游戏辅助软件开发,过保护一直以来都是关键的一步骤,今天我们来再谈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"
看一下大致的代码
小编搜集了一些资料,有兴趣的可以私信:游戏辅助,了解些下
[免责声明]本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系我们会予以删除相关文章,保证您的权利。转载请注明出处






