Распаковка WWPack32 v1.2.X.XXX Автор..: Renegade Перевод: NightCat//TEAM-53 Дизассемблируя упакованный файл мы замечаем, что WWPack32 новую секцию: .text RVA: 00000000 Offset: 00000000 Size: 00000000 Flags: 00000000 .bss RVA: 00000000 Offset: 00000000 Size: 00000000 Flags: 00000000 .data RVA: 00000000 Offset: 00000000 Size: 00000000 Flags: 00000000 .idata RVA: 00000000 Offset: 00000000 Size: 00000000 Flags: 00000000 .rsrc RVA: 00000000 Offset: 00000000 Size: 00000000 Flags: 00000000 .reloc RVA: 00000000 Offset: 00000000 Size: 00000000 Flags: 00000000 .WWP32 RVA: 00000000 Offset: 00000000 Size: 00000000 Flags: 00000000 Мы могли бы сейчас вычситать новую ep добавлением RVA к image base (0040000), но мы используем IDA и обойдёмся без этого: +------------ Choose an entry point ------------+ | Name Address # | | start 00000000 | | | +_______________________________________________+ Итак, секция .WWP32 начинается вот так: .WWP32:00000000 53 public start .WWP32:00000000 start proc near .WWP32:00000000 push ebx .WWP32:00000000 55 push ebp .WWP32:00000000 8B E8 mov ebp, eax .WWP32:00000000 33 DB xor ebx, ebx .WWP32:00000001 EB 60 jmp short _WWP32_000000 .WWP32:00000000 0D 0A 0D 0A 57 57+str->Wwpack32Decompr db 0Dh,0Ah .WWP32:00000000 50 61 63 6B 33 32+db 0Dh,0Ah .WWP32:00000000 20 64 65 63 6F 6D+db 'WWPack32 decompression routine... .WWP32:00000000 70 72 65 73 73 69+db '(c) 1998 Piotr Warezak and Rafal... .WWP32:00000000 6F 6E 20 72 6F 75+db 0Dh,0Ah Следуя за кодом по адресу .WWP32:00000001 и трейсясь до джампа, который эту сеуцию покидает мы найдм секцию кода. Конечно это всегла более-менее одинаковый кусок кода, котрый нас и выводит на секцию .code: _WWP32_XXXXXX: ; CODE XREF add [esi], eax xor edx, edx mov dl, [ebx] inc ebx cmp dl, 0 jz short _WWP32_XXXXXX add esi, edx jmp short _WWP32_XXXXXX _WWP32_XXXXXX: ; CODE XREF pop eax popa pop eax mov ebp, eax add eax, cs:[ebp+XXXh] add eax, XXXh pop ebp pop ebx jmp near ptr _OUR SECTION_XXXXXX итак, мы попали в НАШУ СЕКЦИЮ и это как раз настоящая oeр. Теперь нам нужно перестроить секцию кода. Давайте соберем чуть больше информации об этих секциях используя, к примеру, PEWizard. VSize RVA Size Offset Rel Lines ... .code 0x000X2 0x000X3 0x0000X 0x00000 0x0 0x0 0x0 0x0 .data 0x00000 0x00000 0x00000 0x00000 0x0 0x0 0x0 0x0 .rdata 0x00000 0x00000 0x00000 0x00000 0x0 0x0 0x0 0x0 .reloc 0x00000 0x00000 0x00000 0x00000 0x0 0x0 0x0 0x0 .rsrc 0x00000 0x00000 0x00000 0x00000 0x0 0x0 0x0 0x0 .WWP32 0x00000 0x00000 0x00000 0x00000 0x0 0x0 0x0 0x0 Физический размер - 0x0000X а расспакованный должен быть 0x000X2. Используя дампер мы теперь может сохранить информацию в файл. Начало секции всегда = image base + RVA, 00400000 + 0x000X3 Конечно мы должны поменять физичесекий размер нашего дампа и соотвественно модифицировать оффсеты. Мы уже знаем размер распакованной секции кода. Мы может это сделать путём добавления оффсета к размеру и ввода этого значения в качестве нового оффсета. И затем всегда использовать результат , который мы получили от предыдущего сложения, в качестве оффсета, чтобы использовать его к следующей секции к которой мы хотим высчитать оффсет. ;) Разобраться с заголовком вам поможет PE Rebuilder, или руки. Тогда нужно поменять оффсеты с указанным значением "FileAlign". Чтобы закончить всё это выравнивать мы должны разделить физический размер на значение FileAlign, и поэтому нужно удалить последние 16 байт секции. Затем мы вычитаем эти 16 байт из других оффсетов и выравнивание завершено. Теперь меняем ep в заголовке дампа на оер, которую нашли до этого, конвертируя её в RVA, используя, к примеру, AOU. Перестройте файл с модифицированной секцией кода и файл распакован!