-
-
[求助]运用DEBUG_EVENT调试程序断点出现断点事件无返回
-
发表于: 2012-5-28 13:55 3099
-
这几天学习Iczelion关于Win32调试API的内容,自己编了个程序来控制HookProgram_Change.exe程序跳转到我指定的位置运行后返回
HookProgram_Change.exe只是一个简单的窗口程序,我在其00401447添加了我的代码
mov eax, 403000
mov eax, [eax]
INT3 ;程序运行后到这里中断
然后在“Debug”程序中附加HookProgram_Change.exe,进入循环等待调试事件
当发生“CREATE_PROCESS_DEBUG_EVENT”事件,即调试进程已经被暂停运行后,调用GetThreadContext函数获取调试进程的Eip,Eax,并保存,以备程序返回
代码如下:
然后再检测“EXCEPTION_BREAKPOINT”事件,即检测是否有断点产生,由于调试程序被附加后会自动产生第一个断点,所以第一次检测到有断点产生时不予处理,检测到第2个断点后说明程序以运行到我在调试程序中设置的INT3断点位置,这时将调试程序的Eip和Eax恢复,退出程序调试
代码如下:
程序运行后,点击调试,第一次产生断点后得到调试程序的运行地址“401440”,即我修改的位置,但此后未反应,经观察发现调试程序运行到我设置的INT3断点后程序就停止运行,并未立即向Debug程序发送中断事件,必须将鼠标移到“HookProgram_Change.exe”程序上,或者用“Alt + Tab”切换到“HookProgram_Change.exe”程序上才会显示第二次断点,而在程序中发送鼠标按键消息或其他消息都无反应,原因不明,不知要如何修改程序才能达到不需要将鼠标移到HookProgram_Change.exe”程序上才能产生第二次断点事件,求高手帮忙
附程序源代码及调试程序:
Debug.zip
HookProgram_Change.exe只是一个简单的窗口程序,我在其00401447添加了我的代码
mov eax, 403000
mov eax, [eax]
INT3 ;程序运行后到这里中断
然后在“Debug”程序中附加HookProgram_Change.exe,进入循环等待调试事件
当发生“CREATE_PROCESS_DEBUG_EVENT”事件,即调试进程已经被暂停运行后,调用GetThreadContext函数获取调试进程的Eip,Eax,并保存,以备程序返回
代码如下:
mov strContext.ContextFlags, CONTEXT_FULL invoke GetThreadContext, strDebugEvent.u.CreateProcessInfo.hThread, addr strContext push strContext.regEip ;保存eip和eax,在调试返回后恢复 pop regSaveEip push strContext.regEax pop regSaveEax mov eax, RunMemAddr ;要运行的内存地址 mov strContext.regEip, eax invoke SetThreadContext, strDebugEvent.u.CreateProcessInfo.hThread, addr strContext mov eax, strDebugEvent.u.CreateProcessInfo.hThread ;保存调试程序主线程句柄 mov hDebugThread, eax mov ProcessBreakNum, 1 invoke VK_MsgBox, addr szCreateProcess
然后再检测“EXCEPTION_BREAKPOINT”事件,即检测是否有断点产生,由于调试程序被附加后会自动产生第一个断点,所以第一次检测到有断点产生时不予处理,检测到第2个断点后说明程序以运行到我在调试程序中设置的INT3断点位置,这时将调试程序的Eip和Eax恢复,退出程序调试
代码如下:
.if strDebugEvent.u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT ;当遇到断点后恢复eip和eax,并继续运行程序 mov strContext.ContextFlags, CONTEXT_FULL invoke VK_MsgBox, addr szBreakPoint invoke GetThreadContext, hDebugThread, addr strContext ;显示Eip invoke VK_DwordToHex, strContext.regEip, addr szKeyMsg invoke VK_MsgBox, addr szKeyMsg .if ProcessBreakNum == 2 ;当得到第二个断点事件时说明我们修改的代码已运行到INT3 mov eax, regSaveEip ;恢复eip和eax mov strContext.regEip, eax mov eax, regSaveEax mov strContext.regEax, eax invoke SetThreadContext, hDebugThread, addr strContext invoke ContinueDebugEvent, strDebugEvent.dwProcessId, strDebugEvent.dwThreadId, DBG_CONTINUE invoke DebugActiveProcessStop, strDebugEvent.dwProcessId ;退出调试 .if eax !=0 invoke VK_MsgBox, addr szDebugExit .break .endif .endif inc ProcessBreakNum .endif
程序运行后,点击调试,第一次产生断点后得到调试程序的运行地址“401440”,即我修改的位置,但此后未反应,经观察发现调试程序运行到我设置的INT3断点后程序就停止运行,并未立即向Debug程序发送中断事件,必须将鼠标移到“HookProgram_Change.exe”程序上,或者用“Alt + Tab”切换到“HookProgram_Change.exe”程序上才会显示第二次断点,而在程序中发送鼠标按键消息或其他消息都无反应,原因不明,不知要如何修改程序才能达到不需要将鼠标移到HookProgram_Change.exe”程序上才能产生第二次断点事件,求高手帮忙
附程序源代码及调试程序:
Debug.zip
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
看原图
赞赏
雪币:
留言: