从内存中嵌入并执行本机代码

时间:2013-08-16 18:49:23

标签: windows winapi native-code

我想用我的应用程序做这两件事(仅限Windows):

  1. 允许用户在启动之前将(使用工具)本机代码插入到我的应用程序中。
  2. 在运行时直接从内存中运行此用户插入的代码。
  3. 理想情况下,用户必须很容易指定此代码。

    我有两个想法,我现在正在考虑如何做到这一点:

    1. 用户会将原生dll嵌入到应用程序的资源中。应用程序将使用this文章中的技术直接从内存中加载此dll。

    2. 以某种方式将用户指定的.dll方法的汇编代码复制到我的应用程序资源中,并按照this文章中的描述从堆中执行此代码。

    3. 有没有更好的选择呢?如果没有,是否有任何关于可能导致这些解决方案出现问题的想法?

      修改

      我特别不想使用LoadLibrary*调用,因为它们需要dll文件已经在硬盘驱动器上,我正在努力避免。我也在努力让人更加努力。

      修改

      更多细节: 应用程序代码在我的控制之下并且是原生的。我只想在编译和部署应用程序后为用户提供嵌入自己定制函数的方法。

      用户代码可以对我有任意限制,这不是问题。

3 个答案:

答案 0 :(得分:1)

在我看来,你的选项2几乎是难以处理的。对于少量自包含代码,它是可行的。对于任何严重的代码量,如果不重新发明可选择的轮子1,你就无法真正地希望获得成功。 例如,真正的代码将链接到Win32函数,您将如何解决这些问题?你必须像PE导入表那样发明一些东西。那么,为什么DLL已经存在时会这样做。如果您为此代码发明了自己的类PE文件格式,那么有人会如何生成它?所有标准工具都是制作PE格式DLL的。

对于选项1,不支持从内存加载DLL。所以如果从文件加载,你必须完成加载器为你做的所有工作。因此,如果要加载磁盘上不存在的DLL,则选项1是您唯一的选择。

任何一半有能力的黑客都会轻易地将DLL从执行过程中拉出来,所以不要自欺欺人地说,从内存中运行DLL会以某种方式保护你的代码免受检查。

答案 1 :(得分:1)

目的是允许第三方将代码静态链接到本机应用程序。

显而易见的方法是向第三方提供应用程序的目标文件和链接器。这可以包含在一个工具中,以便于使用。

与以往一样,魔鬼在细节中。除了目标文件之外,应用程序还包含清单,资源等。您需要找到有权分发的链接器。您需要使用与所述链接器兼容的编译器。等等。但这当然是可行的,并且可能比尝试推出自己的解决方案更可靠。

答案 2 :(得分:0)

这就是所谓的“应用程序虚拟化”,有第三方工具,check them on google

在一个简单的例子中,您可以只将“DLL”加载到内存中,应用relocs,设置导入和调用入口点。