首页
社区
课程
招聘
[求助]运用DEBUG_EVENT调试程序断点出现断点事件无返回
发表于: 2012-5-28 13:55 3099

[求助]运用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,并保存,以备程序返回
代码如下:
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直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//