在运行时更改代码

发布于 2024-08-26 12:56:21 字数 178 浏览 7 评论 0 原文

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

(我使用的是C++)

操作系统是windows。

I have a pointer to a function (which i get from a vtable) and I want to edit the function by changing the assembler code (changing a few bytes) at runtime. I tried using memset and also tried assigning the new value directly (something like mPtr[0] = X, mPtr[1] = Y etc.) but I keep getting segmentation fault.
How can I change the code?

(I'm using C++)

OS is windows.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不必了 2024-09-02 12:56:21

一般来说:如果内存是通过 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

枫林﹌晚霞¤ 2024-09-02 12:56:21

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

检查 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.

时光礼记 2024-09-02 12:56:21

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

有一些 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.

猫七 2024-09-02 12:56:21

代码所在的内存部分通常标记为只读。这就是分段失败的原因。您可以尝试通过编译器的特殊键(不确定)或修改二进制文件(同样,不是 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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文