Rồi, thay call 46yyyy bằng call function ta vừa nhét vào, thế là nó tự nạp Mydll rồi. 4. Code of Mydll Mình mô tả các hàm chính thôi nhé, còn viết dll để hook các bạn biết rồi mà. Cấu trúc Mydll như sau : (viết bằng delphi) type PJMP : ^TJMP TJMP = packed record jma : byte // $B8 jcode: pointer // con trỏ function jend : word // FFEO end; Cấu trúc này tương ứng mov eax, jcode ; jmp eax var ỌMP, MJMP : TJMP // opcode old / new DIO, dFree : pointer // đ/c của DeviceIO và FreeLibrary. lKQ: array[0 $87] of byte // Trong lKQ có $80 byte kết quả và 2 dword cuối, sử dụng bạ xem dưới đây lCODE : array [0 $28] of bytes // Mã lệnh thay thế cho function tại xxxx1DA0 Trong event DLL_ATTACH, bạn làm các công việc sau (mô tả thôi) : - Lấy handle của kernel32.dll - Lấy đ/c của DeviceIoControl / FreeLibrary vảo DIO/ dFree - DllGlo = handle Load lên Global memory -Nhớ nhé ko nó không chạy đâu ! - ỌMP.jcode = @DeviceIoControl - MJMP.jcode = @TVPL, đây là hàm xử lý chính sẽ mô tả sau đây, và viết nó vào đ/c cũ của DeviceIoControl (bằng WriteMemory ) . Rồi, đây là các hàm chính trong dll function AutoLoad (DllHandle : Thandle) : boolean ; stdcall ; asm mov ecx, dFree mov eax, DllGlo test eax, eax je _ No // Khong load duoc, tra ve @FreeLibrarry lea esi, lKQ[$80] mov [esi], DllHandle // cat Mydll Handle vao lKQ[$80] mov [esi+04], dFree // cat @FreeLibrarry vao lKQ[$84] xor ecx,ecx _No: mov eax, ecx end function VietPro(N: Integer): boolean ; stdcall // Dùng để đọc / ghi vào memory begin Case N of 0: read memory // để lấy @DeviceIO 1: write OJMP // Restore origin @DeviceIO esle: write MJMP // new @DeviceIO end ; // các hàm này ko có gì ! end ; procedure TVPL ; Đâ là hàm xử lý chính ! asm // Làm các công việc sau : // - kiểm tra địa chỉ nơi gọi, nếu đúng thì replace code, unhook // - nếu sai, gọi DeviceIO xịn Kiểm tra địa chỉ mov eax, [esp] // Lấy đ/c trả về nơi gọi - nên viết bằng asm là OK nhất mov ecx, eax xor ax, $12FA test ax, ax // Goi DeviceIO lần 1 je _1 mov eax, ecx xor ax, $12E5 test ax, ax jne _No // Không phải, gọi DeviceIO xịn _1 : // Copy & replace code mov eax, ecx // eax= 28Fxxxx, ví dụ thế xor ax, ax push eax sub eax,$10000 // eax = 28Exxxx, đ/c đầu đoạn lea edi, eax lea esi, lKQ[0] mov ecx, $22 // Copy $88 bytes lên đầu vùng nhớ, tại đây có $1000 byte trống . repz movsd pop eax add eax, $1DA0 // đ/c hàm cần thay thế lea edi, eax lea esi, lCODE mov ecx, SizeOf(lCODE) // ví dụ $27 bytes mov eax, ecx shr ecx, 02 repz movsd mov ecx, eax and ecx, 03 repz movzb // OK, copy xong push 1 Call VietPro // Restore origin DeviceIO - UnHook push DIO ret // jmp @DeviceIO // Xong phan crack ! _NO: // Xử lý nếu không đúng đ/c push 1 Call VietPro Mov eax, [esp] mov dLuu, eax // cất địa chỉ trở về vào dLuu add esp, 04 call DeviceIOControl push eax // cat result push 2 Call VietPro // Hook continue pop eax push dLuu // return call origin ret. end ; Riêng về lCODE là mã lệnh thay thế cho function tại @ xxxx1DA0 hơi đặc biệt, mình post sau đây // tại xxxx1DA0 vào : eax -> @ mảng chứa kết quả decode (asm) // lấy eip push ebp call get_Real_EIP (opcode : E80000) pop ebp mov edx, ebp pop ebp // fix stack, if not: die ! // , edx = current eip lea edi, eax and edx, $FFFE0000 lea esi , edx // esi -> @ head of segment xor ecx, ecx add ecx, $20 repz movzd // Copy lKQ // Unload Mydll mov eax, [esi] // esi -> lKQ[$80] = handle of Mydll put in AutoLoad push eax mov eax,[esi+04] // @ FreeLibrary , put in same ! call eax -> unload Mydll ! ret Sau đó copy opcode vào lCODE là OK. 5. Tổng kết Mình nghĩ kiểu Hook này có thể cải tiến để áp dụng vào nhiều crack tut khác. Chúc các bạn thành công. Chào, mã nguồn lib dùng dể hook Về file patch thì mình nghĩ là đơn giản, nó chỉ add đoạn code để load library vào file và put lib vào {system32} hay cùng thư mục. Để add code, bạn load file exe vào Olly (untick memory access violation), dùng binary paste các byte sau vào add : 0046A7A0 Code: 41 75 74 6F 4C 6F 61 64 00 00 00 00 00 00 00 00 6D 61 6B 66 69 78 2E 64 6C 6C 00 00 00 00 00 00 68 B0 A7 46 00 B8 00 EA 46 00 FF 10 85 C0 74 1B 50 50 68 A0 A7 46 00 50 B8 F8 E9 46 00 FF 10 85 C0 74 09 FF D0 85 C0 74 03 FF D0 C3 58 C3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Và tại address : 00401005 |. E8 B6970600 CALL SSAMV8D.0046A7C0 Opcode trên chính là : 0046A7C0 68 B0A74600 PUSH SSAMV8D.0046A7B0 ; ASCII "makfix.dll" 0046A7C5 B8 00EA4600 MOV EAX, <&kernel32.LoadLibraryA> ; ASCII "aÙçw" 0046A7CA FF10 CALL NEAR DWORD PTR DS:[EAX] 0046A7CC 85C0 TEST EAX, EAX 0046A7CE 74 1B JE SHORT SSAMV8D.0046A7EB 0046A7D0 50 PUSH EAX 0046A7D1 50 PUSH EAX 0046A7D2 68 A0A74600 PUSH SSAMV8D.0046A7A0 ; ASCII "AutoLoad" 0046A7D7 50 PUSH EAX 0046A7D8 B8 F8E94600 MOV EAX, <&kernel32.GetProcAddress> ; ASCII "2³çw†çwaÙçw" 0046A7DD FF10 CALL NEAR DWORD PTR DS:[EAX] 0046A7DF 85C0 TEST EAX, EAX 0046A7E1 74 09 JE SHORT SSAMV8D.0046A7EC 0046A7E3 FFD0 CALL NEAR EAX 0046A7E5 85C0 TEST EAX, EAX 0046A7E7 74 03 JE SHORT SSAMV8D.0046A7EC 0046A7E9 FFD0 CALL NEAR EAX 0046A7EB C3 RETN 0046A7EC 58 POP EAX 0046A7ED C3 RETN Đây chính là các opcode để gọi load lib "makfix.dll" và xử lý lỗi khi load. chọn copy to excute / save file vậy là xong patch. Còn dưới đây là mã hoàn chỉnh của lib để Hook "makfix.dll" viết bằng Delphi. các bạn có thể convert sang VS / C++ tuỳ theo ngôn ngữ mình dùng Code: library makfix; uses SysUtils,Windows,Classes; . F8 E9 46 00 FF 10 85 C0 74 09 FF D0 85 C0 74 03 FF D0 C3 58 C3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Và tại address : 00 4 01 0 05 |. E8 B69 706 00 CALL SSAMV8D .00 46A7C0 Opcode. : 00 46A7A0 Code: 41 75 74 6F 4C 6F 61 64 00 00 00 00 00 00 00 00 6D 61 6B 66 69 78 2E 64 6C 6C 00 00 00 00 00 00 68 B0 A7 46 00 B8 00 EA 46 00 FF 10 85 C0 74 1B 50 50 68 A0 A7 46 00 50. 00 46A7CC 85C0 TEST EAX, EAX 00 46A7CE 74 1B JE SHORT SSAMV8D .00 46A7EB 00 46A7D0 50 PUSH EAX 00 46A7D1 50 PUSH EAX 00 46A7D2 68 A0A74 600 PUSH SSAMV8D .00 46A7A0 ; ASCII "AutoLoad" 00 46A7D7