Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

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

Обсудить статью на форуме

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: Lampik <lampik12345@mail.ru>

Инструменты


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
        




Обсуждение статьи: Исследование crackme#1 by xor aka 0x00786F72 >>>


Комментарии к статье: Исследование crackme#1 by xor aka 0x00786F72

Kaylinka 17.08.2009 12:11:06

---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS