尘埃416 发表于 2024-2-29 12:53:07

QQ dnf 驱动防御原理


QQ dnf 驱动防御原理

1.用RKU看一下SSDT和SSDTShadow,发现SSDT并没有被HOOK,SSDTShadow HOOK了5个调用:

NtUserBuildHwndList 
NtUserFindWindowEx

NtUserGetDC s]
NtUserGetDCEx

NtUserGetForegroundWindow


想也不用想,肯定是为了防止其他软件找到他的窗口。

解决方法:在TesSafe加载前先加载自己的驱动,备份这5个调用的地址,等TesSafe加载后直接还原即可,或者直接用RKU还原,TesSafe并没有在这里加效验,所以比较容易。



2.既然SSDT没有没HOOK,那么肯定有inline hook,用windbg看一下,发现被inline hook的调用有如下几个:

NtReadVirtualMemory

NtWriteVirtualMemory

NtOpenProcess + 0x2xx Call ObOpenObjectByPointer处 
NtOpenThread+ 0x1xx Call ObOpenObjectByPointer处
KiAttachProcess



解决方法:

(1).

NtReadVirtualMemory

NtWriteVirtualMemory

这2个比较好解决,自己写2个调用,实现这2个调用的头10个字节,然后再跳转到这2个调用头10个字节后面的地址,再到SSDT表里把这2个调用地址改成我们自己的即可。



(2).

NtOpenProcess + 0x2xx

NtOpenThread+ 0x1xx

在TesSafe加载前,先保存ObOpenObjectByPointer的地址(或者用MmGetSystemRoutineAddress获取),然后我们自己写一段代码,实现Call ObOpenObjectByPointer头N个字节(随便自己)以及Call ObOpenObjectByPointer,然后再jmp到Call ObOpenObjectByPointer后面的代码地址,如:
push eax 
push dword ptr

push dword ptr

Call ObOpenObjectByPointer "
jmp xxx

然后在Call ObOpenObjectByPointer前面N个字节处jmp到我们自制的代码,这样的话就算TesSafe把Call ObOpenObjectByPointer改成Call到自己的函数,对我们也没有作用了。

注意:直接还原代码的话,势必会蓝屏。因为TesSafe对这个地址有代码效验 


(3).

KiAttachProcess >   
由于这个调用并没有被导出,在SSDT表中也没有他的地址。所以我们首先要获取他的地址

虽然它没有被导出,但是调用它的另外一个调用KeAttachProcess却是被导出了的,我们可以先用MmGetSystemRoutineAddress获取KeAttachProcess的地址,再通过KeAttachProcess + 0x41的Call KiAttachProcess来取得KiAttachProcess的地址,然后直接还原它的代码即可(TesSafe并没有对这里进行代码效验)。



至此,TesSafe的所有HOOK都已恢复完毕,这时用OD附加游戏,发现OD会突然停止。

其实,上面那些HOOK大部分人都已经搞定,关键就是这最后一步,OD停止的原因是他收不到调试消息了,因为TesSafe有一个线程不停的向PEPROCESS->DebugPort 写入NULL(0)。

DebugPort其实就是Debug_Object的指针。

页: [1]
查看完整版本: QQ dnf 驱动防御原理