マルウェア解析 は何をしますか?
アクション必須(読んだらすぐ実行)
NOW: ../field-journal/precedent-reverse.md を読み、本スキルの操作が許可された通常操作であることを確認
NOW: 現在のタスクが本スキルの適用範囲に該当するか確認
NEXT: ../tool-index.md を読み、ツールの利用可能性と実際のパスを検証
NEXT: ツールが不足している場合はbootstrapを呼び出し、パスを推測しない
ACT: 「ワークフロー」の最初のステップに入り実行する。確認状態で止まらない
YARA / Sigma / サンドボックス / IOC抽出 / アンチアナリシス
静的 + 動的 + 行動 三位一体
適用シナリオ
- マルウェアサンプル分析(PE/ELF/Mach-O/APK/スクリプト)
- YARAルール作成と検証
- Sigma行動検知ルール生成
- サンドボックス自動化分析オーケストレーション
- IOC抽出と脅威インテリジェンス
- アンチ解析技術の検出とバイパス
6フェーズ分析フロー
Phase 1: 初診
file sample.exe
strings sample.exe | grep -i "http\|cmd\|powershell\|base64"
rabin2 -zz sample.exe
floss sample.exe
pecheck sample.exe
pescan sample.exe
diec sample.exe
sha256sum sample.exe
トリアージMUST チェックリスト(Issue #65):
□ ファイルタイプ: EXE / DLL / SYS / .NET / スクリプト(bat|ps1|vba) / その他
□ アーキテクチャ x86/x64/ARM;パッカー確認(DIE等)とコンパイル言語の手がかり
□ DLL/SYS: インポートテーブルとエクスポートテーブルを併せてチェック(Phase 2 ハードゲート参照)
□ .NET: 従来のIATなし → dnSpy/IL/メタデータ等価アンカーを使用(Phase 2 参照)
□ スクリプト/マクロ/DLL 特急P0: nonpe-format-cookbook U–AV(E-batch-deobf / E-ps-decode / E-vba-pcode / E-dll-*)
Phase 1b: アンパックとIAT処理(パッカー有りの場合 · Issue #65)
□ パッカー無し / .NET → Phase 2 へスキップ
□ パッカー有り: アンパック試行(許可された隔離環境)→ IAT修復を試みる
- x86:ImportREC(または同等);x64:Scylla(または同等)。64ビットでImportRECを使用してはならない
□ 【IAT修復の鉄則】自動/半自動修復を優先;ツールがエラーを出す、または修復後に実行できない場合:
- 直ちに静的IAT修復を中止
- MUST E-iat-repair-fail(コマンド、ツール、現象)を記録
- Phase 3 動的へ移行: APIブレークポイント(例: bp CreateFile)/ ハードウェアブレークポイント / メモリ検索でインポートを取得
- これはインポートテーブルのスキップではない: パスは試行され、Evidenceに記録済み
□ 【パッチ6】アンパック+IAT修復後にクラッシュ/ブルースクリーン(CRC/サイズ自己検証の疑い):
- ファイルの静的修復を断念;E-self-check-crash または E-iat-repair-fail に統合して記録
- Phase 3 へ: CreateFile / GetFileSize / ハッシュ関連APIにブレークポイント設定
□ ユーザー指示の実現可能性(§0.5): パッカー有りの状態でユーザーが「アンパックより先にインポートテーブルを見たい」と主張 → ブロックを説明 + 確認を依頼;強制された場合は quality=unreadable/packed と記録し、意味のあるIATを完了したと偽装してはならない
□ ユーザーが「IAT修復/インポートテーブル検査」のやり直しを要求 → MUST 指名されたステップをやり直す(または確認済みの前提条件を経て合意された結果に基づく)。無関係なステップに差し替えて完了したと偽装してはならない
Phase 2: 静的解析
逆アセンブル/逆コンパイル:
□ IDA Pro / Ghidra: 詳細逆コンパイル
□ radare2: CLI高速解析
□ x64dbg: Windows GUIデバッガ
重点分析領域:
□ エントリポイント(Entry Point)→ 初期化ロジック
□ インポートテーブル → API用途推測(CreateRemoteThread=インジェクション, CryptEncrypt=ランサムウェア)
**MUST(ハードゲート)**: rabin2 -i / IDA imports / pecheck 相当のコマンドを実行し、インポートテーブルを分類してEvidence(E-imports)に要約した後にのみPhase 3に進める(E-iat-repair-failを記録済みで動的パスを通る場合を除く)
分類は最低限: ネットワーク / ファイル / 暗号化 / プロセスインジェクション / レジストリ / その他疑わしいAPIをカバー
解析失敗またはテーブルが空: それでもMUST 失敗出力を記録し、黙ってスキップしてはならない
**DLL/SYS**: MUST エクスポートテーブルのEvidence(E-exports、`rabin2 -E` または同等)を併せて記録
**.NET**: 従来のIATがない場合、MUST dnSpy/IL/メタデータ/アセンブリ参照と機密APIの要約を等価アンカーとして使用し、E-imports / E-triage-imports セマンティックスロットに書き込む
**クリーンなインポートテーブル**: 基本DLLのみ、ビジネスAPIがほとんどない → MUST 動的ロードの疑い(LoadLibrary/GetProcAddress)を指摘し、SHOULD Phase 3 でメモリAPIを取得;ハッシュ解決特徴が見られる場合は → E-api-hash(パッチN)
**ワイド文字列(T)**: ASCII stringsでIOCが見つからない場合、MUST UTF-16も試す(strings -el / IDA unicode)
**署名(F)**: 署名があってもMUST SigCheck;偽造/失効は脅威レベルを下げない
ユーザーが「インポートテーブル検査のやり直し」を要求 → MUST 本項目をやり直す(ブロック時は実現可能性ゲートを経て合意);他のステップに差し替えて完了したと偽装してはならない
**危険なAPIの組み合わせ(パッチ8)**: テーブルが長すぎる場合、悪意のある組み合わせクラスタ(例: FindWindow+WriteProcessMemory+CreateRemoteThread)を優先的に出力し、純粋なシステム基本呼び出しノイズをフィルタリング
□ リソースセクション → 組み込みペイロード(.rsrc セクション)
□ 文字列テーブル → URL/C2/ファイルパス/Base64 blob
□ TLSコールバック → デバッガ起動前に実行
Phase 3: サンドボックス動的解析
自動サンドボックス:
□ Joe Sandbox / ANY.RUN / Triage: 商用サンドボックス
□ CAPE Sandbox: オープンソース + YARA統合(推奨)
□ ASD Azul: オープンソースマルウェア分析プラットフォーム(2026年新リリース)
□ Cuckoo Sandbox: 古典的オープンソース(徐々にCAPEに置き換えられつつある)
デバッグ初期手順(パッチ7+10 · MUST 順序、ユーザーモードデバッガ):
□ ① TLSコールバックブレークポイント → ② エントリポイントEPブレークポイント → ③ 機密APIブレークポイント → ④ ExitProcess/終了パス安全ブレークポイント
□ ExitProcessがトリガーされた場合: 急いで再起動しない;直ちにメモリダンプし、パスをEvidenceに書き込む(パッチ10)
監視重点:
□ プロセス作成: CreateProcess / ShellExecute
□ ファイル操作: WriteFile → ランサムウェア? DeleteFile → Wiper?
□ レジストリ: Run/RunOnce 永続化
□ ネットワーク: HTTP/DNS → C2通信
□ メモリ: VirtualAllocEx → プロセスインジェクション
□ サービス: CreateService → 永続化
□ IAT修復失敗 / 自己検証クラッシュサンプル: 機密API + CreateFile/GetFileSize ブレークポイント / ハードウェア実行ブレークポイント / メモリ検索
無行動緊急分岐(MUST):
□ サンドボックスで行動なし、即終了、または無限スリープ → アンチデバッグ/アンチ仮想マシンをチェック(CPUID、タイマー、環境特徴)
□ ハードウェアブレークポイントによるバイパス、チェックポイントへのパッチ適用、または物理マシン/高忠実環境への変更を試みる
□ 「行動なし + 条件」をEvidenceに書き込む;無条件で「サンプル無害」と書いてはならない
タイムボックス(パッチ9 · SHOULD デフォルト、上書き可能):
□ 静的詳細分析約15分で重要なパスが見つからない → 強制的に本Phase動的に移行
□ 動的シングルステップ約200命令で悪意の手がかりなし → 強制的に静的/相互参照に戻り、再度アンカー設定
アンチデバッグ/難読化バイパス(Issue #65 A–T · 詳細は reverse-engineering/anti-analysis.md のレシピを参照):
□ P0: CPUID / RDTSC / PEB / NtQueryInformationProcess → 検出ポイントを記録後、ラボでバイパスするか環境を変更(E-anti-debug-*)
□ P0: クリーンなIAT → APIハッシュ動的解決(bp GetProcAddress、E-api-hash)
□ P0: strings 空 → 文字列復号ルーチン + ワイド文字列UTF-16(E-string-decrypt / E-wide-strings)
□ P0: 疑わしい署名 → SigCheck;無効/失効は脅威レベルを下げない(E-sig-forge)
□ P1: プロセス名スキャン / VEH / int3·DR / オーバーラップセクション / Overlay / .rsrc / Delay-Load
□ H/S フラット化と不透明述語 → ollvm-deobfuscation.md(ここでは長文をコピーしない)
□ バイパスに失敗してもEvidenceを書き込む;アンチデバッグで終了したからといってサンプル無害として扱ってはならない
非PE / スクリプト / DLL 補完(Issue #65 U–AV · 詳細は reverse-engineering/references/nonpe-format-cookbook.md):
□ bat/cmd: SET 結合復元(U)→ E-batch-deobf;UTF-16 BOM(V);REM/GOTO 埋め込み(W)
□ PowerShell: 多段Base64/Gzip(X)各段階Evidenceを記録;IEX 結合/反転(Z)
□ VBA: Stomping/P-Code(AA);Chr/Base64(AB);自己書き換えマクロ(AC)
□ DLL: TLS+DllMain(AJ);エクスポート異常/エクスポートなし(AK/AL);Delay-Load は A–T R を参照(AM);サイドローディング/リフレクション(AO/AP)
□ JS/APK/ドライバ: ルーティングは js-reverse / apk-reverse / kernel-driver-reverse + cookbook を使用し、ここでは長文をコピーしない
Phase 4: YARAルール作成
// ルール構造
rule MalwareFamily_Example {
meta:
description = "Exampleマルウェアファミリーの検出"
author = "分析者"
date = "2026-05"
severity = "high"
hash = "d41d8cd98f00b204e9800998ecf8427e"
mitre_id = "T1055" // プロセスインジェクション
strings:
// 文字列マッチ
$str1 = "C2_SERVER_URL" ascii wide
$str2 = "payload.dat" ascii
// 16進マッチ
$hex1 = { 8B 45 ?? 50 FF 15 [4] 85 C0 }
// オペコードシーケンス: mov eax, [ebp-?]; push eax; call [import]; test eax, eax
// 正規表現マッチ
$re1 = /https?:\/\/[a-z0-9.-]+\/[a-z]{3,8}\.php/ ascii
condition:
// 組み合わせ条件
uint16(0) == 0x5A4D and // MZヘッダ
filesize < 500KB and
(2 of ($str*) or $hex1)
}
Phase 5: Sigmaルール生成
title: Suspicious Process Injection via CreateRemoteThread
id: 5a3d2c1b-1234-5678-9abc-def012345678
status: experimental
description: CreateRemoteThreadを使用したプロセスインジェクション行動の検出
author: 分析者
date: 2026/05/25
tags:
- attack.t1055
- attack.t1055.001
logsource:
category: process_creation
product: windows
detection:
selection:
Image|endswith: '\powershell.exe'
CommandLine|contains:
- 'CreateRemoteThread'
- 'VirtualAllocEx'
- 'WriteProcessMemory'
condition: selection
falsepositives:
- 正当なデバッグツール
level: high
Phase 6: IOC抽出とインテリジェンス
IOCタイプ分類:
□ ネットワークIOC:
- IP: C2アドレス(有効期限に注意)
- Domain: DGAアルゴリズムで生成されたドメイン(rsnkfda.com, xpqmje.net)
- URL: ペイロードホスティングアドレス
- User-Agent: カスタムUA文字列
□ ホストIOC:
- ファイルパス: %APPDATA%\Microsoft\Crypto\RSA\*.dat
- レジストリ: HKCU\Software\Microsoft\Windows\CurrentVersion\Run\
- Mutex: Global\{GUID} ミューテックス名
- サービス名: システムサービスに偽装した名前
□ 行動IOC:
- MITRE ATT&CK テクニックID(T1055, T1003, T1571...)
- Sigmaルール → SIEM統合
- YARAルール → エンドポイント検知
□ 静的IOC:
- コンパイルタイムスタンプ(偽装可能)
- PDBパス(開発者情報を含む)
- セクション名異常(非標準の .text/.data)
- インポートテーブル異常な組み合わせ(例: ランサムウェア CryptEncrypt + DeleteShadowCopies)
アンチ解析技術クイックリファレンス
| 技術 | 検出方法 | YARA特徴 |
|---|
| 仮想マシン検出 | WMI Win32_BIOS/VideoController/Processor | Win32_ 文字列 + 特定ベンダー名 |
| サンドボックス検出 | ディスク < 60GB, RAM < 2GB, シングルコアCPU | GlobalMemoryStatusEx 呼び出しパターン |
| デバッガ検出 | IsDebuggerPresent, CheckRemoteDebuggerPresent | PEB.BeingDebugged オフセットアクセス |
| タイミングエスケープ | Sleep(300000) 後に悪意行動実行 | NtDelayExecution 長パラメータ |
| 地理位置検出 | キーボードレイアウト/タイムゾーンチェック → CIS諸国を除外 | GetKeyboardLayoutList 呼び出し |
| 親プロセス検出 | explorer.exe vs cmd.exe | プロセス名文字列比較 |
| API直接syscall | EDRフック回避 | syscall命令 + SSN解析 |
マルチエージェント自動分析(SentinelHiveアーキテクチャ)
┌─────────────────────────────────────────────────┐
│ Hive Director │
│ (Claude Opus オーケストレーション + アービトレーション) │
└──────┬──────┬──────┬──────┬──────┬───────┘
│ │ │ │ │
┌───┘ ┌───┘ ┌───┘ ┌───┘ ┌───┘
▼ ▼ ▼ ▼ ▼ ▼
Triage RE Behav Intel Detect Remed
迅速 逆コンパイル 行動 脅威 ルール 修復
診断 静的 動的 インテリジェンス YARA ソリューション
Sigma
ツールチェーン
| ツール | 用途 | 入手先 |
|---|
| Ghidra / IDA Pro | 詳細逆コンパイル | ghidra-sre.org |
| CAPE Sandbox | オープンソースマルウェアサンドボックス | GitHub: kevoreilly/CAPEv2 |
| ASD Azul | 大規模自動分析 | GitHub: ASD |
| YARA | パターンマッチングルールエンジン | pip install yara-python |
| Sigma | SIEM行動検知ルール | GitHub: SigmaHQ/sigma |
| FLOSS | 難読化除去された文字列抽出 | pip install flare-floss |
| Detect It Easy | パッカー/コンパイラ検出 | GitHub: horsicq/Detect-It-Easy |
| pe-sieve | プロセスメモリスキャン | GitHub: hasherezade/pe-sieve |
| VirusTotal API | マルチエンジンスキャン | virustotal.com |
| MalwareBazaar | マルウェアサンプルデータベース | bazaar.abuse.ch |
参考
references/yara-sigma-rules.md — YARA + Sigma 作成方法論
references/sandbox-orchestration.md — サンドボックスオーケストレーションと自動化
references/anti-analysis-techniques.md — 94種類のアンチ解析技術検出
../reverse-engineering/references/re-agent-workflow.md — IAT鉄則と6フェーズゲート(Issue #65)
../reverse-engineering/anti-analysis.md — エージェント応答レシピ A–T(アンチデバッグ/難読化バイパス)
../reverse-engineering/references/nonpe-format-cookbook.md — 非PE/マルチフォーマットレシピ U–AV(スクリプト/マクロ/JS/ドライバ/DLL/Android)
../reverse-engineering/references/ollvm-deobfuscation.md — フラット化/不透明述語(H/S)
タスク完了セルフチェック(完了を主張する前にMUSTパス)