访问内存上的代码空间?

时间:2010-10-12 17:32:25

标签: c++ c

是否有可能,但我猜这个内存是只读的。我尝试了类似的东西

void (*b)();

b = *test;

char * z = (char * )b;

当我打印z的内容时,它会从测试函数中打印常量。

但是该内存是只读的,当我编辑它们并调用test时,我会得到段错误。我试过这个。

char x[100];

for(i=0; i<100; i++) x[i] = z[i];

b = (void(*)())x;

b();

再次发生段错误。

我知道这有点愚蠢,但是有办法做到这一点吗?我认为有一种方法可以将代码内存更改为读/写,但我真正需要的是能够通过网络发送功能并使远程机器运行它们。

编辑:这不是恶意使用。我试图创建一个可以在它们之间共享代码部分并在同一输入的不同部分上并行运行程序的网络

4 个答案:

答案 0 :(得分:1)

修改可执行代码的能力(在执行期间)取决于操作系统,并且所有操作系统在此级别上都不同。有些需要高级别的保护(* nix),而其他可能需要ROM(嵌入式系统)中的代码。

在远程计算机上执行代码也不是标准的。您将不得不调查操作系统并找出如何执行此操作。我知道Unix操作系统允许在远程Unix机器上执行程序。

发布有关您要完成的内容的更多详细信息,以便我们为您提供更好的帮助。

答案 1 :(得分:1)

可以将代码写入内存然后执行它。 Java和.NET的JIT编译器会定期执行此操作。

Wikipedia has some background information here

就发送代码并远程执行代码而言,您需要远程机器的帮助(它应该被设计为接收代码,将其放入内存,然后运行它,当然受到适当的安全保护)。 / p>

答案 2 :(得分:0)

通常,函数存储在只读存储器部分内(在ELF系统上,这是ELF文件中的.text部分;几乎总是以mmap的形式进行只读)。并且只要该函数不是PIC(位置独立代码,如在UNIX共享库中),您就无法复制和执行它(或者如果可以的话,那么纯粹的机会)。

答案 3 :(得分:0)

您正在寻找编写加载程序的能力。

目标架构/主机将确定其易用性。

例如,如果您发送Lisp,它只是字符串,然后是评估它们的命令。 OTOH,如果你使用Windows 7和托管C#代码这样做,这可能是一个真正的悲痛。

从技术上讲,是的,这对冯·诺依曼架构来说是非常可行的。这也是一个安全漏洞。