Nói một cách dễ hiểu là sẽ lấy ký tự cuối cùng của U nhập chuyển thành chữ hoa nếu là chữ thường.. 0FBE4431 FF MOVSX EAX,BYTE PTR DS:[ECX+ESI-1] >>>> Đoạn mã trong lệnh CALL này có ý ngh
Trang 1Posted by: moonbaby Jan 3 2004, 05:33 PM
QUOTE
Homepage : http://crackme.de
CrackMe : vcrkme01.zip (vcrkme01.exe )
Coder : [v0!d] ( Microsoft Visual C++ 6.0 )
Type : Name / Serial
Packed : N / A
Crack Tool : OllyDbg 1.09d
Unpack Tool : N / A
Request : Correct Serial
Rule : N/A
Note : N/A
>>>>>>>> Đặt BreakPoint tại hai điểm sau :
QUOTE
00401233 FFD6 CALL ESI ;
\GetDlgItemTextA
0040124B FFD6 CALL ESI ;
\GetDlgItemTextA
>>>>>>>> Trace tiếp ta đến đây
Trang 2QUOTE
0040124D 68 306A4000 PUSH
vcrkme01.00406A30 ; ASCII "M1235678"
00401252 68 30694000 PUSH
vcrkme01.00406930 ; ASCII "Moonbaby"
00401257 E8 A4FDFFFF CALL vcrkme01.00401000
>>>>>>>> Trace thẳng vào trong lệnh CALL này ta đến qúa trình mã hoá chuỗi nhập
QUOTE
Ta đến đây : 00401000 /$ 53 PUSH EBX
>>>> Trace tiếp ta đến :
0040100B | 8A0B MOV CL,BYTE PTR DS:[EBX] < === Ký
tự đầu tiên của S nhập
0040100D | 33ED XOR EBP,EBP
0040100F | 57 PUSH EDI
00401010 | 8A06 MOV AL,BYTE PTR DS:[ESI] < === Ký
tự đầu tiên của U nhập
00401012 | 3AC1 CMP AL,CL < === Hai ký tự này phải
giống nhau
00401014 | 0F85 69010000 JNZ vcrkme01.00401183 < === Nếu không nhảy đến thông báo sai
>>>> Trace tiếp một đoạn ta đến đây :
Trang 300401026 | 83F9 05 CMP ECX,5 < === So sánh chiều dài chuỗi với 05h = 5
00401029 | 0F82 54010000 JB vcrkme01.00401183 < === U nhập
< 5 ký tự nhảy đến thông báo sai
>>>> Trace tiếp ta đến đây :
>>>> So sánh ký tự thứ hai với 02Dh có mã ASCII = “-“
0040102F | 807B 01 2D CMP BYTE PTR DS:[EBX+1],2D <
=== ASCII = “-“
00401033 0F85 4A010000 JNZ vcrkme01.00401183 < === Nhảy nếu không đúng thế
>>>>>>>> Trace tiếp thêm đoạn ta đến đoạn mã hoá đầu tiên :
QUOTE
00401047 | /74 17 JE SHORT vcrkme01.00401060 < == Nhảy thoát nếu không nhập gì
00401049 |> |0FBE0C32 /MOVSX ECX,BYTE PTR
DS:[EDX+ESI] < = Đưa từng ký tự vào ECX
0040104D | |03E9 |ADD EBP,ECX < === EBP = EBP + ECX ( EBP ban đầu bằng 00h )
>>>> Đoạn mã này thực chất là gán ECX bằng chiều dài chuỗi U nhập
0040104F | |8BFE |MOV EDI,ESI
00401051 | |83C9 FF |OR ECX,FFFFFFFF
00401054 | |33C0 |XOR EAX,EAX
00401056 | |42 |INC EDX < === EDX = EDX + 1 < === là biến đếm vòng lặp
00401057 | |F2:AE |REPNE SCAS BYTE PTR ES:[EDI]
Trang 400401059 | |F7D1 |NOT ECX < === ECX = chiều dài U nhập 0040105B | |49 |DEC ECX < === ECX = ECX - 1
0040105C | |3BD1 |CMP EDX,ECX < === Nếu đã hết chuỗi thì nhảy thoát
0040105E |.^|72 E9 \JB SHORT vcrkme01.00401049 < === Nếu chưa thì tiếp tục vòng lặp
>>>> Thực chất của quá trình này là cộng giá trị của tất cả các ký tự của chuỗi U nhập và lưu ở EBP
>>>> Trace tiếp ta đến :
00401060 |> \81C5 64600000 ADD EBP,6064 < === EBP = EBP + 06064h
00401066 | 55 PUSH EBP < === Cất giữ giá trị của EBP
>>>> In chuỗi đầu tiên
QUOTE
>>>> %1u là quá trình chuyển đổi số hệ hex sang số hệ thập phân
00401067 | 68 34604000 PUSH
vcrkme01.00406034 ; ASCII "%lu"
0040106C | 68 306B4000 PUSH vcrkme01.00406B30
00401071 | E8 B6030000 CALL vcrkme01.0040142C < === In ra chuỗi
>>>> Trace tiếp ta đến đây :
Trang 5QUOTE
>>>> Lưu ký tự đầu tiên của chuỗi U nhập vào DS:[406B44]
0040107F | 8815 446B4000 MOV BYTE PTR DS:[406B44],DL
>>>> Ngay kế đó thêm ký tự “-“
00401085 | C605 456B4000>MOV BYTE PTR DS:[406B45],2D
>>>>>>>> Trace tiếp ta đến :
>>>> Đưa ký tự tại địa chỉ này vào EAX ( ECX = chiều dài chuỗi, ESI = địa chỉ chứa chuỗi U nhập ) Nói một cách dễ hiểu là sẽ lấy ký
tự cuối cùng của U nhập chuyển thành chữ hoa nếu là chữ thường Còn không thì giữ nguyên
00401091 | 0FBE4431 FF MOVSX EAX,BYTE PTR
DS:[ECX+ESI-1]
>>>> Đoạn mã trong lệnh CALL này có ý nghĩa nếu ký tự này của chuỗi S nhập là chữ thường sẽ chuyển thành chữ hoa
00401097 | E8 C4020000 CALL vcrkme01.00401360
>>>> Và gán nó vào làm ký tự thứ ba của chuỗi S mã hoá
0040109C | A2 466B4000 MOV BYTE PTR DS:[406B46],AL
>>>> Đoạn mã lệnh kế tiếp sẽ gắn chuỗi số dạng thập phân ở trên vào vị trí thứ tư
Chuỗi có dạng X-Xxxxx
>>>>>>>> Trace tiếp ta đến đây :
>>>> Giá trị ở địa chỉ DS:[ESI] là 2Dh, có mã ASCII = “-“ được gán vào địa chỉ ES:[EDI] Mà địa chỉ này là địa chỉ của chuỗi X-Xxxxx Vậy chuỗi sẽ có dạng mới là X-Xxxxx-
00401108 | F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
>>>> Trace tiếp ta đến lệnh này
0040110A | E8 1D030000 CALL vcrkme01.0040142C
>>>> Thực chất của lệnh này là cộng giá trị đã được tính ở trên với 06064h Chuỗi mới này cũng được chuyển sang hệ thập phân
>>>> Sau khi ra khỏi lệnh CALL, giá chuỗi số mới sẽ được lưu vào EDI
Trang 60040110F | BF 306B4000 MOV
EDI,vcrkme01.00406B30 ; ASCII "50582"
>>>> Sau đó sẽ được gán vào chuỗi ở trên tạo thành chuỗi S thực Chuỗi có dạng X-Xxxxx-xxxx
>>>>>>>> Quá trình kiểm tra chuỗi :
QUOTE
00401146 |> /8A10 /MOV DL,BYTE PTR DS:[EAX] < === Từng ký tự của S nhập
00401148 | |8A1E |MOV BL,BYTE PTR DS:[ESI] < === Từng ký tự của S thực
0040114A | |8ACA |MOV CL,DL < === CL = DL
0040114C | |3AD3 |CMP DL,BL < === So sánh hai ký tự với nhau
0040114E | |75 25 |JNZ SHORT vcrkme01.00401175 < === Thông báo sai nếu không đúng
00401150 | |84C9 |TEST CL,CL < === Nếu kiểm tra hết chuỗi rồi
00401152 | |74 16 |JE SHORT vcrkme01.0040116A < === thì nhảy thoát vòng lặp kiểm tra
00401154 | |8A50 01 |MOV DL,BYTE PTR DS:[EAX+1] < === chuyển ký tự kế của S nhập
00401157 | |8A5E 01 |MOV BL,BYTE PTR DS:[ESI+1] < === chuyển ký tự kế của S thực
0040115A | |8ACA |MOV CL,DL CL = DL
0040115C | |3AD3 |CMP DL,BL < === So sánh hai ký tự với
Trang 7nhau
0040115E | |75 15 |JNZ SHORT vcrkme01.00401175 < === Thông báo sai nếu không đúng
00401160 | |83C0 02 |ADD EAX,2 < === do đã kiểm tra 2 hai
ký tự
00401163 | |83C6 02 |ADD ESI,2 < === nên vị trí ký tự kế được cộng thêm 2
00401166 | |84C9 |TEST CL,CL < === Nếu chưa hết chuỗi
00401168 |.^\75 DC \JNZ SHORT vcrkme01.00401146 < ==== thì tiên hành kiểm tra tiếp
00401141 | BE 446B4000 MOV
ESI,vcrkme01.00406B44 ; ASCII "P-A25970-5064"
>>>>>>>>>>>> Kết luận :
QUOTE
1- Chuỗi U nhập phải có chiều dài từ 5 ký tự trở lên
2- Ký tự đầu tiên của S là ký tự đầu tiên của U
3- Ký tự thứ hai phải là “-“
4- Ký tự thứ ba là ký tự cuối của U được chuyển thành chữ hoa 5- Chuỗi số thứ nhất là tổng giá trị của các ký tự U nhập ở dạng thập phân
6- Chuỗi số thứ hai là chuỗi số thứ nhất cộng thêm 06064h và chuyển sang hệ thập phân
>>>>>>>>>>>> Vậy :
Trang 8QUOTE
User : Moonbaby Serial : M-Y25499-50175
User : HVA-CrAcKeRtEaM Serial : H-M25906-50582