Rambler's
Top100

Ручная распаковка TElock 0.85 на примере Flash Mailer 1.1

Автор: FEUERRADER
Дата: 24.05.2003
Раздел: Reverse Engineering


  Программа: Flash Mailer 1.1
     Размер: 413696 байт
       Язык: Borland Delphi 4.0 - 5.0
     Защита: Delphi компонент - TRegWareII + Telock 0.85
       Цель: регистрация или взлом
Инструменты: Win32Dasm 8.9-9.0
             Hiew 6.x
             SoftIce 4.05 + IceDump
             PEditor 1.7 by Y0da
             LordPE Deluxe
             ImpRec 1.4.2+
             DZA Patcher v1.3

Вступление: программа Flash Mailer 1.1 (FM) служит для массовой рассылки писем. Смотрим, что говорит PEID: "tElock 0.85f -> tE!". Как распаковать? Есть автоматический распаковщик TElock любых версий - WKT_tElock_Dumper 1.2. Я воспользовался им, и дамп запустился, но в программе на некоторых местах выползает exception, что говорит о некачественно произведенной распаковке. Будем распаковывать вручную.

РАСПАКОВКА

Нахождение OEP: cмотрим на PE-header и пишем на бумажку некоторые значения:
Image Base=400000, Size Of Image=F3000, количество секций=8.
Запускаем IceDump, ставим :bpx VirtualProtectEx. Запускаем программу, проваливаемся в софтайс. F12. Несколькими экранами ниже (1 раз Ctrl+PageDown) ищем вот такой кусок:

016F:004F1029  SUB       EBX,04
016F:004F102C  MOV       [EDI],EBX
016F:004F102E  LEA       EDI,[EBP+0040AB41]
016F:004F1034  MOV       ECX,0000002C
016F:004F1039  REPZ STOSB
016F:004F103B  STOSW
016F:004F103D  JMP       004F1041

Ставим :bpm 4F1041 x. Оказались здесь:

016F:004F1041: POPAD
016F:004F1042: JMP [ESP-30]


Заходим в JMP - мы в распакованной программе. Первая инструкция - PUSH EBP. Запомним OEP = 4B775C. Теперь сдампим программу.
/dump 400000 F3000 c:\dump.exe

Теперь dump.exe - это наш дамп.

Испрвляем дамп: запускаем LordPE, жмем PE Editor и выбираем наш дамп. TElock испрвляет число секций на FFFF. Заменим это число на 8, как было первоначально. Теперь загружаем дамп в PEditor 1.7 by Y0da, заметим, что у дампа нет иконки. Значит проблема с ресурсами. Жмем Sections, и щелкаем на секции .rsrc правой кнопкой и выбираем dumpfixer (RS=VS & RO=VO). Правим Entry Point. EntryPoint = OEP - ImageBase = B775C. Всё, дамп исправлен, теперь восстановим импорт.

Восстановление импорта: запускаем ImportReconstructor. Запускаем обычную, запакованную программу и в ImpRec выбираем ее. Теперь вводим наш ОЕР=B775C, жмем IAT AutoSearch, жмем Get Imports. Получаем список импортируемых функций. Теперь нажмем Auto Trace. Ждем... Show Invalid и видим 9 невосстановившихся адресов. Жмем на любой из выделенных правой кнопкой и выбираем Cut Thunk(s) и эти адреса удаляются из списка. Эти функции использовал TElock, нам теперь они не нужны. Нажимем Fix Dump и вибираем наш дамп, оставив галочку на Add New Section.
Всё, теперь в дампе правильная таблица импорта! Кстати, ImpRec автоматический прописал в дампе реальный ОЕР, для которого он нашел импорт, так что нет необходимости вписывать его самим. Распаковка закончена!

ИССЛЕДОВАНИЕ

Что мы видим: Дельфи компонент - TRegWareII. Соглашусь, что он обеспечивает неплохую защиту, но не достаточную:)) Есть два пути: 1) искать правильный серийник в памяти 2) искать где проверяется зарегенность проги.
Рассмотим оба способа.

1 Способ. Поиск серийника.
Ставим в SI бряк на MessageBoxA. Запускаем распакованную прогу. Вводим имя = Feuerrader и код = 111111111111. Жмем OK. Вылетаем в софтайс. F12. Чуть выше видим:

