2010-03-29 95 views
8

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

(我正在使用C++)

OS是windows。

+1

哪个操作系统? – elcuco 2010-03-29 10:01:57

+1

你为什么试图这样做?当然,唯一的原因是减少工作内存的数量,因为您可以从光盘加载部分代码。如果你解释你正在尝试做什么,也许我们可以提供帮助。 – thecoshman 2010-03-29 10:06:56

+0

自修改代码很难。这个操作系统是完全编写的,因为没有中级语言的语法允许自修改代码:http://valerieaurora.org/synthesis/SynthesisOS/abs.html。 – 2010-03-29 10:13:55

回答

6

通常情况下:如果内存分配了API调用VirtualAlloc,则可以使用API​​调用VirtualProtect更改内存属性。 用API调用检查第一个内存属性VirtualQuery

+0

谢谢,这正是我正在寻找的 – polo 2010-03-29 12:30:11

3

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

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

您可能会将代码标记为不驻留在只读页中,但它是编译器特定的(JIT编译器会这样做)。

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

-1

您的代码驻留的内存部分通常标记为只读。这就是为什么你分段失败。您可以尝试通过编译器的特殊键(不确定)或通过修改二进制文件(再次,并非100%可能)来从该部分删除该标志。

0

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

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