[実践]「君、行動がちょっと怪しいぞ?」🤨 正常ファイル vs 悪性ファイル、API呼び出し比較で捕まえよう!(AI活用法)

セキュリティ研究員の皆さん、こんにちは!🕵️‍♂️

私たちは人を判断するとき、その人の「見た目」だけで判断しませんよね?その人が普段「どのような行動」をするかを見て、初めて本当の性格を知ることができます。

ソフトウェア(ファイル)も同様です。

外見(アイコン、ファイル名)は電卓のように偽装できても、内部でオペレーティングシステム(OS)に要求する行動であるAPI(Application Programming Interface)呼び出しは欺くのが難しいです。

  • 正常ファイル(電卓):「画面に数字を描画して」、「マウスのクリックを受け取って」
  • 悪性ファイル(ランサムウェア):「ファイルリストを全部持ってきて」、「暗号化して」、「インターネットに接続してキーを送って」

今日は、正常ファイルと悪性ファイルのAPI呼び出しリスト(Import Table)を抽出し、それをAIに見せて「犯人は誰か当ててみて!」と質問する実習を行います。

AIは果たしてこの「行動リスト」だけでマルウェアを検出できるでしょうか?確認してみましょう!🚀


1. API呼び出しリスト(Import Table)とは? 📋

Windows実行ファイル(PE)は、すべてを単独で行うわけではありません。ファイルを読み込んだり、インターネットにアクセスしたりするには、Windowsオペレーティングシステムに「助けて!」と要求する必要があります。このときに使用する関数がまさにWindows APIです。

このファイルが「実行時にこれらの関数が必要だ!」と記したリストをIAT(Import Address Table)と呼びますが、これを見るだけでファイルの目的の80%は推測できます。


2. [準備] APIリストの抽出 🛠️

抽出方法はいくつか(PEStudio、Ghidraなど)ありますが、私たちは最も速くて簡単なPythonスクリプトを使ってみます。(pefileライブラリが必要)

💡 ヒント:Pythonがない場合は、「PEStudio」のような無料ツールにファイルを入れ、「Imports」タブをコピーしても構いません!

🐍 Python抽出スクリプト (extract_api.py)

Python

import pefile

def get_api_list(file_path):
    try:
        pe = pefile.PE(file_path)
        print(f"--- [ {file_path} ] API List ---")
        for entry in pe.DIRECTORY_ENTRY_IMPORT:
            for imp in entry.imports:
                if imp.name:
                    print(imp.name.decode('utf-8'))
    except Exception as e:
        print(f"Error: {e}")

# 実習: 正常ファイル(電卓)と悪性サンプルのパスを指定してください
get_api_list("C:\Windows\System32\calc.exe") 
get_api_list("malware_sample.exe")

3. [データ] 抽出されたAPIリストの比較 (サンプルデータ) 📊

スクリプトを実行して得られた2つのファイルのAPIリストです。ざっと見ただけでも、何となく違いが感じられませんか?

✅ ファイルA (正常ファイル:電卓)

GetMessageW
TranslateMessage
DispatchMessageW
SetWindowTextW
DrawTextW
BeginPaint
EndPaint
LoadIconW
...

👉 特徴:Paint, Window, Message… 主に画面を描画し、ユーザーと対話する(GUI)関数が見られます。

⛔ ファイルB (悪性ファイル:ランサムウェアの疑い)

FindFirstFileA
FindNextFileA
CryptAcquireContextA
CryptGenKey
CryptEncrypt
InternetOpenA
InternetConnectA
HttpSendRequestA
WriteFile
Process32First
VirtualAllocEx
...

👉 特徴:FindFile(ファイルを検索)、Crypt(暗号化)、Internet(ネットワーク)、VirtualAlloc(メモリ割り当て)… 何か秘密裏で攻撃的な作業を行うようです。


4. [実習] AIに「犯人は誰?」と尋ねる 🗣️

さあ、このリストをそのままコピーして、AI(ChatGPT、Claudeなど)に判断を任せてみましょう。

📝 プロンプト (Prompt)

[役割] あなたはマルウェア分析の専門家です。

>

[状況] 私は2つの実行ファイル(A、B)から抽出したAPIインポートリストを持っています。

>

[要求事項]

>

1. 各ファイルのAPIリストを分析し、該当プログラムの主要機能(挙動)を推論してください。

2. 2つのファイルのうちマルウェアと疑われるファイルを指摘し、その根拠となる脅威的なAPIの組み合わせを説明してください。

3. 予想される悪性挙動のタイプ(例:ランサムウェア、キーロガー、インジェクターなど)を分類してください。

>

[データ]

>

(ファイルAリスト):

>

GetMessageW, TranslateMessage, SetWindowTextW, DrawTextW, … (上記の正常リストを貼り付け)

>

(ファイルBリスト):

>

FindFirstFileA, CryptEncrypt, InternetOpenA, VirtualAllocEx, … (上記の悪性リストを貼り付け)


5. [結果] AIの鳥肌が立つ分析 🕵️‍♀️

AIは単純な関数名の羅列から「文脈(Context)」を読み取ります。

🤖 AI分析結果

>

1. 挙動分析:

>

– ファイルA:Windowsウィンドウを作成し、画面にテキストを描画し、ユーザー入力を待機する典型的なGUIアプリケーションです。危険な機能は見られません。

– ファイルB:ファイルシステムを探索(FindFile)し、データを暗号化(CryptEncrypt)し、外部サーバーと通信(HttpSendRequest)します。また、他のプロセスのメモリにアクセス(VirtualAllocEx)しようとする兆候が見られます。

>

2. 犯人の特定:🚨 ファイルB(悪性の疑い)

>

3. 決定的な証拠(疑わしいAPIの組み合わせ):

>

– ランサムウェアの兆候:FindFirstFile + WriteFile + CryptEncryptの組み合わせは、PC内のファイルを見つけて内容を暗号化し、上書きする典型的なランサムウェアのパターンです。

– C2通信:InternetOpen + HttpSendRequestは、暗号化キーを送信したりコマンドを受信したりするためのネットワーク挙動です。

– インジェクション:VirtualAllocExは、他のプロセスに悪性コードを埋め込む際によく使用されます。

>

4. 結論:

>

ファイルBはランサムウェア(Ransomware)または情報窃取型トロイの木馬である可能性が非常に高いです。直ちに隔離してください!


6. 終わりに:AI、静的分析の優れたパートナー 🤝

いかがでしたか?私たちはコードを一行も見ていません。ただ「このファイルがどのようなツール(API)を用意したか」というリストを見せただけで、AIは正確に悪性かどうかを判断しました。

もちろん、巧妙なマルウェアはAPIを隠すことも(Dynamic Loading)ありますが、この「APIプロファイリング」手法は、初期分析において最も迅速かつ効果的な方法の一つです。

もし皆さんのPCに気になるファイルがあれば、今日学んだ方法でAPIリストを抽出してAIに尋ねてみてください!意外な結果を教えてくれるかもしれません。👻

次回は理論編、「アセンブリ命令パターンとC言語のマッピング構造」を通じて、見た目ではなく本当のコードの中に入っていく準備をしてみましょう。お楽しみに!



Comments

コメントを残す

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