c - 运行内存中存储的代码

标签 c assembly memory heap-memory

问题:

将存储在另一个 C 程序的堆或数据部分中的重要 C 程序作为 asm 指令运行。

我的进步:

运行一组简单的指令,将某些内容打印到标准输出。这些指令存储在堆上,我允许执行包含指令的页面,然后调用原始数据,就好像它是一个函数一样。这工作得很好。

接下来,我想要给定任何静态链接的 C 程序,只读取它的二进制文件,并能够在另一个 C 程序位于内存中时运行它的主函数。

我认为问题是: * 跳转到main函数代码所在的地方 * 更改链接时创建的二进制文件的地址,以便它们相对于代码现在在内存中的位置

请告诉我我的方法是否好,或者我是否错过了一些重要的事情,以及最好的方法是什么。

谢谢

最佳答案

现代操作系统尽量不让您在数据中执行代码,因为这是一场安全噩梦。 http://en.wikipedia.org/wiki/No-execute_bit

即使你克服了这一点,也会有更多的“陷阱”,因为两个程序都会认为它们“拥有”堆栈/堆/等。一旦新程序执行,旧程序中的各个 RAM 位将被占用。 (exec 正是出于这个原因而存在,以便干净地从一个程序转到另一个程序。)

如果您确实需要加载代码,则应该将第一个代码设为库,然后使用dlopen来运行它。 (您可以使用 objcopy 来提取所需的子例程并将其转换为库。)

或者,您可以启动程序(在另一个进程中)并使用 strace 将一些代码注入(inject)到他们的进程中以控制它。

(如果你真的想进入 shell 代码,你应该这么说。这完全是“另一种蠕虫病毒。”

关于c - 运行内存中存储的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628323/

相关文章:

c++ - 用于调试的未初始化内存的常见值是什么?

linux - 如何知道 linux/proc 中的进程工作集大小

multithreading - Perl线程缓慢消耗内存

python - 并行 Python-C++ 程序卡住(内存?)

将以下 SWITCH 语句转换为 IF...ELSE 语句

C - 从函数返回数组

c - 通过向后遍历链表树结构获取路径

c++ - 具有求和界限的重复排列

gcc - 无法修改数据段寄存器。尝试时抛出一般保护错误

assembly - ascii vs asciz vs 气体字符串