
Экспертный агент по обратной разработке: планирует собственный путь анализа, выводит каждый факт из необработанных данных и сходится под механическими воротами верификации — прошивки, протоколы, web/JS, риск-контроль, бинарники.
kunglao-agent — это автономная система обратной разработки. Вы передаёте ей цель и вопросы, на которые нужны ответы; она самостоятельно работает над задачей часами или днями — планирует собственный путь, восстанавливается после сбоев воркеров, возобновляет работу после крашей — и сходится только тогда, когда каждый ответ выведен из сырых доказательств и прошёл механические проверочные шлюзы.
English · Simplified Chinese
В настоящее время он поставляется как плагин Claude Code — Claude Code это интерфейс, с которым вы общаетесь, а не то, чем является продукт. Продукт — это цикл: специализированные воркеры анализируют (сначала статически), независимый верификатор заново выводит каждый факт вслепую из сырых доказательств, а механические шлюзы решают, когда работа завершена. Результат — база фактов, где каждое утверждение привязано к байтам, независимо проверено и проиндексировано по доказательствам — доверие обеспечивается механизмами, а не соглашениями.
PROVEN, пока независимый верификатор не выведет его заново вслепую из сырого артефакта; каждый факт ссылается на сырой артефакт, проиндексированный по sha256, через evidence/_index.json.kunglao-agent работает внутри Claude Code. От образца на диске до вердикта:
Из любого каталога, в Claude Code:``` /plugin marketplace add amd2g2zz/kunglao-agent /plugin install kunglao-agent@kunglao-agent
(Альтернатива: `claude --plugin-dir /path/to/kunglao-agent` для разработки.)
### 2. Инициализация рабочего пространства```
/kunglao-agent:init ~/cases/synth-dropper --type windows
kunglao-init создаёт рабочее пространство, записывает CLAUDE.md, проверяет инструментарий для вашего --type и создаёт .mcp.json. Он ЖЁСТКО отклоняет запуск, если отсутствует требуемый инструмент для вашего типа — рекомендации по исправлению приведены в блоке ошибки.
/kunglao-agent:analysis ~/cases/synth-dropper
Goal: confirm this dropper's persistence mechanism and network endpoints; every conclusion must be reproducible from raw evidence. Verification: key findings count only if an independent verifier re-derives them blind and reaches the same answer. Constraints: static-first; never execute the sample on the host.
Сформулируйте задание так, чтобы независимый проверяющий мог оценить результат: **цель анализа** (что вам нужно узнать), **логика проверки** (что делает ответ заслуживающим доверия — например, «подпись должна воспроизводиться из тех же входных данных»), **ограничения** (например, «никакого выполнения на хосте»). Всё записывается в `task_spec.yaml`; оттуда цикл управляет собой сам. О том, как типичные запросы превращаются в корректно сформулированные утверждения, см. [Как поставить задачу](#how-to-state-the-task).
### 4. Прочитайте результат```
claim-register.yaml # every claim terminal, with verifier sign-off
facts/F<NNN>.md # byte-anchored, reproducible, frontmatter contract
evidence/_index.json # every fact → raw artifact (sha256 + path)
runs/ # session audit trail
Цикл выводит свой критерий завершения — оракул — механически из конечного состояния, которое вы задаёте. Расплывчатая формулировка даёт расплывчатый оракул, и анализ дрейфует в сторону того, что можно доказать, вместо того, что вам было нужно. Четыре формулировки охватывают большую часть этого дрейфа. Для каждой: что говорят пользователи, что это обычно означает, корректная формулировка и на что опирается оракул.
Обычно означает: офлайн-воспроизведение процедуры подписи/шифрования приложения — обвязка unidbg или переписанная реализация, работающая без устройства и без приложения во время выполнения. Не «проанализировать приложение»; приложение — лишь место, где живёт алгоритм.```
Sample: the v7.2 APK; behavior: the signer producing the
signheader on api.example.com/v2/* requests. Criterion: a standalone reproduction (unidbg or rewrite) replays every captured (input → sign) pair byte-exact — including the withheld pairs — with no device or app at run time. Attach: captures/sign-pairs.jsonl — 20 input/output pairs captured from a live session; 10 of them withheld from the analysis.
**Oracle anchors on:** byte-exact replay on every pair, including the withheld ones — and the reproduction running standalone.
### "我要解密" — "Я хочу расшифровать"
**Обычно означает одну из двух разных целей — уточните, какую:**
- **(a) расшифровать одно перехваченное тело** — разовый ответ об этих данных: "получить открытый текст этого перехваченного файла кэша."
- **(b) возможность расшифровки** — восстановление алгоритма + ключа, применимое к данным, которые вы перехватите завтра.
Корректно сформулированный вариант (a):```
> Sample: the v7.2 APK; behavior: the local config cache
> files/.cfg/v2.dat is encrypted at rest.
> Criterion: produce the plaintext of the captured v2.dat and validate
> it against what the app renders (field names and values match the
> screenshot captured alongside).
Корректно сформированный (b):```
Sample: the v7.2 APK; behavior: request bodies on api.example.com/v2/* are encrypted with a static key. Criterion: identify the algorithm and the key, then run a canary round-trip — encrypt a known plaintext with the recovered key and match the ciphertext the device produced, byte for byte. Attach: captures/request-bodies.jsonl — ciphertext bodies captured from the device, with the requests that produced them.
**Оракул опирается на:** (a) открытый текст, проходящий проверку на соответствие тому, что отображает приложение; (b) идентифицированные алгоритм и ключ, а также канарейка, проходящая круговой рейс байт-в-байт идентично шифротексту, созданному устройством. «Оно расшифровалось один раз» не удовлетворяет ни одному из этих условий.
### «帮我分析这个协议» — «проанализируй этот протокол для меня»
**Обычно означает:** восстановление формата передачи данных — кадрирование, семантика полей и кодек, который вы можете запустить.```
> Sample: the Android chat app; behavior: the TCP protocol on
> gateway.example.com:443, as captured in gateway-session.pcap.
> Criterion: a codec that round-trips every captured frame byte-exact,
> and decodes the held-out frame to fields matching the observed app
> behavior.
> Attach: captures/gateway-session.pcap — 40 frames, plus 1 held-out
> frame kept out of the analysis.
Oracle anchors on: кодек выполняет round-trip каждого захваченного кадра байт-в-байт, а отложенный кадр декодируется в поля, соответствующие наблюдаемому поведению приложения.
Обычно означает: место с доказательством. Указать точку в коде дёшево; ответ полезен только при наличии свидетельства, что эта точка и есть та самая точка.```
Sample: the v7.2 APK; behavior: the
signheader attached to every request. Criterion: name the class/method (or native function) wheresignis computed, and hook that point to reproduce the capturedsignvalues from the same inputs. Attach: captures/sign-session.jsonl — capturedsignvalues with their request inputs.
**Оракул опирается на:** именованный класс/метод/нативную функцию, плюс хук в этой точке, воспроизводящий захваченные значения.
### Что у них общего
- **Назовите образец и поведение** — какой параметр, точку входа или поток — а не категорию. «我要纯算» — это категория; «подписант, формирующий заголовок `sign` на api.example.com/v2/*» — это цель.
- **Успех должен быть данными.** Приложите захваченные пары вход/выход; именно удержанные пары делают проверку честной — воспроизведение не может переобучиться на данных, которых оно не видело.
- **Оракул выводится из заявленного вами конечного состояния.** Расплывчатое утверждение — расплывчатая верификация, дрейфующий анализ.
- **Ограничения меняют план.** Только статика? Есть устройство? Какой канал? Скажите об этом сразу — это определяет маршрут до начала работы (см. [Bring your own environment](#bring-your-own-environment)).
## Подкоманды
| Команда | Когда использовать | Что делает |
|---|---|---|
| `/kunglao-agent:init <workspace> [--type windows\|linux\|android\|web\|macos] [--lane malware\|algorithm\|protocol\|web\|data\|app]` | начало работы, первым делом | создаёт каркас рабочего пространства, проверяет инструментарий для указанного типа, записывает `CLAUDE.md` и `.mcp.json`; ЖЁСТКО отклоняет с указанием исправлений, когда отсутствует необходимый инструмент |
| `/kunglao-agent:analysis <workspace>` (алиас `analyze`) | после init — укажите задачу и запустите | один раз собирает вашу цель / логику верификации / ограничения, затем запускает цикл сходимости: циклы dispatch / verify до отчёта |
| `/kunglao-agent:resume <workspace>` | после сбоя, перезагрузки или любого «где я остановился?» | read-only сводка по точке останова (состояние, открытые утверждения, активные воркеры, хронология сбоев) плюс следующее действие из конечного автомата |
| `/kunglao-agent:upgrade <workspace> [--dry-run]` | после обновления плагина, для старого рабочего пространства (или когда запрос на обновление сообщает, что штамп устарел) | мигрирует каркас рабочего пространства (хуки, шаблоны, словарь событий) к текущей версии плагина; `--dry-run` показывает предварительный просмотр; пользовательские данные (утверждения, факты, доказательства) никогда не затрагиваются — при побайтовом расхождении отказывает с RC=4 |
| `/kunglao-agent:help` | всё остальное | выводит список использования |
Типичный порядок: `init` создаёт рабочее пространство → `analysis` указывает задачу и запускает → (`resume`, если что-то пошло не так) → прочитайте отчёт при сходимости → `upgrade` старых рабочих пространств после обновлений плагина.
## Как выглядит запуск
*Форма работы — что вы вводите, что возвращается, куда смотреть.* Синтетический пример: небольшой Windows-дроппер попадает в `~/cases/synth-dropper`:```bash
/kunglao-agent:init ~/cases/synth-dropper --type windows # probes Ghidra, VM reachability
/kunglao-agent:analysis ~/cases/synth-dropper
> "What does this binary do, and where does it phone home?"
Оттуда цикл запускается сам — маршрут адаптируется к тому, чем окажется образец. Можно отойти (см. Долгосрочная автономность). Когда он сойдётся, прочитайте результат ниже.
Ещё два сквозных пути — выберите тот, что соответствует вашей цели (для обычного бинарника Windows PE / Linux ELF рабочий случай выше и есть этот путь).
Реестр утверждений и база фактов, где доверие механическое, а не условное:
PROVEN требует точного подтверждения от независимого слепого верификатора; CONVERGED требует, чтобы каждый первичный вопрос был отвечен с побайтовым доказательством, ноль осиротевших утверждений, никакого простаивания.evidence/_index.json до исходного артефакта (захват / трассировка / дамп / бинарник). Производные сводки исключены по замыслу.Ни одно утверждение не достигает PROVEN на слове своего автора: независимый верификатор должен перевывести его вслепую, и набор механических шлюзов должен быть пройден. Полный дизайн шлюзов описан в docs/design/loop-engineering.md.
После запуска файлы отвечают на разные вопросы:
Пример факта:```yaml id: F061 status: VERIFIED-BY-W01-static-byte-recheck claim_id: C-401 provenance:
## Долгосрочная автономность
Реальные задачи — это не двадцатиминутный чат. kunglao-agent остаётся на проблеме без человека, который ведёт каждый шаг:
- **Работает часами или днями без присмотра** — запланированный heartbeat поддерживает цикл между вашими визитами, а зависший цикл помечается флагом, а не тихо умирает.
- **Восстанавливается после сбоев** — мёртвые или застрявшие воркеры заменяются, а их вопросы возвращаются в очередь; заблокированная работа самовосстанавливается вместо простоя.
- **Переживает падения и перезагрузки** — `/kunglao-agent:resume <workspace>` восстанавливает состояние по данным на диске и называет следующее действие.
- **Помнит на диске, а не в чате** — заявки, факты, доказательства и полный журнал аудита живут в рабочем пространстве, так что любая сессия может подхватить задачу заново.
Вы даёте ему цель и вопросы; он работает над проблемой часами или днями, восстанавливается после сбоев, а вы читаете вердикт, когда он сходится.
## Как получить хорошие результаты
- **Подавайте ему цели, доступные статически.** Цикл в первую очередь статический: распакованный APK, необфусцированный бандл или нестрипленный бинарник сходится гораздо быстрее, чем тот, что вынуждает к динамической работе.
- **Настройте динамическую часть заранее.** Если ваши основные вопросы потребуют выполнения, сначала выберите канал (см. [Bring your own environment](#bring-your-own-environment)) — init HARD-отклоняет динамическую задачу на `local`.
- **Как отличить «работает» от «застрял»** — свежие записи в `runs/` означают, что цикл жив; мёртвый heartbeat или одно и то же решение, повторяющееся без новых фактов, означают, что нет — `/kunglao-agent:resume <workspace>` диагностирует и называет следующий шаг.
## Инструментарий по цели
Выбранный при init `--type` фиксирует, какие инструменты уровня HARD должны быть установлены. Подсказки свёрнуты — разверните свою цель. **Все типы требуют двух MCP-серверов:** `ghidra` (`claude mcp add ghidra -- <path>/bridge-mcp-ghidra.exe`) и `sequential-thinking` (`claude mcp add sequential-thinking -- npx -y @modelcontextprotocol/server-sequential-thinking`).
<details>
<summary><strong>windows (PE32+ x86-64)</strong> — нативные бинарники Windows</summary>
| Уровень | Инструмент | Установка |
|---|---|---|
| HARD | `pefile` (Python) | `pip install pefile` |
| HARD | `die` (Detect It Easy) | env `KUNGLAO_DIE` или в PATH — [ntinfo.com](https://ntinfo.com) |
| HARD | `floss` (FLARE FLOSS) | согласно [flare-floss docs](https://github.com/mandiant/flare-floss) |
| HARD | Ghidra или IDA | один из них; см. [Internals](#internals) |
| HARD (T2/T3) | VMware + vmr-shell, или канал ssh/docker | см. [Bring your own environment](#bring-your-own-environment) |
| HARD (T2/T3) | `frida-server` (переименованный, нестандартный порт) | бинарник на стороне устройства/VM, порт по умолчанию 1337 |
Динамика Windows T3 также использует MCP `x64dbg`; `volatility` (форензика памяти) и IDA-Pro MCP опциональны — см. манифест MCP в разделе [Internals](#internals).
</details>
<details>
<summary><strong>linux (ELF)</strong> — нативные бинарники Linux / прошивки / образы памяти</summary>
| Уровень | Инструмент | Установка |
|---|---|---|
| HARD | `file`, `readelf`, `objdump` | пакет `binutils` |
| HARD | Ghidra или IDA | один из них |
| HARD (T2/T3) | VMware + vmr-shell, или плоскость управления ssh/docker | см. [Bring your own environment](#bring-your-own-environment) |
| HARD (T2/T3) | `frida-server` (переименованный, нестандартный порт) | бинарник на стороне устройства, порт 1337 |
| WARN | `gdbserver` (в PATH на хосте), `strace`, `ltrace` | опциональные дополнения |
`ssh-mcp` включает плоскость управления ssh для удалённых / облачных / docker-хостов.
</details>
<details>
<summary><strong>android (APK / DEX / нативный .so)</strong> — самый сложный тип цели, больше всего элементов HARD</summary>
| Уровень | Инструмент | Установка |
|---|---|---|
| HARD | `aapt` или `aapt2` (или запасной `unzip`) | Android SDK build-tools |
| HARD | `jadx` (декомпилятор DEX → Java) | [skylot/jadx](https://github.com/skylot/jadx) |
| HARD | `apktool` (декодирование/пересборка ресурсов APK) | [iBotPeaches/Apktool](https://github.com/iBotPeaches/Apktool) |
| HARD | `gitnexus` (граф после декомпиляции) | `npm i -g gitnexus` |
| HARD | Ghidra или IDA | только если APK содержит нативные `.so` |
| HARD | `adb` + **рутованное устройство** с `ro.debuggable=1` | platform-tools + кастомный frida на устройстве |
| HARD | `frida-server` (переименованный, нестандартный порт 1337) | бинарник на стороне устройства |
| HARD | `android_server` (удалённая отладка IDA) | бинарник на стороне устройства, порт 23946 |
| WARN | `apkid` | `pip install apkid` |
| WARN | `baksmali` | из [smali releases](https://github.com/baksmali/smali/releases) |
</details>
<details>
<summary><strong>web & macos (beta)</strong> — минимальные инструментарии, без элементов HARD по замыслу</summary>
| Уровень | Инструмент | Установка |
|---|---|---|
| WARN | MCP `camoufox-reverse` (web) | антидетект Firefox для хуков / трассировки / перехвата сети |
| WARN | `docker` (канал web по умолчанию) | Docker Desktop, или явно задайте `KUNGLAO_CHANNEL=ssh` |
| WARN | `lipo`, `otool`, `nm`, `codesign`, `xattr` (macOS) | Xcode Command Line Tools |
| WARN | MCP `ghidra` (macOS) | рекомендуется — см. манифест в разделе [Internals](#internals) |
Обе цели находятся в стадии беты: отсутствующие возможности всплывают, когда цикл действительно в них нуждается, а не при init. Динамическая работа на macOS использует канал `ssh` (к хосту Mac); для опционального пути отладки в браузере через x64dbg установите инструментарий Windows выше.
</details>
Единый источник манифеста для всего вышеперечисленного — проверяйте его в любой момент: `python scripts/mcp_probe.py <ws> --type <windows|linux|android|web|macos>` (exit 1 = HARD отсутствует).
## Bring your own environment
Динамическая отладка требует плоскости управления выполнением, которой может управлять агент. `KUNGLAO_CHANNEL` выбирает один из пяти первоклассных каналов — используйте то, что уже есть в вашей среде; ни один из них не является урезанным режимом:
| Канал | Чем управляет | Предварительные требования |
|---|---|---|
| `vmr` (по умолчанию) | VMware VM, **любая гостевая ОС** — рабочие процессы snapshot/revert — его незаменимая ценность | навык vmr-shell; `KUNGLAO_VM_HOST` + порты 9876/1337 |
| `ssh` | Любой хост, доступный по ssh: bare metal, облачная VM, Mac, удалённый docker-хост | аутентификация по ключу — проба выполняет реальный BatchMode `ssh ... true` |
| `docker` | Локальный или удалённый docker-демон — `docker exec` эквивалентен любому пути управления | `docker version` зелёный; опционально `KUNGLAO_DOCKER_CONTAINER` |
| `adb` | Эмулятор Android или реальное устройство | `adb devices` показывает его; `adb forward tcp:1337 tcp:1337` для frida |
| `local` | **Только статический анализ на хосте** | нет — см. красную линию |
> **Красная линия `local`:** local предназначен только для **статической** работы — никогда не выполняйте, не отлаживайте и не внедряйте образец на хосте. Любое динамическое требование переключает `KUNGLAO_CHANNEL` на `vmr`/`ssh`/`docker`/`adb`; init HARD-отклоняет динамическую задачу на `local`.
Пробы каналов выполняются только для динамических задач (задачи только со статикой их пропускают). Выполнение через канал `ssh` идёт через плоскость управления **ssh-mcp** (`npm i -g ssh-mcp`); обычный CLI ssh — запасной вариант. Для удалённого docker через ssh задайте `KUNGLAO_DOCKER_CONTAINER`.
## Конфигурация
Четыре переменные покрывают большинство конфигураций:
| Переменная | По умолчанию | Значение |
|---|---|---|
| `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` | не задана | должна оставаться незаданной или `0` — истинные значения направляют диспетчеризацию через канал teammate и отклоняются |
| `KUNGLAO_CHANNEL` | `vmr` | плоскость управления динамическим выполнением: `vmr` \| `ssh` \| `docker` \| `adb` \| `local` — см. [Bring your own environment](#bring-your-own-environment) |
| `KUNGLAO_VM_HOST` | не задана | VM/хост для динамического анализа (vmr-shell :9876, Frida :1337) |
| `GHIDRA_HOME` | не задана | корень установки Ghidra (должен содержать `support/analyzeHeadless.bat`) |
Требуются редко: `KUNGLAO_DOCKER_CONTAINER` (цель выполнения docker для каналов `ssh`/`docker`), `KUNGLAO_FRIDA_PORT` (по умолчанию 1337), `KUNGLAO_DIE` (путь к DIE, с откатом к PATH), `KUNGLAO_CLAUDE_JSON` (переопределение для тестов реестра MCP уровня пользователя).
## Безопасность
- Образцы никогда не выполняются на хосте — это обеспечивает хук `block_malware_exec`; динамическая работа выполняется только в VM/контейнере/устройстве и требует авторизации на каждую сессию.
- Иерархия достоверности: сырой артефакт > локальный инструмент > песочница > threat intel (CTI — это опровергаемая гипотеза, а не истина).
- Maker-checker: воркер никогда не верифицирует сам себя; верификатор никогда не читает вывод мейкера.
- Бинарники, настройки и хуки никогда не коммитятся; секреты исключены из рабочих пространств и репозитория.
## Разработка
Вклад приветствуется. Рабочий процесс: ветка от `dev`, одна ветка на изменение, PR обратно в `dev`.```bash
git worktree add .worktrees/<name> -b <name> dev
uv sync --locked
uv run python -m pytest -q
gh pr create --base dev
Авторитетная точка входа для полного набора тестов — python -m pytest -q (см. .github/workflows/release-check.yml).
Документация по проектированию находится в docs/ и specs/. См. License.
Единый источник истины: scripts/mcp_probe.py; kunglao-init создаёт каркас рабочего пространства .mcp.json, если он отсутствует (--no-mcp пропускает; существующий файл никогда не перезаписывается). Проверка: python scripts/mcp_probe.py <ws> --type <windows|linux|android|web|macos> — код выхода 1 = HARD отсутствует, 2 = только WARN отсутствует.
Одно рабочее пространство на одно исследование образца:
Двойное лицензирование: AGPL-3.0 для личного, академического и внутреннего использования (бесплатно — см. LICENSE); коммерческая лицензия требуется для закрытого исходного кода или коммерческого использования в формате SaaS — см. LICENSE-commercial.md.
| Инструмент | Зачем | Установка |
|---|
| Claude Code | где работает kunglao-agent | согласно документации Anthropic |
| Python 3.10+ (Python 2 не поддерживается) | плагин несёт закреплённое окружение через uv; вы его не трогаете | системный или управляемый uv |
uv | резолвер заблокированного окружения | pip install uv или astral.sh/uv |
| Ghidra или IDA | один набор для статического анализа и декомпиляции | см. Toolchain by target |
| Вопрос | Где |
|---|
| Готово ли это? | код выхода цикла — CONVERGED (0) означает, что каждый первичный вопрос имеет проверенный ответ; статус по каждому утверждению в claim-register.yaml |
| Что найдено? | facts/F<NNN>.md — один привязанный к байтам факт на файл, сопоставленный с утверждениями через claim-register.yaml |
| Как это воспроизвести? | evidence/_index.json — факт → исходный артефакт (путь + sha256); каждый факт несёт команду reproduce: |
| Что именно произошло? | runs/ — потактовый журнал и статус исполнителя |
| MCP-сервер | Уровень | Область | Назначение | Регистрация |
|---|
ghidra | HARD | обязательный, все типы | декомпиляция / статический анализ | claude mcp add ghidra -- <path>/bridge-mcp-ghidra.exe |
sequential-thinking | HARD | обязательный, все типы | структурированное рассуждение | claude mcp add sequential-thinking -- npx -y @modelcontextprotocol/server-sequential-thinking |
x64dbg | HARD | Windows T3 динамический | динамическая отладка (удалённая VM) | claude mcp add x64dbg -- x64dbg-automate-mcp |
volatility | WARN | Windows T3 | криминалистика памяти | claude mcp add volatility -- python <path>/volatility_mcp_server.py |
ida-pro-vm | WARN | при выборе IDA | удалённый анализ IDA | claude mcp add --transport http ida-pro-vm <ida-mcp-url> |
gitnexus | HARD | построение графа Android | граф знаний после декомпиляции | claude mcp add gitnexus -- gitnexus mcp |
virustotal | WARN | CTI | threat intel (гипотезы об атрибуции семейства) | claude mcp add virustotal -- npx -y @burtthecoder/mcp-virustotal |
ssh-mcp | WARN | канал | плоскость управления выполнением ssh | claude mcp add ssh-mcp -- ssh-mcp |
camoufox-reverse | WARN | web (бета) | реверс JS в браузере (хуки / трассировка / захват сети) | claude mcp add camoufox-reverse -- python -m camoufox_reverse_mcp |