使用gcc修改内存中的下一条指令

时间:2014-12-15 13:17:54

标签: c gcc assembly instructions

我希望在取出之前修改下一条指令,最好回答" How to modify return address on Stack in C or Assembly"在foo函数中,*p指向main函数中的下一条指令。我想修改*p指向的内容。例如,我想将下一条指令更改为跳转指令。我该怎么做?

void foo()
{
    void** p = search((void**)&p, __builtin_return_address(0));
    // modify content of where *p points at.
}

int main()
{

    foo();
    //next instruction. *p points here
    return 0;
}

我想在intel Core-i7 3632QM处理器上使用gcc编译器。

2 个答案:

答案 0 :(得分:3)

  

例如,我想将下一条指令更改为跳转指令。我该怎么做?

在具有现代操作系统的桌面系统上,除非正在执行的程序已经注意将代码保存在read-write memory pages中,否则不能。默认情况下,代码加载到只读存储器页面中。

答案 1 :(得分:2)

只是一个想法。正如在评论中已经提到的那样执行 [通常]不能在相同的内存范围上设置。但是任何POSIX系统都应该具有动态链接器(dlopen()dlclose(),...)的接口。因此,有一种方法可以在运行时修改进程内存布局,动态链接器使用它。

如果修改动态链接器或使用相同的接口是可接受的选项,则可以转储内存段(或将其复制到另一个范围),修改,释放原始段并将修改后的段加载到相同的范围内