Код:
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