004115FC |. 0FBE56 05 MOVSX EDX,BYTE PTR DS:[ESI+5] >KT 6 vào EDX 00411600 |. 0FBE4E 0F MOVSX ECX,BYTE PTR DS:[ESI+F] >KT 16 vào ECX 00411604 |. 03D1 ADD EDX,ECX 00411606 |. 81FA 9B000000 CMP EDX,9B 0041160C |. 74 04 JE SHORT unpacked.00411612 0041160E |. 33C0 XOR EAX,EAX 00411610 |. 5E POP ESI 00411611 |. C3 RETN Ở đây sẽ chuyển ký tự thứ 6 vào EDX, ký tự 16 vào ECX rồi cộng chúng lại kết quả lưu ở EDX. So sánh EDX với 9B (155). Nếu không bằng thì XOR EAX,EAX. Nếu bằng thì nhảy: Code: 00411612 |> B0 01 MOV AL,1 >AL=1 >Successfully 00411614 |. 5E POP ESI 00411615 \. C3 RETN Đến đây là xong. Tóm lại, Soft này không quan tâm đến E-mail của chúng ta mà chỉ yêu cầu chuỗi SerialNumber có 16 ký tự, tổng của ký tự 6 và 16 ở hệ 10 phải bằng 155 và không có ký tự NUL ở đầu chuỗi. Ví dụ như: HUONGBABYILIKEUY Download KeyGen here: http://rapidshare.de/files/7004685/KeyGen.exe.html Written by Ha Viet Hung (hvh0904) How to KeyGen EXE Scope 6.41 Software: EXE Scope 6.41 Hompage: http://www.vector.co.jp/authors/VA003525/ Language: Borland Delphi 6.0 - 7.0 Tools: PeiD 0.94; OllyDbg 1.10 Cracker: hvh0904/KT44 Trong quá trình cracking, các bạn hẳn đã đôi lần sử dụng EXE Scope 6.41. Nó là phần mềm cho phép chỉnh sửa file. Các dạng file mà EXE Scope 6.41 hỗ trợ: Quote: DLL Dynamic link library OCX,OCA OCX/ActiveX VBX VBX SCR Screen saver CPL Control panel FON Font file DPL Delphi 3 package BPL Delphi 4 package Tuy nhiên nó là phần mềm thuộc dạng Sharewere nên nếu chưa đăng ký, chúng ta cũng chỉ edit được mỗi file không quá một lần. Do đó, cần phải đăng ký nó để có thể sử dụng hết các chức năng của chương trình. OK. Chạy chương trình, vào menu Help >Regist. Nhập đại Name và ID vào 2 textbox, nhấn OK. Hê hê, nó bắn nag báo lỗi ngay rằng "Invalid ID or Name". Thông tin thu thập đã xong. Bây giờ chúng ta exit chương trình và scan nó bằng PeiD xem nó có bị pack không. Kết quả là nó không bị pack và được viết bằng Borland Delphi 6.0 - 7.0. Bước đầu khá là suôn sẻ. Bây giờ mới là công việc chủ yếu. Load chương trình bằng OllyDbg xong, run chương trình. Rightclick lên cửa sổ CPU của Olly và chọn Search for >All referenced text strings. Trong cửa sổ text, chọn Search for text. Nhập vào "ID or Name". OK. Tìm thấy rồi thì doubleclick lên nó chúng ta sẽ ở đây: Code: 004C21F2 |. B9 A4224C00 MOV ECX,eXeScope.004C22A4 ; ASCII "ID" 004C21F7 |. 8BC6 MOV EAX,ESI 004C21F9 |. 8B38 MOV EDI,DWORD PTR DS:[EAX] 004C21FB |. FF57 04 CALL DWORD PTR DS:[EDI+4] 004C21FE |. 8BC6 MOV EAX,ESI 004C2200 |. E8 DB19F4FF CALL eXeScope.00403BE0 004C2205 |. A1 38EC4C00 MOV EAX,DWORD PTR DS:[4CEC38] 004C220A |. C600 01 MOV BYTE PTR DS:[EAX],1 004C220D |. C783 4C020000 >MOV DWORD PTR DS:[EBX+24C],1 004C2217 |. EB 20 JMP SHORT eXeScope.004C2239 004C2219 |> 6A 00 PUSH 0 004C221B |. 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14] 004C221E |. B8 B0224C00 MOV EAX,eXeScope.004C22B0 ; ASCII "Invalid ID or Name;“o˜^ID‚Ü‚½‚Í–¼‘O‚ª–³Œø‚Å‚·" 004C2223 |. E8 280C0000 CALL eXeScope.004C2E50 004C2228 |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14] ; | 004C222B |. 66:8B0D E0224C>MOV CX,WORD PTR DS:[4C22E0] ; | 004C2232 |. B2 01 MOV DL,1 ; | 004C2234 |. E8 6754F7FF CALL eXeScope.004376A0 ; \eXeScope.004376A0 004C2239 |> 33C0 XOR EAX,EAX 004C223B |. 5A POP EDX 004C223C |. 59 POP ECX 004C223D |. 59 POP ECX 004C223E |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 004C2241 |. 68 68224C00 PUSH eXeScope.004C2268 004C2246 |> 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] Kéo lên phía trên một chút thấy có hai thằng nhảy đến đoạn nag. Nhiệm vụ của ta là phải tìm số đăng ký sao cho hai thằng đó không nhảy xuống nữa. Vậy thì lên đầu đoạn code này và đặt breakpoint tại đó. Bây giờ đăng ký với YourName và ID. Ở đây tôi điền vào YourName=hvh0904/KT44 và ID=506. Xong nhấn OK. Olly sẽ ice tại breakpoint trên. Dùng F8 trace xuống cho đến khi gặp lệnh nhảy đầu tiên. Code: 004C2111 |. 8BD8 MOV EBX,EAX 004C2113 |. 33C0 XOR EAX,EAX 004C2115 |. 55 PUSH EBP 004C2116 |. 68 61224C00 PUSH eXeScope.004C2261 004C211B |. 64:FF30 PUSH DWORD PTR FS:[EAX] 004C211E |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 004C2121 |. A1 38EC4C00 MOV EAX,DWORD PTR DS:[4CEC38] 004C2126 |. 8038 00 CMP BYTE PTR DS:[EAX],0 004C2129 74 0F JE SHORT eXeScope.004C213A 004C212B |. C783 4C020000 >MOV DWORD PTR DS:[EBX+24C],1 004C2135 |. E9 FF000000 JMP eXeScope.004C2239 004C213A |> 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4] 004C213D |. 8B83 F8020000 MOV EAX,DWORD PTR DS:[EBX+2F8] 004C2143 |. E8 2C02FBFF CALL eXeScope.00472374 004C2148 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] 004C214B |. A1 C4EE4C00 MOV EAX,DWORD PTR DS:[4CEEC4] 004C2150 |. E8 8F28F4FF CALL eXeScope.004049E4 004C2155 |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8] Tại địa chỉ 4C2129, lệnh nhảy sẽ không thực thi nếu chương trình là REGISTERED do đó, chúng ta sẽ không quan tâm nó làm gì. Vì chưa đăng ký nên nó sẽ nhảy. Tiếp tục trace bằng F8 cho đến 4C217F, chúng ta gặp một hàm CALL với đối số AL. dưới nó là lệnh nhảy thứ nhất của một trong 2 lệnh nhảy đến nag. Vậy hàm này phải trả về AL<>0 thì mới ổn. F7 để vào hàm này, ta sẽ ở đây. Code: 004CB0B0 /$ 55 PUSH EBP >Here! 004CB0B1 |. 8BEC MOV EBP,ESP 004CB0B3 |. 51 PUSH ECX 004CB0B4 |. 53 PUSH EBX 004CB0B5 |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX 004CB0B8 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 004CB0BB |. E8 809DF3FF CALL eXeScope.00404E40 004CB0C0 |. 33C0 XOR EAX,EAX 004CB0C2 |. 55 PUSH EBP 004CB0C3 |. 68 4FB14C00 PUSH eXeScope.004CB14F 004CB0C8 |. 64:FF30 PUSH DWORD PTR FS:[EAX] 004CB0CB |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 004CB0CE |. 33DB XOR EBX,EBX 004CB0D0 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 004CB0D3 |. E8 789BF3FF CALL eXeScope.00404C50 004CB0D8 |. 83F8 0A CMP EAX,0A >Số đăng ký có 10 ký tự? 004CB0DB |. 75 5C JNZ SHORT eXeScope.004CB139 Kiểm tra dãy số đăng ký có 10 ký tự (hệ DEC) không? Nếu khác thì bắn nag. Nếu là 10 ký tự thì kiểm tra tiếp: Code: 004CB0DD |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] 004CB0E0 |. B8 64B14C00 MOV EAX,eXeScope.004CB164 ; ASCII "A1910" 004CB0E5 |. E8 AA9EF3FF CALL eXeScope.00404F94 004CB0EA |. 48 DEC EAX 004CB0EB |. 74 10 JE SHORT eXeScope.004CB0FD 004CB0ED |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] 004CB0F0 |. B8 74B14C00 MOV EAX,eXeScope.004CB174 ; ASCII "A1423" 004CB0F5 |. E8 9A9EF3FF CALL eXeScope.00404F94 004CB0FA |. 48 DEC EAX 004CB0FB |. 75 3C JNZ SHORT eXeScope.004CB139 004CB0FD |> B8 02000000 MOV EAX,2 5 ký tự đầu mặc định phải là "A1910" hoặc "A1423". Nếu đã thỏa mãn, kiểm tra tiếp: Code: 004CB102 |> 8B55 FC /MOV EDX,DWORD PTR SS:[EBP-4] 004CB105 |. 8A5402 FF |MOV DL,BYTE PTR DS:[EDX+EAX-1] 004CB109 |. 80FA 30 |CMP DL,30 004CB10C |. 72 2B |JB SHORT eXeScope.004CB139 004CB10E |. 80FA 39 |CMP DL,39 004CB111 |. 77 26 |JA SHORT eXeScope.004CB139 004CB113 |. 40 |INC EAX 004CB114 |. 83F8 0B |CMP EAX,0B 004CB117 |.^75 E9 \JNZ SHORT eXeScope.004CB102 Đoạn này buộc các ký tự phải là các chữ số. Nếu đã thỏa mãn thì tiếp tục: Code: 004CB119 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 004CB11C |. 0FB640 08 MOVZX EAX,BYTE PTR DS:[EAX+8] 004CB120 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] 004CB123 |. 0FB652 09 MOVZX EDX,BYTE PTR DS:[EDX+9] 004CB127 |. 03C2 ADD EAX,EDX 004CB129 |. B9 0A000000 MOV ECX,0A 004CB12E |. 33D2 XOR EDX,EDX 004CB130 |. F7F1 DIV ECX 004CB132 |. 83FA 04 CMP EDX,4 004CB135 |. 75 02 JNZ SHORT eXeScope.004CB139 004CB137 |. B3 01 MOV BL,1 004CB139 |> 33C0 XOR EAX,EAX 004CB13B |. 5A POP EDX 004CB13C |. 59 POP ECX 004CB13D |. 59 POP ECX 004CB13E |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 004CB141 |. 68 56B14C00 PUSH eXeScope.004CB156 004CB146 |> 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] 004CB149 |. E8 4298F3FF CALL eXeScope.00404990 004CB14E \. C3 RETN 004CB14F .^E9 2092F3FF JMP eXeScope.00404374 004CB154 .^EB F0 JMP SHORT eXeScope.004CB146 004CB156 . 8BC3 MOV EAX,EBX 004CB158 . 5B POP EBX 004CB159 . 59 POP ECX 004CB15A . 5D POP EBP 004CB15B . C3 RETN Đoạn này sẽ lấy tổng ký tự 9 và ký tự 10 chia cho 0A. Nếu dư 4 thì ổn. Nếu tất cả đã OK thì quay về chúng ta sẽ không bị dính nag mà sẽ tiếp cận với lệnh nhảy thứ 2 trong 2 lệnh nhảy đến nag đã nói: Code: 004C218C |. A1 C4EE4C00 MOV EAX,DWORD PTR DS:[4CEEC4] 004C2191 |. 8B00 MOV EAX,DWORD PTR DS:[EAX] 004C2193 |. E8 B82AF4FF CALL eXeScope.00404C50 004C2198 |. 85C0 TEST EAX,EAX 004C219A |. 7E 7D JLE SHORT eXeScope.004C2219 . 81FA 9B 000 000 CMP EDX,9B 00 411 60C |. 74 04 JE SHORT unpacked .00 411 612 00 411 60E |. 33C0 XOR EAX,EAX 00 411 6 10 |. 5E POP ESI 00 411 611 |. C3 RETN Ở đây sẽ chuyển ký tự thứ 6 vào EDX, ký tự 16 vào. DS:[4CEC38] 00 4C 212 6 |. 803 8 00 CMP BYTE PTR DS:[EAX] ,0 00 4C 212 9 74 0F JE SHORT eXeScope .00 4C 213 A 00 4C 212 B |. C783 4C0 200 00 >MOV DWORD PTR DS:[EBX+24C] ,1 00 4C 213 5 |. E9 FF 000 000 JMP eXeScope .00 4C2239. 00 4CB127 |. 03 C2 ADD EAX,EDX 00 4CB129 |. B9 0A 000 000 MOV ECX,0A 00 4CB12E |. 33D2 XOR EDX,EDX 00 4CB1 30 |. F7F1 DIV ECX 00 4CB132 |. 83FA 04 CMP EDX,4 00 4CB135 |. 75 02 JNZ SHORT eXeScope .00 4CB139