Доброго дня. Пару недель назад начал учиться крэкингу. Прочитал вводную по OllyDbg и CRACKME. Решил попробывать на одной из программ написанной на Delphi. Программа при старте показывает заставку и затем выводит на экран форму регистрации в которой показывает в Label3 код и предлагает в Edit1 ввести ответный код, при неправильном вводе программа сразу закрывается. Приведёный ниже код это после обработки EXE через DeDe. Код (Text): procedure TForm1.BitBtn1Click(Sender : TObject); begin (* 0051422C 55 push ebp 0051422D 8BEC mov ebp, esp 0051422F 6A00 push $00 00514231 53 push ebx 00514232 8BD8 mov ebx, eax 00514234 33C0 xor eax, eax 00514236 55 push ebp 00514237 6873425100 push $00514273 ***** TRY | 0051423C 64FF30 push dword ptr fs:[eax] 0051423F 648920 mov fs:[eax], esp 00514242 8D55FC lea edx, [ebp-$04] * Reference to control TForm1.Edit1 : TEdit | 00514245 8B8370030000 mov eax, [ebx+$0370] | 0051424B E81CD1F4FF call 0046136C 00514250 8B55FC mov edx, [ebp-$04] * Reference to pointer to GlobalVar_005A7F60 | 00514253 A1F81F5A00 mov eax, dword ptr [$005A1FF8] | 00514258 E8630AEFFF call 00404CC0 0051425D 33C0 xor eax, eax 0051425F 5A pop edx 00514260 59 pop ecx 00514261 59 pop ecx 00514262 648910 mov fs:[eax], edx ****** FINALLY | 00514265 687A425100 push $0051427A 0051426A 8D45FC lea eax, [ebp-$04] | 0051426D E8FA09EFFF call 00404C6C 00514272 C3 ret | 00514273 E97C02EFFF jmp 004044F4 00514278 EBF0 jmp 0051426A ****** END | 0051427A 5B pop ebx 0051427B 59 pop ecx 0051427C 5D pop ebp 0051427D C3 ret *) end;
0046136C 00404CC0 00404C6C это что за функции а пока begin try Edit1.0046136C; Edit1.00404CC0; finally Edit1.00404C6C; end; end;
В коде вложенных функций много. Я с ними засел. Код (Text): 0046136C 0046136C /$ 53 PUSH EBX 0046136D |. 56 PUSH ESI 0046136E |. 57 PUSH EDI 0046136F |. 8BFA MOV EDI,EDX 00461371 |. 8BF0 MOV ESI,EAX 00461373 |. 8BC6 MOV EAX,ESI 00461375 |. E8 62FFFFFF CALL FrontOff.004612DC 0046137A |. 8BD8 MOV EBX,EAX 0046137C |. 8BC7 MOV EAX,EDI 0046137E |. 8BCB MOV ECX,EBX 00461380 |. 33D2 XOR EDX,EDX 00461382 |. E8 D539FAFF CALL FrontOff.00404D5C 00461387 |. 85DB TEST EBX,EBX 00461389 |. 74 0C JE SHORT FrontOff.00461397 0046138B |. 8D4B 01 LEA ECX,DWORD PTR DS:[EBX+1] 0046138E |. 8B17 MOV EDX,DWORD PTR DS:[EDI] 00461390 |. 8BC6 MOV EAX,ESI 00461392 |. E8 55FFFFFF CALL FrontOff.004612EC 00461397 |> 5F POP EDI 00461398 |. 5E POP ESI 00461399 |. 5B POP EBX 0046139A \. C3 RETN 00404CC0 $ 85D2 TEST EDX,EDX 00404CC2 . 74 24 JE SHORT FrontOff.00404CE8 00404CC4 . 8B4A F8 MOV ECX,DWORD PTR DS:[EDX-8] 00404CC7 . 41 INC ECX 00404CC8 . 7F 1A JG SHORT FrontOff.00404CE4 00404CCA . 50 PUSH EAX 00404CCB . 52 PUSH EDX 00404CCC . 8B42 FC MOV EAX,DWORD PTR DS:[EDX-4] 00404CCF . E8 5C000000 CALL FrontOff.00404D30 00404CD4 . 89C2 MOV EDX,EAX 00404CD6 . 58 POP EAX 00404CD7 . 52 PUSH EDX 00404CD8 . 8B48 FC MOV ECX,DWORD PTR DS:[EAX-4] 00404CDB . E8 14E5FFFF CALL FrontOff.004031F4 00404CE0 . 5A POP EDX 00404CE1 . 58 POP EAX 00404CE2 . EB 04 JMP SHORT FrontOff.00404CE8 00404CE4 > F0:FF42 F8 LOCK INC DWORD PTR DS:[EDX-8] ; LOCK prefix 00404CE8 > 8710 XCHG DWORD PTR DS:[EAX],EDX 00404CEA . 85D2 TEST EDX,EDX 00404CEC . 74 14 JE SHORT FrontOff.00404D02 00404CEE . 8B4A F8 MOV ECX,DWORD PTR DS:[EDX-8] 00404CF1 . 49 DEC ECX 00404CF2 . 7C 0E JL SHORT FrontOff.00404D02 00404CF4 . F0:FF4A F8 LOCK DEC DWORD PTR DS:[EDX-8] ; LOCK prefix 00404CF8 . 75 08 JNZ SHORT FrontOff.00404D02 00404CFA . 8D42 F8 LEA EAX,DWORD PTR DS:[EDX-8] 00404CFD . E8 A6E2FFFF CALL FrontOff.00402FA8 00404D02 > C3 RETN 00404D03 90 NOP 00404D04 $ 85D2 TEST EDX,EDX 00404D06 . 74 0A JE SHORT FrontOff.00404D12 00404D08 . 8B4A F8 MOV ECX,DWORD PTR DS:[EDX-8] 00404D0B . 41 INC ECX 00404D0C . 7E 04 JLE SHORT FrontOff.00404D12 00404D0E . F0:FF42 F8 LOCK INC DWORD PTR DS:[EDX-8] ; LOCK prefix 00404D12 > 8710 XCHG DWORD PTR DS:[EAX],EDX 00404D14 . 85D2 TEST EDX,EDX 00404D16 . 74 14 JE SHORT FrontOff.00404D2C 00404D18 . 8B4A F8 MOV ECX,DWORD PTR DS:[EDX-8] 00404D1B . 49 DEC ECX 00404D1C . 7C 0E JL SHORT FrontOff.00404D2C 00404D1E . F0:FF4A F8 LOCK DEC DWORD PTR DS:[EDX-8] ; LOCK prefix 00404D22 . 75 08 JNZ SHORT FrontOff.00404D2C 00404D24 . 8D42 F8 LEA EAX,DWORD PTR DS:[EDX-8] 00404D27 . E8 7CE2FFFF CALL FrontOff.00402FA8 00404D2C > C3 RETN 00404C6C $ 8B10 MOV EDX,DWORD PTR DS:[EAX] 00404C6E . 85D2 TEST EDX,EDX 00404C70 . 74 1C JE SHORT FrontOff.00404C8E 00404C72 . C700 00000000 MOV DWORD PTR DS:[EAX],0 00404C78 . 8B4A F8 MOV ECX,DWORD PTR DS:[EDX-8] 00404C7B . 49 DEC ECX 00404C7C . 7C 10 JL SHORT FrontOff.00404C8E 00404C7E . F0:FF4A F8 LOCK DEC DWORD PTR DS:[EDX-8] ; LOCK prefix 00404C82 . 75 0A JNZ SHORT FrontOff.00404C8E 00404C84 . 50 PUSH EAX 00404C85 . 8D42 F8 LEA EAX,DWORD PTR DS:[EDX-8] 00404C88 . E8 1BE3FFFF CALL FrontOff.00402FA8 00404C8D . 58 POP EAX 00404C8E > C3 RETN
FrontOff.00404D5C({EAX,} FrontOff.004612DC(), 0); при чем в EAX в предыдущей функции загоняется [ebp-$04] if (EBX<>0) FrontOff.004612EC({ESI}, DWORD PTR DS:[EBX+1], DWORD PTR DS:[EDI]); Ну и т.д. мож посмотришь под дебагером что там происходит ? Или под Идой.
Разглядываю что там происходит через OllyDbg. При старте прога проверяет откуда она запущена и затем идут непонятные манипуляции с инфой о разделе или hdd. И генерируется непонятно как номер, который и показывается на экране. По идее на ответный код пофиг, было бы достаточно просто обойти эти проверки и запустить прогу. Патча достаточно будет. Сегодня как раз две недели как пробую сделать - чувствую себя тупицей.
Видишь вот эту инструкцию 00461389 |. 74 0C JE SHORT FrontOff.00461397 В ней достаточно 1 байт пропатчить чтоб стало JNE SHORT FrontOff.00461397 Для Олли есть плагин чтоб записать лог переходов, пропускаешь два раза, один раз вводишь правильный ответ, второй раз неправильный, смотришь где прога пошла по другому пути...
Достаточно найти CreateForm, а перед ним и будет в регистрах и TForm и Form1, при чем с именами как в сырце. Если погулять по этим указателям можно восстановить и классы, и их имена в сырце а даже файлы в которых они были, когда были сырцами. Исследование кода, генерируемого Delphi. Часть 1 Мож кто поумнее плагин для этого замутит ? А то всяких там DeDe/SourceRescuer/De_Decompiller'ов полно ходит.
Shooshpanchik Для Олли есть плагин чтоб записать лог переходов, пропускаешь два раза, один раз вводишь правильный ответ, второй раз неправильный, смотришь где прога пошла по другому пути... Можешь сказать что это за плагин?
Всем спасибо. буду дальше ковырять. Тут похоже всё интереснее, что-то местами попадается шифрование. Т.е. снимается инфа о железе и шифруется. И похоже на основе этого генерируется код.