首页
社区
课程
招聘
[求助]关于调试原理,遇到问题求教。
发表于: 2012-6-18 21:50 5270

[求助]关于调试原理,遇到问题求教。

2012-6-18 21:50
5270
附加调试:
r3 调试器通过DebugActiveProcess 调试进程,NtDebugActiveProcess 返回成功后 调用DebugBreakProcess创建远程线程在被调试进程创造一个int 3 断点,这时候调试器会断下。

(不是针对游戏,没有任何杀毒软件,等等)
自己实现调试时,r3 DebugActiveProcess  后 调用DebugBreakProcess创建远程线 会造成被调试进程和调试进程全部卡死.
windbg 跟踪发现,当创建新线程,也就是 DebugBreakProcess 创建的线程,通过DbgkCreateThread发送 DbgkpSendApiMessage 线程创建消息后,执行到DbgkpQueueMessage 会卡死在下面
KeWaitForSingleObject(&DebugEvent->ContinueEvent,
                                  Executive,
                                  KernelMode,
                                  FALSE,
                                  NULL);  

搜索了一下,DebugEvent->ContinueEvent 被设置后,只有调用 DebugContinue 后才会重新设置。

问题就在这里, r3 调用DebugBreakProcess 后函数还没有返回,调试器还没有进入事件循环,导致DebugEvent->ContinueEvent 一直不被重置,进程卡死。

DebugBreakProcess 里面只是创建一个线程,应该立即返回的,怎么会导致卡死,请指教。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
还需要循环接收调试信息
2012-6-19 01:40
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
3
正常流程是这样:
调用DebugActiveProcess后,目标进程中的所有线程会被冻结(包括DebugBreakProcess创建的远线程)

,然后系统构造各种杜撰调试事件(线程创建,模块加载等)并传递给调试器,等待WaitForDebugEvent 和 DebugContinue 处理,处理完毕杜撰调试事件以后,系统恢复目标程序的所有线程,此时将引发int3断点异常,使得调试器正常捕获对目标的控制。

LZ在调用DebugActiveProcess以后,没有接收系统的杜撰调试事件,直接调用DebugBreakProcess,此时目标进程仍然是冻结状态。可见,是连接再次在冻结状态下调用DebugBreakProcess了。第一次是DebugActiveProcess调用的,第二次是LZ调用的,并且LZ调用的那次DebugBreakProcess没有返回。正是由于它的没有返回导致死锁了。

很显然,关键问题是为何在冻结状态下为啥二次调用DebugBreakProcess不返回。由于还没有实验依据,只能猜测了。可能是实现DebugBreakProcess时有事件同步,也可能是系统在处理“向冻结进程中创建远线程”的时候内部有一些同步机制等。只是猜测,有待实验验证哈。
2012-6-19 02:53
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
DebugActiveProcess即断下。
不必要再执行DebugBreakProcess。
2012-6-19 06:23
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
5
多谢楼上各位回复

问题在于应该hook DbgkCreateThread  发送线程创建消息
而我是注册了一个线程创建回调函数,到达回调时,线程已经结束
2012-6-19 13:08
0
游客
登录 | 注册 方可回帖
返回
//