Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在运行时更改代码_C++_Assembly_Runtime - Fatal编程技术网

C++ 在运行时更改代码

C++ 在运行时更改代码,c++,assembly,runtime,C++,Assembly,Runtime,我有一个指向函数的指针(从vtable中获取),我想通过在运行时更改汇编代码(更改几个字节)来编辑函数。我尝试使用memset,也尝试直接分配新值(如mPtr[0]=X,mPtr[1]=Y等),但我总是遇到分段错误。 如何更改代码 (我正在使用C++) 操作系统是windows 根据操作系统和/或体系结构的不同,您可以写入或不写入可执行页面 查看英特尔(IA-32e)手册中有关将页面标记为可执行或只读的文档。代码可能位于只读节中,因此,您可能无法对其进行写入 您可以将代码标记为不驻留在只读页中,

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

(我正在使用C++)


操作系统是windows

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

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

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


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

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

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


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

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

为什么要这样做?当然,唯一的原因是减少工作内存量,因为您可以从光盘加载代码段。如果你解释一下你想做什么,也许我们能帮上忙。自我修改代码很难。这个操作系统完全是用汇编语言编写的,因为没有一种中级语言的语法允许自修改代码:。自修改代码在60年代很流行(特别是在俄罗斯,他们制作了非常出色的编译器,生成了自修改代码)。但是这种开发风格在70年代早期基本上被放弃了,因为(没有编译器的帮助)编写起来很困难,调试起来几乎是不可能的。因此,现代操作系统现在明确地防止自修改代码(借助硬件),就像在现代语言中一样,它(自修改代码)通常是由于编码错误或恶意代码造成的。谢谢,这正是我想要的