Данный разбор представлен исключительно в ознакомительных целях!
Собственно полностью логику данного кракми я до конца не понял, но поставленную его автором задачу выполнил:) А задача стояла такая:
------------------------------------
An easy crackme for Windows. It implements a simple protection against debugging and against binary patching.
The goal of this exercise is to patch this executable file in order to any password was accepted.
------------------------------------
Ссылка на оригинал http://www.crackmes.de/users/fereter/crackme_by_fereter_1./download
Для решения этой задачи я использовал:
OllyDbg 2.0 в качестве отладчика.
HxD в качестве хекс-редактора.
IDA pro в качестве статического анализатора.
Загрузив файл в IDA я увидел что выполнение программы начинается с:
--------------------------------------------------------------------------
.code:00403070 push 10480000h ; dwStyle
.code:00403075 push offset Caption ; "CrackMe by Fereter"
.code:0040307A push offset ClassName ; "GetNumberClass"
.code:0040307F push 0 ; dwExStyle
.code:00403081 call ds:CreateWindowExA
.code:00403087 test eax, eax
.code:00403089 jz short loc_4030CA
.code:0040308B
.code:0040308B loc_40308B: ; CODE XREF: start+B8 j
.code:0040308B ; DATA XREF: start+94 o
.code:0040308B push 0 ; wMsgFilterMax
.code:0040308D push 0 ; wMsgFilterMin
.code:0040308F push 0 ; hWnd
.code:00403091 push offset Msg ; lpMsg
.code:00403096 call ds:GetMessageA
.code:0040309C mov ebx, eax
.code:0040309E call ds:IsDebuggerPresent
.code:004030A4 add eax, offset loc_40308B
.code:004030A9 cmp ebx, 1
.code:004030AC jb short loc_4030DB
.code:004030AE jz short loc_4030B2
.code:004030B0 jmp eax
--------------------------------------------------------------------------
А вот немного причесанный вид основной процедуры:
Теперь видно что если мы сразу откроем этот кракми в Olly то придется либо пользоваться плагинами для обхода антиотладки, либо вручную менять значения регистров при выполнении. Я ленивый, поэтому я просто запустил файл отдельно, и приаттачился к нему.
Собственно все что нам надо узнать в данном случае, так это где проверяется пароль на правильность. Здесь проверок две:
сначала по адресу 00403225h, затем 0040328Dh. Так вот, так как обычно патчингу подвергаются команды типа jmp, я подумал что на их целостность и проверяется этот кракми. Поэтому я решил изменить предшествующие команды
cmp EAX, ECX на cmp EAX, EAX, тем более что в обоих случаях они одинаковые.
Для этого я открыл кракми в хекс-редакторе и через поиск заменил байты 39C8 на 39C0. Если дизассемблировать эти опкоды, то получатся нужные нам инструкции.
Ну собственно вот и все:) Хочу сказать, что я очень долго тупил над тем, как же все таки реализована защита от патчинга, но так ничего и не понял. Так что буду рад если мне кто-нибудь поможет))
Защита от отладки заключалась еще и в подсчете тактов необходимых на выполнение N-ого кол-ва команд (004031C4-004031D1). А защита от патчинга в этот crackme кривая. Заключается она в том, что нельзя ставить NOP'ы и Software breakpoint'ы на промежуток с 004031DD по 004032B9. Вот код этой защиты. Как мы можем видеть в него захардкодированны адреса "исключений".
ОтветитьУдалитьCPU Disasm
Address Hex dump Command Comments
00403234 . C705 68204000 DD314 MOV DWORD PTR DS:[402068],004031DD ; Entry point
0040323E > 8B1D 68204000 MOV EBX,DWORD PTR DS:[402068]
00403244 . 81FB B9324000 CMP EBX,004032B9
0040324A 74 41 JE SHORT 0040328D
0040324C . BA FE314000 MOV EDX,004031FE
00403251 . 83C2 01 ADD EDX,1
00403254 . 39D3 CMP EBX,EDX
00403256 . 74 24 JE SHORT 0040327C
00403258 . BA 75324000 MOV EDX,00403275
0040325D . 83EA 01 SUB EDX,1
00403260 . 39D3 CMP EBX,EDX
00403262 . 74 18 JE SHORT 0040327C
00403264 . BA 7A324000 MOV EDX,0040327A
00403269 . 83EA 01 SUB EDX,1
0040326C . 39D3 CMP EBX,EDX
0040326E . 74 0C JE SHORT 0040327C
00403270 . 8A1B MOV BL,BYTE PTR DS:[EBX]
00403272 . 80FB CC CMP BL,0CC
00403275 74 66 JE SHORT 004032DD
00403277 . 80FB 90 CMP BL,90
0040327A 74 61 JE SHORT 004032DD
0040327C > 8B1D 68204000 MOV EBX,DWORD PTR DS:[402068]
00403282 . 83C3 01 ADD EBX,1
00403285 . 891D 68204000 MOV DWORD PTR DS:[402068],EBX
0040328B .^ EB B1 JMP SHORT 0040323E