[実習] マルウェアの心臓を探せ!🫀 暗号化・ネットワーク関数の位置特定とコード精密分析

こんにちは、粘り強いセキュリティ研究者の皆さん!🕵️‍♂️

前回、私たちはメタデータ(IAT、文字列)を通じて、マルウェアが「どのようなツール」を用意したかを確認しました。「ふむ、暗号化ツール(CryptEncrypt)と通信ツール(InternetOpen)を用意したな。ランサムウェアのようだ!」

しかし、これだけでは不十分です。犯人がナイフを買ったからといって、必ずしも犯罪を犯したわけではありません。「いつ、どこで、どのようにそのナイフを振るったのか」現場を押さえる必要があります。

今日は、リバースエンジニアリングツール(GhidraまたはIDA)を使用して、悪意のある行為が実際に発生するコードの心臓部(Core Logic)を見つけ出し、分析する実習を行います。

この技術を習得すれば、何万行ものコードの中で迷うことなく、たった3回のクリックで核心ロジックに移動できます!🚀


1. 🧭 コンパスの準備:相互参照(Cross-Reference)の魔法

何万行ものアセンブリコードの中から暗号化関数がどこに隠れているかを目で探すには、徹夜しても足りません。このときに使うチートキーが、まさに相互参照(X-Ref, Cross-Reference)です。

💡 相互参照とは?「この関数(API)を誰が呼び出したの?」と尋ねる機能です。本の巻末にある「索引(Index)」と全く同じです。単語を探すと、その単語が使われているページ番号を教えてくれるのと同じですね。


2. [実習 1] 暗号化ロジック(Ransomware Core)の位置特定 🔐

ランサムウェアの本質は「ファイル暗号化」です。この現場を捕らえましょう。

🛠️ ツール: Ghidra(無料)またはIDA Pro 📂 ターゲットAPI: CryptEncrypt(またはWriteFile)

👣 ステップバイステップ追跡

  1. Symbol Tree(シンボルツリー)を開く: Ghidra右側のSymbol TreeウィンドウでImportsフォルダを開きます。
  2. API検索: ADVAPI32.DLL内にあるCryptEncryptを探します。
  3. X-Ref確認:
    • CryptEncrypt関数名の上で右クリック -> Show References to(またはショートカットCtrl+Shift+F)を押します。
    1. 現場急襲(Jump): リストに表示されたアドレス(例:FUN_00401000)をダブルクリックします。

    🎯 到着! 画面が移動したそこが、まさにファイルを暗号化するループが回っている現場です。周囲を見ると、XOR演算を行ったり、ファイル内容をバッファに格納するコードが見つかるでしょう。


    3. [実習 2] ネットワーク接続(C2 Communication)の位置特定 🌐

    ハッカーに情報を抜き取ったり、キーを受け取ったりする通信区間を探してみましょう。

    📂 ターゲットAPI: InternetOpenUrl, HttpSendRequest, socket, connect

    👣 ステップバイステップ追跡

    1. 文字列(Strings)で探す: 今回はAPIではなく文字列で探してみましょう。
      • 上部メニュー Search -> Strings をクリック。
      • http, https または疑わしいIPアドレスを検索します。
      1. X-Ref確認:
        • 発見されたURL文字列(例:)の上で右クリック -> Show References to
        1. 現場急襲: 該当文字列を使用する関数に移動します。

        🎯 到着! ここを分析すれば、「どのようなデータを、どのような方式(GET/POST)で、どこに送っているのか」正確に知ることができます。


        4. 🧠 [深化] AIと共に行うコード領域分析

        関数の位置は見つけたものの、いざコードを見るとエイリアン語(uVar1, param_2…)だらけですよね?ここが、前回学んだAIの能力を200%活用するポイントです。

        📝 デコンパイルコード分析プロンプト

        GhidraのDecompileウィンドウにあるCコードをコピーして、AIにこのように尋ねてみてください。

        [リクエスト] 以下のCコードはCryptEncrypt APIを呼び出す関数です。リバースエンジニアリングツールで抽出したため、変数名がめちゃくちゃです。

        >

        1. この関数の動作原理を段階的に説明してください。

        2. 変数 local_14, param_1 などが実際にはどのような役割(ファイルハンドル、バッファ、キーなど)を果たしているのか推論してください。

        3. このコードを理解しやすいPython擬似コード(Pseudocode)に変換してください。

        >

        [コード] (Ghidraからコピーしたコードを貼り付け)

        AIは文脈を読み取り、「local_14はファイルハンドルで、ループを回しながら1024バイトずつ読み込んで暗号化していますね!」と明快に解釈してくれます。


        5. ⚠️ 分析時の注意点(落とし穴を避ける)

        1. 動的ローディング(Dynamic Loading):
          • 賢いマルウェアはImportsリストにAPIを隠します。
          • 代わりにLoadLibraryとGetProcAddressを使って実行中にAPIを呼び出します。
          • もしImportsに探しているAPIがなければ、GetProcAddressを追跡する必要があります。
          1. ラッパー関数(Wrapper Function):
            • マルウェア作成者がMyEncryptという関数を作り、その中でCryptEncryptを呼ぶ場合が多いです。
            • X-Refを辿ったのにコードが短すぎる場合は、その関数を呼び出す上位関数(Caller)にさらに一段階上がって全体像を見る必要があります。

            🎉 終わりに:森を見て木を切れ!

            今日、私たちは広大なコードの森の中で、「悪意のある行為」という木がどこに植えられているのかを正確に見つけ出す方法を学びました。

            • 相互参照(X-Ref)は地図です。
            • デコンパイラ(Ghidra)は翻訳機です。
            • AIはガイドです。

            この3つを組み合わせれば、どんなに複雑なマルウェアでもその核心ロジックを徹底的に解明できます。

            これで皆さんは、「このファイルは悪意があります」という言葉を超えて、「このファイル内部の0x401000アドレスにある関数がAES-256でファイルを暗号化しています」と語れる専門家になりました。

            次回は、これまでのすべての分析内容を総合して、「実務型マルウェア分析報告書」を作成する待望のフィナーレを飾ります。お楽しみに!👋



Comments

コメントを残す

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