Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从分配的内存中正确执行已分配的二进制/代码_C++_C - Fatal编程技术网

C++ 如何从分配的内存中正确执行已分配的二进制/代码

C++ 如何从分配的内存中正确执行已分配的二进制/代码,c++,c,C++,C,我有一些二进制文件,我使用mmap()将其写入内存。然后我尝试从分配的内存中直接执行它,但到现在为止没有结果。有人能帮忙吗?(请举例说明) 我在Ubuntu上, 任何二进制文件(c hello world)、其大小文件大小、描述符fd,然后: addr = mmap(NULL, file_size, PROT_READ | PROT_EXEC, MAP_PRIVATE, fd, pa_offset); if (addr == MAP_FAILED)

我有一些二进制文件,我使用mmap()将其写入内存。然后我尝试从分配的内存中直接执行它,但到现在为止没有结果。有人能帮忙吗?(请举例说明) 我在Ubuntu上, 任何二进制文件(c hello world)、其大小文件大小、描述符fd,然后:

addr = mmap(NULL, file_size, PROT_READ | PROT_EXEC, MAP_PRIVATE, fd, pa_offset);
           if (addr == MAP_FAILED)
               handle_error("mmap");

因此,我不知道如何执行它

即使在编辑之后,你的问题仍然令人困惑,我认为你已经说得够多了,足以确定你做错了什么

任意二进制(c hello world)

您不能以操作系统执行的方式执行
mmap
ed二进制文件。您正在Linux上运行,因此hello world可能是ELF格式的二进制文件。Linux知道如何读取和执行ELF二进制文件,而您的程序不知道。ELF和内存映射数据也以头开始。它不是可执行代码。标头以
0x7F
开头,它对应于x86上的
jg
指令,因此尝试将ELF标头作为可执行代码“执行”可能会(取决于标志的状态)立即跳转到由标头的下一个字节组成的垃圾地址


如果您想运行这样的代码,您需要解析ELF文件,找到它的入口点(或者首先找到
.init
部分),然后从那里开始执行代码。出于学习目的,您当然可以将此作为一种练习,但这不是从您自己的程序执行另一个程序的正常方式。典型的方法是使用
fork
exec
调用。这让Linux能够处理启动程序的技术细节。

尽管你的问题在编辑之后仍然令人困惑,但我认为你已经说得够多了,足以说明你做错了什么

任意二进制(c hello world)

您不能以操作系统执行的方式执行
mmap
ed二进制文件。您正在Linux上运行,因此hello world可能是ELF格式的二进制文件。Linux知道如何读取和执行ELF二进制文件,而您的程序不知道。ELF和内存映射数据也以头开始。它不是可执行代码。标头以
0x7F
开头,它对应于x86上的
jg
指令,因此尝试将ELF标头作为可执行代码“执行”可能会(取决于标志的状态)立即跳转到由标头的下一个字节组成的垃圾地址


如果您想运行这样的代码,您需要解析ELF文件,找到它的入口点(或者首先找到
.init
部分),然后从那里开始执行代码。出于学习目的,您当然可以将此作为一种练习,但这不是从您自己的程序执行另一个程序的正常方式。典型的方法是使用
fork
exec
调用。这让Linux能够处理启动程序的技术问题。

几乎不可能执行到任意内存映像中。 ELF文件必须在进程地址空间中以特定的方式进行MMA,几乎不能作为基础文件的连续映像

我能想到的最可行的方法是将图像保存到一个(可能没有名字)文件中,并通过
execveat(fd,“,…)
执行该文件。在他们谈论空路径名的地方检查execveat(2),并在O_TMPFILE上打开(2)

一个命名的临时文件和一个常规的execve(2)也可以工作,只要close/munmap和execve之间在文件可能被更改时的间隙不是问题


另一个想法是完全在用户空间中加载ELF,为新进程设置适当的地址空间,调用LD等等。绝对不容易。不需要任何execve(2)调用,只需要fork并从那里开始工作。由于不使用execve(2),某些事情,如O_CLOEXEC处理和取消积累额外内存,将需要非常简单的解决方法。

执行到任意内存映像几乎是不可能的。 ELF文件必须在进程地址空间中以特定的方式进行MMA,几乎不能作为基础文件的连续映像

我能想到的最可行的方法是将图像保存到一个(可能没有名字)文件中,并通过
execveat(fd,“,…)
执行该文件。在他们谈论空路径名的地方检查execveat(2),并在O_TMPFILE上打开(2)

一个命名的临时文件和一个常规的execve(2)也可以工作,只要close/munmap和execve之间在文件可能被更改时的间隙不是问题


另一个想法是完全在用户空间中加载ELF,为新进程设置适当的地址空间,调用LD等等。绝对不容易。不需要任何execve(2)调用,只需要fork并从那里开始工作。由于不使用Exeve(2),某些事情,如O_CLOEXEC处理和取消mmaping额外内存,将需要非常简单的解决方法。

您应该在问题中展示您的代码,而不仅仅是询问示例。您是否有具有执行权限的页面?您试图运行的“某个二进制文件”的代码是什么?当您尝试运行它时会发生什么?没什么,塞格?请添加更多细节。是否有必要这样做?从另一个进程启动程序的正常方法是使用exec()系列的函数之一……如果您试图编写一个包含“插件”的程序,C库已经介绍过:将插件构建为共享对象而不是可执行文件,然后使用加载和调用它们。如果您试图动态生成机器代码并执行它(一个“即时”编译器或类似的编译器),那么您很可能是在运行错误的代码;您必须将代码写入内存,然后使用使其可执行。C库对此没有帮助。如果你想手工编写自己的可执行加载程序,你需要阅读“.”这是一个ent