mcpField
R
reverse-engineering-malware-with-ghidra

reverse-engineering-malware-with-ghidra

github.com/mukul975セキュリティ35.2k199 回インストール8 週間前に更新
リポジトリ

reverse-engineering-malware-with-ghidra について

初期トリアージ後にコードレベルの調査が必要なセキュリティアナリスト向けの、Ghidra を使ったマルウェア解析ガイドです。逆コンパイル、C2 の追跡、難読化の調査から検知シグネチャ作成まで扱います。

主な機能

  1. 01バイナリの取り込みと自動解析
  2. 02関数とクロスリファレンスの追跡
  3. 03逆コンパイルコードの分析
  4. 04C2 プロトコルの調査
  5. 05暗号化と難読化の分析
  6. 06YARA 検知ルールの作成

活用シーン

  1. 01不審なマルウェアの挙動をコードレベルで調査
  2. 02埋め込み C2 設定や鍵の抽出
  3. 03独自 C2 プロトコルの記録
  4. 04コードの特徴に基づく検知シグネチャ作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill reverse-engineering-malware-with-ghidra

インストール後、Claude Code で/reverse-engineering-malware-with-ghidraを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
references/
api-reference.md
scripts/
agent.py

詳細

Ghidra を使用したマルウェアのリバースエンジニアリング

使用するタイミング

  • 静的解析と動的解析によって、コードレベルでより深く理解する必要がある不審な機能が見つかった場合
  • C2 通信プロトコル、暗号化アルゴリズム、または独自の難読化をリバースエンジニアリングする必要がある場合
  • マルウェアサンプルが標的とする、正確なエクスプロイトの仕組みや脆弱性を理解する場合
  • コンパイル済みコードに埋め込まれたハードコードの設定データ(C2 アドレス、暗号鍵、キャンペーン ID)を抽出する場合
  • 固有のコードパターンに基づいて、精度の高い YARA ルールや検出シグネチャを作成する場合

不明なサンプルの初期トリアージには使用しないでください。まず PEStudio で静的解析を、Cuckoo で振る舞い分析を実施してください。

