我想修补一个例行的调用,以便能够自己处理它,并进行一些修改.
我正在编写一个资源加载器.我想补丁Delphi的LoadResourceModule和
InitInheritedComponent与我的例程.我已经在MadExcept.pas单元中检查了PatchAPI调用,但是如果我可以将其用于我的项目,则无法确定.
我正在编写一个资源加载器.我想补丁Delphi的LoadResourceModule和
InitInheritedComponent与我的例程.我已经在MadExcept.pas单元中检查了PatchAPI调用,但是如果我可以将其用于我的项目,则无法确定.
我想要的东西
my exe at runtime calls -> LoadResourceModule -> jump to -> MyCustomresourceModule…
任何指针都将非常有用.
解决方法
我使用以下代码:
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,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;
你可以通过调用RedirectProcedure来实现你的hook / patch / detour:
RedirectProcedure(@LoadResourceModule,@MyLoadResourceModule);
这将适用于32位代码.如果旧功能和新功能都驻留在同一可执行模块中,则它也适用于64位代码.否则跳转距离可能超过32位整数的范围.
原文地址:https://www.jb51.cc/delphi/102829.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。