вторник, 22 декабря 2015 г.

Разбор CrackMe by Fereter #1

Данный разбор представлен исключительно в ознакомительных целях!

Собственно полностью логику данного кракми я до конца не понял, но поставленную его автором задачу выполнил:) А задача стояла такая:
------------------------------------
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.
------------------------------------
Для решения этой задачи я использовал:
   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. Если дизассемблировать эти опкоды, то получатся нужные нам инструкции. 
Ну собственно вот и все:) Хочу сказать, что я очень долго тупил над тем, как же все таки реализована защита от патчинга, но так ничего и не понял. Так что буду рад если мне кто-нибудь поможет))

1 комментарий:

  1. Защита от отладки заключалась еще и в подсчете тактов необходимых на выполнение 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

    ОтветитьУдалить