Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #66, МАЙ 2006 г.

жестокая пенетрация hiew’ом

GPCH (ADMIN@DOTFIX.NET)

Спецвыпуск: Хакер, номер #066, стр. 066-072-2


.0046D39C: E8B3EAFFFF call .00046BE54 -----? (4)

.0046D3A1: 8B0D28F94600 mov ecx,[0046F928]

.0046D3A7: A1E8F84600 mov eax,[0046F8E8]

.0046D3AC: 8B00 mov eax,[eax]

.0046D3AE: 8B15F0B84600 mov edx,[0046B8F0]

.0046D3B4: E89FE6FCFF call .00043BA58 -----? (5)

.0046D3B9: A1E8F84600 mov eax,[0046F8E8]

.0046D3BE: 8B00 mov eax,[eax]

.0046D3C0: 8B4044 mov eax,[eax][44]

.0046D3C3: E834FBFFFF call .00046CEFC -----? (6)

.0046D3C8: A1E8F84600 mov eax,[0046F8E8]

Действительно, невозможно не узнать его: просто несколько Call-вызовов, стандартных в Delphi-программах. Если вновь перейти в текстовый режим, нажать и подержать <PgUp> в самом верху, то сможем посмотреть на названия секций. Вот примерный расклад для Delphi-программ, не тронутых защитой:

CODE

DATA

BSS

idata

tls

rdata

.reloc

.rsrc

Итак, с Delphi определились, теперь поговорим о C++ Builder. Здесь сложностей намного меньше. На оригинальной точке входа всегда присутствует код (см. Листинг 2).

Листинг 2

.00401000: EB10 jmps .000401012

.00401002: 66623A bound di,[edx]

.00401005: 43 inc ebx

.00401006: 2B2B sub ebp,[ebx]

.00401008: 48 dec eax

.00401009: 4F dec edi

.0040100A: 4F dec edi

.0040100B: 4B dec ebx

.0040100C: 90 nop

.0040100D: E978D54900 jmp 0206321AA

.00401012: A16BD54900 mov eax,[0049D56B]

Байты, расположенные между jmp’ом и mov’ом: "C++HOOK". Тоже все просто :). Что же насчет Basic’а? Он всегда имеет только две команды на EP:

Листинг (контекстно-зависимый)

.004011CC: 68EC164000 push 0004016EC -----? (1)

.004011D1: E8EEFFFFFF call MSVBVM60.100

Здесь мы наблюдаем, что по адресу 0004016EC всегда присутствует VBHeader, начинающийся с сигнатуры «VB5!».

Итак, [PEi уже не нужен]. Что там с упаковщиками? Можно даже не смотреть на точку входа :). Достаточно посмотреть на EXE-заголовок в текстовом виде. UPX пихает в начало первой секции сигнатуру «UPX!», а секции обзывает «.UPX0», «.UPX1», «.rsrc», причем секций насчитывается три вне зависимости от того, сколько их было до упаковки.

Если же взглянуть на точку входа (Листинг №3), то откроется код, довольно стандартный для всех версий UPX’а.

Листинг №3

.00417180: 60 pushad

.00417181: BE00E04000 mov esi,00040E000 -----? (1)

.00417186: 8DBE0030FFFF lea edi,[esi][-0000D000]

.0041718C: 57 push edi

.0041718D: 83CDFF or ebp,-001 ;"?"

.00417190: EB10 jmps .0004171A2 -----? (2)

.00417192: 90 nop

.00417193: 90 nop

.00417194: 90 nop

.00417195: 90 nop

.00417196: 90 nop

.00417197: 90 nop

.00417198: 8A06 mov al,[esi]

.0041719A: 46 inc esi

.0041719B: 8807 mov [edi],al

Подробнее о самом алгоритме распаковки и восстановлении импорта читай в статье «Об упаковщиках в последний раз» (лежит на www.wasm.ru). Я же продолжу рассказ об определении других упаковщиков. Следующим по распространенности является FSG и (с недавних пор) Upack. Они узнаются очень просто. Смотришь на текстовое представление EXE-заголовка — он крайне оптимизирован, и обычно там нет стольких нулевых байт мусора, сколько оставляют другие пакеры. Upack даже запихивает импорт прямо в DOS Header после!

Назад на стр. 066-072-1  Содержание  Вперед на стр. 066-072-3