-
-
[讨论]Ring3 异常 分发 的 奇怪现象~~大神帮忙看下
-
发表于:
2014-5-12 22:04
5400
-
[讨论]Ring3 异常 分发 的 奇怪现象~~大神帮忙看下
打算隐藏调试寄存器,查资料显示异常机制 和 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直播授课