在OS X上的WriteProcessMemory等效功能是什么?

4
我正在我的库中使用方法钩取/重定向
由于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,无法测试任何东西)。


看看这个,也许有帮助:https://dev59.com/enVD5IYBdhLWcg3wWKLc - Lars
1
你是在询问等效的API函数吗?还是在询问如何挂钩函数?如果你说“两者都是”,那么你有一个XY问题;不要假设解决X的方法在于知道如何做Y。如果你真的认为需要知道两个问题,请分别提出两个问题。此外,请注意,链接的挂钩代码可能可以使用普通的Move(对于C语言的人来说是memcpy),因为它是当前进程中的挂钩代码。 - Rob Kennedy
@Rob 嗯,我基本上需要知道如何重写正在运行的应用程序的内存。比如挂钩,重写VMT的部分等。 - Stefan Glienke
有三种基本的方法可以重写另一个进程的内存:将自己的代码挂接到该进程中(就像Rob说的那样,然后你只需使用memcpy函数),以调试器的形式附加到该进程中,或者使用Mach API。哪种方法更合适取决于你最终想要实现什么目标,以及如果你正在从Windows移植一些东西,你要移植的是什么。 - abarnert
我刚注意到这被标记为Delphi。很久以前,有人创建了一个名为GameCheatLib的开源Delphi项目(松散基于我编写的类似Python库),它将枚举进程、附加到进程、读取/写入其内存等代码封装在Mac、Win32和Linux上(或者可能是任何具有完整ptrace的POSIX系统)。你可能想要在谷歌上搜索一下;即使它已经死了很久,源代码也应该是有用的。 - abarnert
显示剩余6条评论
1个回答

10
WriteProcessMemory/ReadProcessMemory的最直接等价物是Mach调用vm_write/vm_read。您需要一个Mach任务(可以通过task_for_pid获得),而且当然有很多小差异。
由于苹果已经帮助删除了这些函数的手册,并且没有在任何Xcode docsets中记录它们,因此您必须处理略微过时的非苹果Mach/MK/Gnu-Mach文档、头文件注释(非常好)和/或第三方文章,例如http://www.uninformed.org/?v=4&a=3http://www.phrack.org/issues.html?issue=66&id=16(您可能可以从URL中猜出它们的目标受众)。但这很容易。将“内存作弊工具”从Windows移植到Mac,您将花费更多时间重写GUI而不是实施低级别的内容。
但这可能不是最好的方法来进行方法挂钩。特别是当你挂钩ObjC方法时,但即使对于C API也是如此。请更详细地描述您想要做什么,我可以提供更好的替代方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接