C++ 动态二进制文件
这是一个有点奇怪的问题 <我有一个C++代码,运行在一个特定的平台上。此代码的唯一目的是运行包含该平台本机二进制文件的文件 现在-我的问题是-我如何将这些文件中的数据(甚至可以是逐位的,比如一个周期1024位)放入运行我的代码的机器的内存中,以便这些数据将在执行部分 换句话说,我能把数据拿到可以指向指令指针的地方吗 如果是,如何进行 我不介意我是否必须使用汇编程序来完成这项工作——这样它才能工作 编辑:对不起,我不够具体 基本上-我要加载的文件数据不是.exe、Mach-O可执行文件或ELF格式。它只是原始的二进制数据(带有一些我的代码删除的自定义头)。此二进制数据是机器代码,特定于当前机器上运行的处理器 从技术上讲,这意味着我想绕过普通的操作系统执行器,直接加载二进制文件。我可以解释,但最多只能慢3倍左右C++ 动态二进制文件,c++,dynamic,binary,assembly,C++,Dynamic,Binary,Assembly,这是一个有点奇怪的问题
如果我需要在另一个子进程中运行数据,我一点也不介意——但是,我不能使用普通的进程开启器,因为数据不是操作系统可以自动运行的任何格式(同样,像.exe、Mach-O、ELF)。您应该将文件读取到内存,将该内存标记为可执行文件(它是特定于平台的,例如用于Windows的
VirtualProtect()
),并将其作为函数调用:((void(*)()ptr)(;
当然,文件中的代码应该是。您的解决方案需要多通用 OS加载器通常知道如何处理特定的文件格式以及如何将它们加载到内存中。您通常可以使用OS加载器并调用入口点,但为此,您需要知道入口点是什么,并且您需要了解文件格式。我想不出一个可移植的解决方案
如果您能详细解释一下您想做什么,也许可以提供一个解决方案。如果您所说的运行是指执行另一个二进制文件,那么
fork()
和system()有什么问题
?你对你的目标只字不提,这是非常依赖于目标的。你到底在哪里得到二进制块来执行,没有语言或平台?我说的是“二进制块”这是上述机器/处理器/体系结构的固有特性。类似于在没有链接的情况下编译。我认为这是可行的,只是您需要设置此代码块的返回。您正在运行的二进制块可能没有任何堆栈设置/分解约定-只需要一个跳跃into他们的代码。因此,上面所述,再加上手动添加适合当前平台的函数代码的返回值,可能就足够了。请扩展Mordachai的评论:如果加载文件中的可执行位“看起来像”C函数,那么Abyx的建议就行了;dlsym
等。这样做。如果是“原始”块“只是希望跳转到他们的代码中”,不过,您可能可以构造一个定制的jmp_buf
并使用C的longjmp()
@Mordachai,JCSalomon-是的,我理解-二进制块已经准备好进行这种加载,而且不仅仅是从上下文中提取。还有-Abyx-对于主要平台,您能更具体地说明执行标记吗?似乎这些操作系统特有的功能才是我真正需要的。