前提条件

  • Ghidra 11.x をインストール済みであること(https://ghidra-sre.org/ からダウンロード)。JDK 17 以降が必要です
  • 本番ネットワークから隔離された解析用 VM(Windows または Linux ホスト)
  • x86/x64 アセンブリ言語と Windows API の規約に関する知識
  • デコンパイルの精度を高めるための Windows システム DLL の PDB シンボルファイル
  • 自動解析タスク用の Ghidra スクリプトリポジトリ(ghidra_scripts)
  • 解析結果を相互検証するための二次参照ツール:IDA Free または Binary Ninja

ワークフロー

ステップ 1:プロジェクトを作成してバイナリをインポートする

Ghidra プロジェクトを設定し、マルウェアサンプルをインポートします。

1. Launch Ghidra: ghidraRun (Linux) or ghidraRun.bat (Windows)
2. File -> New Project -> Non-Shared Project -> Select directory
3. File -> Import File -> Select malware binary
4. Ghidra auto-detects format (PE, ELF, Mach-O) and architecture
5. Accept default import options (or specify base address if known)
6. Double-click imported file to open in CodeBrowser
7. When prompted, run Auto Analysis with default analyzers enabled

自動化のためのヘッドレス解析:

# Run Ghidra headless analysis with decompiler
/opt/ghidra/support/analyzeHeadless /tmp/ghidra_project MalwareProject \
  -import suspect.exe \
  -postScript ExportDecompilation.py \
  -scriptPath /opt/ghidra/scripts/ \
  -deleteProject
ステップ 2:主要な関数とエントリーポイントを特定する

バイナリ内を移動して、重要なコードセクションを見つけます。

Navigation Strategy:
━━━━━━━━━━━━━━━━━━━
1. Start at entry point (OEP) - follow execution from _start/WinMain
2. Check Symbol Tree for imported functions (Window -> Symbol Tree)
3. Search for cross-references to suspicious APIs:
   - VirtualAlloc/VirtualAllocEx (memory allocation for injection)
   - CreateRemoteThread (remote thread injection)
   - CryptEncrypt/CryptDecrypt (encryption operations)
   - InternetOpen/HttpSendRequest (C2 communication)
   - RegSetValueEx (persistence via registry)
4. Use Search -> For Strings to find embedded URLs, IPs, and paths
5. Check the Functions window sorted by size (large functions often contain core logic)

効率的な移動に役立つ Ghidra のキーボードショートカット:

G         - Go to address
Ctrl+E    - Search for strings
X         - Show cross-references to current location
Ctrl+Shift+F - Search memory for byte patterns
L         - Rename label/function
;         - Add comment
T         - Retype variable
Ctrl+L    - Retype return value
ステップ 3:デコンパイルされたコードを解析する

Ghidra のデコンパイラーを使って、関数のロジックを理解します。

// Example: Ghidra decompiler output for a decryption routine
// Analyst renames variables and adds types for clarity

void decrypt_config(BYTE *encrypted_data, int data_len, BYTE *key, int key_len) {
    // XOR decryption with rolling key
    for (int i = 0; i < data_len; i++) {
        encrypted_data[i] = encrypted_data[i] ^ key[i % key_len];
    }
    return;
}

// Analyst actions in Ghidra:
// 1. Right-click parameters -> Retype to correct types (BYTE*, int)
// 2. Right-click variables -> Rename to meaningful names
// 3. Add comments explaining the algorithm
// 4. Set function signature to propagate types to callers
ステップ 4:C2 通信ロジックを追跡する

ネットワーク通信のコードパスをたどります。

Analysis Steps for C2 Protocol Reverse Engineering:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Find InternetOpenA/WinHttpOpen call -> trace to wrapper function
2. Follow data flow from encrypted config -> URL construction
3. Identify HTTP method (GET/POST), headers, and body format
4. Locate response parsing logic (JSON parsing, custom binary protocol)
5. Map the C2 command dispatcher (switch/case or jump table)
6. Document the command set (download, execute, exfiltrate, update, uninstall)

C2 設定を抽出する Ghidra スクリプト:

# Ghidra Python script: extract_c2_config.py
# Run via Script Manager in Ghidra

from ghidra.program.model.data import StringDataType
from ghidra.program.model.symbol import SourceType

# Search for XOR decryption patterns
listing = currentProgram.getListing()
memory = currentProgram.getMemory()

# Find references to InternetOpenA
symbol_table = currentProgram.getSymbolTable()
for symbol in symbol_table.getExternalSymbols():
    if "InternetOpen" in symbol.getName():
        refs = getReferencesTo(symbol.getAddress())
        for ref in refs:
            print("C2 init at: {}".format(ref.getFromAddress()))
ステップ 5:暗号化と難読化を解析する

暗号処理ルーチンを特定し、記録します。

Common Malware Encryption Patterns:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
XOR Cipher:     Loop with XOR operation, often single-byte or rolling key
RC4:            Two loops (KSA + PRGA), 256-byte S-box initialization
AES:            Look for S-box constants (0x63, 0x7C, 0x77...) or calls to CryptEncrypt
Base64:         Lookup table with A-Za-z0-9+/= characters
Custom:         Combination of arithmetic operations (ADD, SUB, ROL, ROR with XOR)

Identification Tips:
- Search for constants: AES S-box, CRC32 table, MD5 init values
- Look for loop structures operating on byte arrays
- Check for Windows Crypto API usage (CryptAcquireContext -> CryptCreateHash -> CryptEncrypt)
- FindCrypt Ghidra plugin automatically identifies crypto constants
ステップ 6:調査結果を記録し、検出シグネチャを作成する

リバースエンジニアリングから実用的なインテリジェンスを作成します。

# Generate YARA rule from unique code patterns found in Ghidra
cat << 'EOF' > malware_family_x.yar
rule MalwareFamilyX_Decryptor {
    meta:
        description = "Detects MalwareX decryption routine"
        author = "analyst"
        date = "2025-09-15"
    strings:
        // XOR decryption loop with hardcoded key
        $decrypt = { 8A 04 0E 32 04 0F 88 04 0E 41 3B CA 7C F3 }
        // C2 URL pattern after decryption
        $c2_pattern = "/gate.php?id=" ascii
    condition:
        uint16(0) == 0x5A4D and $decrypt and $c2_pattern
}
EOF

主要な概念

用語定義
逆アセンブルマシンコードのバイト列を、人が読めるアセンブリ言語の命令に変換すること。Ghidra の Listing ビューには逆アセンブルされたコードが表示されます
デコンパイルアセンブリコードを解析しやすい疑似 C 表現に変換すること。Ghidra の Decompile ウィンドウにこの表示が提供されます
クロスリファレンス(XREF)関数またはデータのアドレスが、どこから呼び出されているか、またはどこで使用されているかを示す参照。コードの実行フローを追跡するうえで不可欠です
制御フローグラフ(CFG)関数内で実行可能なすべての経路を視覚化したもの。分岐ロジックやループを明らかにします
オリジナルエントリーポイント(OEP)アンパック後のマルウェアコードの実際の開始アドレス。パッカーはまず、アンパック用スタブを介して実行をリダイレクトします
関数シグネチャ関数の戻り値の型、名前、パラメーターの型。正しいシグネチャを適用すると、デコンパイラーの出力品質が向上します
Ghidra スクリプト一括解析、パターン検索、またはデータ抽出を実行するために Ghidra 内で実行される Python または Java の自動化スクリプト

ツールとシステム

  • Ghidra:NSA のオープンソースのソフトウェアリバースエンジニアリングスイート。逆アセンブラー、デコンパイラー、複数のアーキテクチャに対応したスクリプト機能を備えています
  • IDA Pro/Free:業界標準の対話型逆アセンブラー。IDA Free では、x86/x64 のクラウドベースのデコンパイルを利用できます
  • Binary Ninja:最新の UI と、プラグイン開発向けの充実した API を備えた商用リバースエンジニアリングプラットフォーム
  • x64dbg:Windows で使用するオープンソースの x64/x32 デバッガー。Ghidra と併用して、マルウェアを動的にデバッグします
  • FindCrypt(Ghidra プラグイン):バイナリコード内の暗号定数とアルゴリズムを特定するプラグイン

一般的なシナリオ

シナリオ:カスタムC2プロトコルのリバースエンジニアリング

コンテキスト:動的解析の結果、標準外のポートで外部IPアドレスに向かう暗号化トラフィックが確認されています。プロトコルが独自仕様のため、ネットワークシグネチャでは亜種を検出できません。プロトコルの構造を理解するには、詳細なリバースエンジニアリングが必要です。

アプローチ:

  1. 展開済みのサンプルをGhidraにインポートし、完全な自動解析を実行します
  2. ソケット/WinHTTP APIの呼び出し箇所を特定し、呼び出し元の関数までさかのぼります
  3. データ送信前に呼び出される暗号化ルーチンを特定します(send/HttpSendRequestからデータフローを追跡します)
  4. 暗号化を解析します(XORキーの抽出、RC4キーの導出、AESキーの場所の特定)
  5. 応答解析関数を分析してコマンド構造を対応付けます(コマンドIDに対するswitch/case)
  6. プロトコル形式を記録します(ヘッダー構造、コマンドバイト、暗号化方式)
  7. ネットワーク監視ツール用のプロトコルデコーダースクリプトを作成します

落とし穴:

  • 手動解析を始める前に完全な自動解析を実行しない(関数の境界や型の伝播を見落とします)
  • 関数ポインターやvtableを介した間接呼び出しを無視する(関数アドレスを格納したデータへのクロスリファレンスを使用します)
  • GhidraのFunction ID(FID)やFLIRTシグネチャで特定できるはずのライブラリコードに時間を費やす
  • Ghidraプロジェクトの進行状況をこまめに保存しない(クラッシュ時に解析状態が失われることがあります)

出力形式

REVERSE ENGINEERING ANALYSIS REPORT
=====================================
Sample:           unpacked_payload.exe
SHA-256:          abc123def456...
Architecture:     x86 (32-bit PE)
Ghidra Project:   MalwareX_Analysis

FUNCTION MAP
0x00401000  main()              - Entry point, initializes config
0x00401200  decrypt_config()    - XOR decryption with 16-byte key
0x00401400  init_c2()           - WinHTTP initialization, URL construction
0x00401800  c2_beacon()         - HTTP POST beacon with system info
0x00401C00  cmd_dispatcher()    - Switch on 12 command codes
0x00402000  inject_process()    - Process hollowing into svchost.exe
0x00402400  persist_registry()  - HKCU Run key persistence
0x00402800  exfil_data()        - File collection and encrypted upload

C2 PROTOCOL
Method:           HTTPS POST to /gate.php
Encryption:       RC4 with derived key (MD5 of bot_id + campaign_key)
Bot ID Format:    MD5(hostname + username + volume_serial)
Beacon Interval:  60 seconds with 10% jitter
Command Set:
  0x01 - Download and execute file
  0x02 - Execute shell command
  0x03 - Upload file to C2
  0x04 - Update configuration
  0x05 - Uninstall and remove traces

ENCRYPTION DETAILS
Algorithm:        RC4
Key Derivation:   MD5(bot_id + "campaign_2025_q3")
Hardcoded Seed:   "campaign_2025_q3" at offset 0x00405A00

EXTRACTED IOCs
C2 URLs:          hxxps://update.malicious[.]com/gate.php
                  hxxps://backup.evil[.]net/gate.php (failover)
Campaign ID:      campaign_2025_q3
RC4 Key Material: [see encryption details above]

コメント