Когда ты открываешь исполняемый файл (EXE, DLL, SYS) в binwalk и видишь внутри него кучу чего-то интересного — это ещё не значит, что всё работает гладко. PE-файлы имеют свою структуру, и binwalk не всегда корректно их разбирает. Разберёмся, как заставить утилиту сделать свою работу правильно, и что делать, когда она спотыкается.
- Почему binwalk видит не всё в PE-файлах
- Базовый запуск и что он покажет
- Извлечение вложенных файлов
- Проблема: binwalk извлекает «грязно»
- Рекурсивное сканирование и его подводные камни
- Когда binwalk не справляется: ручное извлечение
- Сравнение подходов к извлечению
- Частые ошибки при работе с binwalk на PE-файлах
- Что делать, если binwalk вообще ничего не находит
- Практический пример: вложенный PE внутри установщика
- Как автоматизировать рутину
- Что выбрать в зависимости от задачи
- Итог
Почему binwalk видит не всё в PE-файлах
PE (Portable Executable) — это формат исполняемых файлов Windows. Внутри одного PE-файла могут быть встроены другие PE-файлы (например, вредоносные загрузчики прячут второй исполняемый модуль внутри первого), архивы, зашифрованные блоки, строки ресурсов. Binwalk умеет находить сигнатуры этих вложений, но есть нюансы:
- Вложенный PE внутри PE — binwalk может пропустить его, если сигнатура MZ/PE находится не по стандартному смещению или обфусцирована.
- Упаковка/сжатие — если файл упакован UPX, то вложения будут после распаковки, а не в исходном дампе.
- Кастомные загрузчики — злоумышленники часто пишут свои алгоритмы встраивания, которые не распознаются стандартными сигнатурами.
- Фрагментация — вложенный файл может быть разбит на куски и разбросан по разным секциям.
Поэтому просто запустить binwalk file.exe и радоваться результатам — подход не совсем правильный. Нужно понимать, что именно ты ищешь, и настраивать утилиту под задачу.
Базовый запуск и что он покажет
Начнём с простого. Допустим, у нас есть файл suspicious.exe, и мы подозреваем, что внутри что-то спрятано:
binwalk suspicious.exe
Binwalk просканирует файл и выдаст список найденных сигнатур с описанием и смещением. Типичный вывод для PE-файла с вложениями может выглядеть так:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Microsoft executable, PE32+ for MS Windows
64 0x40 PNG image, 256 x 256, 8-bit RGB
1048576 0x100000 Zip archive data, at least v2.0 to extract
1179648 0x110000 Microsoft executable, PE32 for MS Windows
Здесь мы видим: сам PE-файл, картинку, архив и ещё один вложенный PE. Уже есть о чём подумать.
Извлечение вложенных файлов
Самое полезное — это не просто посмотреть, а вытащить всё наружу. Для этого есть ключ -e (extract):
binwalk -e suspicious.exe
После выполнения появится директория _suspicious.exe.extracted/ со всеми найденными файлами. Но тут начинается самое интересное — не всё извлекается корректно.
Проблема: binwalk извлекает «грязно»
Когда binwalk находит вложенный PE-файл, он вырезает его по смещению сигнатуры. Но PE-формат имеет заголовок, таблицу секций, и если вложенный файл не начинается ровно с заголовка MZ, а сигнатура найдена где-то в середине данных — на выходе получится мусор.
Что делать:
- Проверяй извлечённые файлы через
file:
file _suspicious.exe.extracted/*
- Если файл определяется как «data» или «empty» — скорее всего, смещение было неправильным. Придётся вырезать вручную через
ddилиxxd. - Используй
binwalk -e -M— рекурсивное извлечение. Это заставит binwalk проходить по уже извлечённым файлам и искать вложения в них.
Рекурсивное сканирование и его подводные камни
Ключ -M (matryoshka) включает рекурсивный проход. Это полезно, когда у нас матрёшка: PE внутри PE внутри архива. Но есть риск — binwalk может уйти в бесконечную рекурсию или начать извлекать мусорные совпадения.
binwalk -e -M suspicious.exe
После такого запуска проверь количество файлов в директории извлечения. Если их сотни — скорее всего, binwalk ловил ложные совпадения сигнатур. Фильтруй по размеру и типу:
find _suspicious.exe.extracted/ -type f -size +1k | xargs file
Когда binwalk не справляется: ручное извлечение
Бывает, что binwalk находит вложенный PE, но извлекает его криво. Тогда действуем вручную:
- Находим смещение сигнатуры MZ:
binwalk --signature suspicious.exe | grep "Microsoft executable"
- Вырезаем от найденного смещения до конца файла:
dd if=suspicious.exe of=extracted_embedded.exe bs=1 skip=1179648
- Проверяем структуру PE через
objdumpилиreadpe:
objdump -f extracted_embedded.exe
Если заголовок валидный — поздравляю, вложенный файл извлечён корректно. Если нет — возможно, перед сигнатурой MZ есть мусор, и нужно найти реальное начало PE-заголовка (смещение которого указано в поле e_lfanew).
Сравнение подходов к извлечению
В зависимости от ситуации, разные подходы дают разный результат. Вот что я обычно использую:
| Ситуация | Команда | Когда применять |
|---|---|---|
| Быстрый осмотр | binwalk file.exe |
Нужно понять, есть ли вообще вложения |
| Извлечение всего подряд | binwalk -e file.exe |
Первичный анализ, не критична точность |
| Глубокий анализ | binwalk -e -M file.exe |
Подозрение на многоуровневую вложенность |
| Точечное извлечение | dd по смещению из binwalk |
Когда binwalk извлекает мусор |
| Проверка результатов | file + readpe |
Всегда после извлечения |
Частые ошибки при работе с binwalk на PE-файлах
- Верить всему, что выдаёт binwalk. Сигнатурный анализ — это не панацея. Иногда он находит «PNG» там, где на самом деле случайные байты, совпавшие с заголовком. Всегда проверяй извлечённые файлы.
- Игнорировать смещения. Если binwalk показывает смещение 0x100000, а файл весит 500 КБ — что-то не так. Смещение не может быть больше размера файла.
- Забывать про рекурсию. Один проход
-eможет не найти всё. Если внутри архива ещё один архив — без-Mвы его пропустите. - Не проверять контрольные суммы. После ручного извлечения через
ddубедитесь, что контрольная сумма файла совпадает с тем, что вы ожидали (если есть с чем сравнивать). - Работать с файлом напрямую без бэкапа. Если вы модифицируете исходный файл (например, удаляете секции), сделайте копию.
Что делать, если binwalk вообще ничего не находит
Если binwalk выдаёт пустой результат или только заголовок самого PE — это не значит, что вложений нет. Возможные причины и действия:
- Вложения зашифрованы или обфусцированы. Сигнатурный анализ тут бессилен. Смотри на энтропию секций через
binwalk -E— высокая энтропия (близкая к 8) говорит о сжатии или шифровании. - Вложения не имеют стандартных заголовков. Например, кусок данных, который интерпретируется как код только во время выполнения. Тут нужен динамический анализ или дизассемблирование.
- Файл повреждён или обрезан. Проверь целостность заголовка PE через
readpeилиpestudio.
binwalk -E suspicious.exe
График энтропии покажет, какие секции сжаты или зашифрованы. Это сузит область поиска.
Практический пример: вложенный PE внутри установщика
Допустим, у нас есть установщик setup.exe, который при запуске что-то делает подозрительное. Запускаем:
binwalk setup.exe
Видим:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Microsoft executable, PE32 for MS Windows
524288 0x80000 LZMA compressed data, properties: 0x5D, dictionary size: 65536 bytes
532480 0x82000 Zip archive data, at least v2.0 to extract
Извлекаем:
binwalk -e -M setup.exe
В директории _setup.exe.extracted/ находим:
80000— файл без расширения, ноfileпоказывает LZMA-поток82000— ZIP-архив
Распаковываем LZMA-поток:
lzma -d 80000
На выходе получаем ещё один PE-файл. Вот она — матрёшка. Без рекурсивного извлечения и ручной распаковки мы бы этого не увидели.
Как автоматизировать рутину
Если приходится часто анализировать PE-файлы, имеет смысл написать небольшой скрипт-обёртку:
#!/bin/bash
FILE="$1"
echo "[*] Сканирование $FILE..."
binwalk "$FILE"
echo "[*] Извлечение с рекурсией..."
binwalk -e -M "$FILE"
echo "[*] Проверка извлечённых файлов..."
find "_${FILE}.extracted/" -type f -size +1k | while read f; do
echo "=== $f ==="
file "$f"
done
Сохрани как scan_pe.sh, запускай — и получаешь первичную разведку за пару секунд.
Что выбрать в зависимости от задачи
Если ты исследуешь малварь и тебе нужно быстро понять структуру — начни с binwalk -e -M, потом вручную проверь всё, что извлеклось. Не доверяй автоматике слепо.
Если ты восстанавливаешь повреждённый файл — используй binwalk только для поиска смещений, а извлекай через dd с последующей проверкой структуры PE.
Если ты проверяешь свой собственный файл на предмет лишних вложений — достаточно binwalk file.exe без извлечения. Посмотри, что внутри, и если что-то лишнее — пересобери проект.
Если binwalk ничего не нашёл, а подозрения остаются — смотри на энтропию, проверяй строки через strings, запускай файл в песочнице. Статический анализ не всегда даёт полную картину.
Итог
Binwalk — хороший инструмент для быстрого осмотра PE-файла и поиска вложений, но он не заменяет голову. Используй его как первый шаг: запусти, посмотри смещения, извлеки с рекурсией, а потом вручную проверь результаты. Если binwalk не находит очевидное — это повод копать глубже, а не повод успокоиться.
Начни с binwalk -e -M файл.exe, проверь извлечённое через file, и если что-то выглядит криво — бери dd и ручное извлечение. Это стандартный рабочий поток, который я использую на практике.
