Олдфаг
-
Автор темы
- #1
Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.
Инструменты
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
Весь 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
Дампим с помощью 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 >/$ 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
В 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