Debugging 调试器:软断点

Debugging 调试器:软断点,debugging,breakpoints,Debugging,Breakpoints,我目前正在学习调试器。我读到调试器有软件断点(这些是最常用的断点)。它们通过将操作码的第一个字节替换为Int 3(操作码0xcc)来工作 我已经读到一个程序的文本(/code)段是只读的(如果这个段不需要是只读的,那么停止代码修改它自己的指令就是自修改代码)。我的问题是,当指令为只读时,调试器如何修改它。我是不是遗漏了什么。对这一点的任何评论或对这一点的理论指点都将不胜感激 谢谢。在Windows桌面和服务器平台上,可以使用kernel32.dll导出的VirtualProtect函数更改内存页

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

我已经读到一个程序的文本(/code)段是只读的(如果这个段不需要是只读的,那么停止代码修改它自己的指令就是自修改代码)。我的问题是,当指令为只读时,调试器如何修改它。我是不是遗漏了什么。对这一点的任何评论或对这一点的理论指点都将不胜感激


谢谢。

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


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

有些调试器能够在调试期间修改代码。例如VisualStudio。我怀疑您不是在修改指令,而是在修改这些指令引用的值