Tải bản đầy đủ (.pdf) (5 trang)

Cracker Handbook 1.0 part 190 ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (122.15 KB, 5 trang )

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;

×