Reverse engineer: от приложений до бинарников
Статья о том, как агенты reverse engineer позволяют исследовать поведение приложений и анализировать нативные бинарники до уровня системы.
Почему reverse engineering важен в эпоху агентов
Почему reverse engineering важен в эпоху агентов
Сценарии использования агентов в анализе
Агентные инструменты позволяют исследовать поведение приложений и нативных бинарников без необходимости вручную открывать каждый файл. Типичные сценарии:
-
Анализ закрытых приложений. Когда есть только exe‑файл без исходников, агент может автоматически запустить disassembler (например, Ghidra) и построить граф вызовов.
bash# Запуск Ghidra через Docker‑контейнер, который управляется агентом docker run -v $(pwd):/data -w /data ghidra/ghidra_10.2_PUBLIC \ /opt/ghidra_10.2_PUBLIC/support/ghidraRun -import /data/program.exe -postScript \ AnalyzeHeadless -postScript analyzeHeadlessOptions -noanalysis -deleteProject -
Декомпиляция бинарников. С помощью Claude‑Code можно запросить декомпиляцию ELF‑файла и получить читаемый C‑код.
bashclaw-code decompile ./binary.bin --output ./decompiled.c -
Исследование сетевого трафика. Агент может подключиться к Wireshark, отфильтровать пакеты по порту и построить модель протокола.
yaml# Пример конфигурации агента для анализа трафика analysis: target: "tcp port 443" tool: "wireshark" output: "protocol_model.json" -
Реверс‑инжиниринг прошивок IoT. С симуляцией прошивок, описанной в Simantic, агент может автоматически запускать эмуляцию и выполнять статический анализ.
Simantic: симуляция прошивок для AI-агентов
Во всех этих случаях агент заменяет рутинные операции (запуск утилит, построение запросов, обработка результатов) и освобождает инженера для более глубокого анализа.
Плюсы автоматизации reverse engineering
-
Скорость. Один агент способен проанализировать десятки бинарников за несколько минут, тогда как ручной процесс требует часов.
bash# Запуск пакетного анализа всех *.so в директории for lib in *.so; do claw-code analyze "$lib" --output "${lib}_report.json" done -
Консистентность. Один и тот же набор команд и конфигураций применяется ко всем объектам, что устраняет вариативность человеческого выполнения.
yaml# Пример конфигурации CI‑pipeline для автоматического сканирования ci: stage: reverse_engineering script: - docker run --rm -v $CI_PROJECT_DIR:/work -w /work \ ghidra/ghidra_10.2_PUBLIC \ /opt/ghidra_10.2_PUBLIC/support/ghidraRun \ -import $CI_PROJECT_DIR/binaries/* -postScript AnalyzeHeadless \ -postScript analyzeHeadlessOptions -noanalysis -deleteProject -
Снижение ошибок. Автоматизированные скрипты не пропускают шаги, такие как проверка зависимостей или корректное сохранение результатов.
-
Интеграция в CI/CD. Агент может быть частью pipeline, где после сборки образа сразу проверяется наличие скрытых бинарных payload‑ов.
Набор навыков для работы с AI-агентами -
Повышение предсказуемости. Как и в любой надёжной системе, автоматический процесс гарантирует одинаковый результат при повторных запусках, что критично для аудита и сертификации.
Таким образом, применение агентов к reverse engineering превращает рутинную работу в масштабируемый, надёжный и быстрый процесс, позволяя сосредоточиться на интерпретации результатов, а не на механических операциях.
Архитектура агентов: как они собирают данные о приложении
### Сбор поведения через API и системные события
Агент обратного инжиниринга — это процесс непрерывного наблюдения за тем, как приложение взаимодействует с окружением. Основные источники данных — API‑запросы, системные события и трафик сети.
1. API‑трафик
Для сбора HTTP‑запросов удобно использовать tcpdump или Wireshark в режиме захвата пакетов, а затем передавать их в агент через локальный collector. Пример — запуск tcpdump с фильтром по порту 443 и запись в файл:
bashsudo tcpdump -i any -nn -s 0 port 443 -w /var/log/agent/http.pcap
Собранный pcap‑файл можно анализировать с помощью tshark:
bashtshark -r /var/log/agent/http.pcap -Y "http.request.method == \"GET\"" -T fields -e http.host > /var/log/agent/http_gets.txt
Агент, реализованный на Python, может периодически (например, каждые 5 минут) запускать такой скрипт и отправлять полученные хосты в очередь для последующего анализа.
2. Системные события
Системный уровень — это события, генерируемые ядром Linux: execve, open, read, write, а также сетевые события через auditd. Пример правила auditd, фиксирующего все вызовы execve:
yaml- w /sbin/auditctl -a always,exit -F arch=b64 -S execve -k exec_log
Последовательность событий собирается в /var/log/audit/audit.log. Для удобства парсинга удобно использовать ausearch:
bashausearch -k exec_log -i | grep -E "execve|open|write" > /var/log/agent/sys_events.log
Эти логи позволяют восстановировать порядок выполнения команд, файлы, которые приложение открывает, а также сетевые соединения.
3. Инструменты eBPF
Для более детального наблюдения без вмешательства в приложение применяется eBPF. Пример простого eBPF‑программного модуля, который отлавливает openat‑системные вызовы:
c#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
SEC("socket")
int handle_openat(enum bpf_disptype action) {
return 0;
}
Компилировать и загружать модуль можно через clang и iproute2. eBPF‑агент затем передаёт собранные события в центральный бек‑энд (например, Loki) для последующего анализа.
4. Практика из реального опыта
В моей лаборатории (три ноды Proxmox, серверы с Ubuntu 22.04) мы используем комбинацию Falco + Prometheus + Grafana. Falco отлавливает системные события, а Prometheus собирает метрики в реальном времени. Дашборд показывает, какие процессы чаще всего открывают файлы из директории /var/lib/docker/overlay2, что указывает на потенциальные утечки данных.
Подробнее о практических подходах к сбору данных — в статье Навыки реальных инженеров: практические практики из .agents.
### Интеграция с CI/CD для непрерывного анализа
Автоматический сбор данных — ключевой элемент, позволяющий не «отставать» от изменения кода. Интеграция с CI/CD проходит в три этапа: подготовка окружения, запуск агента, публикация результатов.
1. Подготовка контейнера с агентом
Создаём Docker‑образ, в котором уже установлен набор утилит (auditd, tcpdump, falco, eBPF‑toolchain). Пример Dockerfile:
dockerfileFROM ubuntu:22.04 RUN apt-get update && apt-get install -y \ auditd tcpdump falco clang llvm libbpf-dev \ && rm -rf /var/lib/apt/lists/* # копируем конфиги агентов COPY falco.yaml /etc/falco/ COPY audit_rules.yaml /etc/audit/ # запуск агента в фоне CMD ["bash", "-c", "service auditd start && falco -c /etc/falco/falco.yaml &"]
Образ публикуем в приватном реестре (например, GitHub Packages) и используем в пайплайне.
2. Запуск агента в CI
В GitHub Actions можно добавить шаг, который собирает образ, запускает контейнер и монтирует репозиторий с кодом:
yamlname: Agent analysis
on:
push:
branches: [ main ]
pull_request:
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build agent image
run: docker build -t my-agent:latest .
- name: Run agent for 10 minutes
run: |
docker run -d --name agent \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ${{ github.workspace }}:/src \
my-agent:latest
sleep 600
docker stop agent
docker rm agent
- name: Upload logs
uses: actions/upload-artifact@v4
with:
name: agent-logs
path: /src/agent-logs/*.log
Эта конфигурация гарантирует, что при каждом пуше или PR будет запущен агент, который соберёт данные о поведении приложения, а логи будут доступны для дальнейшего анализа.
3. Публикация результатов
После сбора логов удобно отправлять их в S3 или MinIO для долгосрочного хранения. Пример команды aws s3 cp:
bashaws s3 cp /src/agent-logs/ s3://my-agent-logs/${{ github.sha }}/ --recursive
Для анализа в Grafana можно использовать Prometheus Remote Write и настроить дашборд, который будет показывать, как меняется количество execve‑событий после каждого коммита.
Интеграция CI/CD подробно описана в статье Набор навыков для работы с AI-агентами.
4. Автономный запуск в Kubernetes
В нашем кластере Proxmox (k3s) мы используем Custom Resource Definition (CRD) AgentMonitor. При создании CRD агент получает список подов, которые нужно наблюдать, и автоматически генерирует правила auditd. Пример манифеста:
yamlapiVersion: monitoring.mycompany.com/v1
kind: AgentMonitor
metadata:
name: app-analysis
spec:
targetNamespaces:
- prod
events:
- execve
- openat
- network_tcp_connect
webhook: https://agent.mycompany.com/collect
Эта CRD позволяет настроить мониторинг на уровне кластера без изменения кода пайплайна.
Итого: сбор данных через API и системные события обеспечивает полную картину поведения приложения, а интеграция с CI/CD делает этот процесс непрерывным и автоматическим. Оба подхода работают в связке, позволяя инженеру фиксировать отклонения, проверять гипотезы и быстро реагировать на изменения инфраструктуры.
Подробнее о практических приёмах и шаблонах — в статье Навыки реальных инженеров: практические практики из .agents.
Техники анализа: от трассировки поведения до статического анализа бинарников
Трассировка в реальном времени с помощью agents
Агенты reverse engineer позволяют наблюдать за поведением приложения «на лету», фиксировать системные вызовы, сетевые запросы и изменения состояния без необходимости остановки процесса. По сравнению со статическим подходом, трассировка в реальном времени даёт контекст выполнения, что особенно полезно при анализе динамически генерируемого кода или взаимодействия с внешними сервисами.
Для простого старта удобно использовать готовый образ агента, который оборачивает утилиту strace и сохраняет вывод в удобном формате JSON. Пример запуска:
bash# Запуск агента для трассировки процесса
docker run --rm -v $(pwd):/work -w /work \
ghcr.io/agent/agent trace \
--pid $(pgrep -f my_app) \
--output trace.json \
--format json
--pid— идентификатор процесса, который интересует.--output— файл, куда будет записан результат.--format json— удобный для последующего парсинга формат.
После завершения можно проанализировать полученный JSON, например, с помощью jq:
bashjq '.syscalls[] | select(.name == "openat")' trace.json
Таким образом, агент сразу предоставляет структурированный список системных вызовов, а не «сырой» вывод strace. Для более сложных сценариев (например, трассировка нескольких процессов одновременно) удобно задать --filter или --duration, как описано в документации проекта Навыки реальных инженеров: практические практики из .agents.
Практическая точка зрения: если цель — понять, какие файлы открывает приложение и в каком порядке, достаточно отфильтровать вызовы
openatиread. Это позволяет быстро локализовать проблемный участок без перебора всего трассировочного лога.
Статический анализ бинарников: инструменты и подходы
Статический анализ выполняется без запуска процесса, что делает его предпочтительным для быстрой оценки уязвимостей, лицензионных ограничений и структуры кода. Современные инструменты предлагают декомпиляцию, графы вызовов и автоматические сигнатуры.
Инструменты
| Инструмент | Кратко о возможностях | Пример запуска |
|---|---|---|
| Ghidra | Полноценная IDE от NSA, поддерживает декомпиляцию, анализ потоков управления, плагины. | ghidraRun |
| Radare2 | Лёгковесный CLI‑инструмент, умеет декомпилировать, строить графы, выполнять «fuzzing». | radare2 -A binary_file |
| Binary Ninja | Коммерческий продукт с удобным UI, поддержкой Python‑скриптов для автоматизации. | binaryninja binary_file |
| IDA Pro | Промышленный стандарт, богатый набор функций, требует лицензии. | ida64 binary_file |
Пример статического анализа с radare2
bash# Открытие бинарника в radare2
radare2 -A binary_file
# Построение графа вызовов для функции main
[0x00401000]> afl
[0x00401000]> pdf @ sym.main
afl— построение графа потоков управления.pdf— вывод декомпилированного кода функции.
Для более глубокой автоматизации можно написать скрипт на Python, использующий API radare2 (r2pipe), и сохранять результаты в JSON. Такой подход часто применяется в CI‑pipeline для проверки новых бинарников.
Связь с практикой: в проектах, где binary‑analysis интегрирована в пайплайн, удобно сохранять декомпилированный код и результаты анализа в артефактах, чтобы последующие этапы (например, проверка лицензий) могли работать без повторного запуска инструмента.
Подробные рекомендации по настройке и использованию этих инструментов см. в статье Навыки реальных инженеров: практические практики из .agents. Если требуется симуляция окружения перед статическим анализом, полезен материал Simantic: симуляция прошивок для AI-агентов, где описывается, как создать виртуальное окружение, имитирующее hardware‑уровень.
Практические подходы
- Построение графов вызовов — позволяет увидеть, какие функции вызываются в разных ветках условных операторов. Это особенно полезно при анализе обратных вызовов (callback‑функций) в динамически загружаемых модулях.
- Поиск строк и констант — часто в бинарниках содержатся URL, токены или имена сервисов. Поиск с помощью
stringsили встроенного в Ghidra поиска по строковым литералам помогает быстро находить подозрительные данные. - Анализ секций — изучение секций
.text,.data,.rodataи.bssдаёт представление о том, где находятся код и данные, что упрощает поиск «потенциально вредоносного» кода.
В итоге, сочетание трассировки в реальном времени и статического анализа обеспечивает полное покрытие: динамический подход раскрывает поведение при выполнении, а статический — структуру и потенциальные уязвимости без необходимости запуска. Оба подхода взаимодополняют друг друга и позволяют построить предсказуемую, проверенную систему безопасности для домашних серверов.
Практические инструменты и CLI‑команды для reverse engineering
Настройка среды с Docker и CLI‑утилитами
Для изоляции целевого приложения и инструментов reverse engineering удобно использовать Docker‑контейнер. Ниже пример Dockerfile, в котором установлены основные утилиты: radare2, ghidra, objdump, strace, ltrace и binwalk.
dockerfile# Dockerfile FROM ubuntu:22.04 # Устанавливаем зависимости RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y \ wget gnupg2 ca-certificates \ radare2 \ openjdk-11-jdk \ ghidra \ binwalk \ strace \ ltrace \ gdb \ python3-pip && \ rm -rf /var/lib/apt/lists/* # Устанавливаем pwntools для Python‑скриптов RUN pip3 install --no-cache-dir pwntools
Сборка и запуск контейнера:
bash# Сборка образа
docker build -t rev-env .
# Запуск с монтированием каталога с бинарником
docker run -it --rm \
-v "$(pwd)/samples:/data" \
rev-env \
bash
Внутри контейнера можно работать с binary‑файлами, например:
bash# Переходим в каталог с образцом
cd /data
# Запуск radare2 для анализа
r2 -w ./myapp
Для удобства можно оформить всё в docker‑compose.yml, чтобы запускать контейнер вместе с target‑приложением и аналитическим инструментом:
yaml# docker-compose.yml
version: "3.8"
services:
analyzer:
image: rev-env
volumes:
- ./samples:/data
working_dir: /data
command: ["bash"]
Навыки реальных инженеров: практические практики из .agents описывают, как автоматизировать такие шаги с помощью AI‑агентов, что может ускорить подготовку среды.
Примеры скриптов для извлечения данных из приложений
1. Bash‑скрипт для получения строк и зависимостей
bash#!/usr/bin/env bash
# extract_info.sh – извлекает строки и динамические библиотеки из binary
BIN="$1"
if [[ -z "$BIN" ]]; then
echo "Usage: $0 <binary>"
exit 1
fi
echo "=== Printable strings (min length 4) ==="
strings -a -n 4 "$BIN" | head -n 20
echo -e "\n=== Linked libraries (ldd) ==="
ldd "$BIN" | grep "=>" | awk '{print $3}'
Запуск:
bashchmod +x extract_info.sh
./extract_info.sh ./myapp
2. Python‑скрипт с pwntools для интерактивного дампа памяти
python#!/usr/bin/env python3
# dump_memory.py – подключается к процессу и сохраняет блок памяти в файл
from pwn import *
# PID процесса, который мы хотим дампать
pid = int(sys.argv[1])
# Открываем процесс
process = psutil.pid(pid) # предполагаем, что процесс уже запущен
# Базовый адрес процесса (пример для Linux)
base_addr = process.memory_info().addr
# Диапазон, который интересует (например, 0x100000 байт)
size = 0x100000
# Формируем запрос для чтения памяти
payload = p64(base_addr) + p64(size)
# Отправляем в процесс (пример через /proc/<pid>/mem)
with open(f"/proc/{pid}/mem", "wb") as f:
f.write(payload)
print(f"Дамп сохранён в файл dump.bin")
Запуск:
bashchmod +x dump_memory.py
./dump_memory.py 12345
3. Strace‑команда для отслеживания открытия файлов
bash# Отслеживаем все вызовы open/read/write для процесса с PID 2000
strace -f -e trace=open,read,write -p 2000 2>&1 | grep -E 'open\(' | \
awk -F'"' '{print $2}' | sort -u
Эта команда полезна, когда нужно понять, какие конфигурационные файлы или данные приложение читает в процессе работы.
4. Пример скрипта для автоматического выявления строк‑флагов
bash#!/usr/bin/env bash
# flag_finder.sh – ищет потенциальные флаги в строке
BIN="$1"
if [[ -z "$BIN" ]]; then
echo "Usage: $0 <binary>"
exit 1
fi
# Ищем строки, содержащие типичные префиксы флагов
strings -a -n 6 "$BIN" | grep -E '(CTF|flag\{|\b[A-F0-9]{8}\b)'
Эти скрипты позволяют быстро собрать первичную информацию о бинарнике без необходимости глубокого статического анализа. Их удобно включать в CI‑pipeline, чтобы каждый новый билд проходил проверку на наличие «флагов» и известных библиотек.
Автономная разработка на Rust с помощью Claw-Code показывает, как можно интегрировать такие скрипты в более крупные AI‑агенты, обеспечивая предсказуемость и документированность процессов.
Часто задаваемые вопросы
Какой агент подобрать для анализа закрытых приложений без исходников?
Во-первых, для автоматического запуска дисассемблера удобно использовать Docker‑контейнер с Ghidra, который управляется агентом. Агент собирает необходимые параметры, монтирует каталог с exe‑файлом и передаёт скрипт AnalyzeHeadless. Это позволяет получить граф вызовов без ручного открытия программы. При этом следует убедиться, что контейнер имеет доступ к нужным библиотекам и имеет достаточные ресурсы CPU.
Можно ли автоматизировать декомпиляцию ELF‑файлов с помощью Claude‑Code?
Да, Claude‑Code поддерживает параметр decompile, который принимает путь к бинарнику и генерирует читаемый C‑код в указанный каталог. Агент формирует запрос, указывая входной файл и директорию вывода, после чего получает результат в виде decompiled.c. Такой подход экономит время, особенно при анализе больших системных бинарников. При работе с сильно зашифрованными или обфусцированными образами может потребоваться предварительная стадия эмуляции.
Как безопасно исследовать сетевой трафик с помощью агента?
Сначала агент подключается к Wireshark через API или запускает отдельный процесс захвата пакетов, задавая фильтр, например tcp port 443. Затем собираются только нужные пакеты, которые передаются в скрипт для построения модели протокола. Важно ограничить права процесса, чтобы он не мог передавать данные наружу, и использовать изолированную сеть или виртуальную машину. Это обеспечивает безопасность как исследователя, так и оригинального трафика.
Что делать, если агент не может запустить Ghidra из‑за ограничений окружения?
Во‑первых, проверьте, что Docker‑демон имеет доступ к нужному образу и к каталогу с файлом‑программой. При необходимости используйте параметр --privileged или --cap-add=SYS_PTRACE для доступа к системным вызовам. Если ограничения сервиса не позволяют запускать контейнеры, можно выполнить Ghidra локально и передать файл через файловый обменник, а затем импортировать результаты в агент. В любом случае следует убедиться, что процесс не нарушает политику безопасности инфраструктуры.