首页
社区
课程
招聘
[讨论]Ring3 异常 分发 的 奇怪现象~~大神帮忙看下
发表于: 2014-5-12 22:04 5273

[讨论]Ring3 异常 分发 的 奇怪现象~~大神帮忙看下

2014-5-12 22:04
5273
打算隐藏调试寄存器,查资料显示异常机制 和 GetThreadContext 可以获取,那么首先 r0 hook NtGetThreadContext  和 PSGetThreadContext hook,这里应该问题不大,不是导致奇怪现象的原因,继续往下。。。

KiUserExceptionDispatcher r0 进 r3 的第一个函数,这里貌似有CRC,查阅了WRK以后,修改了内核,让异常从r0 进 r3 的时候,走我的函数。
__declspec(naked) VOID  MyKiUserExceptionDispatcher()
{
        __asm
        {
                mov ecx, dword ptr [esp+4]
                mov ebx, dword ptr [esp]
                push ecx
                push ebx
                call MyRtlDispatchException
                or al, al
                je Label1
                pop ebx
                pop ecx
                push 0
                push ecx
                call NtContinueAddr
                jmp Label2
Label1:
                pop ebx
                pop ecx
                push 0
                push ecx
                push ebx
                call RaiseException
Label2:
                add esp, -14
                mov dword ptr [esp], eax
                mov dword ptr [esp+4], 1
                mov dword ptr [esp+8], ebx
                mov dword ptr [esp+10], 0
                push esp
                call RtlRiaseExceptionAddr
                retn 8
        }
}
裸函数的代码是照着ntdll复制的,这样驱动跑起来以后,从r0进r3就会走MyKiUserExceptionDispatcher。MyRtlDispatchException 异常分发也是我的函数,通过这种方法,绕过 r0 进 r3 时候异常机制对Drx的检查。。。
接着 检测还有 SEH部分,,我在MyRtlDispatchException 中对异常进行了过滤,游戏检测会触发两个类型的异常,ExceptionCode 一个是E06D7363 一个是40010006 用16进制打出来的,本来以为打印不对,但是打印自己的单步异常 是 0x80000004L啊,为什么打印检测触发的异常是这么两个值。。。。
再接着 RtlDispatchException函数会有两种返回,一种是返回true false,根据返回值调用ZwContinue,回到内核,另一种是在SEH 异常回调函数中  直接 长跳转,就不返回了,我自己注册的VEH,属于第一种,修改EIP之后,会返回,接着调用ZwContine,而游戏检测的异常,则是第二种,MyRtlDispatchException 调用以后就不返回了,这样的话,我清零的Drx 就没地方重新设置了,,,后来 hook ZwContine 函数,在MyZwContine 中重新设置Drx,因为 SEH 检测,根本不返回,所以当时感觉 hookZwContine 也没用,, 结果发现,Dr0 到 Dr3 值,被设置了,但是 DR1和Dr2的值变了,Dr0和Dr3正常,假设设置的是 12345678 ,结果 成了00005678 同理Dr2 成了12340000,我不明白,谁改了Drx的值,异常机制我绕过了啊,SEH 我是清0Drx后才传递给他的,还有,游戏检测SEH ,分发后根本不返回,那么我在 ZwContine 中重置了,怎么又重置上了?
我乱了,今天,去市区新华书店买了一本,张老师的软件调试,。。
请前辈们,指点一下吧。。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 7
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看了看书,还是我搞错了,,不管哪一种 都走 ZwContine ,,再就是 检测 抛出的异常是 使用 RaiseException ,,这俩之前我没搞懂。~
2014-5-13 10:45
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
过于深奥...
2014-5-13 10:46
0
雪    币: 7
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
写的太乱了。。。太惭愧了
2014-5-13 17:10
0
游客
登录 | 注册 方可回帖
返回
//