Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Обход идентификации анализаторами типа PEiD

Обсудить статью на форуме

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: FEUERRADER <feuerrader@nm.ru>


        Цель: обмануть 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 Кб).



Обсуждение статьи: Обход идентификации анализаторами типа PEiD >>>


Комментарии к статье: Обход идентификации анализаторами типа PEiD

SLV 11.05.2004 19:02:50
Эта техник используется в UPX-Scrambler RC1.x -> ©OnT®oL.
---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS