游戏辅助(外挂):再谈SSDT_HOOK驱动保护原理

adminadmin 2025-05-27 299 阅读

游戏辅助软件开发,过保护一直以来都是关键的一步骤,今天我们来再谈SSDTHOOK驱动保护原理(主要分为以下四部分):初识内核进程相关结构;内核函数PsGetCurrentProcess;进程保护原理;实例测试。具体代码等可以和小编聊聊(私信:游戏辅助),最近也收集了一些资料。

看一个实例(代码已经写好了)

将mini_和test_复制到虚拟机,载入驱动

以一个记事本进程为例

启动WinDBG

ZC:WinDBG中打印了很多信息

∵被hook了之后,系统的速度变慢了,可以看到虚拟机中的CPU已经被占满了

ZC:看这个显现,貌似有点死循环的意思啊不像变慢啊【575】WinDBG中也看到信息一直在打印出来,个人判断,肯定是写的代码有问题,貌似是无休止的调用某函数的缘故。

我们把调试去掉(ZC:WinDBG里面打了命令"g",貌似这个操作与"去掉调试"没有关系吧它说的"把调试去掉"应该是指把test_关掉/mini_卸载掉?)

ZC:貌似虚拟机重启过了

此时,再用CE来附加记事本进程,CE报错"打开进程错误",它已经被保护起来了

并非说记事本进程就绝对的能够得到很好的保护了,如OD里面有一些过保护的插件,它就可以过这个保护

打开(郁金香),此时(OD--文件--附加)找不到记事本的进程

OD--插件--StrongOD--Options--"*KernelMode"勾上--关闭OD

再次打开OD【990】此时(OD--文件--附加)能看到记事本进程,也能正常的附加

OD--反汇编窗口--右击--StrongOD--Detach--关闭OD

只是一个简单的演示

里面也有一个内核模式:CE--设置--其他--隐藏模式(内核模式),但是这个是调试模式,不知道这个有没有用。∵虚拟机里面测试非常的不方便,就不再做再多的演示了,有兴趣自己测试

看一下原理

对函数NtOpenProcess做了一个SSDT的HOOK,它不是一个内联的(ZC:讲的是"内联的"吗?)

一般来说比较强的保护的话,它都是一个内联的更深层次的保护,今天我们就不说内联HOOK了,说SSDT的HOOK

内核里面的NtOpenProcess如下:

NTSTATUSNtOpenProcess(

__outPHANDLEProcessHandle,//【1360】这个是用来回传参数的

__inACCESS_MASKDesiredAccess,//【1410】访问权限的掩码

__inPOBJECT_ATTRIBUTESObjectAttributes,

__in_optPCLIENT_IDClientId

);

MSDN里面查看看OpenProcess,返回值对应函数NtOpenProcess的参数ProcessHandle

HANDLEOpenProcess(

DWORDdwDesiredAccess,//【1485】对应函数NtOpenProcess的参数DesiredAccess

BOOLbInheritHandle,//【1680】对应函数NtOpenProcess的参数ObjectAttributes

DWORDdwProcessId

);

OpenProcess的参数dwProcessId对应的不是函数NtOpenProcess的参数ClientId

包含这样一个结构dt_CLIENT_ID这个结构,在OD里面也能看到,在WInDBG里面能够看到(ZC:到底OD里能不能看到?)

vs2003里面看到中有该结构的定义

typedefstruct_CLIENT_ID

{

HANDLEUniqueProcess;//进程PID

HANDLEUniqueThread;//线程PID

}CLIENT_ID;

根据传入的值,这个值(CLIENT_)如果是我们要打开的进程,做一个简单的过滤,就直接返回函数NtOpenProcess的参数ProcessHandle的值为空。我们对OpenProcess进行SSDT的HOOK进入我们自己的函数,自己构建一个假的函数MyNtOpenProcess()

MyNtOpenProcess()

{

if要打开进程是我们要保护的

{

ProcessHandle=NULL

}

else

{

ProcessHandle=NtOpenProcess()//HANDLEhProcess

}

}

这样就起到一个简单的保护作用

MSDN查看WriteProcessMemory

也就是说我们的战场就是在OpenProcess这里

看一下这个结构"dt_eprocess"

打开虚拟机,启动WinDBG

∵进程相关的结构,在程序(vs2003)里面是看不到的,∵该结构是一个未公开的一个结构

VS2003中_EPROCESS【2565】此时提示“未定义符号"_EPROCESS"”

ZC:根据应用层的结构--得到内核未公开的结构名--在WinDBG中用"dt"命令一点一点往下挖

WinDBG命令"dt_eprocess"

_比较重要,常用来反调试

_进程名。也可以通过过滤进程名来保护进程

WinDBG命令"dt_CLIENT_ID"

看一下大致的代码

小编搜集了一些资料,有兴趣的可以私信:游戏辅助,了解些下

The End

[免责声明]本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系我们会予以删除相关文章,保证您的权利。转载请注明出处

上一篇 下一篇

相关阅读