调试器:软断点

时间:2012-12-06 15:40:30

标签: debugging breakpoints

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

我已经读过程序的文本(/代码)段是只读的(如果不需要读取这段代码来停止代码修改自己的指令,那么自修改代码)。我的问题是调试器如何在只读时修改指令。我在这里错过了一些东西。对此有任何意见或对此理论的指示表示赞赏。

感谢。

1 个答案:

答案 0 :(得分:1)

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

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