Исследование crackme #1 by xor aka 0x00786F72

😁
Олдфаг
Статус
Оффлайн
Регистрация
27 Ноя 2016
Сообщения
2,091
Реакции[?]
2,025
Поинты[?]
6K

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.


Инструменты

PEiD
OllyDbg с настроеными плагинами + OllyDump
WinASM

Часть 1 - удаляем ненужные комманды (не обязательно)

Сначала откроем PEiD и выясним паковщик или компилятор
PEiD не нашел ни одного компилятора.
Откроем crackme#1 в OllyDbg
Видем первый цикл
Код:
00401270 >/$  89FF          MOV EDI,EDI                              ;  ntdll.7C910738

00401272  |.  89C0          MOV EAX,EAX
00401274  |.  97            XCHG EAX,EDI
00401275  |.  97            XCHG EAX,EDI
00401276  |.  6A 00         PUSH 0
00401278  |.  E8 2F000000   CALL crackme#.004012AC
0040127D  .  CF            IRETD
Тут если внимательно посмотреть - первые 4 комманды изменяют вид регистров,а потом дают прежний вид.
Весь crackme#1 находится в Call 004012AC.
Трассируем до Call-a и входим в него. Попали вот такое место.

Код:
004012EE   $  83C4 08       ADD ESP,8
004012F1   .  890424        MOV DWORD PTR SS:[ESP],EAX
004012F4   .  B8 EB04EBFC   MOV EAX,FCEB04EB
004012F9   .^ EB FC         JMP SHORT crackme#.004012F7
004012FB   .  58            POP EAX
004012FC   .  E8 6F050000   CALL crackme#.00401870
00401301   .  6A 00         PUSH 0
00401303   .  68 C1314000   PUSH crackme#.004031C1
00401308   .  68 8E304000   PUSH crackme#.0040308E                   ;  ASCII 20,"     Warning!!! Debug it only un"
0040130D   .  6A 00         PUSH 0
0040130F   .  E8 4A050000   CALL crackme#.0040185E
00401314   .  6A 00         PUSH 0                                   ; /pModule = NULL
00401316   .  FF15 6E204000 CALL DWORD PTR DS:[<&kernel              ; |hOwner = NULL
0040131C   .  A3 00304000   MOV DWORD PTR DS:[403000],EAX
00401321   .  6A 00         PUSH 0                                   ; /lParam = NULL
00401323   .  68 50134000   PUSH crackme#.00401350                   ; |DlgProc = crackme#.00401350
00401328   .  6A 00         PUSH 0
0040132A   .  68 E8030000   PUSH 3E8                                 ; |pTemplate = 3E8
0040132F   .  FF35 00304000 PUSH DWORD PTR DS:[403000]               ; |hInst = NULL
00401335   .  FF15 F6204000 CALL DWORD PTR DS:[<&user32.DialogBoxPar>; DialogBoxParamA
0040133B   .  6A 00         PUSH 0                                   ; /ExitCode = 0
0040133D   .  FF15 7E204000 CALL DWORD PTR DS:[<&kernel32.ExitProces>; ExitProcess
004012EE - представим что это OEP
Дампим с помощью OllyDump
Оставляем галочку Rebuild Import включонный - так нас нет времени чинить Импорт вручную.
Дампим под именим dump.exe и открываем его.
Теперь ищем другие комманды.
Нопим
Код:
004012F4   .  B8 EB04EBFC   MOV EAX,FCEB04EB
004012F9   .^EB FC         JMP SHORT dump.004012F7
004012F7   >^/EB FC         JMP SHORT dump.004012F5
004012F5   ? /EB 04         JMP SHORT dump.004012FB
004012FB   .  58            POP EAX
Изменяем вид комманд, снова дампим в 004012F6 и сохраняем.
У нас получилась вот такой анализированный цикл,в котором будет приятно реверсить
Код:
004012F6 >/$  83C4 08       ADD ESP,8                                ; Entry Point
004012F9  |.  890424        MOV DWORD PTR SS:[ESP],EAX
004012FC  |.  E8 6F050000   CALL dump.00401870
00401301  |.  6A 00         PUSH 0
00401303  |.  68 C1314000   PUSH dump.004031C1
00401308  |.  68 8E304000   PUSH dump.0040308E                       ;  ASCII 20,"     Warning!!! Debug it only un"
0040130D  |.  6A 00         PUSH 0
0040130F  |.  E8 4A050000   CALL dump.0040185E
00401314  |.  6A 00         PUSH 0                                   ; /pModule = NULL
00401316  |.  FF15 6E204000 CALL DWORD PTR DS:[<&kernel32.GetModuleH>; GetModuleHandleA
0040131C  |.  A3 00304000   MOV DWORD PTR DS:[403000],EAX
00401321  |.  6A 00         PUSH 0                                   ; /lParam = NULL
00401323  |.  68 50134000   PUSH dump.00401350                       ; |DlgProc = dump.00401350
00401328  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
0040132A  |.  68 E8030000   PUSH 3E8                                 ; |pTemplate = 3E8
0040132F  |.  FF35 00304000 PUSH DWORD PTR DS:[403000]               ; |hInst = NULL
00401335  |.  FF15 F6204000 CALL DWORD PTR DS:[<&user32.DialogBoxPar>; DialogBoxParamA
0040133B  |.  6A 00         PUSH 0                                   ; /ExitCode = 0
0040133D  .  FF15 7E204000 CALL DWORD PTR DS:[<&kernel32.ExitProces>; ExitProcess

Часть 2 - выяснение и удаление антиотладки
Трассируем до того когда произайдет вот такой Error
Dont now how to continue because memory at address 00000002 is not readable.
Try to change EIP or pass exception to program

Сначала подумаем как срабатывает такой Error
Если в отладчике выполнить Call 00000002
Или
Mov al,2
Call al
Тогда срабатывает такой Error
Error выскакивает из
004012FC . E8 6F050000 CALL dump.00401870
Перезагрузим Ольку и трассируя входим в CALL.
Там проверяется наличие отладчика
00401883 |. /73 2D JNB SHORT dump.004018B2
Переход работает если нету отладчика.Так что надо изменить JNB на JMP.
Прежний Error выпадает ещё из адреса
0040130F . E8 4A050000 CALL dump2.0040185E ; MessageBox -> Title
можем заметить,что в
004017CC . /74 09 JE SHORT dump.004017D7
Уссловный переход.если crackme находится под отладчиком,то переход срабатывает.
Нам нужно будет занопить переход.Cохраняем и пошли дальше.
Нужно ещё найти комманду,где даётся неправильный параметр DialogBoxParamA в 0040132F
Вот эта комманда:
0040131C . A3 00304000 MOV DWORD PTR DS:[403000],EAX
в дампе 00403000 сохраняется номер eax в 0040131C.Нопим комманду и сохраняем.
Если Error выполнится перед тем,когда вы загрузили крякми в отладчик,то нужно перезапустить отладчик.
Когда сделали Run и снова выпадает Error,то просто обходите его нажав OK
Главное этот Error не вешает систему в исследовании крякмиса!!


Часть 3 - Патч

Ставим бряк на GetDlgItemTextA и пишем имя - xor (пусть будет ANSI имя создателя крякмиса :) и левые цифры - 12345678
В
0040146B |> E8 60010000 CALL dump.004015D0
вылетает сообщение о неправильности введенного кода
Изменяем условные переходы в этот Call
Их две:
00401460 |. /75 09 JNZ SHORT dump.0040146B ; nop
00401469 |. /74 05 JE SHORT dump.00401470 ; jmp
Ещё есть в Callе
00401533 /75 46 JNZ SHORT dump123.0040157B ; nop
И нам отвечают
Congratulationz! you are solved it

Часть 4 - Нахождение ключа

Мы смогли патчить,теперь разберём алгоритм
Код:
004014C0  /$  60            PUSHAD                                       ;   Тут считывается пароль

004014C1  |.  BE 04304000   MOV ESI,dump.00403004
004014C6  |.  BF 44304000   MOV EDI,dump.00403044
004014CB  |.  B9 08000000   MOV ECX,8
004014D0  |>  AC            /LODS BYTE PTR DS:[ESI]
004014D1  |.  3C 39         |CMP AL,39
004014D3  |.  77 09         |JA SHORT dump.004014DE
004014D5  |.  2C 30         |SUB AL,30
004014D7  |.  88C4          |MOV AH,AL
004014D9  |.  C0E4 04       |SHL AH,4
004014DC  |.  EB 07         |JMP SHORT dump.004014E5
004014DE  |>  2C 37         |SUB AL,37
004014E0  |.  88C4          |MOV AH,AL
004014E2  |.  C0E4 04       |SHL AH,4
004014E5  |>  AC            |LODS BYTE PTR DS:[ESI]
004014E6  |.  3C 39         |CMP AL,39
004014E8  |.  77 04         |JA SHORT dump.004014EE
004014EA  |.  2C 30         |SUB AL,30
004014EC  |.  EB 02         |JMP SHORT dump.004014F0
004014EE  |>  2C 37         |SUB AL,37
004014F0  |>  08E0          |OR AL,AH
004014F2  |.  AA            |STOS BYTE PTR ES:[EDI]
004014F3  |.^ E2 DB         LOOPD SHORT dump.004014D0
004014F5  |.  61            POPAD
004014F6  .  C3            RETN
Код:
004011E0  /$  55            PUSH EBP                                ; цикл изминения пароля

004011E1  |.  89E5          MOV EBP,ESP
004011E3  |.  60            PUSHAD
004011E4  |.  8B45 10       MOV EAX,DWORD PTR SS:[EBP+10]
004011E7  |.  83C0 07       ADD EAX,7
004011EA  |.  83E0 F8       AND EAX,FFFFFFF8
004011ED  |.  C1E8 03       SHR EAX,3
004011F0  |.  89C1          MOV ECX,EAX
004011F2  |.  8B75 0C       MOV ESI,DWORD PTR SS:[EBP+C]
004011F5  |.  8B5D 08       MOV EBX,DWORD PTR SS:[EBP+8]
004011F8  |>  E8 0A000000   CALL dump.00401207                           ; главное изминение тут
004011FD  |.  83C6 08       ADD ESI,8
00401200  |.^ E2 F6         LOOPD SHORT dump.004011F8
00401202  |.  61            POPAD
00401203  |.  C9            LEAVE
00401204  .  C2 0C00       RETN 0C
Тут идёт превращение пасса,который будет сравниваться с именим.
Исследовав и этот цикл идём на сравнение.
Код:
00401207  /$  60            PUSHAD                                  ; из Call 00401207 в цикл изминения пароля
00401208  |.  BA 10000000   MOV EDX,10
0040120D  |>  8B06          /MOV EAX,DWORD PTR DS:[ESI]
0040120F  |.  C1C0 10       |ROL EAX,10
00401212  |.  66:8B46 06    |MOV AX,WORD PTR DS:[ESI+6]
00401216  |.  8B0B          |MOV ECX,DWORD PTR DS:[EBX]
00401218  |.  C1C1 10       |ROL ECX,10
0040121B  |.  66:8B4B 06    |MOV CX,WORD PTR DS:[EBX+6]
0040121F  |.  E8 36000000   |CALL dump.0040125A
00401224  |.  66:8946 06    |MOV WORD PTR DS:[ESI+6],AX
00401228  |.  C1C0 10       |ROL EAX,10
0040122B  |.  66:8906       |MOV WORD PTR DS:[ESI],AX
0040122E  |.  8B46 04       |MOV EAX,DWORD PTR DS:[ESI+4]
00401231  |.  8B4B 04       |MOV ECX,DWORD PTR DS:[EBX+4]
00401234  |.  E8 21000000   |CALL dump.0040125A
00401239  |.  8946 04       |MOV DWORD PTR DS:[ESI+4],EAX
0040123C  |.  8B46 02       |MOV EAX,DWORD PTR DS:[ESI+2]
0040123F  |.  8B4B 02       |MOV ECX,DWORD PTR DS:[EBX+2]
00401242  |.  E8 13000000   |CALL dump.0040125A
00401247  |.  8946 02       |MOV DWORD PTR DS:[ESI+2],EAX
0040124A  |.  8B06          |MOV EAX,DWORD PTR DS:[ESI]
0040124C  |.  8B0B          |MOV ECX,DWORD PTR DS:[EBX]
0040124E  |.  E8 07000000   |CALL dump.0040125A
00401253  |.  8906          |MOV DWORD PTR DS:[ESI],EAX
00401255  |.  4A            |DEC EDX
00401256  |.^ 75 B5         JNZ SHORT dump.0040120D
00401258  |.  61            POPAD
00401259  .  C3            RETN
Код:
004010D0  /$  55            PUSH EBP
004010D1  |.  89E5          MOV EBP,ESP
004010D3  |.  56            PUSH ESI
004010D4  |.  57            PUSH EDI
004010D5  |.  51            PUSH ECX
004010D6  |.  9C            PUSHFD
004010D7  |.  FC            CLD
004010D8  |.  8B7D 08       MOV EDI,DWORD PTR SS:[EBP+8]                 ; имя в EDI
004010DB  |.  8B75 0C       MOV ESI,DWORD PTR SS:[EBP+C]                 ; изменённый ключ в ESI
004010DE  |.  8B4D 10       MOV ECX,DWORD PTR SS:[EBP+10]                ; длина прежнего ключа в ECX
004010E1  |.  83F9 00       CMP ECX,0                                    ; сравнение длины ключа с нулём
004010E4  |.  74 45         JE SHORT dump.0040112B                       ; if ecx==0 сравнение не происходит  (take je)
004010E6  |.  F3:A6         REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:>    ; проверяется QWORD 00403024 и QWORD 00403044.
004010E8  |.  74 23         JE SHORT dump.0040110D                       ; переход в другую проверку
004010EA  |.  8A47 FF       MOV AL,BYTE PTR DS:[EDI-1]
004010ED  |.  3A46 FF       CMP AL,BYTE PTR DS:[ESI-1]
004010F0  |.  77 0E         JA SHORT dump.00401100
004010F2  |.  66:812424 3FF>AND WORD PTR SS:[ESP],0FF3F
004010F8  |.  66:810C24 000>OR WORD PTR SS:[ESP],800
004010FE  |.  EB 13         JMP SHORT dump.00401113
00401100  |>  66:832424 BF  AND WORD PTR SS:[ESP],0FFBF
00401105  |.  66:810C24 800>OR WORD PTR SS:[ESP],880
0040110B  |.  EB 06         JMP SHORT dump.00401113
0040110D  |>  66:810C24 C00>OR WORD PTR SS:[ESP],8C0
00401113  |>  8B45 10       MOV EAX,DWORD PTR SS:[EBP+10]
00401116  |.  29C8          SUB EAX,ECX
00401118  |.  48            DEC EAX
00401119  |.  802424 FE     AND BYTE PTR SS:[ESP],0FE
0040111D  |>  9D            POPFD
0040111E  |.  59            POP ECX
0040111F  |.  5F            POP EDI
00401120  |.  5E            POP ESI
00401121  |.  C9            LEAVE
00401122  |.  C2 0C00       RETN 0C
00401125  |>  800C24 01     OR BYTE PTR SS:[ESP],1
00401129  |.^ EB F2         JMP SHORT dump.0040111D
0040112B  |>  B8 00000000   MOV EAX,0
00401130  .^ EB F3         JMP SHORT dump.00401125
получилось вот что
ПАСС -> ИЗМЕНЕНИЕ -> СРАВНЕНИЕ <-ИМЯ
Тут есть ещё одна вещь.ПАСС в 004014C0 сохраняет другие цифры,ни то что в оригинале.
Тут серийник
00403044 12 34 56 78 D0 D0 D0 D0
0040304C 07 0D 08 00 02 00 00 09
в D0 D0 D0 D0 может быть продолжение серийника
в 0040304С третяя цифра 09 переменилась на 08 когда мы удалили антиотладку
нужно найти комманду и исправить это.
А вот и она.
Код:
004017CE    B0 08           MOV AL,8
004017D0    C605 4E304000 0>MOV BYTE PTR DS:[40304E],8
в 004017D0 убрав анализ видем что в дамп 0040304E добавляется байт 08.нопим его и сохраняем.
В 004010E6 сравняются QWORD имени и изменённого пасса.
Из адреса 004010E6 можно легко найти имя для серийника 12345678

ИМЯ: 1<Ъ~ш€Ї
ПАСС: 12345678
Congratulationz! you are solved it

Часть 5 - Написание кейгена


Скажу что в кейгене из серийник генерируется имя,а не наоборот,но главное работает :-)
Я только дам часть генерации из моего кейгена

Код:
.data
Message     DB "Please enter 8 numbers",0

.data?
Buffer         dd       4       dup(?)              ;00403058

.const
IDC_EDIT          EQU 3000
IDC_EDIT2       EQU 3003
IDC_BUTTON    EQU 3001

.code
        PUSH 10h
    Push 00403058h                         ; Virutal address Buffer
    Push IDC_EDIT2
    Push hWnd
    call GetDlgItemText
    test eax,eax
    je Error
    cmp eax,8h
    jnz Error
    call Generation1
    call Generation2
    mov dword ptr ds:[00403070h],eax
    push 00403068h                         ; Buffer+10
    push IDC_EDIT
    push hWnd
    call SetDlgItemText
        End_If:                                ; Конец проседуры
  Generation1:                                 ; цикл в крякми 004014C0 (пасс преврашается в hex-овые числа)
    PUSHAD
    Mov ecx,090D07h
    Mov dword ptr [Buffer+10h],ecx
    MOV ESI,00403058h
    Mov EDI,00403068h
    MOV ECX,8h
    a:
    LODS BYTE PTR DS:[ESI]
    CMP AL,39h
    JA a1
    SUB AL,30h
    MOV AH,AL
    SHL AH,4h
    JMP a2
    a1:
    SUB AL,37h
    MOV AH,AL
    SHL AH,4h
    a2:
    LODS BYTE PTR DS:[ESI]
    CMP AL,39h
    JA a3
    SUB AL,30h
    JMP a4
    a3:
    SUB AL,37h
    a4:
    OR AL,AH
    STOS BYTE PTR ES:[EDI]
    LOOPD a
    POPAD
    RETN
  Generation2:                                 ; цикл в крякми 004011E0 (цикл изменение пасса)
    PUSH EBP
    MOV EBP,ESP
    PUSHAD
    MOV EAX,8h
    ADD EAX,7h
    AND EAX,-8h
    SHR EAX,3
    MOV ECX,EAX
    MOV ESI,00403068h
    MOV EBX,00403070h
    a5:
    Call Generation3
    ADD ESI,8
    LOOPD a5
    POPAD
    LEAVE
    RETN
  Generation3:                                 ; цикл в крякми 00401207 (главное изменение пасса)
        PUSHAD
        MOV EDX,10h
        mov dword ptr ds:[ebx+4h],09000002h
        a7:
        MOV EAX,DWORD PTR DS:[ESI]
        ROL EAX,10h
        MOV AX,WORD PTR DS:[ESI+6]
        MOV ECX,DWORD PTR DS:[EBX]
        ROL ECX,10h
        MOV CX,WORD PTR DS:[EBX+6]
        call a6
        MOV WORD PTR DS:[ESI+6],AX
        ROL EAX,10h
        MOV WORD PTR DS:[ESI],AX
        MOV EAX,DWORD PTR DS:[ESI+4]
        MOV ECX,DWORD PTR DS:[EBX+4]
        call a6
        MOV DWORD PTR DS:[ESI+4],EAX
        MOV EAX,DWORD PTR DS:[ESI+2]
        MOV ECX,DWORD PTR DS:[EBX+2]
        call a6
        MOV DWORD PTR DS:[ESI+2],EAX
        MOV EAX,DWORD PTR DS:[ESI]
        MOV ECX,DWORD PTR DS:[EBX]
        call a6
        MOV DWORD PTR DS:[ESI],EAX
        DEC EDX
        jnz a7
        popad
        retn
  a6:
        ROL EAX,10h
        ROL ECX,10h
        SUB AL,CL
        MOV CL,AH
        XOR AH,CH
        ROL EAX,10h
        AND CL,7h
        ROR AX,CL
        RETN
  Error:
        invoke SetDlgItemText,hWnd,IDC_EDIT,addr Message
        call End_If
 
Сверху Снизу