# Как использовать ИИ-агента для реверс-инжиниринга: анализ и патчинг бинарников

> AI Release · @ai_release1 · https://ai-release.org/guides/kak-ispolzovat-ii-agenta-dlya-revers-inzhiniringa-anali.html

Реверс-инжиниринг (разбор готового исполняемого файла — «бинарника» — на логику и структуру) — это медленная ручная работа: часы на чтение дизассемблированного кода (текста машинных инструкций, переведённых в читаемый вид). Гайд показывает, как подключить к этому процессу ИИ-агента — программу, которая сама планирует шаги, вызывает инструменты и отвечает по результатам, — чтобы он готовил гипотезы, разбирал длинные листинги и подсказывал, где искать проверку лицензии или сетевой протокол. Подходит для ELF-файлов (формат исполняемых файлов в Linux) и PE-файлов (формат исполняемых файлов в Windows), как 64-битных, так и 32-битных, при анализе собственного ПО, учебных образцов и CTF-задач на изолированной машине.

## Требования и подготовка
![Иллюстрация к разделу «Требования и подготовка»](https://ai-release.org/guides/img/kak-ispolzovat-ii-agenta-dlya-revers-inzhiniringa-anali-ru-1.jpg)


- Изолированная виртуальная машина (ВМ) — отдельная «песочница», где запуск неизвестного файла не навредит основной системе. VirtualBox, VMware или аналог, без доступа к рабочей сети.
- ОС: Linux (например, Ubuntu) либо Windows 11 с WSL2 — подсистемой Linux внутри Windows.
- Базовые утилиты: `file` (определяет тип файла), `strings` (вытаскивает читаемые текстовые фрагменты), `readelf`/`objdump` (разбирают заголовки и код), отладчик `gdb`.
- Дизассемблер с графическим интерфейсом: Ghidra или radare2. Дизассемблер — программа, которая превращает байты в инструкции.
- Права: `sudo` только для установки пакетов; сам анализ — от обычного пользователя.
- Отдельный пользователь без прав на продуктивные системы и без сохранённых в системе ключей.
- API-ключ LLM-провайдера (API — интерфейс, через который программа обращается к модели). Как это устроено на стороне запросов, разобрано в гайде [Как использовать GPT-6.1 Sol через API: полное руководство](https://ai-release.org/guides/kak-ispolzovat-gpt-6-1-sol-cherez-api-polnoe-rukovodstv.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).
- Агентная обвязка: обычный чат не умеет сам вызывать команды. Как собрать из чата агента, пошагово описано в [Как превратить обычный чат с LLM в полноценного AI-агента](https://ai-release.org/guides/kak-prevratit-obychnyy-chat-s-llm-v-polnotsennogo-ai-ag.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

Чек-лист перед стартом:

- [ ] Я работаю только со своим, лицензированным или учебным бинарником
- [ ] ВМ отключена от корпоративной сети
- [ ] Сделан снимок (snapshot) ВМ до первого запуска образца
- [ ] Есть копия файла, оригинал не изменяется
- [ ] Все промпты и ответы агента сохраняются в лог

## Пошаговая инструкция
![Иллюстрация к разделу «Пошаговая инструкция»](https://ai-release.org/guides/img/kak-ispolzovat-ii-agenta-dlya-revers-inzhiniringa-anali-ru-2.jpg)


1. Создайте рабочую папку и снимок ВМ.
   ```bash
   mkdir -p ~/re/workspace
   cd ~/re/workspace
   ```
   **Пример:** после команд `pwd` выводит `/home/user/re/workspace`.
   *Почему так:* отдельная папка и снимок позволяют откатить всё состояние, если образец поведёт себя неожиданно. Ожидаемый результат: пустая папка и снимок с понятным именем, например `clean-before-analysis`.

2. Сделайте копию образца и посчитайте хеш.
   ```bash
   cp ./target.bin ~/re/workspace/target.bin
   sha256sum ~/re/workspace/target.bin
   ```
   **Пример вывода:** `3b1f...9d2c  /home/user/re/workspace/target.bin`.
   Хеш — короткий «отпечаток» файла. Он нужен, чтобы позже доказать, что вы анализировали именно этот файл и не подменили его. Ожидаемый результат: одна строка с 64 символами.

3. Проведите первичную разведку, не запуская файл.
   ```bash
   file ~/re/workspace/target.bin
   strings -n 6 ~/re/workspace/target.bin | head -n 30 > strings.txt
   readelf -h ~/re/workspace/target.bin
   ```
   **Пример вывода:** `ELF 64-bit LSB executable, x86-64` — вы сразу знаете архитектуру и разрядность.
   Ожидаемый результат: в `strings.txt` появились подсказки — URL, имена библиотек, тексты ошибок. Это дешёвый способ понять назначение программы за минуту.

4. Соберите из результатов «пакет контекста» для агента. Не отдавайте ему весь файл — только то, что относится к задаче.

| Что нашли | Инструмент | Что передать агенту |
|---|---|---|
| Тип и архитектура | `file`, `readelf -h` | одна строка с типом файла |
| Подозрительные строки | `strings` | 20–30 строк с подписями |
| Функции и импорты | `objdump`, Ghidra | список имён и адресов |
| Подозрительная функция | Ghidra | листинг одной функции целиком |

   **Пример:** вы нашли строку `License key invalid` — передаёте агенту её и адрес, где она используется. Ожидаемый результат: у агента достаточно данных, чтобы не догадываться, а ссылаться на факты.

5. Задайте агенту роль и жёсткие правила. Готовый шаблон промпта:
   ```text
   Ты помогаешь анализировать бинарник в изолированной ВМ.
   Данные: тип файла, список строк, листинг функции (см. ниже).
   Задача: найди, где проверяется лицензия.
   Правила: для каждой гипотезы указывай адрес и строку-доказательство;
   если данных нет — пиши "недостаточно данных", не выдумывай.
   ```
   *Почему это работает:* запрет на выдумывание и требование цитировать адреса резко снижают число ложных выводов. Ожидаемый результат: ответ в формате «адрес → строка → вывод».

6. Проверяйте каждую гипотезу руками в отладчике.
   ```bash
   gdb -q ~/re/workspace/target.bin
   (gdb) info functions
   (gdb) disassemble main
   ```
   **Пример:** агент предположил, что проверка идёт по адресу `0x401234` — вы ставите `break *0x401234`, запускаете `run` и видите, останавливается ли отладчик именно там.
   Ожидаемый результат: гипотеза подтверждена или отброшена. Агент — источник версий, истина — отладчик.

7. Патчите только копию, по одному изменению за раз.
   ```python
   path = "target_patched.bin"
   with open(path, "r+b") as f:
       f.seek(0x401234)      # адрес из шага 6
       f.write(bytes([0x90])) # 0x90 = NOP, инструкция "ничего не делать"
   ```
   **Пример:** заменив первую инструкцию условного перехода на NOP, вы проверяете, изменилось ли поведение.
   *Почему так:* байтовый патч — самое локальное изменение, по нему легко понять причину. Ожидаемый результат: файл `target_patched.bin` запускается и ведёт себя иначе, чем оригинал.

8. Сравните хеши и зафиксируйте результат.
   ```bash
   sha256sum target.bin target_patched.bin
   ```
   **Пример вывода:** две разные строки — значит, патч действительно применён.
   Ожидаемый результат: в логе появилась запись «адрес, что менял, что получилось». Без этого через день вы не вспомните логику правки.

## Возможные проблемы и решения
![Иллюстрация к разделу «Возможные проблемы и решения»](https://ai-release.org/guides/img/kak-ispolzovat-ii-agenta-dlya-revers-inzhiniringa-anali-ru-3.jpg)


**Агент придумывает адреса, которых нет.** Симптом: отладчик выдаёт ошибку вида `No symbol "0x402f10" in current context` или `Cannot access memory at address 0x402f10`.
Решение:
1. Вернитесь к шагу 5 и добавьте в промпт требование цитировать строку-доказательство.
2. Передайте агенту не весь листинг, а одну функцию — меньше простора для домыслов.
3. Каждую гипотезу прогоняйте через `info functions` и `disassemble`, пока адрес не подтвердится.

**Ответ обрывается или приходит ошибка о превышении длины запроса.** Симптом: сообщение вида «context length exceeded» или ответ обрывается на середине.
Решение:
1. Разбейте большую функцию на фрагменты по 100–200 строк.
2. Подавайте строки и импорты отдельно от листинга.
3. Сначала просите обзор («какие функции похожи на проверку ввода»), потом углубляйтесь в одну.

**После патча программа падает.** Симптом: `Segmentation fault` (нарушение доступа к памяти) или мгновенное завершение без вывода.
Решение:
1. Восстановите файл из копии `target.bin` и пересчитайте хеш.
2. Патчите по одному байту за раз и после каждого запуска фиксируйте поведение.
3. Проверьте, не попал ли байт внутрь инструкции: одна лишняя замена ломает выравнивание команд.

## FAQ

**Можно ли так анализировать чужой софт?**
Только если у вас есть права на этот файл: собственный продукт, лицензия на исследование, учебный образец или CTF-задача. Анализ чужого ПО без разрешения — нарушение закона и условий лицензии.

**Нужна ли видеокарта?**
Для базового сценария — нет. `strings`, `readelf`, Ghidra и `gdb` работают на процессоре, а модель вызывается по API. Видеокарта понадобится, только если вы захотите держать модель локально.

**ИИ заменяет дизассемблер и отладчик?**
Нет. Агент ускоряет чтение и подсказывает направления поиска, но подтверждает факты только отладчик. Любую гипотезу проверяйте по адресу и по реальному поведению программы.

**Что делать, если агент уверенно называет функцию проверкой лицензии?**
Потребуйте доказательство: адрес, строку-ссылку и место вызова. Затем поставьте точку останова на этот адрес и запустите программу с заведомо неверным ключом — если останова не происходит, вывод ложный.