016F:004ADA96  E88963FEFF  CALL      00493E24 <--проверка на зарегенность
016F:004ADA9B  84C0        TEST      AL,AL    
016F:004ADA9D  751B        JNZ       004ADABA
016F:004ADA9F  6A00        PUSH      00
016F:004ADAA1  6834DB4A00  PUSH      004ADB34
016F:004ADAA6  683CDB4A00  PUSH      004ADB3C
016F:004ADAAB  8BC3        MOV       EAX,EBX
016F:004ADAAD  E842CAF8FF  CALL      0043A4F4
016F:004ADAB2  50          PUSH      EAX
016F:004ADAB3  E8C89CF5FF  CALL      USER32!MessageBoxA

Делаем bc* и ставим бряк 4ADA96. Когда снова вылетим смотрим, что EBX=011B1C14. Теперь спустимся примерно до 11B5E2C и увидим в памяти:

0177:011B5E84 00 00 00 00 88 5E 1B 01-88 5E 1B 01 44 00 00 00  .....^...^..D...
0177:011B5E94 xx xx xx xx xx xx xx xx-xx xx xx xx 00 00 00 00  1BF*D4745*F8....
0177:011B5EA4 A4 5E 1B 01 A4 5E 1B 01-28 00 00 00 00 02 00 00  .^...^..(.......
0177:011B5EB4 00 6C 1A 01 00 6C 1A 01-18 00 00 00 4F 6E 43 6C  .l...l......OnCl
0177:011B5EC4 69 63 6B 00 44 00 00 00-17 00 00 00 01 00 00 00  ick.D...........
0177:011B5ED4 05 00 00 00 72 65 67 5F-62 00 00 00 FE 01 00 00  ....reg_b.......
0177:011B5EE4 50 73 42 00 14 1C 1B 01-D8 5E 1B 01 00 00 00 00  PsB......^......

Как можно догадаться по адресу 11B5E94 серийник для имени Feuerrader, только он специально затерт знаком "*". Адреса в памяти у вас могут не совпадать с приведенными выше, что естественно!

2 способ. Поиск проверки на зарегенность.
Запускаем Win32Dasm, суем туда распакованный FM. Ищем строку "Registered version!". Нашли тут:

:004AF9A4 E83F3FFEFF              call 004938E8
:004AF9A9 84C0                    test al, al
:004AF9AB 741F                    je 004AF9CC
:004AF9AD 8B83D0020000            mov eax, dword ptr [ebx+000002D0]
:004AF9B3 8B80EC010000            mov eax, dword ptr [eax+000001EC]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004AF94A(C)
|
:004AF9B9 33D2                    xor edx, edx
:004AF9BB E8D451FBFF              call 00464B94

* Possible StringData Ref from Data Obj ->"Registered version !"

Заходим в CALL 004938E8.

* Referenced by a CALL at Addresses:
|:004934B8   , :0049407A   , :00494099   , :0049436D   , :004AF96F   
|:004AF9A4   
|
:004938E8 E813030000              call 00493C00
:004938ED C3                      ret

У-у-у...сколько адресов вызывает этот call. А что делает этот call? Проверка на зареггеность программы! Она возвращает в EAX - 1, если мы зарегены. Та давайте не будем вызывать вложенный CALL 00493C00, а сделаем mov eax,01. Это думаю каждый сможет это в Hiew. Попробуем, нагов нет! Но в окне About надпись, что мы еще не зарегены! Так исправьте ее в том же Hiew на "REGGED TO MYNAME"!!! Теперь всё.

Crack: как же будем строить кряк? Править в памяти неинтересно, надо бы саму прогу. А-а-а! Возьмем-ка DZA Patcher (как всегда protools.cjb.net). Он может сделать "инъекцию" почти для любого пакованного/криптованного файла. Вот код файллиста, содержащий байты для патча в DZA Patcher. Используйте его на свое усмотрение:

4D4E03/20/21*4D4E02/20/21*4D4E01/52/21*4D4E00/45/20*4D4DFF/44/4E*4D4DFE/41/ 4F*4D4DFD/52/49*4D4DFC/52/53*4D4DFB/45/52*4D4DFA/55/45*4D4DF9/45/56*4D4DF8/ 46/20*4D4DF7/20/44*4D4DF6/3A/45*4D4DF5/64/52*4D4DF4/65/45*4D4DF3/72/54*4D4D F2/65/53*4D4DF1/74/49*4D4DF0/73/47*4D4DEF/69/45*4D4DEE/67/52*4D4DED/65/4E*4 D4DEC/52/55*4938EC/90/00*4938EB/90/00*4938EA/90/03*4938E9/01/13*4938E8/B0/E8*$

Выводы: согласитесь, почти нулевая защита! И автор хотел за нее $25.95! Что??? Надеюсь я помог сэкономить 30 баксов.

Спасибо за интерес к этой статье!



Все права защищены ©  2003 
...::FEUERRADER::...




Rambler's Top100