我正在编写一个简单的调试器用于学习目的。我需要知道Windows设置的初始断点位于何处才能正确处理它。从rm CMakeCache.txt
cmake ./
读取应该位于函数DbgBreakPoint()
的某处,但该函数解析为地址ntdll.dll
,并且从我的测试开始,初始断点始终在地址0x77ab0a60
处上升。这是一个函数还是只是一个0x77aedbcf
指令的随机地址?如果我没有弄错,INT 3
总是被加载到同一个地址,如果是这样,程序总是会在这个确切的地址中断,或者是否有变化?
答案 0 :(得分:3)
进程从LdrInitializeThunk
开始执行,并调用LdrpInitializeProcess
。这个例程,在加载所有静态依赖项之后但在调用它初始化例程之前 - 检查调试器是否存在(BeingDebugged
成员PEB
),如果是,则调用LdrpDoDebuggerBreak
存在int 3
指令。如果wow64进程LdrpDoDebuggerBreak
将被调用2次 - 从64位和32位dll。结果,64位调试器得到了2个断点 - STATUS_BREAKPOINT
和STATUS_WX86_BREAKPOINT
。
如何处理 - 已经调试者必须自己选择。交互式调试器只是停在这里。另一个调试工具,通常只需跳过(处理)第一个 STATUS_BREAKPOINT
(以及STATUS_WX86_BREAKPOINT
)返回DBG_CONTINUE