{ "version": 3, "sources": ["../../../../../../../../source/febe/ui/src/scripts/report_modules/network.ts", "../../../../../../../../source/febe/ui/src/scripts/report_modules/processes.ts", "../../../../../../../../source/febe/ui/src/scripts/report_modules/deep-links.ts", "../../../../../../../../source/febe/ui/src/scripts/components/GuacRecordingPlayer.ts", "../../../../../../../../source/febe/ui/src/scripts/ui.report_behavioral.ts"], "sourcesContent": ["import { Hatch, SafeString, Domifier, HatchMap } from \"../classes/Hatch.js\";\nimport Utils from \"../classes/Utils.js\";\nimport TabView from \"../components/TabView.js\";\nimport Tooltip from \"../components/Tooltip.js\";\nimport {\n NetworkRequest,\n NetworkFlow,\n TaskReport,\n NetworkDomainRequest,\n NetworkDomainResponse,\n NetworkWebRequest,\n NetworkWebResponse,\n DNSEntry,\n} from \"./interfaces\";\nlet countryStats = {};\n\nimport close from \"@icons/close.svg\";\nimport download from \"@icons/download.svg\";\nimport upload from \"@icons/upload.svg\";\nimport archive from \"@icons/archive.svg\";\nimport unarchive from \"@icons/unarchive.svg\";\nimport reply from \"@icons/reply.svg\";\nimport search from \"@icons/search.svg\";\n\nfunction mapRequests() {\n const data = globalThis.page_data.task_report;\n if (data.network.requests)\n data.network.requests = data.network.requests.map((request: NetworkRequest) => {\n if (request.dns_response && request.dns_response.ip) {\n request.dns_response.ip.forEach((ip: string) => {\n if (data.network.ips && data.network.ips[ip]) {\n request.cc = data.network.ips[ip].cc;\n if (countryStats[request.cc]) {\n countryStats[request.cc]++;\n } else {\n countryStats[request.cc] = 1;\n }\n } else {\n request.cc = \"unknown\";\n }\n });\n }\n return request;\n });\n\n if (data.network.flows)\n data.network.flows = data.network.flows.slice(0, 500).map((item: NetworkFlow) => {\n if (item.dst) {\n let ip = item.dst.split(\":\")[0];\n if (data.network.ips && data.network.ips[ip]) {\n item.cc = data.network.ips[ip].cc;\n\n if (typeof countryStats[item.cc] === \"number\") {\n countryStats[item.cc]++;\n } else {\n countryStats[item.cc] = 1;\n }\n } else {\n item.cc = \"unknown\";\n }\n }\n return item;\n });\n\n renderFlowRequests(data);\n renderRequests(data.network.requests);\n renderMap(countryStats);\n}\nfunction renderRequests(data: Array) {\n let cache = {};\n if (!data) {\n document.querySelector(\n \"#requests ul\"\n ).innerHTML = `
${close}
No results found
`;\n return;\n }\n\n data.forEach((req) => {\n let isReq = isRequest(req);\n if (req.index) {\n renderInContext(req.flow, req.index, req);\n return;\n }\n\n if (!cache[req.flow]) cache[req.flow] = {};\n cache[req.flow][isReq ? \"request\" : \"response\"] = req;\n\n if (cache[req.flow] && cache[req.flow][!isReq ? \"request\" : \"response\"]) {\n renderSimple(req.flow, cache[req.flow].request, cache[req.flow].response);\n delete cache[req.flow];\n }\n\n if (!cache[req.flow]) {\n cache[req.flow] = {};\n }\n });\n\n Object.values(cache).forEach((item: any) => {\n if (item.response || item.request) {\n renderSimple(\n item.response ? item.response.flow : item.request.flow,\n item.request ? item.request : null,\n item.response ? item.response : null\n );\n }\n });\n\n document.querySelectorAll(\"#requests [data-clipboard]\").forEach((item) => {\n item.addEventListener(\"click\", (ev) => {\n ev.stopPropagation();\n Utils.copyToClipboard(item);\n });\n });\n\n document.querySelectorAll(\"#requests [data-tooltip]\").forEach((tooltip) => {\n new Tooltip({\n text: tooltip.getAttribute(\"data-tooltip\"),\n target: tooltip,\n });\n });\n}\nfunction renderInContext(flow_id: number, index: number, obj: any) {\n let holder = document.querySelector(`[data-flow=\"${flow_id}\"][data-index=\"${index}\"]`);\n if (!holder) {\n holder = Domifier(\n Hatch`\n
  • \n
    \n ${obj.flow ? renderFlowFlag(obj.flow) : \"\"}\n
    \n ${obj.http_request ? \"HTTP\" : \"DNS\"}\n
    \n
    \n ${obj.http_request ? obj.http_request.url : \"\"}\n ${obj && obj.dns_request && obj.dns_request.domains[0] ? obj.dns_request.domains[0] : \"\"}\n
    \n ${flow_id ? renderProcess(flow_id) : \"\"}\n ${renderContextMenu(flow_id, \"request\")}\n
    \n
    \n
    \n ${obj.flow ? renderFlowData(obj.flow) : \"\"}\n
    \n
    \n
  • \n `.toString()\n );\n\n holder.querySelector(\".network-requests__header\").addEventListener(\"click\", () => {\n if (holder.classList.contains(\"open\")) {\n holder.classList.remove(\"open\");\n } else {\n holder.classList.add(\"open\");\n }\n });\n document.querySelector(\"#requests ul\").appendChild(holder);\n }\n\n let content = holder.querySelector(\".network-requests__content\");\n let isReq = isRequest(obj);\n let contentTemplate = Domifier(\n Hatch`\n
    \n
    \n ${isReq ? \"Request\" : \"Response\"}\n
    \n ${obj.http_request ? renderObject(obj.http_request) : \"\"}\n ${obj.http_response ? renderObject(obj.http_response) : \"\"}\n ${obj.dns_response && obj.dns_response.answers ? renderBlock(obj.dns_response.answers) : \"\"}\n ${obj.dns_request && obj.dns_request.questions ? renderBlock(obj.dns_request.questions) : \"\"}\n ${\n !(obj.dns_response && obj.dns_response.answers) && obj.dns_response && obj.dns_response.ip\n ? renderBlock(obj.dns_response.ip)\n : \"\"\n }\n ${\n !(obj.dns_request && obj.dns_request.questions) && obj.dns_request && obj.dns_request.domains\n ? renderBlock(obj.dns_request.domains)\n : \"\"\n }\n ${\n !(obj.dns_response && obj.dns_response.answers) && obj.dns_response && obj.dns_response.domains\n ? renderBlock(obj.dns_response.domains)\n : \"\"\n }\n
    \n `.toString()\n );\n\n if (obj.http_request) {\n holder.querySelector(\".network-requests__header__type\").innerHTML = Hatch`${obj.http_request.method}`.toString();\n holder.querySelector(\".network-requests__header__location-domain\").innerHTML =\n Hatch`${obj.http_request.url}`.toString();\n }\n\n content.appendChild(contentTemplate);\n}\nfunction renderFlowRequests(data: TaskReport) {\n if (!document.querySelector(\"#network\")) return;\n\n let renderList = function (list: Array, header: string) {\n if (!list) return \"\";\n return Hatch`\n
    \n

    ${header}

    \n
    \n ${HatchMap(list, (li: string) => {\n return Hatch`\n
    ${li}
    \n `;\n })}\n
    \n

    `;\n };\n\n function renderHttpRequest(re: NetworkWebRequest) {\n if (!re) {\n return \"\";\n }\n return Hatch`\n
    \n

    HTTP Request

    \n
    ${re.method ? re.method : \"\"} ${re.url ? re.url : \"\"}
    \n
    \n
    `;\n }\n\n function renderHttpResponse(re: NetworkWebResponse) {\n if (!re) {\n return \"\";\n }\n return Hatch`\n
    \n

    HTTP Response

    \n
    ${re.status ? re.status : \"\"}
    \n
    `;\n }\n\n function renderDnsRequest(re: NetworkDomainRequest) {\n if (!re) {\n return \"\";\n }\n return renderList(re.domains, `DNS Request`);\n }\n\n function renderDnsResponse(re: NetworkDomainResponse) {\n if (!re) {\n return \"\";\n }\n return renderList(re.ip, `DNS Response`);\n }\n\n if (data.network && data.network.flows && data.network.flows.length) {\n let flowList = {};\n let flowMetas = {};\n if (data.network.requests) {\n data.network.requests.forEach((req) => {\n if (!flowList[req.flow]) {\n flowList[req.flow] = \"\";\n }\n flowList[req.flow] += renderHttpRequest(req.http_request);\n flowList[req.flow] += renderHttpResponse(req.http_response);\n flowList[req.flow] += renderDnsRequest(req.dns_request);\n flowList[req.flow] += renderDnsResponse(req.dns_response);\n\n if (!flowMetas[req.flow]) {\n flowMetas[req.flow] = {};\n }\n if (req.http_request) {\n flowMetas[req.flow].http_method = req.http_request.method;\n flowMetas[req.flow].url = req.http_request.url;\n }\n if (req.http_response) {\n flowMetas[req.flow].http_status = req.http_response.status;\n }\n if (req.dns_request && req.dns_request) {\n flowMetas[req.flow].dns_domains = req.dns_request.domains;\n }\n });\n }\n // TODO: artificially limited because some reports have >15k flows,\n // which freezes the browser!\n data.network.flows.slice(0, 500).forEach((flow) => {\n let maxNetworkTimePercent = data.analysis.max_time_network;\n let startPercentage = (flow.first_seen / maxNetworkTimePercent) * 100;\n let endPercentage = (flow.last_seen / maxNetworkTimePercent) * 100;\n let flowMeta = flowMetas[flow.id] || {};\n\n let pName =\n globalThis.reportHelpers.getProcessLabel(flow.procid).pid !== \"?\"\n ? globalThis.reportHelpers.getProcessLabel(flow.procid).name\n : \"\";\n\n if (flowMeta.url) {\n flowMeta.domain = flowMeta.url;\n } else if (flow.tls_sni) {\n flowMeta.domain = flow.tls_sni;\n } else if (flow.domain) {\n flowMeta.domain = flow.domain;\n } else if (flowMeta.dns_domains) {\n flowMeta.domain = flowMeta.dns_domains;\n }\n\n let escapedString = Domifier(\n Hatch`\n
  • \n ${/* Render header part of the network request */ \"\"}\n
    \n \n
    \n ${flow.dst}\n
    \n\n
    \n ${flowMeta.domain || \"\"}\n
    \n\n
    \n ${flow.protocols ? flow.protocols.join(\", \") : \"\"}\n
    \n\n ${\n pName\n ? Hatch`
    ${pName}
    `\n : Hatch`
    `\n }\n ${renderContextMenu(flow.id, \"flow\")}\n
    \n
    \n ${\n startPercentage && endPercentage\n ? Hatch`
    \n
    \n
    \n `\n : \"\"\n }\n\n
    \n ${\n flow.tx_bytes\n ? Hatch`\n \n ${Utils.humanByteSize(flow.tx_bytes, 1).string}
    ${new SafeString(\n upload\n )}
    \n
    \n `\n : \"\"\n }\n ${\n flow.rx_bytes\n ? Hatch`\n \n ${Utils.humanByteSize(flow.rx_bytes, 1).string}
    ${new SafeString(\n download\n )}
    \n
    \n `\n : \"\"\n }\n ${\n flow.tx_packets\n ? Hatch`\n \n ${flow.tx_packets}
    ${new SafeString(unarchive)}
    \n
    \n `\n : \"\"\n }\n ${\n flow.rx_packets\n ? Hatch`\n \n ${flow.rx_packets}
    ${new SafeString(archive)}
    \n
    \n `\n : \"\"\n }\n
    \n ${\n flowList[flow.id]\n ? Hatch`\n
    \n ${new SafeString(flowList[flow.id] || \"\")}\n
    `\n : \"\"\n }\n\n
    \n
  • `.toString()\n );\n\n escapedString.querySelector(\".network-requests__header\").addEventListener(\"click\", () => {\n if (escapedString.classList.contains(\"open\")) {\n escapedString.classList.remove(\"open\");\n } else {\n escapedString.classList.add(\"open\");\n }\n });\n\n if (!document.querySelector(\"#network\").querySelector(\"#\" + flow.proto)) {\n let index = document.querySelector(\"#network\").querySelectorAll(\".tab-view__bar button\").length + 1;\n let tabButton = Hatch`\n \n `;\n let tabView = Hatch`\n
    \n
      \n\n
    \n
    \n `;\n\n document.querySelector(\"#network\").querySelector(\".tab-view__bar\").appendChild(Domifier(tabButton.toString()));\n document.querySelector(\"#network\").querySelector(\".tab-view__view\").appendChild(Domifier(tabView.toString()));\n }\n\n document\n .querySelector(\"#network\")\n .querySelector(\"#\" + flow.proto)\n .appendChild(escapedString);\n });\n }\n\n document.querySelectorAll(\"#network .tab-view__view__tab\").forEach((i) => {\n if (!i.querySelector(\"li\") && i.getAttribute(\"id\") !== \"requests\") {\n i.innerHTML = `
    ${close}
    No results found
    `;\n }\n });\n\n document.querySelectorAll(\"#network [data-clipboard]\").forEach((item) => {\n item.addEventListener(\"click\", () => {\n Utils.copyToClipboard(item);\n });\n });\n\n document.querySelectorAll(\"#network [data-tooltip]\").forEach((tooltip) => {\n new Tooltip({\n text: tooltip.getAttribute(\"data-tooltip\"),\n target: tooltip,\n });\n });\n\n globalThis.networkTabs = new TabView({\n el: document.querySelector(\"#network\"),\n });\n}\nfunction renderSimple(flow: any, request: any, response: any) {\n let line = Domifier(\n Hatch`\n
  • \n
    \n \n
    \n ${(request && request.http_request) || (response && response.http_response) ? \"HTTP\" : \"DNS\"}\n
    \n
    \n ${request && request.http_request ? request.http_request.url : \"\"}\n ${request && request.dns_request && request.dns_request.domains[0] ? request.dns_request.domains[0] : \"\"}\n
    \n ${flow ? renderProcess(flow) : \"\"}\n
    \n
    \n
    \n ${\n (request && request.flow) || (response && response.flow)\n ? renderFlowData(request && request.flow ? request.flow : response.flow)\n : \"\"\n }\n
    \n ${\n request\n ? Hatch`\n
    \n
    \n Request\n
    \n ${request.http_request ? renderObject(request.http_request) : \"\"}\n ${\n request.dns_request && request.dns_request.questions\n ? renderBlock(request.dns_request.questions)\n : request.dns_request\n ? renderBlock(request.dns_request.domains)\n : \"\"\n }\n
    \n `\n : \"\"\n }\n ${\n response\n ? Hatch`\n
    \n
    \n Response\n
    \n ${response.http_response ? renderObject(response.http_response) : \"\"}\n ${\n response.dns_response && response.dns_response.answers\n ? renderBlock(response.dns_response.answers)\n : \"\"\n }\n ${\n !(response.dns_response && response.dns_response.answers) &&\n response.dns_response &&\n response.dns_response.domains\n ? renderBlock(response.dns_response.domains)\n : \"\"\n }\n ${\n !(response.dns_response && response.dns_response.answers) &&\n response.dns_response &&\n response.dns_response.ip\n ? renderBlock(response.dns_response.ip)\n : \"\"\n }\n
    \n `\n : \"\"\n }\n
    \n
  • \n `.toString()\n );\n\n line.querySelector(\".network-requests__header\").addEventListener(\"click\", () => {\n if (line.classList.contains(\"open\")) {\n line.classList.remove(\"open\");\n } else {\n line.classList.add(\"open\");\n }\n });\n document.querySelector(\"#requests ul\").appendChild(line);\n}\nfunction renderFlowFlag(flow_id: number) {\n let flowData = globalThis.reportHelpers.getFlow(flow_id);\n if (!flowData) return \"\";\n return Hatch`\"flag-${flowData.cc.toLowerCase()}\"`;\n}\nfunction renderFlowData(flow_id: number) {\n let flowData = globalThis.reportHelpers.getFlow(flow_id);\n if (!flowData) return \"\";\n return Hatch`\n
    \n Remote address:\n
    \n
    \n ${flowData.dst}\n
    \n `;\n}\nfunction renderProcess(flow_id: number) {\n let flowData = globalThis.reportHelpers.getFlow(flow_id);\n if (!flowData) return \"\";\n let procLabel = globalThis.reportHelpers.getProcessLabel(flowData.procid);\n if (procLabel.pid === \"?\") return \"\";\n return Hatch`
    ${procLabel.name}
    `;\n}\nfunction renderObject(obj: any) {\n return Hatch`\n
    \n ${obj.request || obj.response ? Hatch`${obj.request ? obj.request : obj.response}
    ` : \"\"}\n ${!obj.request ? Hatch`
    ${obj.method ? obj.method : \"\"} ${obj.url ? obj.url : \"\"}
    ` : \"\"}\n ${!obj.response && obj.status ? Hatch`
    ${obj.status}
    ` : \"\"}\n ${obj.headers ? HatchMap(obj.headers, (item: string) => Hatch`${item}
    `) : \"\"}\n
    \n `;\n}\nfunction renderArrayRow(obj: DNSEntry) {\n return HatchMap(\n Object.entries(obj),\n (entry: Array) => Hatch`\n ${renderBlock(entry[1])}\n `\n );\n}\nfunction renderBlock(block: DNSEntry | string) {\n if (Array.isArray(block)) {\n return Hatch`\n
    \n
    \n ${HatchMap(\n block,\n (item: any) => Hatch`\n ${\n typeof item === \"object\"\n ? Hatch`
    ${renderArrayRow(\n item\n )}
    `\n : Hatch`
    ${item}
    `\n }\n `\n )}\n
    \n
    \n `;\n } else {\n return Hatch`\n
    \n
    \n ${Hatch`
    ${block}
    `}\n
    \n
    \n `;\n }\n}\nasync function renderMap(data: any) {\n let map = document.querySelector(\".network-map\");\n if (!data || !Object.entries(data).length) {\n map.remove();\n return;\n }\n let max =\n data[\n Object.keys(data).reduce(function (a, b) {\n return data[a] > data[b] ? a : b;\n })\n ];\n const ccs = await Utils.ccToLabel();\n Object.entries(data).forEach((item) => {\n let paths: any = [map.querySelector(`#${item[0]}`)];\n let label = ccs.find((e) => e.code === item[0])?.name;\n if (!paths[0]) {\n paths = map.querySelectorAll(`.${label.replaceAll(\" \", \".\")}`);\n }\n let per = Math.floor((100 / max) * parseInt(item[1] as string));\n if (per === 100) per = 99;\n\n paths.forEach((path: HTMLElement) => {\n path.style.fill = globalThis.window.darkmode ? \"#FFFFFF\" + per : \"#2673B3\" + per;\n path.style.stroke = \"#2673B3\";\n path.style.strokeWidth = \"1px\";\n\n new Tooltip({\n target: path,\n text: Hatch`${label}: ${item[1]}`,\n position: \"bottom\",\n });\n });\n });\n}\nfunction isRequest(req: any) {\n if (req.dns_request) return true;\n if (req.http_request) return true;\n if (req.ftp_request) return true;\n if (req.smtp_request) return true;\n\n return false;\n}\nlet renderContextMenu = (flowId: number, type: string) => {\n return Hatch`\n
    \n \n \n \n
    \n ${new SafeString(search)}\n
    \n
    \n
    `;\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n let data = globalThis.page_data.task_report;\n if (!data.network) {\n document.querySelector(\"#network\").setAttribute(\"data-section\", \"close\");\n return;\n } else if (data.network.requests && data.network.requests.length) {\n mapRequests();\n } else if (data.network.flows && data.network.flows.length) {\n mapRequests();\n }\n document.dispatchEvent(new Event(\"NetworkRendered\"));\n});\n", "document.querySelectorAll(\"#processes .foldable .processes__node-image\").forEach((item) => {\n item.addEventListener(\"click\", () => {\n item.parentElement.classList.toggle(\"folded\");\n });\n});\n", "import Utils, { getChildIndex, wait } from \"../classes/Utils\";\n\nlet handleDeepLink = async () => {\n let [key, id] = window.location.hash.split(\"#\")[1].split(\"=\");\n let scrollEl;\n if (key === \"flow-id\") {\n scrollEl = document.querySelector(`[data-flow-scroll-id=\"${id}\"`);\n let tabindex = getChildIndex(scrollEl.closest(\".tab-view__view__tab\"));\n globalThis.networkTabs.renderTab(tabindex);\n scrollEl.parentElement.parentElement.classList.add(\"active\");\n } else if (key === \"request-id\") {\n scrollEl = document.querySelector(`#requests [data-flow=\"${id}\"`);\n } else if (key === \"proc-id\") {\n scrollEl = document.querySelector(`[data-proc-id=\"${id}\"`);\n } else if (key === \"download-index\") {\n document.querySelector(\"#downloads\").setAttribute(\"data-section\", \"\");\n await wait(50);\n scrollEl = document.querySelectorAll(\"#downloads-container li\")[parseInt(id)];\n }\n\n if (!scrollEl) return;\n Utils.scrollAndBlink(scrollEl);\n};\n\nif (window.location.hash) {\n if (\n document.querySelector(\"#network .tab-view__view__tab .no-results\") ||\n document.querySelector(\"#network .tab-view__view__tab li\")\n ) {\n handleDeepLink();\n } else {\n const l = () => {\n handleDeepLink();\n document.removeEventListener(\"NetworkRendered\", l);\n };\n document.addEventListener(\"NetworkRendered\", l);\n }\n}\n", "import { Hatch, Domifier, HatchMap, SafeString } from \"../classes/Hatch.js\";\nimport Utils, { getChildIndex, wait } from \"../classes/Utils.js\";\nimport { Guacamole } from \"../ext/Guac.js\";\nimport warningSVG from \"@icons/warning.svg\";\nimport fullscreenSVG from \"@icons/fullscreen.svg\";\nimport fullscreenExit from \"@icons/fullscreen_exit.svg\";\nimport playSVG from \"@icons/play_arrow.svg\";\nimport pauseSVG from \"@icons/pause.svg\";\nimport arrowLeft from \"@icons/arrow_left.svg\";\nimport arrowRight from \"@icons/arrow_right.svg\";\nimport ScreenshotMonitorIcon from \"@icons/photo_camera.svg\";\n\nimport Tooltip from \"./Tooltip.js\";\n\nexport const openGuacTunnel = (url: string, el: HTMLElement, timeline) => {\n let playing = false;\n let fullscreen = false;\n let controls: Element;\n let maxDuration = globalThis.page_data.task_report.analysis.max_time_kernel;\n let leaveTimer: ReturnType;\n\n (async function () {\n const recording = new Guacamole.StaticHTTPTunnel(url) as any;\n const guac = new Guacamole.SessionRecording(recording);\n await guac.connect();\n recording.onstatechange = (state) => {\n if (state === 1) {\n attachDisplay(guac, el);\n addControls(el, guac);\n el.onmousemove = () => {\n onMouseMove();\n };\n el.onmouseleave = () => {\n onMouseLeave();\n };\n }\n };\n guac.onprogress = (time: number) => {\n if (time > maxDuration) maxDuration = time;\n };\n guac.onseek = (time: number) => {\n onseek(time);\n };\n let errEl = `\n
    \n
    \n ${warningSVG}\n
    \n

    An error occured.

    \n
    `;\n guac.onerror = (err) => {\n el.innerHTML = errEl;\n };\n recording.onerror = (err) => {\n if (err?.code === 9000) {\n globalThis.notification.notify({\n title: \"Monitor replay size limit exceeded. Playback will be clipped.\",\n type: \"danger\",\n dismiss: \"Dismiss\",\n timer: 3000,\n });\n } else {\n el.innerHTML = errEl;\n }\n };\n await wait(1000);\n play(guac);\n })();\n\n const attachDisplay = async (guac, el: HTMLElement) => {\n el.innerHTML = \"\";\n el.append(guac.getDisplay().getElement());\n window.onresize = () => {\n resize(guac);\n };\n guac.getDisplay().onresize = () => {\n resize(guac);\n };\n await guac\n .getDisplay()\n .getElement()\n .addEventListener(\"click\", () => {\n togglePlay(guac);\n });\n if (timeline) {\n renderTimeline(timeline);\n }\n };\n\n const resize = (guac) => {\n const display = guac.getDisplay().getElement();\n const overviewBBox = display.parentNode.getBoundingClientRect();\n const limitHeight = Math.max(200, globalThis.innerHeight - 100);\n const limitWidth = overviewBBox.width;\n const originalHeight = guac.getDisplay().getHeight();\n const originalWidth = guac.getDisplay().getWidth();\n\n const heightScale = limitHeight / originalHeight;\n const widthScale = limitWidth / originalWidth;\n\n let scale = Math.min(heightScale, widthScale);\n\n guac.getDisplay().scale(scale);\n\n if (heightScale < widthScale) {\n display.parentElement.style.height = limitHeight + \"px\";\n display.parentElement.style.width = originalWidth * scale + \"px\";\n } else {\n display.parentElement.style.width = limitWidth + \"px\";\n display.parentElement.style.height = originalHeight * scale + \"px\";\n }\n };\n\n const formatMillisecondsToMinutesSeconds = (milliseconds: number): string => {\n const totalSeconds = Math.floor(milliseconds / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n\n const formattedTime = `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n\n return formattedTime;\n };\n\n const showStateChange = async (icon: string) => {\n let template = Domifier(`
    ${icon}
    `);\n el.appendChild(template);\n await wait(10);\n template.classList.add(\"closing\");\n await wait(700);\n template.remove();\n };\n\n const capture = () => {\n var link = document.createElement(\"a\");\n link.download = \"capture.png\";\n link.href = (document.querySelector(\"#replay-monitor canvas\") as HTMLCanvasElement).toDataURL();\n link.click();\n };\n\n const toggleFullscreen = () => {\n if (fullscreen) {\n void document.exitFullscreen();\n controls.querySelector(\"#toggle-fullscreen\").innerHTML = fullscreenExit;\n } else {\n controls.querySelector(\"#toggle-fullscreen\").innerHTML = fullscreenSVG;\n void document.querySelector(\"#monitor-container\")?.requestFullscreen?.();\n }\n fullscreen = !fullscreen;\n };\n\n const togglePlay = (guac) => {\n playing ? pause(guac) : play(guac);\n showStateChange(playing ? playSVG : pauseSVG);\n };\n\n const play = (guac) => {\n guac.play();\n playing = true;\n controls.querySelector(\"#toggle-play\").innerHTML = pauseSVG;\n };\n\n const pause = (guac) => {\n guac.pause();\n playing = false;\n controls.querySelector(\"#toggle-play\").innerHTML = playSVG;\n };\n\n const onseek = (time: number) => {\n if (!controls) return;\n if (time > maxDuration) maxDuration = time;\n let progressBar = controls.querySelector(\"#progress-bar span\");\n controls.querySelector(\"#time\").innerHTML = formatMillisecondsToMinutesSeconds(time);\n controls.querySelector(\"#maxTime\").innerHTML = formatMillisecondsToMinutesSeconds(maxDuration);\n progressBar.style.width = (time * 100) / maxDuration + \"%\";\n };\n\n const progressBarClick = (ev: MouseEvent, guac) => {\n let progressBar = controls.querySelector(\"#progress-bar\");\n const bb = progressBar.parentElement.getBoundingClientRect();\n const x = ev.x - bb.x;\n const pct = x / bb.width;\n guac.seek(maxDuration * pct);\n };\n\n const onMouseMove = () => {\n controls.classList.add(\"hover\");\n clearTimeout(leaveTimer);\n leaveTimer = setTimeout(() => {\n controls.classList.remove(\"hover\");\n }, 5000);\n };\n\n const onMouseLeave = () => {\n controls.classList.remove(\"hover\");\n };\n\n const filterTimelineEvents = (size, page, timeline) => {\n let start = size * (page - 1);\n let end = size * page;\n return Object.fromEntries(\n Object.entries(timeline).filter(([key]) => {\n let numb = parseInt(key);\n if (numb > start && numb < end) {\n return true;\n }\n })\n );\n };\n\n const renderTimeline = async (timeline) => {\n await wait(1000);\n let width = 10;\n let el = document.querySelector(\"#timeline\");\n let elWidth = el.getBoundingClientRect().width;\n let steps = elWidth / width;\n let stepsize = maxDuration / steps;\n\n for (let i = 0; i < steps; i++) {\n let stepEl = document.createElement(\"div\");\n let filtered = filterTimelineEvents(stepsize, i, timeline);\n stepEl.innerHTML = HatchMap(Object.entries(filtered), (f) => {\n return HatchMap(f[1], (ff) => {\n return Hatch`\n \n `;\n });\n }).s;\n el.appendChild(stepEl);\n }\n\n document.querySelectorAll(\"#timeline [data-blob]\").forEach((el) => {\n el.addEventListener(\"click\", async () => {\n let scrollEl;\n if (el.getAttribute(\"data-type\") === \"network\") {\n scrollEl = document.querySelector(`[data-flow-scroll-id=\"${el.getAttribute(\"data-scroll-id\")}\"`);\n let tabindex = getChildIndex(scrollEl.closest(\".tab-view__view__tab\"));\n globalThis.networkTabs.renderTab(tabindex);\n scrollEl.parentElement.parentElement.classList.add(\"active\");\n } else if (el.getAttribute(\"data-type\") === \"process\") {\n scrollEl = document.querySelector(`[data-proc-id=\"${el.getAttribute(\"data-scroll-id\")}\"`);\n }\n if (!scrollEl) return;\n Utils.scrollAndBlink(scrollEl);\n });\n\n let cc = el.getAttribute(\"data-cc\")?.toLowerCase();\n let body = Hatch`${\n cc !== \"null\"\n ? new SafeString(``)\n : \"\"\n }\n
    ${el.getAttribute(\"data-blob\")}
    `;\n new Tooltip({\n target: el,\n text: body,\n position: \"bottom\",\n });\n });\n };\n\n const addControls = (el: HTMLElement, guac) => {\n controls?.remove();\n controls = Domifier(`\n
    \n
    \n
    \n
    \n \n
    1:00\n  / \n ${formatMillisecondsToMinutesSeconds(maxDuration)}
    \n
    \n \n \n \n \n
    \n `);\n\n new Tooltip({\n target: controls.querySelector(\"#toggle-fullscreen\"),\n text: \"Toggle Fullscreen\",\n });\n\n new Tooltip({\n target: controls.querySelector(\"#capture\"),\n text: \"Download Screenshot\",\n });\n\n new Tooltip({\n target: controls.querySelector(\"#frame-back\"),\n text: \"Frame Backwards\",\n });\n\n new Tooltip({\n target: controls.querySelector(\"#frame-forward\"),\n text: \"Frame Forwards\",\n });\n\n controls.querySelector(\"#toggle-fullscreen\").addEventListener(\"click\", () => {\n toggleFullscreen();\n });\n\n controls.querySelector(\"#capture\").addEventListener(\"click\", () => {\n capture();\n });\n controls.querySelector(\"#frame-back\").addEventListener(\"click\", () => {\n pause(guac);\n guac.seekFrame(-1);\n });\n controls.querySelector(\"#frame-forward\").addEventListener(\"click\", () => {\n pause(guac);\n guac.seekFrame(1);\n });\n controls.querySelector(\"#progress-bar\").addEventListener(\"click\", (ev) => {\n progressBarClick(ev, guac);\n });\n controls.querySelector(\"#toggle-play\").addEventListener(\"click\", () => {\n togglePlay(guac);\n });\n\n el.appendChild(controls);\n };\n};\n", "import \"./report_modules/helpers\";\nimport \"./report_modules/network\";\nimport \"./report_modules/processes\";\nimport \"./report_modules/report-tools\";\nimport \"./report_modules/sample-header\";\nimport \"./report_modules/signatures\";\nimport \"./report_modules/task-center\";\nimport \"./report_modules/moderation\";\nimport \"./report_modules/deep-links\";\n\nimport { openGuacTunnel } from \"./components/GuacRecordingPlayer\";\n\nlet attachedMonitor = false;\ndocument.querySelector(\"#monitor-header\")?.addEventListener(\"click\", () => {\n if (attachedMonitor) {\n return;\n }\n attachedMonitor = true;\n let task = globalThis.page_data.task_id ? globalThis.page_data.task_id : globalThis.page_data.task.id;\n const guacURL = `/${globalThis.page_data.sample.id}/${task}/logs/vnc.guac`;\n openGuacTunnel(guacURL, document.querySelector(\"#replay-monitor\"), getTimeline());\n});\n\nlet getProcScore = (id: number, signatures) => {\n let highscore = 0;\n signatures.forEach((sig) => {\n if (sig.indicators) {\n sig.indicators.forEach((i) => {\n if (i.procid === id && sig.score && sig.score > highscore) {\n highscore = sig.score;\n }\n });\n }\n });\n return highscore;\n};\n\nlet getFlowScore = (id: number, signatures) => {\n let highscore = 0;\n signatures.forEach((sig) => {\n if (sig.indicators) {\n sig.indicators.forEach((i) => {\n if (i.procid === id && sig.score) {\n highscore = sig.score;\n }\n });\n }\n });\n return highscore;\n};\n\nlet getTimeline = () => {\n let signatures = globalThis.page_data?.task_report?.signatures;\n let network = globalThis.page_data?.task_report?.network;\n let processes = globalThis.page_data?.task_report?.processes;\n let timeline = {};\n\n processes?.forEach((proc) => {\n if (proc.started) {\n if (!timeline[proc.started]) {\n timeline[proc.started] = [];\n }\n timeline[proc.started].push({\n section: \"process\",\n blob: proc.image || proc.cmd,\n parent_id: proc.procid,\n cc: null,\n score: getProcScore(proc.procid, signatures),\n });\n }\n });\n\n network?.flows?.forEach((flow) => {\n if (flow.first_seen) {\n if (!timeline[flow.first_seen]) {\n timeline[flow.first_seen] = [];\n }\n timeline[flow.first_seen].push({\n section: \"network\",\n blob: flow.dst,\n parent_id: flow.id,\n cc: flow.cc,\n score: getFlowScore(flow.procid, signatures),\n });\n }\n });\n return timeline;\n};\n"], "mappings": "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", "names": ["countryStats", "mapRequests", "data", "request", "ip", "item", "renderFlowRequests", "renderRequests", "renderMap", "cache", "close_default", "req", "isReq", "isRequest", "renderInContext", "renderSimple", "ev", "Utils", "tooltip", "Tooltip", "flow_id", "index", "obj", "holder", "Domifier", "Hatch", "renderFlowFlag", "renderProcess", "renderContextMenu", "renderFlowData", "content", "contentTemplate", "renderObject", "renderBlock", "renderList", "list", "header", "HatchMap", "li", "renderHttpRequest", "re", "renderHttpResponse", "renderDnsRequest", "renderDnsResponse", "flowList", "flowMetas", "flow", "maxNetworkTimePercent", "startPercentage", "endPercentage", "flowMeta", "pName", "escapedString", "SafeString", "upload_default", "download_default", "unarchive_default", "archive_default", "tabButton", "tabView", "i", "TabView", "response", "line", "flowData", "procLabel", "renderArrayRow", "entry", "block", "map", "max", "a", "b", "ccs", "_a", "paths", "label", "e", "per", "path", "flowId", "type", "reply_default", "search_default", "item", "handleDeepLink", "key", "id", "scrollEl", "tabindex", "getChildIndex", "wait", "Utils", "l", "openGuacTunnel", "url", "el", "timeline", "playing", "fullscreen", "controls", "maxDuration", "leaveTimer", "recording", "Guacamole", "guac", "state", "attachDisplay", "addControls", "onMouseMove", "onMouseLeave", "time", "onseek", "errEl", "warning_default", "err", "wait", "play", "resize", "togglePlay", "renderTimeline", "display", "overviewBBox", "limitHeight", "limitWidth", "originalHeight", "originalWidth", "heightScale", "widthScale", "scale", "formatMillisecondsToMinutesSeconds", "milliseconds", "totalSeconds", "minutes", "seconds", "showStateChange", "icon", "template", "Domifier", "capture", "link", "toggleFullscreen", "_a", "_b", "fullscreen_exit_default", "fullscreen_default", "pause", "play_arrow_default", "pause_default", "progressBar", "progressBarClick", "ev", "bb", "pct", "filterTimelineEvents", "size", "page", "start", "end", "key", "numb", "width", "steps", "stepsize", "i", "stepEl", "filtered", "HatchMap", "f", "ff", "Hatch", "Utils", "scrollEl", "tabindex", "getChildIndex", "cc", "body", "SafeString", "Tooltip", "arrow_left_default", "arrow_right_default", "photo_camera_default", "attachedMonitor", "_a", "task", "guacURL", "openGuacTunnel", "getTimeline", "getProcScore", "id", "signatures", "highscore", "sig", "i", "getFlowScore", "_b", "_c", "_d", "_e", "_f", "_g", "network", "processes", "timeline", "proc", "flow"] }