在运行时更改代码

时间:2010-03-29 09:57:54

标签: c++ assembly runtime

我有一个指向函数的指针(我从vtable获取),我想通过在运行时更改汇编代码(更改几个字节)来编辑函数。我尝试使用memset并尝试直接分配新值(类似于mPtr [0] = X,mPtr [1] = Y等)但我不断得到分段错误。 我该如何更改代码?

(我正在使用C ++)

操作系统是Windows。

4 个答案:

答案 0 :(得分:6)

通常:如果使用API​​调用VirtualAlloc分配内存,则可以使用API​​调用VirtualProtect更改内存属性。 使用API​​调用VirtualQuery

检查第一个内存属性

答案 1 :(得分:3)

根据操作系统和/或体系结构,您可能会或可能不会写入可执行页面。

检查有关在英特尔(IA-32e)手册中将页面标记为可执行或只读的文档。代码可能位于只读部分,因此,您可能无法写入代码。

您可以将代码标记为不驻留在只读页面中,但它是特定于编译器的(JIT编译器执行此操作)。

在MSVC下,您可以使用#pragma section创建一个读写部分,并使用#pragma alloc_text将函数放入其中。

答案 2 :(得分:0)

通常,您正在尝试写入代码段,新的操作系统会阻止您执行此操作。这是一些病毒的工作方式。

有一些API可以删除该保护,但它们依赖于操作系统。

答案 3 :(得分:-1)

代码所在的内存部分通常标记为只读。这就是你得分段失败的原因。您可以尝试通过编译器的特殊键(不确定)或通过修改二进制文件(再次,不是100%可能)来从节中删除此标志。