2012-12-06 74 views
2

我目前就读调试器。我读过的调试器具有软件断点(apparently这些是最常用的断点)。这些工作通过INT 3(操作码的0xCC)替换操作码的第一个字节。调试器:软断点

我读过一个程序的文本(/代码)段是只读的(如果这部分不必只读什么是停止代码来修改自己的指令,自修改代码)。我的问题是调试器在只读时如何修改指令。我在这里错过了什么。对此的任何评论或对此理论的指向都会受到赞赏。

谢谢。

+1

有一些调试器,其能够在调试期间修改代码。例如Visual Studio。我会怀疑你没有修改指令,但是这些指令所引用的值 – 2012-12-06 15:43:54

回答

1

在Windows台式机和服务器平台上,内存页面保护可以通过由kernel32.dll导出的函数VirtualProtect的改变。因此,例如,如果调试器想要在某个地址写入0xcc,但该地址驻留在标记为只读的页面中,那么调试器可以将该页面的保护设置为读写(假设它具有足够的权限),然后写入值。

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