QUOTE Homepage : http://crackme.de CrackMe : zeph1.zip ( keygenme1.exe ) Coder : Zephyrous ( 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 004010A7 |. FFD3 CALL EBX ; \ GetWindowTextA >>>> Kiểm tra chiều dài chuỗi U nhập : QUOTE 004010C0 |> \83FF 03 CMP EDI,3 < === Chuỗi phải có chiều dài lớn hơn 3 004010C3 |. 7F 07 JG SHORT keygenme.004010CC Kiểm tra chiều dài S nhập : 004010E5 |> \837D 08 03 CMP DWORD PTR SS:[EBP+8],3 < === S phải có chiều dài lớn hơn 3 004010E9 |. 7F 13 JG SHORT keygenme.004010FE >>>>>>>> Quá trình mã hoá hày bao gồm năm giai đoạn : >>> >>> Giai đoạn mã hoá thứ nhất : QUOTE >>> Đưa chuỗi nhập vào ECX === > Với từng ký tự của chuỗi nhập nằm ở CL 00401104 |> /8A4C15 94 /MOV CL,BYTE PTR SS:[EBP+EDX-6C] >>> Đưa từng ký tự của chuỗi U nhập ở Cl vào EAX. 00401108 |. |0FBEC1 |MOVSX EAX,CL >>> Công EAX với giá trị ở địa chỉ SS:[EBP-4] ( ban đầu giá trị tại đây bằng 00h == > lưu kết quả ở đây ) 0040110B |. |0145 FC |ADD DWORD PTR SS:[EBP-4],EAX >>> So sánh giá trị của Cl với 04Ah, nếu nhỏ hơn sẽ mã hoá theo một cách và nếu lớn hơn mã hoá cách khác. Quá trình này ảng hưởng đến giá trị của kết quả cuối cùng. 0040110E |. |80F9 4A |CMP CL,4A 00401111 |. |7C 06 |JL SHORT keygenme.00401119 >>> Nếu CL lớn hơn sẽ nhân EAX với giá trị tại địa chỉ này. Ban đầu thì hai giá trị này bằng nhau. 00401113 |. |0FAF45 FC |IMUL EAX,DWORD PTR SS:[EBP-4] >>> Nhảy thoát ra nếu CL lớn hơn. 00401117 |. |EB 06 |JMP SHORT keygenme.0040111F >>> Nếu CL nhỏ hơn sẽ tiến hành bước này. Nhân EAX với giá trị tại địa chỉ này. Ban đầu thì hai giá trị này bằng nhau. Và làm thêm bước sau 00401119 |> |0FAF45 FC |IMUL EAX,DWORD PTR SS:[EBP-4] >>> Lệnh này có thể xem như là nhân đôi EAX === > Kết quả được lưu ở EAX. 0040111D |. |D1E0 |SHL EAX,1 >>> Tăng EDX lên 1 đơn vị. EDX là biến đếm của vòng lặp. 0040111F |> |42 |INC EDX >>> Chuyển kết quả tính toán lưu ở địa chỉ SS:[EBP-4]. 00401120 |. |8945 FC |MOV DWORD PTR SS:[EBP-4],EAX >>> EDI ở đây là chiều dài của chuỗi nhập. EDX là biến đếm. Nếu chưa hết chuỗi thì vòng lặp lại tiếp tục. 00401123 |. |3BD7 |CMP EDX,EDI 00401125 |.^\7C DD \JL SHORT keygenme.00401104 >>> Ra khỏi vòng lặp này giá trị cuối cùng được lưu tại hai chỗ : EAX và địa chỉ SS:[EBP-4]. >>> >>> Giai đoạn mã hoá thứ hai : QUOTE >>> Lưu giá trị tính toán bên trên vào EAX 00401127 |> \8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] >>> Làm sạch EDX chuẩn bị cho bước tiếp theo 0040112A |. 33D2 XOR EDX,EDX >>> Gán ECX = 0724h 0040112C |. B9 24070000 MOV ECX,724 >>> Lấy EAX chia ECX === > Phần nguyên được lưu ở EAX, phần dư được lưu ở EDX 00401131 |. F7F1 DIV ECX >>> Làm sạch EAX để lưu biến mới. 00401133 |. 33C0 XOR EAX,EAX >>> Đây là quá trình kiểm tra lại giá trị của EDI === > EDI là chiều dài chuỗi U nhập 00401135 |. 85FF TEST EDI,EDI 00401137 |. 7E 20 JLE SHORT keygenme.00401159 >>> Đưa chuỗi nhập vào EBX === > Với từng ký tự của chuỗi nhập nằm ở BL 00401139 |> 8A5C05 94 /MOV BL,BYTE PTR SS:[EBP+EAX-6C] >>> Đưa từng ký tự của chuỗi U nhập lưu ở BL vào ECX. 0040113D |. 0FBECB |MOVSX ECX,BL >>> EDX = EDX + ECX ( EDX ban đầu là giá trị phần dư của phép chia bên trên ) 00401140 |. 03D1 |ADD EDX,ECX >>> So sánh từnh ký tự của U nhập với 040h, nếu nhỏ hơn hay lớn hơn sẽ có một cách tính khác nhau. 00401142 |. 80FB 40 |CMP BL,40 >>> Nếu lớn hơn sẽ đi tiếp xuống bước kế. Nếu nhỏ hơn sẽ nhảy đến địa chỉ được cho. 00401145 |. 7C 05 |JL SHORT keygenme.0040114C >>> ECX = ECX x EDX ==== > Giá trị được lưu ở ECX. 00401147 |. 0FAFCA |IMUL ECX,EDX >>> Không thực hiện bước sau nếu BL lớn hơn 040h 0040114A |. EB 06 |JMP SHORT keygenme.00401152 >>> Nếu BL < 040h thì ECX = ECX x EDX === > kết quả được lưu ở ECX. 0040114C |> 0FAFCA |IMUL ECX,EDX >>> Lệnh này tương được với nhân ECX cho 4 0040114F |. C1E1 02 |SHL ECX,2 >>> Tăng EAX lên 1 === > EAX là giá trị biến đếm của vòng lặp. 00401152 |> 40 |INC EAX >>> Giá trị tính toán cuối cùng được lưu ở EDX. 00401153 |. 8BD1 |MOV EDX,ECX >>> Nếu chưa đến cuối chuỗi thì vòng lặp lại tiếp tục 00401155 |. 3BC7 |CMP EAX,EDI 00401157 |.^ 7C E0 \JL SHORT keygenme.00401139 >>> Ra khỏi vòng lặp này thì giá trị được lưu ở EDX. . QUOTE 00 4 01 0 C0 |> 83FF 03 CMP EDI,3 < === Chuỗi phải có chiều dài lớn hơn 3 00 4 01 0 C3 |. 7F 07 JG SHORT keygenme .00 4 01 0 CC Kiểm tra chiều dài S nhập : 00 4 01 0 E5 |> 837D 08 03 CMP. trình này ảng hưởng đến giá trị của kết quả cuối cùng. 00 4 01 1 0E |. |80F9 4A |CMP CL,4A 00 4 01 1 11 |. |7C 06 |JL SHORT keygenme .00 4 01 1 19 >>> Nếu CL lớn hơn sẽ nhân EAX với giá trị tại. lưu ở EDX. 00 4 01 1 53 |. 8BD1 |MOV EDX,ECX >>> Nếu chưa đến cuối chuỗi thì vòng lặp lại tiếp tục 00 4 01 1 55 |. 3BC7 |CMP EAX,EDI 00 4 01 1 57 |.^ 7C E0 JL SHORT keygenme .00 4 01 1 39 >>>