我正在我的库中使用方法钩取/重定向。
由于WriteProcessMemory / ReadProcessMemory是Windows API函数,因此在OS X上如何解决方法钩取/重定向问题?
编辑:
好的,让我在这里放更多信息,以便更清楚地解释我为什么要问这个问题:
在我即将推出的DSharp库的一个功能中,我有这段代码:
事实是,我需要钩入TObject.FreeInstance方法以便在每个对象销毁时得到通知(是的,我知道,如果有人决定覆盖它并且不调用inherited,则可能不会被调用)。
另一个使用WriteProcessMemory的单元是ReturnTypePatch.pas,它修复了QC#98687,这对于像我这样的Mocking库和Vincent Parrett的Delphi Mocks是必需的(他基本上在我们两个都意识到该问题之前就有一个用户报告了该问题)。
WriteProcessMemory的另一个用途是DSharp的AOP部分,在其中我基本上将类的VMT替换为从RTTI创建的代理类VMT。使用TVirtualMethodInterceptor,您只能代理现有对象-我的实现对整个类进行了代理(因此所有现有和未来的对象,即使继承)。
在所有情况下,内存都不能通过Move写入,因为它们是受保护的(如果将WriteProcessMemory替换为对CopyMemory的调用,则会收到AV)。
由于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方法以便在每个对象销毁时得到通知(是的,我知道,如果有人决定覆盖它并且不调用inherited,则可能不会被调用)。
另一个使用WriteProcessMemory的单元是ReturnTypePatch.pas,它修复了QC#98687,这对于像我这样的Mocking库和Vincent Parrett的Delphi Mocks是必需的(他基本上在我们两个都意识到该问题之前就有一个用户报告了该问题)。
WriteProcessMemory的另一个用途是DSharp的AOP部分,在其中我基本上将类的VMT替换为从RTTI创建的代理类VMT。使用TVirtualMethodInterceptor,您只能代理现有对象-我的实现对整个类进行了代理(因此所有现有和未来的对象,即使继承)。
在所有情况下,内存都不能通过Move写入,因为它们是受保护的(如果将WriteProcessMemory替换为对CopyMemory的调用,则会收到AV)。
希望这些函数的相关信息足够了解 - 希望有人能指出适用于OS X的解决方案(不幸的是,我没有OS X,无法测试任何东西)。
Move
(对于C语言的人来说是memcpy
),因为它是当前进程中的挂钩代码。 - Rob Kennedy