RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

Исследование CDBF for Windows v1.0.

Автор: Porshe
Цель: CDBF for Windows v1.00 (DBF viewer/editor)
URL: http://www.whitetown.com
Ограничения: 10 min limit
Инструменты: PE Explorer 1.60, HIEW, DeDe, W32Dasm

Просьба не судить строго, т.к. это мой первый tutorial.
Итак, посмотрим чет же нам сeгодня запаковали цель. Оказалось это мирный UPX. Кто хочет может распаковать его вручную, мы же воспользуемся прекрасным unpacker'om из PE Explorer. Просто открываем цель и сохраняем Save As New Image.
Самое время запустить программу, она не дает возможности ввести какие-то рег.данные. Help говорит что после регистрации мы получим рег.данные, но неизвестно какие конкретно. Filemon и Regmon не показали ничего подозрительного. Скорее всего проверяются какие-то свои файлы и, похоже, это Cdbfapi.dll - был замечен в About и Help.
Нo он запакован (UPX) и содержит какие-то свой API. Поэтому будем снимать ограничение на время прямым patching'ом. Грузим прогу в DeDe, т.к. она написана на Delphi. В Classes Info видим клас TTimer, но он конечно же нивидим, тогда сохраним весь Проект и поищем в каких же файлах упоминается TTimer. Это main.pas, progress.pas (к нему мы вернемся) и goodbye.pas (тут искать нечего, т.к. после него нас выкинут из проги).
В main.pas ищем где идет ссылка на TTimer, нашли:

* Reference to: extctrls.TTimer.SetEnabled(TTimer;System.Boolean);
|
00486631   E88640FBFF             call    0043A6BC
00486636   EB0A                   jmp     00486642
00486638   A128A94900             mov     eax, dword ptr [$49A928]
Посмотрим что находится по адресу 0043A6BC (это уже придется смотреть в W32Dasm, DeDe можно закрыть):
:0043A6BC 3A5034                  cmp dl, byte ptr [eax+34]
:0043A6BF 7408                    je 0043A6C9
:0043A6C1 885034                  mov byte ptr [eax+34], dl
:0043A6C4 E867FFFFFF              call 0043A630
Теперь идем по 0043A630 и чуть ниже видим интересные вызовы API:
KillTimer и SetTimer
* Reference To: user32.KillTimer, Ord:0000h                          
       |
:0043A64D E86EBBFCFF              Call 004061C0
:0043A652 8B7324                  mov esi, dword ptr [ebx+24]
:0043A655 85F6                    test esi, esi
:0043A657 7440                    je 0043A699
:0043A659 807B3400                cmp byte ptr [ebx+34], 00
:0043A65D 743A                    je 0043A699
:0043A65F 66837B2E00              cmp word ptr [ebx+2E], 0000
:0043A664 7433                    je 0043A699
:0043A666 6A00                    push 00000000
:0043A668 56                      push esi
:0043A669 6A01                    push 00000001
:0043A66B 8B4328                  mov eax, dword ptr [ebx+28]
:0043A66E 50                      push eax
* Reference To: user32.SetTimer, Ord:0000h
                                  |
:0043A66F E8BCBCFCFF              Call 00406330
Можно было бы заменить последний JE по адресу 0043А664 на JMP - все работает - 10 min limit исчез. А теперь экспортируйте любую базу в другой формат. Ууу, какая красивая и вечная шкала процесса сохранения :). Значит SetTimer нужен другим функциям проги, тогда будем искать где же идет вызов установки 10 min limit.
Ставим в вашем любимом Debug'epe breakpoint на KillTimer и смотрим когда же произойдет установка 500000 мс. У меня это было после второго вызова. Идем дo RET, потом второй RET и после его исполнения мы появимся под call'ом (:0043A6EB E840FFFFFF call 0043A630 ) который установил счетчик. Осталось только найти этот Call в файле и забить его nop'ами.
Вроде все...


<= Вернуться к статьям


Rambler's Top100