3 回答

TA貢獻2041條經(jīng)驗 獲得超4個贊
我使用以下代碼:
procedure PatchCode(Address: Pointer; const NewCode; Size: Integer);
var
OldProtect: DWORD;
begin
if VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, OldProtect) then
begin
Move(NewCode, Address^, Size);
FlushInstructionCache(GetCurrentProcess, Address, Size);
VirtualProtect(Address, Size, OldProtect, @OldProtect);
end;
end;
type
PInstruction = ^TInstruction;
TInstruction = packed record
Opcode: Byte;
Offset: Integer;
end;
procedure RedirectProcedure(OldAddress, NewAddress: Pointer);
var
NewCode: TInstruction;
begin
NewCode.Opcode := $E9;//jump relative
NewCode.Offset := NativeInt(NewAddress)-NativeInt(OldAddress)-SizeOf(NewCode);
PatchCode(OldAddress, NewCode, SizeOf(NewCode));
end;
您可以通過調(diào)用來實現(xiàn)鉤子/補丁/繞行RedirectProcedure:
RedirectProcedure(@LoadResourceModule, @MyLoadResourceModule);
這將適用于32位代碼。如果舊功能和新功能都位于同一可執(zhí)行模塊中,則它也適用于64位代碼。否則,跳轉距離可能會超出32位整數(shù)的范圍。
如果有人可以提供一種適用于64位地址
- 3 回答
- 0 關注
- 684 瀏覽
添加回答
舉報