在运行时更改代码
我有一个指向函数的指针(从 vtable 获取),我想通过在运行时更改汇编代码(更改几个字节)来编辑该函数。我尝试使用 memset 并尝试直接分配新值(例如 mPtr[0] = X、mPtr[1] = Y 等),但我不断遇到分段错误。 我怎样才能更改代码?
(我使用的是C++)
操作系统是windows。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
一般来说:如果内存是通过 API 调用 VirtualAlloc 分配的,那么您可以通过 API 调用更改内存属性 VirtualProtect。
使用 API 调用 VirtualQuery 检查第一个内存属性
In generally: if memory is allocated with API call VirtualAlloc than you can change the memory attributes with API call VirtualProtect.
Check first memory attributes with API call VirtualQuery
根据操作系统和/或体系结构,您可能会也可能不会写入可执行页面。
检查 Intel (IA-32e) 手册中有关将页面标记为可执行或只读的文档。该代码可能位于只读部分,因此您不能写入它。
您可以将代码标记为不驻留在只读页面中,但它是特定于编译器的(JIT 编译器执行此操作)。
在 MSVC 下,您可以使用 #pragma 部分 创建读取-编写部分并使用 #pragma alloc_text 将函数放入其中。
Depending on Operating System and/or architecture you may or may not write to executable pages.
Check documentation about marking pages as executable or read-only in the Intel (IA-32e) manuals. The code may be located in a read only section, therefore, you may not write to it.
You may mark the code not to reside in read only pages, but it's compiler specific (JIT compilers do this).
Under MSVC, you can use the #pragma section to create a read-write section and use #pragma alloc_text to put functions in it.
一般来说,您正在尝试写入代码段,而新操作系统会阻止您这样做。这就是某些病毒的工作方式。
有一些 API 可以消除这种保护,但它们依赖于操作系统。
In general, you are trying to write to the code segment, something new operating systems will prevent you to do. This is the way some viruses worked.
There are APIs to remove that protection, but they are operating system dependent.
代码所在的内存部分通常标记为只读。这就是分段失败的原因。您可以尝试通过编译器的特殊键(不确定)或修改二进制文件(同样,不是 100% 可能)从部分中删除此标志
Memory sections where your code reside are usually marked as readonly. That's why you get segmentation failure. You can try to remove this flag from section by either special keys for compiler (not sure about that) or by modifying binary file (again, not 100% that it is possible)