Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Исследование HTMLPad 2002 Pro

Обсудить статью на форуме

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: GL#0M gl00m-crk@yandex.ru

 Цель: HTMLPad 2002 v4.11 Pro
Инструменты: SoftICE для Win9x (Loader для WinME, но я советую вам перейти на Win98, а лучше WinXP)                     SoftICE для WinNT/2k/XP (Patch для WinXP)                     ProcDump,                     IDA 4.30 (31mb, пароль к архиву: www.crackbest.com, скачайте, не пожалеете),                     Hiew,                     PEiDentifier,                     UPX

О программе

По моему мнению, HTMLPad 2002 Pro - хороший html-редактор с приличным набором возможностей и отличным интерфейсом.

Взлом

Итак приступим. При каждом запуске программы перед нами появляется Nag (окно-напоминатель с требованием о регистрации), который говорит, что у нас в запасе всего 50 запусков и предлагает выйти или продолжить загрузку программы с помощью соответствующих кнопок, а по истечении лимита заплатить, либо распрощаться. Нет, так дело не пойдёт...

Запустим PEIdentifier (лучше всего в настройках PEiDentifier выставить "Shell Extension", тогда при нажатии правой кнопки на exe, dll и т.д., в меню появится пункт "Scan with PEiD"), откроем в нём htmlpad.exe и увидим "UPX 0.89.6 - 1.02 / 1.05 - 1.22 -> Markus & Lazlo", тем лучше. Пробуем стандартную команду UPX'а: upx -d packed_file_name, где packed_file_name, в нашем случае, htmlpad.exe. Получилось? Отлично, переименуем распакованный файл в unpacked.exe

Хорошо. Запусти-ка его пару раз. Ничего не слышишь? Правильно, мы слышим звук из спикера/колонок, а какой API он вызывается? Правильно, MessageBeep. Запустим SoftICE (Ctrl+D), поставим breakpoint на MessageBeep (команда bpx MessageBeep -> Enter) и нажмём F5 для выхода из SoftICE. Далее запускаем HTMLPad 2002 Pro и попадаем в SoftICE, нажимаем F12 (для того чтобы посмотреть откуда вызвался этот (MessageBeep), попадаем на адрес 005DC514 (запоминаем его). Выключаем breakpoint (команда bc* -> Enter) и нажимаем F5 для выхода.

Запускаем IDA и открываем в нём наш unpacked.exe [ждём некоторое время, а можно и не ждать]. И идём на адрес 005DC514, листинг из IDA ниже, с комментариями:
 CODE:005DC360                   push    ebp	// начало программы (OEP)
 CODE:005DC361                 mov     ebp, esp
 CODE:005DC363                 add     esp, 0FFFFFFF0h
 CODE:005DC366                 push    ebx
 CODE:005DC367                 push    esi
 CODE:005DC368                 push    edi
 CODE:005DC369                 xor     eax, eax
 CODE:005DC36B                 mov     [ebp+var_10], eax
 CODE:005DC36E                 mov     eax, offset nullsub_15
 CODE:005DC373                 call    sub_407548
 CODE:005DC378                 xor     eax, eax
 CODE:005DC37A                 push    ebp
 CODE:005DC37B                 push    offset loc_5DC590
 CODE:005DC380                 push    dword ptr fs:[eax]
 CODE:005DC383                 mov     fs:[eax], esp
 CODE:005DC386                 push    offset aWebuilder ; lpName
 CODE:005DC38B                 push    0               ; bInitialOwner
 CODE:005DC38D                 push    0               ; lpMutexAttributes
 CODE:005DC38F                 call    CreateMutexA
 CODE:005DC394                 push    0               ; lpWindowName
 CODE:005DC396                 push    offset aTwebuilder ; lpClassName
 CODE:005DC39B                 call    FindWindowA
 CODE:005DC3A0                 mov     esi, eax
 CODE:005DC3A2                   test    esi, esi		     // сравниваем esi с нулём
 CODE:005DC3A4                   jz      loc_5DC4A0	                   // если esi=0, то вызов Nag'а
 CODE:005DC3AA                 push    0               ; lpWindowName
 CODE:005DC3AC                 push    offset aTappbuilder ; lpClassName
 CODE:005DC3B1                 call    FindWindowA
 CODE:005DC3B6                   test    eax, eax		     // сравниваем eax с нулём
 CODE:005DC3B8                   ja      loc_5DC4A0	                   // если eax>0, то вызов Nag'а
 CODE:005DC3BE                 call    sub_402AE4
 CODE:005DC3C3                 test    eax, eax
 CODE:005DC3C5                 jle     short loc_5DC41A
 CODE:005DC3C7                 call    sub_402AE4
 CODE:005DC3CC                 mov     ebx, eax
 CODE:005DC3CE                 test    ebx, ebx
 CODE:005DC3D0                 jle     short loc_5DC402
 CODE:005DC3D2                 mov     edi, 1
 CODE:005DC3D7
 CODE:005DC3D7 loc_5DC3D7:                             ; CODE XREF: start+A0j
 CODE:005DC3D7                 push    ds:dword_5E40D4
 CODE:005DC3DD                 lea     edx, [ebp+var_10]
 CODE:005DC3E0                 mov     eax, edi
 CODE:005DC3E2                 call    sub_402B44
 CODE:005DC3E7                 push    [ebp+var_10]
 CODE:005DC3EA                 push    offset dword_5DC5CC
 CODE:005DC3EF                 mov     eax, offset dword_5E40D4
 CODE:005DC3F4                 mov     edx, 3
 CODE:005DC3F9                 call    sub_404260
 CODE:005DC3FE                 inc     edi
 CODE:005DC3FF                 dec     ebx
 CODE:005DC400                 jnz     short loc_5DC3D7
 CODE:005DC402
 CODE:005DC402 loc_5DC402:                             ; CODE XREF: start+70j
 CODE:005DC402                 mov     eax, ds:dword_5E40D4
 CODE:005DC407                 call    sub_404364
 CODE:005DC40C                 mov     edx, eax
 CODE:005DC40E                 mov     eax, offset dword_5E40D0
 CODE:005DC413                 call    sub_4040D8
 CODE:005DC418                 jmp     short loc_5DC424
 CODE:005DC41A ; ------------------------------------------------------------------------
 CODE:005DC41A
 CODE:005DC41A loc_5DC41A:                             ; CODE XREF: start+65j
 CODE:005DC41A                 mov     eax, offset dword_5E40D0
 CODE:005DC41F                 call    sub_403F10
 CODE:005DC424
 CODE:005DC424 loc_5DC424:                             ; CODE XREF: start+B8j
 CODE:005DC424                 mov     eax, ds:dword_5E40D0
 CODE:005DC429                 call    sub_4041A0
 CODE:005DC42E                 mov     ds:dword_5E40CC, eax
 CODE:005DC433                 push    offset aMemorymap_0 ; lpName
 CODE:005DC438                 mov     eax, ds:dword_5E40CC
 CODE:005DC43D                 add     eax, 2
 CODE:005DC440                 push    eax             ; dwMaximumSizeLow
 CODE:005DC441                 push    0               ; dwMaximumSizeHigh
 CODE:005DC443                 push    4               ; flProtect
 CODE:005DC445                 push    0               ; lpFileMappingAttributes
 CODE:005DC447                 push    0FFFFFFFFh      ; hFile
 CODE:005DC449                 call    CreateFileMappingA
 CODE:005DC44E                 mov     ebx, eax
 CODE:005DC450                 push    0               ; dwNumberOfBytesToMap
 CODE:005DC452                 push    0               ; dwFileOffsetLow
 CODE:005DC454                 push    0               ; dwFileOffsetHigh
 CODE:005DC456                 push    2               ; dwDesiredAccess
 CODE:005DC458                 push    ebx             ; hFileMappingObject
 CODE:005DC459                 call    MapViewOfFile
 CODE:005DC45E                 mov     edi, eax
 CODE:005DC460                 mov     eax, edi
 CODE:005DC462                 mov     edx, ds:dword_5E40D0
 CODE:005DC468                 call    sub_40A87C
 CODE:005DC46D                 push    0               ; lParam
 CODE:005DC46F                 mov     eax, ds:dword_5E40CC
 CODE:005DC474                 add     eax, 2
 CODE:005DC477                 push    eax             ; wParam
 CODE:005DC478                 push    401h            ; Msg
 CODE:005DC47D                 push    esi             ; hWnd
 CODE:005DC47E                 call    SendMessageA
 CODE:005DC483                 test    edi, edi
 CODE:005DC485                 jz      short loc_5DC48D
 CODE:005DC487                 push    edi             ; lpBaseAddress
 CODE:005DC488                 call    UnmapViewOfFile
 CODE:005DC48D
 CODE:005DC48D loc_5DC48D:                             ; CODE XREF: start+125j
 CODE:005DC48D                 test    ebx, ebx
 CODE:005DC48F                 jz      loc_5DC57A
 CODE:005DC495                 push    ebx             ; hObject
 CODE:005DC496                 call    CloseHandle
 CODE:005DC49B                 jmp     loc_5DC57A
 CODE:005DC4A0 ; ------------------------------------------------------------------------
 CODE:005DC4A0
 CODE:005DC4A0 loc_5DC4A0:                             ; CODE XREF: start+44j                  // первый...
 CODE:005DC4A0                                         ; start+58j                                               // второй адрес вызова
 CODE:005DC4A0                   mov     ecx, ds:dword_5E09EC                                             // сюда прыгают с адреса 5DC3A4
 CODE:005DC4A6                 mov     ecx, [ecx]
 CODE:005DC4A8                 mov     dl, 1
 CODE:005DC4AA                 mov     eax, ds:dword_585D60
 CODE:005DC4AF                 call    sub_4527E4
 CODE:005DC4B4                 mov     edx, ds:dword_5E0908
 CODE:005DC4BA                 mov     [edx], eax
 CODE:005DC4BC                 mov     eax, ds:dword_5E0908
 CODE:005DC4C1                 mov     eax, [eax]
 CODE:005DC4C3                 call    sub_4566C4
 CODE:005DC4C8                 mov     eax, ds:dword_5E0908
 CODE:005DC4CD                 mov     eax, [eax]
 CODE:005DC4CF                 mov     edx, [eax]
 CODE:005DC4D1                 call    dword ptr [edx+80h]
 CODE:005DC4D7                 call    sub_4F7E34
 CODE:005DC4DC                 mov     eax, ds:dword_5E09EC
 CODE:005DC4E1                 mov     eax, [eax]
 CODE:005DC4E3                 call    sub_4597E0
 CODE:005DC4E8                 mov     eax, ds:dword_5E09EC
 CODE:005DC4ED                 mov     eax, [eax]
 CODE:005DC4EF                 add     eax, 40h
 CODE:005DC4F2                 mov     edx, offset dword_5DC5E4
 CODE:005DC4F7                 call    sub_403F64
 CODE:005DC4FC                 mov     eax, ds:dword_5E09EC
 CODE:005DC501                 mov     eax, [eax]
 CODE:005DC503                 mov     edx, offset dword_5DC5F8
 CODE:005DC508                 call    sub_4593E4
 CODE:005DC50D                 push    0               ; uType
 CODE:005DC50F                 call    MessageBeep
 CODE:005DC514                   xor     ecx, ecx				// мы здесь, в SoftICE, после нажатия F12
 CODE:005DC516                 mov     dl, 1
 CODE:005DC518                 mov     eax, ds:dword_582874
 CODE:005DC51D                   call    sub_4527E4			// создание окна-напоминателя.
 CODE:005DC522                 mov     edx, ds:dword_5E0B50
 CODE:005DC528                 mov     [edx], eax
 CODE:005DC52A                 mov     eax, ds:dword_5E0B50
 CODE:005DC52F                 mov     eax, [eax]
 CODE:005DC531                 mov     edx, [eax]
 CODE:005DC533                   call    dword ptr [edx+0D8h]		// цикл-проверка
 CODE:005DC539                   cmp     eax, 2				// проверка, равен ли eax двум
 CODE:005DC53C                   jz      short loc_5DC57A			// переход на выход, если eax=2
 CODE:005DC53E                   mov     ecx, ds:dword_5E0594		// продолжаем загрузку
 CODE:005DC544                 mov     eax, ds:dword_5E09EC
 CODE:005DC549                 mov     eax, [eax]
 CODE:005DC54B                 mov     edx, ds:dword_5CE5E0
 CODE:005DC551                 call    sub_4597F8
 CODE:005DC556                 mov     ecx, ds:dword_5E060C
 CODE:005DC55C                 mov     eax, ds:dword_5E09EC
 CODE:005DC561                 mov     eax, [eax]
 CODE:005DC563                 mov     edx, ds:dword_555B40
 CODE:005DC569                 call    sub_4597F8
 CODE:005DC56E                 mov     eax, ds:dword_5E09EC
 CODE:005DC573                 mov     eax, [eax]
 CODE:005DC575                 call    sub_459878
 
Итак, мы на адресе 005DC514, если в SoftICE пройти по коду дальше, нажимая F10, то мы поймём, что call 004527E4 - это процедура создания окна-напоминателя (т.к. после её прохождения за экраном SoftICE появляется Nag, для просмотра нажмём F4, чтобы опять вернуть окно SoftICE надо еще раз нажать F4), а по адресу 005DC533, идёт цикл-проверка, по выходу из которого, в eax заносится значение соответствующее нажатой копке (1-кнопка "Продолжить", 2-кнопка "Выход").
Для просмотра, что в eax, используем команду "? eax", или можно посмотреть в окно регистров SoftICE (на самом верху).


Ладно перейдём опять к IDA. Теперь нам хорошо бы узнать откуда произошёл вызов всего "Этого". Поднимемся от адреса 005DC514 выше до строчки " ; CODE XREF: start+44j; start+58j ".
start+44 и start+58 - это и есть адреса вызова (start - это адрес начала программы (OEP), у нас он равен 005DC360), они равны 005DC360+44=005DC3A4 и 005DC360+58=005DC3B8. Идём по этим адресам. Мы видим, что по адресу 005DC3A4, если esi равен нулю, происходит прыжок на адрес 005DC4A0, а дальше, как мы видим, идёт вызов окна-напоминателя. Следовательно нам нужно, любыми путями, с адреса 005DC3A4, где происходит первый вызов окна-напоминателя, перепрыгнуть на адрес 005DC53E, где происходит загрузка программы, уже после показа окна-напоминателя.

Зайдём в Hiew и изменим оригинальные опкоды, по адресу: 005DC3A4 - на свои. Вот что у меня получилось:

 ...
 :005DC3A4 0F8494010000		jmp 005DC53E
 ...
 
Внеся эти изменения в unpacked.exe, мы получим требуемый результат. После запуска, HTMLPad 2002 Pro благополучно запустится не выводя никаких окон с претензиями... Rules!!!

Так, основную работу мы проделали, теперь хорошо бы патч сделать. Одна проблемка, htmlpad.exe упакован. :( Но ничего страшного, мы же можем сделать inline patch.

"Что же такое inline patch?", спросите Вы. Inline patch - это патч исправляющий код во время выполнения программы. Для того чтобы это проделать, мы ждём пока программа полностью распакуется, и точку, когда программа хочет прыгнуть на OEP (расшифровывается как Original Entry Point - это адрес, с которого бы начинала выполняться программа, если бы не была упакована, когда же программа упакована, выполняться она начинает с EP, что расшифровывается как Entry Point), мы меняем на прыжок к Нашему куску кода, который делает необходимые изменения, а затем прыгает на OEP. Программа продолжает загрузку, ни о чём не подозревая. :)

Пауза.

Для меня это была БОЛЬШАЯ [проблема] :((( Долго я парился (2 дня) в поисках как же это проделать. Перечитал 3 статьи на эту тему (Greet's: Patch it on death, Corbio and TeamX). Всё вроди бы легко, но [у меня] не работает...

Долгие, долгие, долгие поиски...%(!?..


А выход нашёл такой:

1. ProcDump'ом смотрим Entry Point+Image Base нашего unpacked.exe, он равен 005DC360 (записываем его, чтобы не забыть).

2. Затем, в Hiew открываем наш htmlpad.exe и в самом конце СЕКЦИИ РЕСУРСОВ (о ней можно узнать из статьи "ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE) by Hard Wisdom"), там должно быть много нолей, у меня это был адрес 006BB390, вставляем следующее [листинг из HIEW]:

 :006BB390 C705A4C35D000F849401		mov d, [0005DC3A4], 00194840F
 :006BB39A BF60C35D00			mov edi, 0005DC360	       // это OEP unpacked.exe
 :006BB39F FFE7				jmp edi
 
Вы спросите: "А, почему именно в конце СЕКЦИИ РЕСУРСОВ?"
А, потому, что если вставить этот код в другую секцию и попытаться исполнить, то у нас вылетит ошибка: "Системе недостаточно памяти для запуска приложения..."

Вы спросите: "А, что это за команды такие?"
Учите ассемблер.

mov d, [0005DC3A4], 00194840F - это mov dword ptr [xxxxxx], yyyyyyyy , где xxxxxx, адрес куда будем вносить изменения, а yyyyyyyy, на что будем изменять. Причём изменения (yyyyyyyy) пишутся наоборот. У нас 0F849401, а пишем 0194840F.

mov edi, 0005DC360 - заносим значение/адрес 005DC360 в регистр edi.
jmp edi - осуществляем прыжок на адрес содержащийся в edi.

3. ProcDump'ом смотрим Entry Point+Image Base у htmlpad.exe, он равен 006B58D0, заходим в Hiew и идём туда, там pushad, спускаемся до адреса 006B5A33 - там popad, а это значит, что после этой команды произойдёт распаковка htmlpad.exe (у UPX'а, на сегодняшний день, это так).


 :006B5A2C FF96A4A02B00		call d, [esi] [0002BA0A4]
 :006B5A32 61			popad	// вот он финал распаковки:)
 :006B5A33 E92869F2FF		jmp 0FFFEA760
 :006B5A38 50			push eax
 
После popad происходит прыжок на OEP (jmp 0FFFEA760). Изменим его на jmp 006BB390 (опкоды: E958590000, т.е. прыгнем к нашему куску кода). Теперь сохраним изменения (F9) и выйдем (F10). Всё, Мы сделали Это! Удачи!

Все пожелания и предложения отправляйте на мыло. Постараюсь ответить.
Этот материал опубликован в целях самообразования, за последствия которого Автор ответственности не несёт!

Обсуждение статьи: Исследование HTMLPad 2002 Pro >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS