0

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

  1. 允许用户在启动应用程序之前将本机代码插入(使用工具)到我的应用程序中。
  2. 在运行时直接从内存中运行这个用户插入的代码。

理想情况下,用户必须很容易指定此代码。

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

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

  2. 不知何故,将用户指定的 .dll 方法的汇编代码复制到我的应用程序资源中,并按照本文所述从堆中执行此代码。

有没有更好的选择来做到这一点?如果没有,对这些解决方案中可能导致问题的任何想法?

编辑

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

编辑

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

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

4

3 回答 3

1

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

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

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

于 2013-08-16T21:19:04.860 回答
1

在我看来,您的选项 2 非常棘手。对于少量的独立代码,它是可行的。对于任何大量代码,如果不重新发明轮子,您就无法真正希望成功,这是您的选择 1。例如,实际代码将链接到 Win32 函数,您将如何解决这些问题?您必须发明一些类似于 PE 导入表的东西。那么,当 DLL 已经存在时,为什么要这样做。如果您为此代码发明了自己的类似 PE 的文件格式,那么任何人将如何生成它?所有标准工具都用于制作 PE 格式的 DLL。

至于选项 1,不支持从内存加载 DLL。因此,如果加载器从文件加载,您必须完成加载器将为您完成的所有工作。因此,如果您想加载磁盘上不存在的 DLL,那么选项 1 是您唯一的选择。

任何有一半能力的黑客都会很容易地从执行过程中拉出 DLL,所以不要自欺欺人地认为从内存中运行 DLL 会以某种方式保护您的代码不被检查。

于 2013-08-16T19:45:30.777 回答
0

这就是所谓的“应用程序虚拟化”,有 3rd 方工具,请在 google 上查看

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

于 2013-08-17T18:38:22.843 回答