2013-05-18 136 views
3

问题:运行代码

运行存储在另一C程序作为汇编指令的堆或数据部分中的非平凡的C程序。

我的进步:

冉一组打印的东西到stdout简单的指令。指令存储在堆中,我允许包含指令的页面被执行,然后调用原始数据,就像它是一个函数一样。这工作得很好。

接下来,我想给出任何静态链接的C程序,只是看它的二进制文件,并能够运行它的主要功能,而它在从其他C程序存储器。

我相信问题是: *跳跃到的主要功能代码 *改变其被链接时,使它们相对于创建的二进制文件的地址,现在的代码就在于在内存

请让我知道我的方法是好的还是我错过了一些重要的事情,以及最好的方式是什么。

谢谢

+2

的问题正是你所列举的那些。第一个叫做“跳入入口”,第二个叫“重新定位”。您可能需要查阅操作系统的二进制加载器的源代码。 – 2013-05-18 19:50:04

+0

如果你已经有了静态链接的其他程序,你不能只使用'exec'吗? –

+0

是的,你错过了一些东西:考虑到在其他编程语言中,你将执行基本相同的步骤,而对于其他操作系统,这些步骤将会改变。你现在可以看到这个问题与C很少有关系,几乎与你的实现有关吗?你可能想找出什么“实施”的意思,顺便...... – Sebivor

回答

1

现代操作系统尽量不要让你在你的数据执行代码正是因为它是一个安全噩梦。 http://en.wikipedia.org/wiki/No-execute_bit

即使你已经过去了,也会有更多'陷阱',因为两个程序都会认为他们'拥有'堆栈/堆等。一旦新程序执行完毕,旧程序中的各种内存将被禁用。 (exec存在只是为了这个原因,干净地从一个程序转到另一个。)

如果你真的需要加载代码,你应该做的第一个库,然后使用dlopen运行它。 (您可以使用objcopy提取你想要的子程序,并把它变成一个库)。

或者,你可以启动程序(在另一个进程),并使用strace注入代码的一点点到他们的过程来控制它。

(如果你真的想进入shell代码,你应该这么说的。这是蠕虫的一个整体“诺特尔即可。)

+1

你错过了“我允许执行包含指令的页面”的问题的一部分。 – 2013-05-18 20:26:23

+0

哎呀,你是对的,我错过了。您仍然需要手动重新链接。让objcopy和dlopen为你做这件事会更容易。 – BraveNewCurrency