标题: 在初始化断点处无法设置硬件断点的原因 https://scz.617.cn/windows/201801221523.txt 硬件断点(ba)利用了DR*调试寄存器。 假设已经"rm 0x2a"允许显示调试寄存器。ba设置硬件断点,r查看寄存器,DR*寄存 器看上去并未发生变化,必须t/p/g之后CONTEXT显示才会同步。 (d18.e00): Break instruction exception - code 80000003 (first chance) ntdll!LdrpDoDebuggerBreak+0x30: 00007ffd`f4d22e9c cc int 3 0:000> ba e1 /1 $exentry ^ Unable to set breakpoint error The system resets thread contexts after the process breakpoint so hardware breakpoints cannot be set. Go to the executable's entry point and set it then. 初始化断点命中后,先干点别的事,然后流程到达ZwContinue。这个函数会切换 CONTEXT,必然导致DR*寄存器被修改。严格说起来,在ibp处不是不能设硬件断点, 而是设了之后,很快就会被破坏。为了避免将来的这种破坏引起误会,windbg干脆禁 止在ibp处使用ba设置硬件断点。它的提示说是到了$exentry之后就可以设硬件断点, 其实只要离开了ibp,windbg就不管了(也没法管);比如流程到达 ntdll!RtlUserThreadStart,此时完全可以"ba e1 /1 $exentry"。 windbg的这个限制只针对ibp,在任何其他位置均可使用ba,至于将来会否生效、会 否被破坏,windbg不管,完全取决于调试者对流程的理解。 反调试手段之一就是拦截ZwContinue,修改DR*、TF等。