OS X上的WriteProcessMemory等价物

时间:2012-06-01 17:37:49

标签: macos delphi hook delphi-xe2

我在我的图书馆中使用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,这对于像我这样的模拟库和来自Vincent Parrett的Delphi Mocks来说是非常的(他们基本上有一个用户在我们都知道之前报告了这个问题那个问题)。

WriteProcessMemory的另一个用途是在DSharp的AOP部分,我基本上用从RTTI的TVirtualMethodInterceptor类创建的代理类VMT替换类的VMT。使用TVirtualMethodInterceptor,您只能代理现有对象 - 我的实现对整个类执行此操作(因此所有现有和将来的对象,即使是继承的对象)。

在所有情况下,使用Move都无法写入内存,因为它们受到保护(在通过调用CopyMemory替换WriteProcessMemory时获取AV)。

希望有足够的信息来说明我正在对这些功能做些什么 - 有人可以指出一个可以在OS X上运行的解决方案(不幸的是我没有,所以我无法测试任何东西)。

1 个答案:

答案 0 :(得分:10)

与WriteProcessMemory / ReadProcessMemory最直接相同的是Mach调用vm_w​​rite / vm_read。你需要一个Mach任务(你可以通过task_for_pid获得)而不是HPROCESS,当然也有很多不同之处。

由于Apple已帮助删除了这些功能的联机帮助页,并且没有将其记录在任何Xcode文档集中,因此您必须处理稍微过时的非Apple Mach / MK / Gnu-Mach文档,头文件评论(非常好)和/或第三方文章,如http://www.uninformed.org/?v=4&a=3http://www.phrack.org/issues.html?issue=66&id=16(您可以从目标受众的网址中猜出)。但这很容易。将“内存作弊工具”从Windows移植到Mac,您将花费更多时间重写GUI而不是实现低级别的东西。

但这可能不是做方法挂钩的最佳方法。特别是如果您正在使用ObjC方法,甚至是C API。详细描述您想要做的事情,我可以提供更好的选择。