Posted 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 QUOTE 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 : 00401026 |. 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] 00401059 |. |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 : QUOTE >>>> 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 0040110F |. 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 nhau 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 : QUOTE User : Moonbaby Serial : M-Y25499-50175 User : HVA-CrAcKeRtEaM Serial : H-M25906-50582 . >>>> %1u là quá trình chuyển đổi số hệ hex sang số hệ thập phân 00 4 01 0 67 |. 68 34 604 000 PUSH vcrkme 01 . 00 406 034 ; ASCII "%lu" 00 4 01 0 6C |. 68 306 B 400 0 PUSH vcrkme 01 . 00 406 B 30 00 4 01 0 71. 00 4 01 0 10 |. 8A06 MOV AL,BYTE PTR DS:[ESI] < === Ký tự đầu tiên của U nhập 00 4 01 0 12 |. 3AC1 CMP AL,CL < === Hai ký tự này phải giống nhau 00 4 01 0 14 |. 0F85 69 01 0 00 0 JNZ vcrkme 01 . 00 4 01 1 83. 00 4 01 1 66 |. |84C9 |TEST CL,CL < === Nếu chưa hết chuỗi 00 4 01 1 68 |.^75 DC JNZ SHORT vcrkme 01 . 00 4 01 1 46 < ==== thì tiên hành kiểm tra tiếp 00 4 01 1 41 |. BE 446B 400 0 MOV ESI,vcrkme 01 . 00 406 B44