【问题标题】:Dynamic binary from file来自文件的动态二进制文件
【发布时间】:2011-06-04 15:27:14
【问题描述】:

这里有点奇怪的问题。

假设我有一个 C++ 代码,在特定平台上运行。这段代码的唯一目的是运行包含二进制、本机到该平台的文件。

现在 - 我的问题是 - 我如何将这些文件中的数据(甚至可以按位,例如一个周期 1024 位)获取到运行我的代码的机器的内存中,以便这些数据在执行部分中?

换句话说,我可以把数据放到可以指向指令指针的地方吗?

如果是,怎么做?

我不介意我是否必须为此使用汇编程序 - 只是这样它才能工作。

编辑:抱歉,我不够具体。

基本上 - 我要加载的文件数据不是 .exe、Mach-O 可执行文件或 ELF 等格式。它只是原始二进制数据(我的代码删除了一些 custom 标头)。此二进制数据是机器代码,特定于当前机器上运行的处理器。

从技术上讲,这意味着我想绕过普通的操作系统执行程序并直接加载二进制文件。我可以解释它,但充其量只会慢 3 倍左右。

如果我需要在另一个子进程中运行数据,我一点也不介意 - 但是我不能使用正常的进程打开器,因为数据不是操作系统可以自动运行的任何格式(再次 - 像.exe、Mach-O、ELF)。

【问题讨论】:

  • 如果运行是指执行另一个二进制文件,fork()system() 有什么问题?
  • 你没有说你的目标,这非常依赖目标。
  • 在没有语言或平台的情况下,您在哪里获得二进制块来执行?
  • 我说它是一个“二进制块”,是所述机器/处理器/架构的原生。就像你在没有链接的情况下编译一样。

标签: c++ dynamic binary assembly


【解决方案1】:

您应该只将文件读入内存,将此内存标记为可执行文件(它是特定于平台的,例如 Windows 的 VirtualProtect()),并将其作为函数调用:((void(*)())ptr)();

当然文件中的代码应该是position-independent

【讨论】:

  • 我希望这可行,但您需要设置此代码块的返回。大概您自己运行的二进制块没有任何堆栈设置/拆卸约定 - 只是希望跳转到他们的代码中。所以以上内容,加上手动添加适合当前平台的 return from-function 代码可能就足够了。
  • 扩展 Mordachai 的评论:如果加载文件中的可执行位“看起来像”C 函数,那么 Abyx 的建议将起作用; dlsym et al. 就是这样工作的。但是,如果它是“原始”块“只是希望跳转到他们的代码中”,那么您也许可以构造一个自定义 jmp_buf 并使用 C 的 longjmp()
  • @Mordachai,JCSalomon - 是的,我明白 - 二进制块已准备好进行这种加载,而不仅仅是脱离上下文。另外-Abyx-您能否针对主要平台更具体地说明执行标记?看来这些操作系统特定的功能才是我真正需要的。
【解决方案2】:

您的解决方案需要多通用?

操作系统加载器通常知道如何处理特定的文件格式以及如何将它们加载到内存中。您通常可以使用操作系统加载程序并调用入口点,但为此您需要知道入口点是什么,并且无论如何您都需要了解文件格式。我想不出一个便携的解决方案。

如果您能详细说明您想要做什么,也许可以提供解决方案。

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2015-05-29
    • 1970-01-01
    • 2016-08-18
    相关资源
    最近更新 更多