0041D300 . 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C] 0041D304 . 50 PUSH EAX 0041D305 . 68 34964300 PUSH #1_VIDEO.00439634 ; ASCII "License To: %s" 0041D30A . 51 PUSH ECX 0041D30B . E8 DABB0000 CALL <JMP.&MFC42.#2818> 0041D310 . 8B5424 18 MOV EDX,DWORD PTR SS:[ESP+18] 0041D314 . 83C4 0C ADD ESP,0C 0041D317 . 8BCE MOV ECX,ESI 0041D319 . 6A 40 PUSH 40 0041D31B . 68 28964300 PUSH #1_VIDEO.00439628 ; ASCII "Thank you" 0041D320 . 52 PUSH EDX 0041D321 . E8 BEBB0000 CALL <JMP.&MFC42.#4224> 0041D326 . 57 PUSH EDI 0041D327 . B9 C89D4300 MOV ECX,#1_VIDEO.00439DC8 0041D32C . E8 DBB70000 CALL <JMP.&MFC42.#858> 0041D331 . 55 PUSH EBP 0041D332 . B9 CC9D4300 MOV ECX,#1_VIDEO.00439DCC 0041D337 . E8 D0B70000 CALL <JMP.&MFC42.#858> 0041D33C . 8B07 MOV EAX,DWORD PTR DS:[EDI] 0041D33E . 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C] 0041D342 . 50 PUSH EAX 0041D343 . 68 18964300 PUSH #1_VIDEO.00439618 ; ASCII "(License To:%s)" 0041D348 . 51 PUSH ECX 0041D349 . E8 9CBB0000 CALL <JMP.&MFC42.#2818> 0041D34E . 83C4 0C ADD ESP,0C 0041D351 . 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C] 0041D355 . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] 0041D359 . 52 PUSH EDX 0041D35A . 68 FC954300 PUSH #1_VIDEO.004395FC ; ASCII "#1 Video Converter 3.8.3 " Tại địa chỉ 0041D2DA ta có hàm kiểm tra thông tin đăng ký : CALL #1_VIDEO.0041CD60. Nếu hợp lệ thì set giá trị EAX=1 và lệnh nhảy tại địa chỉ 0041D2E4 được thực thi; còn không thì EAX=0, lệnh nhảy đó không được thực thi và sẽ bắn nag. Oki , vậy là chúng ta đã hiểu cơ chế bắn nag của chương trình. Tại đây chúng ta có 2 phương án patch chương trình. Phương án 1, chúng ta sẽ patch lệnh nhảy tại địa chỉ 0041D2E4 từ JNZ SHORT #1_VIDEO.0041D2FE thành JMP SHORT #1_VIDEO.0041D2FE . Tức là với bất kỳ giá trị nào của thanh ghi EAX thì đều nhảy tới thông báo đăng ký thành công. Chúng ta thử tiến hành thử phương án này xem sao. Nhấn Space Bar tại địa chỉ 0041D2E4, xuất hiển cửa sổ như hình dưới đây : Tiến hành việc sửa như hình, và nhấn Assemble. Sau đó chúng ta tiến hành save những thay đổi ra một file, chẳng hạn như Patch_1. exe. Chuột phải tại cửa sổ code, chọn mục trên pop-up menu như hình dưới đây : Một cửa sổ xuất hiện : Nhấn tiếp Copy all, xuất hiện cửa sổ sau đây : Nhấp chuột phải trên cửa sổ này, chọn Save file để lưu ra một file khác (Patch_1. exe). Chạy file Patch_1. exe, nhập vào Name/Serial , nhấn OK. Waa … waa, một thông báo ”License To : Name”. Có lẽ là chúng ta đã patch đúng rồi chăng ? Các bạn chớ vội mừng, hãy tắt chương trình đi và khởi động lại xem sao. Hic … hic ta thấy tiêu đề chương trình là trial version, 50% conversion, như vậy có nghĩa là vào lúc bắt đầu, chương trình sẽ test lại đăng ký, đây là một kỹ thuật anti patching, và khi bạn đăng ký chương trình chỉ chấp nhận đăng ký đó trong phiên làm việc hiện thời. Load file Patch_1. exe trong Olly, chúng ta tìm được chuỗi trial version, 50% conversion tại địa chỉ 00422ADD, lần lên một chút chúng ta sẽ thấy hàm kiểm tra CALL #1_VIDEO.0041CD60 Code: 00422A77 . E8 E4A2FFFF CALL #1_VIDEO.0041CD60 ;<== gọi hàm test 00422A7C . 83C4 08 ADD ESP,8 00422A7F . 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10] 00422A83 . 85C0 TEST EAX,EAX 00422A85 . 74 4C JE SHORT #1_VIDEO.00422AD3 ; [ /b] <== patch here[/b] 00422A87 . A1 C89D4300 MOV EAX,DWORD PTR DS:[439DC8] 00422A8C . 50 PUSH EAX 00422A8D . 68 18964300 PUSH #1_VIDEO.00439618 ; ASCII "(License To:%s)" 00422A92 . 51 PUSH ECX 00422A93 . E8 52640000 CALL <JMP.&MFC42.#2818> 00422A98 . 83C4 0C ADD ESP,0C 00422A9B . 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10] 00422A9F . 8D4424 18 LEA EAX,DWORD PTR SS:[ESP+18] 00422AA3 . 52 PUSH EDX 00422AA4 . 68 FC954300 PUSH #1_VIDEO.004395FC ; ASCII "#1 Video Converter 3.8.3 " ………… 00422AD0 . 51 PUSH ECX 00422AD1 . EB 1D JMP SHORT #1_VIDEO.00422AF0 00422AD3 > 68 FC954300 PUSH #1_VIDEO.004395FC ; ASCII "#1 Video Converter 3.8.3 " 00422AD8 . E8 7B5F0000 CALL <JMP.&MFC42.#860> 00422ADD . 68 DC984300 PUSH #1_VIDEO.004398DC ; ASCII "(trial version, 50% conversion)" Tại địa chỉ 00422A85, ta sẽ patch lệnh nhảy thành lệnh NOP. Làm tương tự như trên chúng ta, sẽ lưu ra file Patch_1_1. exe. Chạy thử Patch_1_1. exe, ta sẽ thấy chúng ta đã qua được bước kiểm tra lúc chương trình mới khởi động, và chương trình đã được đăng ký với bất kỳ tên nào bạn nhập vào. Kết luận về cách patch thứ nhất : Chúng ta sẽ patch tại 2 địa chỉ, 0041D2E4 và 00422A85 thành : JMP SHORT #1_VIDEO.0041D2FE . NOP. Phương án 2 Đặt BP tại vị trí chương trình gọi hàm kiểm tra đăng ký của chúng ta. Code: 0041D2DA . E8 81FAFFFF CALL #1_VIDEO.0041CD60 ; <== gọi hàm test , set BP here F9 để chạy prog, nhập N/S, nhấn OK, chương trình sẽ ice tại BP. Nhấn F7 (trace into) ta sẽ tới đây : Code: 0041CD60 /$ 6A FF PUSH -1 ; <== you’re here 0041CD62 |. 68 E9C24200 PUSH #1_VIDEO.0042C2E9 ; SE handler installation …… …… 0041CDF4 |. 68 B89D4300 PUSH #1_VIDEO.00439DB8 ; /s2 = "" 0041CDF9 |. 52 PUSH EDX ; |s1 0041CDFA |. C68424 AC0000>MOV BYTE PTR SS:[ESP+AC],1 ; | 0041CE02 |. FFD6 CALL NEAR ESI ; \_mbscmp 0041CE04 |. 83C4 08 ADD ESP,8 0041CE07 |. 85C0 TEST EAX,EAX 0041CE09 |. 0F84 0F020000 JE #1_VIDEO.0041D01E ; <== Nhảy nếu Name=”” 0041CE0F |. 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] 0041CE13 |. 68 B89D4300 PUSH #1_VIDEO.00439DB8 0041CE18 |. 50 PUSH EAX 0041CE19 |. FFD6 CALL NEAR ESI 0041CE1B |. 83C4 08 ADD ESP,8 0041CE1E |. 85C0 TEST EAX,EAX 0041CE20 |. 0F84 F8010000 JE #1_VIDEO.0041D01E ; <== Nhảy nếu Serial=”” ……. …… 0041CFBB |. 50 PUSH EAX 0041CFBC |. 51 PUSH ECX 0041CFBD |. FFD6 CALL NEAR ESI 0041CFBF |. 83C4 08 ADD ESP,8 0041CFC2 |. 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10] 0041CFC6 |. 85C0 TEST EAX,EAX 0041CFC8 |. C68424 A40000>MOV BYTE PTR SS:[ESP+A4],6 0041CFD0 0F84 86000000 JE #1_VIDEO.0041D05C ; <== Nhảy nếu đăng ký hợp lệ …… 0041D01E |> 8D4C24 08 LEA ECX,DWORD PTR SS:[ESP+8] …… 0041D044 |. 33C0 XOR EAX,EAX ; EAX=0 0041D046 |. 5B POP EBX 0041D047 |. 8B8C24 940000>MOV ECX,DWORD PTR SS:[ESP+94] 0041D04E |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX 0041D055 |. 81C4 A0000000 ADD ESP,0A0 0041D05B |. C3 RETN 0041D05C |> E8 D3B90000 CALL <JMP.&MFC42.#800> 0041D061 |. 8D4C24 4C LEA ECX,DWORD PTR SS:[ESP+4C] 0041D065 |. C68424 A40000>MOV BYTE PTR SS:[ESP+A4],5 0041D06D |. E8 FE9F0000 CALL #1_VIDEO.00427070 0041D072 |. 8D4C24 34 LEA ECX,DWORD PTR SS:[ESP+34] 0041D076 |. 889C24 A40000>MOV BYTE PTR SS:[ESP+A4],BL 0041D07D |. E8 EE9F0000 CALL #1_VIDEO.00427070 0041D082 |. 8D4C24 44 LEA ECX,DWORD PTR SS:[ESP+44] 0041D086 |. C68424 A40000>MOV BYTE PTR SS:[ESP+A4],9 0041D08E |. E8 DD9F0000 CALL #1_VIDEO.00427070 0041D093 |. 8D4C24 3C LEA ECX,DWORD PTR SS:[ESP+3C] 0041D097 |. C68424 A40000>MOV BYTE PTR SS:[ESP+A4],1 0041D09F |. E8 CC9F0000 CALL #1_VIDEO.00427070 0041D0A4 |. 8D4C24 08 LEA ECX,DWORD PTR SS:[ESP+8] 0041D0A8 |. C68424 A40000>MOV BYTE PTR SS:[ESP+A4],0 0041D0B0 |. E8 7FB90000 CALL <JMP.&MFC42.#800> 0041D0B5 |. 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C] 0041D0B9 |. C78424 A40000>MOV DWORD PTR SS:[ESP+A4],-1 0041D0C4 |. E8 6BB90000 CALL <JMP.&MFC42.#800> 0041D0C9 |. 8B8C24 9C0000>MOV ECX,DWORD PTR SS:[ESP+9C] 0041D0D0 |. 5E POP ESI 0041D0D1 |. B8 01000000 MOV EAX,1 ; EAX=1 0041D0D6 |. 5B POP EBX 0041D0D7 |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX . 8B8C24 9 400 00& gt;MOV ECX,DWORD PTR SS:[ESP+94] 00 41D04E |. 64:890D 00 000 >MOV DWORD PTR FS: [0] ,ECX 00 41D055 |. 81C4 A 000 000 0 ADD ESP,0A0 00 41D05B |. C3 RETN 00 41D05C |> E8 D3B 900 00 CALL. AC 000 0>MOV BYTE PTR SS:[ESP+AC] ,1 ; | 00 41CE02 |. FFD6 CALL NEAR ESI ; \_mbscmp 00 41CE04 |. 83C4 08 ADD ESP,8 00 41CE07 |. 85C0 TEST EAX,EAX 00 41CE09 |. 0F84 0F0 200 00 JE #1_ VIDEO .00 41D01E. 00 41D08E |. E8 DD9F 000 0 CALL #1_ VIDEO .00 42 707 0 00 41D093 |. 8D4C24 3C LEA ECX,DWORD PTR SS:[ESP+3C] 00 41D097 |. C68424 A 400 00& gt;MOV BYTE PTR SS:[ESP+A4] ,1 00 41D09F |. E8 CC9F 000 0 CALL #1_ VIDEO .00 42 707 0