>>>> Quá trình này gọi một chuỗi lệnh xử lý và so sánh, vậy CALL ở đây bao gồm quá trình xử lý và so sánh, cuối cùng cho ra kết quả để thực hiện lệnh nhảy.. không lưu ý đến đoạn mã nằm n
Trang 1Posted by: moonbaby Dec 11 2003, 02:17 PM
Homepage : http://crackme.de
CrackMe : ceycey.zip ( ceycey.exe )
Coder : Ceycey ( Borland Delphi 4.0 - 5.0 )
Type : Serial
Packed : UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub ->
Markus & Laszlo
Crack Tool : OllyDbg 1.09d
Unpack Tool : UPXUnpack
Request : Correct Serial
Rule : N/A
Note : N/A
-
>>>> Set BreakPoint tại đây:
00457615 | 8B83 D4020000 MOV EAX,DWORD PTR DS:[EBX+2D4]
>>>> Đây là quá trình gọi chuỗi và so sánh hai chuỗi
00457615 | 8B83 D4020000 MOV EAX,DWORD PTR DS:[EBX+2D4] 0045761B | E8 E8C9FCFF CALL Un-ceyce.00424008
00457620 | 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00457623 | BA 6C764500 MOV EDX,Un-ceyce.0045766C ; ASCII
"ULTRADMA "
00457628 | E8 5FC6FAFF CALL Un-ceyce.00403C8C
0045762D | 75 13 JNZ SHORT Un-ceyce.00457642 < === Patch ở đây nếu muốn
>> Chuỗi nhập vào được chứa ở đây
00457620 | 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
>> Chuỗi UL… được chứa ở đây
00457623 | BA 6C764500 MOV EDX,Un-ceyce.0045766C ; ASCII
"ULTRADMA "
>> Ở đây ta đặt ra một câu hỏi là chuỗi này là chuỗi gì, chỉ có hai trường hợp là chuỗi Magic hoặc chuỗi S thực
Trang 2>>>> Quá trình này gọi một chuỗi lệnh xử lý và so sánh, vậy CALL ở đây bao gồm quá trình xử lý và so sánh, cuối cùng cho ra kết quả để thực hiện lệnh nhảy
00457628 | E8 5FC6FAFF CALL Un-ceyce.00403C8C
0045762D | 75 13 JNZ SHORT Un-ceyce.00457642
>> Trace thẳng vào trong lệnh gọi này, ta thấy câu lệnh sau
00403C93 39D0 CMP EAX,EDX ; Un-ceyce.0045766C
>> Trong khi đó, như ở trên ta đã nói, vậy ta kết luận ngay được chuỗi chứa trong EDX là chuỗi S thực Ở đây, các dấu (.) nằm sau chữ
ULTRADMA là dấu chấm, theo hệ hex là 2E
>>>> Vậy
Serial : ULTRADMA
Posted by: moonbaby Dec 11 2003, 02:19 PM
Homepage : http://crackme.de
CrackMe : cosh2.zip (crackme2.exe )
Coder : CoSH (Microsoft Visual C++ 6.0)
Type : Serial
Packed : N / A
Crack Tool : OllyDbg 1.09d
Unpack Tool : N / A
Request : Correct Serial
Rule : N/A
Note : N/A
-
>>>> Chương trình này rất lạ, nếu cứ đi tìm các điểm đặt BreakPoint mà
Trang 3không lưu ý đến đoạn mã nằm ngay bên thông báo sai có thể làm mất rất nhiều thời gian:
>> Quá trình kiểm tra chuỗi U nhập vào, nếu chuỗi dưới 5 ký tự sẽ nhảy đến thông báo sai
004014D6 E8 6F030000 CALL <JMP.&MFC42.#3876>
004014DB 8B1D FC214000 MOV EBX,DWORD PTR
DS:[<&USER32.PostQuitM>; USER32.PostQuitMessage
004014E1 83F8 05 CMP EAX,5
004014E4 /7E 50 JLE SHORT crackme2.00401536
>> Quá trình kiểm tra chuỗi S nhập vào, nếu chuỗi dưới 5 ký tự sẽ nhảy đến thông báo sai
004014EB E8 5A030000 CALL <JMP.&MFC42.#3876>
004014F0 83F8 05 CMP EAX,5
004014E4 /7E 50 JLE SHORT crackme2.00401536
>>>> Quan sát đọan mã nằm ngay trên thông báo sai Ta thấy ở đây bao gồm một lọat quá trình so sánh và sau đó là nhảy đến thông báo sai, nên đây chính là chuỗi S thực được lưu trong chương trình dưới dạng từng ký
tự tách rời
00401511 8B07 MOV EAX,DWORD PTR DS:[EDI]
00401513 8038 36 CMP BYTE PTR DS:[EAX],36 < ==== ASCII “6”
00401516 75 1E JNZ SHORT crackme2.00401536
00401518 8078 01 32 CMP BYTE PTR DS:[EAX+1],32 < ==== ASCII
“2”
0040151C 75 18 JNZ SHORT crackme2.00401536
0040151E 8078 02 38 CMP BYTE PTR DS:[EAX+2],38 < ==== ASCII
“8”
00401522 75 12 JNZ SHORT crackme2.00401536
00401524 8078 03 37 CMP BYTE PTR DS:[EAX+3],37 < ==== ASCII
“7”
00401528 75 0C JNZ SHORT crackme2.00401536
Trang 40040152A 8078 04 2D CMP BYTE PTR DS:[EAX+4],2D < ====
ASCII “-”
0040152E 75 06 JNZ SHORT crackme2.00401536
00401530 8078 05 41 CMP BYTE PTR DS:[EAX+5],41 < ==== ASCII
“A”
00401534 74 17 JE SHORT crackme2.0040154D
Chương trình này không quan tâm đến U nhập là gì mà chỉ cần tìm đúng S
mà thôi ( U phải có từ 5 ký tự )
>>>> Vậy
Serial : 6287-A
Posted by: moonbaby Dec 11 2003, 02:21 PM
Homepage : http://crackme.de
CrackMe : cosh3.zip (crackme3.exe )
Coder : CoSH (Microsoft Visual C++ 6.0)
Type : Serial
Packed : N / A
Crack Tool : OllyDbg 1.09d
Unpack Tool : N / A
Request : Correct Serial
Rule : N/A
Note : N/A
-
>>>> Set BreakPoint tại đây:
00401570 | 33C0 XOR EAX,EAX
>>>> Đây là quá trình mã hoá chuỗi đầu tiên, mã hoá chuỗi U nhập vào
Trang 500401576 | B9 01000000 MOV ECX,1
0040157B | 33D2 XOR EDX,EDX
0040157D | 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
00401580 |> 8A18 /MOV BL,BYTE PTR DS:[EAX]
00401582 | 32D9 |XOR BL,CL
00401584 | 8818 |MOV BYTE PTR DS:[EAX],BL
00401586 | 41 |INC ECX
00401587 | 40 |INC EAX
00401588 | 8038 00 |CMP BYTE PTR DS:[EAX],0
0040158B |.^ 75 F3 \JNZ SHORT crackme3.00401580
Gán cho ECX giá trị 1, đây là biến rất quan trọng trong quá trình xử lý chuỗi
00401576 | B9 01000000 MOV ECX,1
Đưa giá trị của chuỗi U nhập vào EAX
0040157D | 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
Đưa từng ký tự của U được chứa trong EAX vào BL Ở đây hơi đặc biệt tí,
BL chính là giá trị thấp của EBX ( xem EBX chia làm hai giá trị cao BH và giá trị thấp BL ), nhưng có thể nói nôm na là đưa từng ký tự của chuỗi U ở EAX vào EBX để tiến hành mã hoá
00401580 |> 8A18 /MOV BL,BYTE PTR DS:[EAX]
Tiến hành phép toán EBX xor ECX ( CL là giá trí cao của ECX, ở đây ta coi là ECX )
00401582 | 32D9 |XOR BL,CL
Đưa giá trị vào lưu ở địa chỉ của EAX tức là thay thế ký tự đầu tiên của U bằng một ký tự mới mã hoá
00401584 | 8818 |MOV BYTE PTR DS:[EAX],BL
Tăng ECX lên 1 đơn vị, có nghĩa ECX = 2h
00401586 | 41 |INC ECX
Chuyển đến ký tự thứ hai
00401587 | 40 |INC EAX
Kiểm tra xem đã hết chuỗi chưa, nếu chưa thì tiếp tục, còn không thì qua giai đoạn khác
00401588 | 8038 00 |CMP BYTE PTR DS:[EAX],0
0040158B |.^ 75 F3 \JNZ SHORT crackme3.00401580
Trang 6Quá trình này cứ lặp cho đến hết chuỗi Ở đây ta chú ý ba điểm :
1- Giá trị của từng ký tự của U thay đổi
2- Giá trị của biến đếm ECX tăng theo môic vòng lặp Vì thế giá trị của nó với từng ký tự của chuỗi nhập sẽ thay đổi cho dù ký tự chuỗi nhập có giống nhau đi nữa
3- Chuỗi mới được mã hoá sẽ thay thế hoàn toàn chuỗi U nhập và được lưu
ở cùng một địa chỉ
Quá trình mã hoá thứ hai, mã hoá chuỗi S nhập vào
00401593 | B9 0A000000 MOV ECX,0A
00401598 | 33D2 XOR EDX,EDX
0040159A | 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
0040159D |> 8A18 /MOV BL,BYTE PTR DS:[EAX]
0040159F | 32D9 |XOR BL,CL
004015A1 | 8818 |MOV BYTE PTR DS:[EAX],BL
004015A3 | 41 |INC ECX
004015A4 | 40 |INC EAX
004015A5 | 8038 00 |CMP BYTE PTR DS:[EAX],0
004015A8 |.^ 75 F3 \JNZ SHORT crackme3.0040159D
Ở đây biến ECX cũng lại là biến chính, nhưng ban đầu được gán giá trị là
Ah = 10
00401593 | B9 0A000000 MOV ECX,0A
Quá trình ma hoá chuỗi ở đây hoàn toàn giống quá trình mã hoá chuỗi đầu tiên Sau mỗi vòng lặp, giá trị của ECX lại tăng thêm một, quá trình xảy ra đến hết chuỗi S Va gí trị chuỗi S mã hoá thay thế chuỗi S nhập tại cùng địa chỉ lưu
Quá trình so sánh hai chuỗi mã hoá
004015AA | 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
004015AD | 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
004015B0 |> 33C9 /XOR ECX,ECX
004015B2 | 8A18 |MOV BL,BYTE PTR DS:[EAX]
004015B4 | 8A0A |MOV CL,BYTE PTR DS:[EDX]
004015B6 | 3AD9 |CMP BL,CL
Trang 7004015B8 | 75 09 |JNZ SHORT crackme3.004015C3
004015BA | 40 |INC EAX
004015BB | 42 |INC EDX
004015BC | 8038 00 |CMP BYTE PTR DS:[EAX],0
004015BF |.^ 75 EF \JNZ SHORT crackme3.004015B0
Đưa chuỗi U mã hoá vào EAX
004015AA | 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
Đưa chuỗi S mã hoá vào EDX
004015AD | 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
Dọn sạch trước khi đưa từng ký tự vào so sánh
004015B0 |> 33C9 /XOR ECX,ECX
Đưa từng ký tự của U mã hoá vào EBX và S mã hoá vàp ECX
004015B2 | 8A18 |MOV BL,BYTE PTR DS:[EAX]
004015B4 | 8A0A |MOV CL,BYTE PTR DS:[EDX]
So sánh hai ký tự với nhau, nếu không bằng là nhảy thông báo sai ngay, không cần xét tiếp
004015B6 | 3AD9 |CMP BL,CL
004015B8 | 75 09 |JNZ SHORT crackme3.004015C3
Nếu bằng thì chuyển sáng ký tự kế tiếp, và tiến hành cho đến hết chuỗi 004015BA | 40 |INC EAX
004015BB | 42 |INC EDX
004015BC | 8038 00 |CMP BYTE PTR DS:[EAX],0
004015BF |.^ 75 EF \JNZ SHORT crackme3.004015B0
Vậy để tính được giá trị đúng của S tương ứng vơi U nhập vào thì ta làm như sau :
1- Mã hoá chuỗi U theo quá trình mã hoá chuỗi U nhập vào
2- Lấy chuỗi U mã hoá, mã hoá theo quá trình mã hoá chuỗi S nhập vào
>>>> Vậy
User : Moonbaby Serial : Ff`gihu`