【发布时间】:2012-06-06 23:14:09
【问题描述】:
我在我的库中使用method hooking/detour。
由于 WriteProcessMemory/ReadProcessMemory 是 Windows API 函数,OS X 上的方法挂钩/迂回解决方案是什么?
编辑:
好的,让我在这里提供更多信息,以便更清楚我为什么要问这个问题:
在我的 DSharp 库中即将推出的功能中,我有以下代码:
procedure FreeInstance(Self: TObject);
begin
...
Self.CleanupInstance;
FreeMem(Pointer(Self));
end;
var
FreeInstanceBackup: TXRedirCode;
initialization
...
HookCode(@TObject.FreeInstance, @FreeInstance, FreeInstanceBackup);
finalization
UnhookCode(@TObject.FreeInstance, FreeInstanceBackup);
...
end.
事实是,我需要挂接到 TObject.FreeInstance 方法,以便在每个对象销毁时得到通知(是的,我知道,如果有人决定覆盖它并且不调用继承,它可能不会被调用)。
另一个使用 WriteProcessMemory 的单元是 ReturnTypePatch.pas,它修复了 QC #98687,这对于像我的 Mocking 库和来自 Vincent Parrett 的 Delphi Mocks 是必需的(在我们都意识到这个问题之前,他基本上有一个用户报告了这个问题) .
WriteProcessMemory 的另一个用途是在 DSharp 的 AOP 部分,我基本上用代理类 VMT 替换类的 VMT,该代理类 VMT 从 RTTI 的 TVirtualMethodInterceptor 类创建。使用 TVirtualMethodInterceptor,您只能代理一个现有对象 - 我的实现对整个类都执行此操作(因此所有现有和未来的对象,即使是继承的)。
在所有情况下,都无法使用 Move 写入内存,因为它们受到保护(在使用 CopyMemory 调用替换 WriteProcessMemory 时获取 AV)。
希望这是关于我正在使用这些功能做什么的足够信息 - 有人可以指出一个适用于 OS X 的解决方案(不幸的是我没有,所以我无法测试任何东西)。
【问题讨论】:
-
看看这个,也许有帮助:stackoverflow.com/questions/10668/…
-
您是要等效的API函数吗?或者你在问如何挂钩函数?如果你说“两者”,你就有一个 XY 问题;不要假设 X 的解决方案在于知道如何做 Y。如果你真的认为你需要知道这两个问题,请提出两个单独的问题。另外,请注意,链接的挂钩代码可能使用普通的旧
Move(memcpy,用于 C 人员),因为它是当前进程中的挂钩代码。 -
@Rob 好吧,我基本上需要知道如何重写正在运行的应用程序的内存。比如挂钩、重写部分 VMT 等。
-
重写另一个进程的内存有三种基本方法:将自己的代码挂接到进程中(如 Rob 所说,然后你可以只使用 memcpy),作为调试器附加到进程,或使用 Mach蜜蜂。哪一个有意义取决于您最终要完成的任务——而且,如果您要从 Windows 移植某些内容,那么您要移植的内容。
-
我刚刚注意到它被标记为delphi。很久以前,有人创建了一个名为 GameCheatLib 的开源 delphi 项目(大致基于我编写的类似 Python 库),它封装了用于枚举进程、附加到进程、读取/写入其内存等的代码Mac、Win32 和 linux(或者任何具有完整 ptrace 的 POSIX?)。你可能想用谷歌搜索它;即使它早就死了,来源应该是有帮助的。
标签: macos delphi hook delphi-xe2