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

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

1. Создайте рабочую папку и снимок ВМ.
mkdir -p ~/re/workspace
cd ~/re/workspace
**Пример:** после команд `pwd` выводит `/home/user/re/workspace`.
*Почему так:* отдельная папка и снимок позволяют откатить всё состояние, если образец поведёт себя неожиданно. Ожидаемый результат: пустая папка и снимок с понятным именем, например `clean-before-analysis`.
2. Сделайте копию образца и посчитайте хеш.
cp ./target.bin ~/re/workspace/target.bin
sha256sum ~/re/workspace/target.bin
**Пример вывода:** `3b1f...9d2c /home/user/re/workspace/target.bin`.
Хеш — короткий «отпечаток» файла. Он нужен, чтобы позже доказать, что вы анализировали именно этот файл и не подменили его. Ожидаемый результат: одна строка с 64 символами.
3. Проведите первичную разведку, не запуская файл.
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. Задайте агенту роль и жёсткие правила. Готовый шаблон промпта:
Ты помогаешь анализировать бинарник в изолированной ВМ.
Данные: тип файла, список строк, листинг функции (см. ниже).
Задача: найди, где проверяется лицензия.
Правила: для каждой гипотезы указывай адрес и строку-доказательство;
если данных нет — пиши "недостаточно данных", не выдумывай.
*Почему это работает:* запрет на выдумывание и требование цитировать адреса резко снижают число ложных выводов. Ожидаемый результат: ответ в формате «адрес → строка → вывод».
6. Проверяйте каждую гипотезу руками в отладчике.
gdb -q ~/re/workspace/target.bin
(gdb) info functions
(gdb) disassemble main
**Пример:** агент предположил, что проверка идёт по адресу `0x401234` — вы ставите `break *0x401234`, запускаете `run` и видите, останавливается ли отладчик именно там.
Ожидаемый результат: гипотеза подтверждена или отброшена. Агент — источник версий, истина — отладчик.
7. Патчите только копию, по одному изменению за раз.
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. Сравните хеши и зафиксируйте результат.
sha256sum target.bin target_patched.bin
**Пример вывода:** две разные строки — значит, патч действительно применён.
Ожидаемый результат: в логе появилась запись «адрес, что менял, что получилось». Без этого через день вы не вспомните логику правки.

Агент придумывает адреса, которых нет.Симптом: отладчик выдаёт ошибку вида `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. Проверьте, не попал ли байт внутрь инструкции: одна лишняя замена ломает выравнивание команд.
Можно ли так анализировать чужой софт?
Только если у вас есть права на этот файл: собственный продукт, лицензия на исследование, учебный образец или CTF-задача. Анализ чужого ПО без разрешения — нарушение закона и условий лицензии.
Нужна ли видеокарта?
Для базового сценария — нет. `strings`, `readelf`, Ghidra и `gdb` работают на процессоре, а модель вызывается по API. Видеокарта понадобится, только если вы захотите держать модель локально.
ИИ заменяет дизассемблер и отладчик?
Нет. Агент ускоряет чтение и подсказывает направления поиска, но подтверждает факты только отладчик. Любую гипотезу проверяйте по адресу и по реальному поведению программы.
Что делать, если агент уверенно называет функцию проверкой лицензии?
Потребуйте доказательство: адрес, строку-ссылку и место вызова. Затем поставьте точку останова на этот адрес и запустите программу с заведомо неверным ключом — если останова не происходит, вывод ложный.