初始断点位于何处?

时间:2018-02-12 22:39:29

标签: windows debugging

我正在编写一个简单的调试器用于学习目的。我需要知道Windows设置的初始断点位于何处才能正确处理它。从rm CMakeCache.txt cmake ./ 读取应该位于函数DbgBreakPoint()的某处,但该函数解析为地址ntdll.dll,并且从我的测试开始,初始断点始终在地址0x77ab0a60处上升。这是一个函数还是只是一个0x77aedbcf指令的随机地址?如果我没有弄错,INT 3总是被加载到同一个地址,如果是这样,程序总是会在这个确切的地址中断,或者是否有变化?

1 个答案:

答案 0 :(得分:3)

用户模式下的

进程从LdrInitializeThunk开始执行,并调用LdrpInitializeProcess。这个例程,在加载所有静态依赖项之后但在调用它初始化例程之前 - 检查调试器是否存在(BeingDebugged成员PEB),如果是,则调用LdrpDoDebuggerBreak存在int 3指令。如果wow64进程LdrpDoDebuggerBreak将被调用2次 - 从64位和32位dll。结果,64位调试器得到了2个断点 - STATUS_BREAKPOINTSTATUS_WX86_BREAKPOINT

如何处理 - 已经调试者必须自己选择。交互式调试器只是停在这里。另一个调试工具,通常只需跳过(处理)第一个 STATUS_BREAKPOINT(以及STATUS_WX86_BREAKPOINT)返回DBG_CONTINUE