【问题标题】:Embed and execute native code from memory从内存中嵌入和执行本机代码
【发布时间】:2013-08-16 18:49:23
【问题描述】:

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

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

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

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

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

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

有没有更好的选择来做到这一点?如果没有,有什么想法可能会导致这些解决方案出现问题吗?

编辑

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

编辑

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

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

【问题讨论】:

  • 正常且直接的方法是使用 LoadLibrary() 从文件系统动态加载 dll,并在该 dll 中调用众所周知的函数。这不可行吗
  • LoadLibraryExGetProcAddress 有什么问题?另外,“直接从内存中运行 [...]” 是什么意思?而不是从运行?您提出的解决方案存在问题:反恶意软件和病毒防护软件将运行混乱。
  • 您能说“主要用于导致其被所有防病毒/恶意软件检测软件隔离或删除的目的”或“允许您被任何和所有负责任的公司 IT 部门轻松禁止”吗?它会在您的产品文献中读起来非常好。
  • 您希望允许第三方将代码静态链接到您的应用程序中。所以给他们你的目标文件和链接器。如果您愿意,您可以将其封装在一个工具中,以方便第三方使用。
  • 换句话说,一个从磁盘加载的.dll,之前已经扫描过。再次,这是不同的。您正在使用可执行代码并执行它。您没有获取数据段并将其重新声明为可执行代码。这基本上就是@Ken 所说的。

标签: windows winapi native-code


【解决方案1】:

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

这样做的明显方法是向第三方提供应用程序的目标文件和链接器。这可以封装在一个工具中,使其易于使用。

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

【讨论】:

    【解决方案2】:

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

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

    任何不称职的黑客都会轻易地从执行进程中拉取 DLL,所以不要自欺欺人地认为从内存中运行 DLL 会以某种方式保护您的代码不被检查。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-06-27
        • 2011-01-02
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-14
        • 1970-01-01
        相关资源
        最近更新 更多