2

我想在获取之前修改下一条指令,在 foo 函数中这篇文章*p的最佳答案中,指向主函数中的下一条指令。我想修改 where*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 编译器来执行此操作。

4

2 回答 2

5

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

在具有现代操作系统的桌面系统上,您不能,除非正在执行的程序已经注意将代码保存在读写内存页中。默认情况下,代码加载到只读内存页中。

于 2014-12-15T13:34:04.603 回答
3

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

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

于 2014-12-15T14:10:45.467 回答