加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

修补程序调用delphi

发布时间:2020-12-15 10:09:10 所属栏目:大数据 来源:网络整理
导读:我想修补一个例行的调用,以便能够自己处理它,并进行一些修改. 我正在编写一个资源加载器.我想补丁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位整数的范围.

如果有人可以提供一个适用于64位地址空间的替代方案,无论两个地址有多远,我都会很感兴趣.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读