Современные решения

для защиты Windows приложений

и восстановления исходного кода
Автор: FEUERRADER. Дата публикации: 05.08.2004

обмануть PEiD :)


Цель: обмануть PEiD :)
Инструменты: Hiew 6.82, TRW2000 1.23 (работать с SoftIce’ом будет сложнее)

Вступление: анализаторами типа PEiD пользуются почти все реверсеры и результатам их чаще всего слепо доверяют. Но все-таки, почему же нельзя обмануть PEiD или PE Sniffer? У последнего к тому же открыты сигнатуры... карты в руки и вперед. Ну, кому лень - я провел эту работу и сейчас поделюсь своими результатами.

Теория: как можно догадаться, работа PEiD и ему подобных основывается на поиске порядка байт в файле (поиск сигнатуры). Чаще всего эти байты берутся с начала EntryPoint файла. Я не буду вдаваться в подробности того, как они работают. Анализаторов достаточно много (если Вы пользуйтесь только PEiD, то советую обзавестись еще парочкой).
Итак, прежде всего, нам нужно узнать сигнатуру, по которой тот или иной анализатор определяет. Для всеобщего обозрения доступны сигнатуры PE Sniffer (анализатор, входящий в пакет PE Tools), поэтому попробуем использовать их.

Подготовка к практике: подопытным кроликом будет маленькая программка, написанная на ASM’e и запакованная UPX 1.24. Наша задача, сделать так, чтобы большинство анализаторов не смогло ничего определить. Травим на программку PEiD и смотрим результат - UPX v0.89.6 - v1.02 / v1.05 - v1.24. Ищем сигнатуру для этой надписи в базе данных PE Sniffer (сигнатуры PEiD и PE Sniffer должны быть в принципе одинаковы). Видим:

[UPX v0.89.6 - v1.02 / v1.05 - v1.22=::::::::::::::::::::::::::::::::::::::::::::::::8A064688074701DB75078B1E83EEFC11DB72E DB801::::::01DB75078B1E83EEFC11DB11C001DB73::75::8B1E83EEFC]

Знаки "::" означают, при сравнении пропускаем n байтов (где n="::"=1 байт) и начинаем сравнивать с байта 8A. Думаю, все это понятно. Не будем торопиться лезть в редактор, чтобы что-то ковырять, посмотрим в базе дальше и видим другую сигнатуру для UPX:

[UPX v0.89.6 - v1.02 / v1.05 - v1.22 Modified=01DB::078B1E83EEFC11DB::EDB80100000001DB::078B1E83EEFC11DB11C001DB73::75]

"Modified" означает, что некоторые байты были изменены, но последовательность байт от 01DB....до DB73::75 сохраняется. Наша задача предельно проста - чуть-чуть переделать последовательность выполнения инструкций в файле, тем самым изменится порядок байт, а это приведет к несовпадению истинной сигнатуры и сигнатуры пакера.
Что ж, если все вышеизложенное трудно доходит, то не расстраивайтесь, чтобы переделывать последовательности байт, нужно иметь неплохие знания по формату PE и опыт в исследовании.

Практика: сначала нужно решить, какие именно и сколько байт мы будем менять. Сразу скажу, что хватит изменения всего 5 байт в нужной позиции и PEiD (PE Sniffer в частности) будет в упор видеть UPX как Win32 PE Unknown :) И никакой Hardcore Scan не поможет. Теперь решим, какие 5 байт и на какие будем менять. Заменять байты на 90 (инструкция NOP) нельзя, т.к. это же код распаковщика и инструкции его участвуют в распаковке самой программы. Просто заNOPив, PEiD не узнает файл, но и файл не запустится :)
Нужно сделать переадресацию выполнения инструкций на пустое место. Прыжком на пустое место будет служить JMP. А JMP состоит из 5 байт. (кто патчил вручную пакованные файлы UPX, то принцип будет тот же самый).
Предлагаю у сигнатуры UPX взять байты 8B1E83EEFC. Т.е. из серединки. А это такие инструкции:

016F:004066A2 8B1E MOV EBX,[ESI] 016F:004066A4 83EEFC SUB ESI,BYTE -04

Ищем пустое место для размещения нашего кода... обычно в самом низу файла есть место. Пусть оно будет по адресу 407B50. Теперь прописываем эти 5 байт туда. Теперь надо бы заменить инструкции с 4066А2 на

JMP 407B50
Можно это сделать в HEX-редакторе, но я делал в TRW2000 командой "а".
Затем, когда мы прописали JMP, нужно сделать еще один JMP, который бы возвращал обратно, после выполнения команд с пустого места, на обычный код. Т.е. на адрес

016F:004066A7 11DB ADC EBX,EBX Надо сделать на адресе 407B55, JMP 4066A7.

В принципе, кому идея понятна, то можно сделать маленькую программку для перемещения байт. Проблема только будет в расчете смещений для перемещений и составлении опкодов для JMP’ов.

Смотрите, что у меня получилось:


.004066A0: 7507 jne .0004066A9 ----- (1) .004066A2: E9A9140000 jmp .000407B50 ----- (2) .004066A7: 11DB adc ebx,ebx

А на "пустом месте" стало:

.00407B50: 8B1E mov ebx,[esi] .00407B52: 83EEFC sub esi,-004 ;" " .00407B55: E94DEBFFFF jmp .0004066A7 ----- (1)

Заключение: я не говорю, что это так просто всё. Но если посидеть немного, то защититься можно. Некоторые анализаторы всё-таки смогли опознать UPX даже после такой модификации. Это был анализатор под названием.......
А программку, над которой я экспериментировал, можете скачать отсюда (3 Кб).

Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий: