Показать сообщение отдельно

  #3  
Старый 14.08.2006, 17:20
ProTeuS
Познавший АНТИЧАТ
Регистрация: 26.11.2004
Сообщений: 1,367
Провел на форуме:
4226592

Репутация: 2175


Отправить сообщение для ProTeuS с помощью ICQ
По умолчанию

Код:
seg000:004247A0
seg000:004247A0 ; --------------- S U B R O U T I N E ---------------------------------------
seg000:004247A0
seg000:004247A0 ; Attributes: bp-based frame
seg000:004247A0
seg000:004247A0 sub_4247A0      proc near               ; CODE XREF: sub_437940+26p
seg000:004247A0                                         ; sub_437940+3Bp
seg000:004247A0
seg000:004247A0 var_200         = dword ptr -200h
seg000:004247A0
seg000:004247A0                 push    ebp
seg000:004247A1                 mov     ebp, esp
seg000:004247A3                 sub     esp, 200h
seg000:004247A9                 push    esi
seg000:004247AA                 push    edi
seg000:004247AB                 call    sub_437940
seg000:004247B0                 mov     dword ptr [eax+20h], offset aLemonade ; "Lemonade"
seg000:004247B7                 call    sub_437940
seg000:004247BC                 mov     dword ptr [eax+24h], offset aLemonadeTycoon ; "Lemonade Tycoon"
seg000:004247C3                 call    sub_437940
seg000:004247C8                 mov     dword ptr [eax+28h], offset a1_1_5 ; "1.1.5"
seg000:004247CF                 call    sub_437940
seg000:004247D4                 mov     dword ptr [eax+28h], offset a1_1_6 ; "1.1.6"
seg000:004247DB                 call    sub_437940
seg000:004247E0                 mov     dword ptr [eax+1Ch], offset aB6081ca706b415 ; "{B6081CA-706B-415E-AE52-910C4FB06016}"
seg000:004247E7                 call    sub_437940
seg000:004247EC                 mov     dword ptr [eax+10h], offset a1_0 ; "1.0"
seg000:004247F3                 call    sub_437940
seg000:004247F8                 mov     dword ptr [eax+14h], offset a72733b3Ac0f4d4 ; "{72733B3-AC0F-4D43-BED1-25EE1194A7BA}"
seg000:004247FF                 call    sub_437940
seg000:00424804                 mov     dword ptr [eax+18h], offset a48033dc6A54144 ; "{48033DC6-A541-4454-A9CE-3186C3365B75}"
seg000:0042480B                 call    sub_437940
seg000:00424810                 mov     dword ptr [eax+88h], 96h
seg000:0042481A                 call    sub_437940
seg000:0042481F                 xor     edi, edi
seg000:00424821                 push    68h
seg000:00424823                 mov     [eax+34h], edi
seg000:00424826                 pop     esi
seg000:00424827
seg000:00424827 loc_424827:                             ; CODE XREF: sub_4247A0+98j
seg000:00424827                 call    sub_437940
seg000:0042482C                 mov     [eax+esi], edi
seg000:0042482F                 add     esi, 4
seg000:00424832                 cmp     esi, 84h
seg000:00424838                 jl      short loc_424827
seg000:0042483A                 call    sub_4263DD      ; функЦия проверки
seg000:0042483F                 test    eax, eax
seg000:00424841                 jz      short loc_42484A
seg000:00424843                 push    1               ; int
seg000:00424845                 call    _exit
seg000:0042484A ; ---------------------------------------------------------------------------
seg000:0042484A
seg000:0042484A loc_42484A:                             ; CODE XREF: sub_4247A0+A1j
seg000:0042484A                 call    sub_4264BC      ; eax = ds:dword_57F99C
seg000:0042484F                 test    eax, eax
seg000:00424851                 jz      short loc_42489B ; JMP if eax=1 (в до4ернем процессе)
seg000:00424853                 mov     esi, ds:GetModuleHandleA
seg000:00424859                 lea     eax, [ebp+var_200]
seg000:0042485F                 push    eax             ; char *
seg000:00424860                 push    edi             ; lpModuleName
seg000:00424861                 call    esi ; GetModuleHandleA
seg000:00424863                 push    eax             ; hInstance
seg000:00424864                 call    sub_426404
seg000:00424869                 pop     ecx
seg000:0042486A                 lea     eax, [ebp+var_200]
seg000:00424870                 pop     ecx
seg000:00424871                 mov     ds:dword_57F988, edi
seg000:00424877                 push    eax             ; int
seg000:00424878                 push    edi             ; lpModuleName
seg000:00424879                 call    esi ; GetModuleHandleA
seg000:0042487B                 push    eax             ; hInstance
seg000:0042487C                 call    sub_425C59      ; ReadParametrs
seg000:00424881                 pop     ecx
seg000:00424882                 cmp     eax, 3EBh
seg000:00424887                 pop     ecx
seg000:00424888                 jnz     short loc_424891
seg000:0042488A                 push    1               ; int
seg000:0042488C                 call    _exit           ; закрываем приложением после ввода рег.данных
seg000:00424891 ; ---------------------------------------------------------------------------
seg000:00424891
seg000:00424891 loc_424891:                             ; CODE XREF: sub_4247A0+E8j
seg000:00424891                 mov     ds:dword_57F988, 1
seg000:0042489B
seg000:0042489B loc_42489B:                             ; CODE XREF: sub_4247A0+B1j
seg000:0042489B                 pop     edi
seg000:0042489C                 pop     esi
seg000:0042489D                 leave                   ; прыгаем на .4365C9
seg000:0042489E                 retn
seg000:0042489E sub_4247A0      endp
seg000:0042489E
Несложно догадаться, что 0042483A call sub_4263DD есть ни что иное, как вызов функЦия проверки, влияющей на ход проверки по адресу .0042484F. Именно от ее результатов проверки зависит, будет ли вызвана функция ExitProcess, или будет ли восстановлен обычный порядок работы в случае ввода зарегистрированности пользователя и запуск игрушки.
Заглянув в вызываемую функцию 0042484A call sub_4264BC видим, что в регистр eax заносится 1, содержание ячейки памяти по адресу 57F99C.

Код:
seg000:004264BC
seg000:004264BC ; --------------- S U B R O U T I N E ---------------------------------------
seg000:004264BC
seg000:004264BC
seg000:004264BC sub_4264BC      proc near               ; CODE XREF: sub_413B78+5Cp
seg000:004264BC                                         ; sub_4157E8+531p ...
seg000:004264BC                 mov     eax, ds:dword_57F99C
seg000:004264C1                 retn
seg000:004264C1 sub_4264BC      endp
seg000:004264C1
Логично предположить, что до этого, во время проверки в эту самую ячейку производится запись в случае ввода неправильных данных. И если ячейка содержит 0, то программа будет постоянно пропускать этап проверки на зарегистрированность и сразу же запускать игру. Для поиска места проверки перезапустим жертву и установим точку останова на запись в указанную ячейки памяти:



Бряк на запись в ячейку памяти, хрянящую статус зарегистрированности

Жмем по F9 и перед нами появляется такой кусок кода:

Код:
seg000:00426296
seg000:00426296                 push    ebp
seg000:00426297                 mov     ebp, esp
seg000:00426299                 sub     esp, 530h
seg000:0042629F                 push    esi
seg000:004262A0                 xor     esi, esi
seg000:004262A2                 cmp     ds:dword_57F9A0, esi
seg000:004262A8                 jnz     loc_4263DA
seg000:004262AE                 lea     eax, [ebp+KeyName]
seg000:004262B4                 push    offset a1831    ; "183-1"
seg000:004262B9                 push    eax
seg000:004262BA                 mov     ds:dword_57F99C, 1 ; записывает 1 в я4ейку памяти в слу4ае ввода неправильных рег.данных
seg000:004262C4                 call    ds:lstrcpy
По адресу .004262A2 видим интересную команду по сравнению ячейки 57F9A0 с 0. Это место проверки на отсчет 60 секунд с момента запуска игры(щелкаем по .4262A2, нажимаем правую кнопку мыши, выбираем "Find References to - Address constant" и видим по адресу .00426046 соответствующий код MOV DWORD PTR DS:[57F9A0],1. Он выполняется только в случае зарегистрированности юзера и "дает знать" игре, что не нужно прерываться после минуты исполнения). Если содержание ячейки 57F9A0 будет 0, то игра вылетит даже после пропатчивания переменной статуса зарегистрированности! Итак, для полного взлома защиты нужно поменять результат проверки по адресу 004262A2, чтобы хоть один из операндов равнялся 1 и вместо сравнения содержимого ячейки 57F9A0 на 0 (адрес .4261D6) записать туда 1. Чтобы не использовать более массивные операции с модификацией ячеек памяти можно просто занести 1 в регистр esi. Для этого можно заменить команду xor esi, esi по адресу 004262A0 на inc esi и nop (оппкоды 46 90). Вместо CMP DWORD PTR DS:[57F9A0],0 нужно записать INC DWORD PTR DS:[57F9A0], ведь по умолчанию незарегистрированная прога будет хранить там 0 и мы таким образом оптимизируя код внесем в содержимое ячейки памяти 1. По желанию следующий условный переход JNE cracked.00426292 можно заменить на безусловный JMP cracked.00426292. Это и сделаем в любом шестнадцатиричном редакторе. Я выбрал Hiew. Для пропатчивание открываем в нем файл dumped_.exe, 2 раза жмем Enter, затем F5, вводим .4262A0, жмем F3, вводим 46 90. То же делаем и для остальных команд, оппкоды которых можно увидить на скрине ниже. Сохраняем изменения F9.



Патчим бинарник игры в шестнадцатиричном редакторе Hiew

Теперь програма полностью работоспособна. Запуск игры происходи сразу же, без вывода любых нагов и прерываний посреди процесса игры.

gl hf 2 all

Последний раз редактировалось ProTeuS; 14.08.2006 в 17:22..