4

我目前正在研究调试器。我读过调试器有软件断点(显然这些是最常用的断点)。这些通过将操作码的第一个字节替换为 Int 3(操作码 0xcc)来工作。

我已经读过程序的文本(/code)段是只读的(如果这个段不需要只读的话,就是停止代码修改自己的指令,自我修改代码)。我的问题是调试器如何修改只读指令。我在这里错过了什么吗。对此的任何评论或对此理论的指针表示赞赏。

谢谢。

4

1 回答 1

2

在 Windows 桌面和服务器平台上,可以使用 kernel32.dll 导出的 VirtualProtect 函数更改内存页面保护。因此,例如,如果调试器想要在某个地址写入 0xcc,但该地址位于标记为只读的页面中,则调试器可以将该页面的保护设置为读写(假设它具有足够的权限),然后写入价值。

这样做的副作用是它会导致该内存页面的写时复制 (COW) 错误,现在被调试进程将拥有它自己的页面物理副本。这可以防止在共享该物理页面的所有进程中设置断点。

于 2012-12-07T14:47:10.193 回答