Продвинутый

Reverse engineer: от приложений до бинарников

Алексей Кузнецов
Алексей Кузнецов
Системный администратор31 октября 2026 г.14 мин чтения

Статья о том, как агенты reverse engineer позволяют исследовать поведение приложений и анализировать нативные бинарники до уровня системы.

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‑код.

    bash
    claw-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 и запись в файл:

bash
sudo tcpdump -i any -nn -s 0 port 443 -w /var/log/agent/http.pcap

Собранный pcap‑файл можно анализировать с помощью tshark:

bash
tshark -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:

bash
ausearch -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:

dockerfile
FROM 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 можно добавить шаг, который собирает образ, запускает контейнер и монтирует репозиторий с кодом:

yaml
name: 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:

bash
aws 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. Пример манифеста:

yaml
apiVersion: 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:

bash
jq '.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‑уровень.

Практические подходы

  1. Построение графов вызовов — позволяет увидеть, какие функции вызываются в разных ветках условных операторов. Это особенно полезно при анализе обратных вызовов (callback‑функций) в динамически загружаемых модулях.
  2. Поиск строк и констант — часто в бинарниках содержатся URL, токены или имена сервисов. Поиск с помощью strings или встроенного в Ghidra поиска по строковым литералам помогает быстро находить подозрительные данные.
  3. Анализ секций — изучение секций .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}'

Запуск:

bash
chmod +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")

Запуск:

bash
chmod +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 локально и передать файл через файловый обменник, а затем импортировать результаты в агент. В любом случае следует убедиться, что процесс не нарушает политику безопасности инфраструктуры.

Поделиться:TelegramX / TwitterVK

Читайте также