жестокая пенетрация 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 после! |