调试器:软件断点

4

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

我读到程序的文本(/代码)段是只读的(如果这个段不需要是只读的,那么什么阻止代码修改自己的指令,自修改代码)。我的问题是,当它是只读的时,调试器如何修改指令。我是否漏掉了什么。对此的任何评论或指向理论的指针都将不胜感激。

谢谢。


1
有一些调试器可以在调试期间修改代码,例如Visual Studio。我猜测你修改的不是指令本身,而是这些指令所引用的值。 - user1877337
1个回答

2
在Windows桌面和服务器平台上,可以使用kernel32.dll导出的VirtualProtect函数更改内存页面保护。例如,如果调试器想要在某个地址写入0xcc,但该地址位于标记为只读的页面中,则调试器可以将该页面的保护设置为读写(假设它具有足够的特权),然后再写入该值。
这样做的一个副作用是会导致该页面的写时复制(COW)故障,现在debugee进程将拥有其自己的物理页面副本。这可以防止断点在共享该物理页面的所有进程中被设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接