| Вернуться на сайт |
Обман анализаторов типа PEiD
В предыдущих примерах я часто рассматривал анализаторы типа PEiD для определения языка, на котором написана программа или типа упаковщика/криптора. Такими программами пользуются почти все реверсеры, в текущем примере нашей задачей будет обмануть анализатор, и показать, что результатам такого анализа не всегда можно доверять. Программирования в этом примере не будет, поэтому понадобятся только:
Начнем как обычно с теории: несложно догадаться, что работа PEiD и ему подобных анализаторов основывается на поиске сигнатур (т.е. определенных байт в файле по порядку). Чаще всего эти байты берутся с начала Entry Point (точки входа) файла. Сигнатуры, по которой тот или иной анализатор определяет тип файла, как правило, доступны. Для примера рассмотрим сигнатуры софтины PE Sniffer (анализатор, входящий в пакет PE Tools), а именно воспользуемся сигнатурой упаковщика UPX. В базе данных PE Sniffer (сигнатуры PEiD и PE Sniffer должны быть в принципе одинаковы) эта сигнатура имеет следующий вид:
|
Теперь переходим к практике. За основу я взял
совершенно типичную программу wingraph32, написанную на Borland C++ Builder. После сжатия ее упаковщиком UPX с параметром -9 (максимальное
сжатие), получили файлик почти в 3 раза меньше (346кБ). Натравливаем на него
анализатор PEiD и видим, что по сигнатуре тип файла определен абсолютно
верно. |
Сразу стоит отметить, что хватит изменения всего 5 байт в нужной позиции
и PEiD (да и большинство других анализаторов) будет в упор видеть UPX как
Win32 PE Unknown даже в режиме параноидального
сканирования. |
|
|
В данном примере из сигнатуры UPX взяты 5 байт из середины 8B1E83EEFC. Они соответствуют инструкциям: |
Ищем пустое место для размещения нашего кода. Как я и говорил, в конце, начиная с адреса 0051AC30 идут нули, сюда то мы и запишем наш код. |
|
|
Но сначала на место тех пяти байт, которые мы собирались менять, запишем прыжок в нашу свободную область JMP 51AC30 (в Olly на нужной строчке нажать Пробел). Запоминаем байтики, вместо 8B1E83EEFC у нас получилось E9A1010000 |
Но инструкции, которые мы затерли переходом, тем не менее должны выполняться программой. Поэтому первыми командами, которые идут на
пустом ранее месте по адресу 51AC30 будут именно
они. |
|
|
В итоге на пустом месте у нас должна получиться следующая картинка – выполнение команд, которые мы затерли переходом (8B1E83EEFC) и обратная передача управления (E955FEFFFF). |
Можно конечно сохранить изменения (так сказать пропатчить файл) прямо из Olly, но я воспользуюсь шестнадцатеричным редактором (на данном рисунке FlexHex). Напоминаю, что физические адреса в файле можно посмотреть в Olly в меню View->Executable File. К примеру адресу 51AA8A соответствует смещение в файле 54E8A, а адресу 51AC30 – смещение 55030. На рисунке красной стрелкой выделено место изменения 5 байт сигнатуры, синей – внесение изменений на пустое место (в центре место пропущено в целях экономии ;-)) |
|
|
Сохраняем изменения в файл, запускаем его, проверяя, что все работает. И,
натравливая на него анализатор PEiD, видим вполне безобидную надпись «Nothing found» (ничего не найдено). Задача,
таким образом, считается решенной. |
(с) FM, 2008 |
Отзывы как обычно принимаются на mimicria@mail.ru |