首页
社区
课程
招聘
[讨论]OD附加DXF卡住
发表于: 2015-5-7 15:44 8122

[讨论]OD附加DXF卡住

2015-5-7 15:44
8122
OD附加DXF的时候,在OD下面显示一系列的XXX线程创建成功,然后看起来就什么都不做了,OD也没卡死,模块信息也不显示,汇编窗口和数据窗口都是空白

   OD附加已运行进程调用DebugActiveProcess函数,该函数调用到DbgUiDebugActiveProcess,转到内核NtDebugActiveProcess

   NtDebugActiveProcess调用DbgkpPostFakeProcessCreateMessages,该函数调用DbgkpPostFakeThreadMessages和DbgkpPostFakeModuleMessages用来向调试对象发送杜撰的消息

  windbg !process 0 0,显示有2个DXF进程,OD看得见的那个DXF进程,PEB ->Ldr字段为NULL,DbgkpPostFakeModuleMessages需要Ldr,用来遍历已加载模块,为NULL的话,就遍历不到模块,OD就不到调试信息

  看了DbgkpPostFakeModuleMessages相关代码,发现Ldr为空,它依然执行,但是取地址+偏移后,会有内存访问异常,它的__try()__exception(这里为空,什么都没做),即便这样,它的返回状态还是STATUS_SUCCESS

  自己创建了一个进程,将该进程PEB结构的Ldr字段改为NULL,该进程就卡死了,为什么DXF的不卡死呢,还是说windbg读取它的peb -> Ldr字段时,驱动保护做了修改?

  windbg !process 0 0 发现各有几个进程是相同的PEB地址,windbg的PEB和另一个DXF的PEB值是一样的.......

刚学驱动,软件调试,小白一个,不嫌弃的话,加我QQ1612095567

做了个实验,当OD附加记事本程序,调用DebugActiveProcess,函数执行完ZwDebugActiveProcess,人为的跳到DebugActiveProcess尾部,不执行DbgUiIssueRemoteBreakin 这个函数,发现OD的表现和附加DXF的表现一样,下面只显示了一系列线程创建消息,不显示模块加载的信息,OD汇编窗口和数据窗口一片空白,ALT+C显示模块窗口,里面也是一片空白

是不是因为没有产生断点异常,所以才会什么都空白呢.

CPU执行到int3,然后从IDT表里调用KiTrap03,该例程将一些和异常相关的信息传递给CommonDispatchException,后者分配一个EXCEPTION_RECORD结构,并填写好后,调用KiDispatchException将异常发给调试器,后者调用DbgkForwardException......现在,就是因为没有异常,所以OD接受不到这些信息,然后汇编窗口和数据窗口都空白的原因吗??

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 70
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
你说的卡死是进程卡死,还是整个系统都卡死了
2015-5-7 16:09
0
雪    币: 995
活跃值: (669)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
。。。点击图标T 右键选中一个线程点击 Resume All Threads 就不卡了
2015-5-7 23:34
1
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我表达的不够准确吧,是OD进入不了接受调试事件循环.正常情况是下面显示完线程创建信息,然后显示模块加载信息,最后一个远程线程调用int3,OD接受到断点异常信息,然后暂停,汇编区域显示执行int3的线程代码
我附加的情况就是OD只显示了线程创建信息,然后什么都不做了
2015-5-8 08:34
0
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个我点了,恢复所有线程运行后,DXF就退出了
2015-5-8 08:35
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
VAD?????
2015-5-8 10:38
0
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
......VAD是什么?
2015-5-8 14:12
0
雪    币: 70
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
你是不是debugport清零没解决啊,压根收不到调试信息
2015-5-8 19:25
0
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
HOOK了原内核的相关debugport的函数到新内核,然后修改了debugport处的代码,这样不行的话,可能是相关函数又被DXF给HOOK覆盖了?使得走不到新的内核函数中?

DXF对KiDispatchException进行HOOK?或者DbgkForwardException进行了处理?反正就是不让int3引起的异常发送到OD调试对象中??
2015-5-8 20:13
0
雪    币: 70
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
你看看你debugport相关处理好了没,windbg看看是否转移到新对象了,我感觉是OD没收到调试信息,没收到调试信息和你的这个是一模一样的,另外你是32位的?
2015-5-8 21:28
0
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
是的,我是XP SP3系统.嗯,由于没解决双机调试的问题,所以没有去跟内核,看来我得先去解决双机调试的问题,然后才能跟踪到底是哪出了问题.......
OD附加DXF,所有线程都挂起,恢复了,进程就退出了,不知道是不是它对RtlExitUserThread函数做了处理,检查了返回地址.....这个也得先让进程在OD中断下,才能跟踪是否HOOK了....

一步一步来吧.....发现问题,猜测引起问题的原因,证实,然后解决

谢谢你的回复
2015-5-8 21:52
0
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
OD能收到线程创建成功,是因为DbgKpQueueMessage向调试对象消息队列追加调试事件
它的流程大概是如下:
NtDebugActiveProcess -> DbgKpPostFakeProcessCreateMessage -> DbgKpPostFakeThreadMessage ->DbgKpQueueMessage

而int3的调试事件走的流程大概如下:
kitrap03 -> CommonDispatchException -> KiDisapatchException -> DbgKpForwardException -> DbgKpSendApiMessage -> DbgkpQueueMessage

我用windbg将游戏运行前后运行后的相关的汇编代码都copy了下来,用UltraCompare对比了一下,游戏未做相关HOOK,那么流程应该最后也会到DbgkpQueueMessage这,OD附加别的程序可以的,但是就是附加DXF不行,有点困惑啊,按理说,流程只要是正确的,那么OD等待的调试事件就会被SET
2015-5-11 17:28
0
雪    币: 70
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
基本就是debugport 了
2015-5-11 18:23
0
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
哥们,谢谢你,不是DXF搞的鬼,是我自己人为的错误,确实是debugport为0
2015-5-12 09:38
0
游客
登录 | 注册 方可回帖
返回
//