【问题标题】:How to launch an executable from memory?如何从内存中启动可执行文件?
【发布时间】:2012-08-01 07:23:05
【问题描述】:

有人知道在 OSX 中从内存中运行可执行文件吗? 像这样的:

char *exeFile[size];
loadFromFile(exeFile, "/path/to/data");
execute(exeFile);

出于安全原因,我想这样做。例如,可以在启动前对 exe 进行加密和解密。

【问题讨论】:

  • 这是不可能的 AFAIK;您可以使用exec() 系列调用(当然是在fork() 之后),但您不能加密可执行文件。
  • 有可能,UPX exe压缩器做到了,解压二进制数据并执行。
  • 这是可执行文件本身的代码;不是父进程在加载可执行文件时所做的事情。
  • 那么,如何在可执行文件本身内部执行内存呢? (我将目标可执行文件加载到内存中)。
  • 加载可执行文件不仅仅是将其加载到内存中,就像使用纯数据一样;可执行文件需要重新定位和许多其他事情才能工作。除了将文件解密为临时文件,execing 该文件然后将其删除之外,您无法做任何您想做的事情。

标签: macos cocoa macos-carbon core-foundation


【解决方案1】:

嗯,是的,你可以做到,但它很复杂。我现在无法访问工作代码,但我知道其他人正在/已经使用它。关键是“NSCreateObjectFileImageFromMemory()”,它已被弃用,但据说像 Skype 这样的一些大型应用程序使用它,所以它可能不会很快消失 (YMMV)。

您必须使用 vm_allocate 分配一个页面大小的倍数的内存缓冲区。将与当前进程相同架构的 mach-o 可执行文件复制到那里。调用 NSCreateObjectFileImageFromMemory() 返回一个对象图像。然后依次调用 NSLinkModule、NSLookupSymbolInModule 和 NSAddressOfSymbol。最后一个给你一个实际的函数指针来调用。

这应该为您提供了您需要了解的大部分内容,并且如果您搜索,您可能会发现也可以执行此操作的代码。祝你好运!

【讨论】:

  • 谢谢大卫,这是很好的指导,现在我有了一个起点。
猜你喜欢
  • 2017-11-23
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多