gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:44:15 28 4
gpt4 key购买 nike

问题:

将存储在另一个 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com