一. 论驱动反外挂
随着国内软件安全行业的发展,驱动这一名词逐渐被摘去神秘的光环. 而3721的出现,告诉了人们驱动这东西不仅仅是用于硬件
越来越多的人认识到驱动的巨大作用,当<<MU>>引入了 nProtect 反外挂系统后,似乎驱动反外挂成了相当理想的选择.
但这一切,只是看起来很美. 随着越来越多的ROOTKIT出现,各大杀毒厂商逐渐的加强了这一方面的监控. 越来越多的各类监控
软件也使得驱动反外挂举步维难.
在进入正题之前,首先要明确一点. 你的驱动将是游戏客户端的组成部分, 很多ROOTKIT上可以用的手段你不能使用.
游戏玩家并不是专业人士,他们更相信他们所选择的杀毒软件. 总不能当你的游戏运行时,杀毒软件便提示说 - 这是个ROOTKIT
首先我们抛开驱动的兼容性不谈 - 这也没法谈, 正如你驾驶汽车,你可以保证自己不出错. 但是你能保证其他人都能吗?
说到驱动反外挂,你应该立马想到 HOOK SSDT与SSSDT 拦截API防止游戏进程被修改. 可是这真的那么有效吗?
好吧,你想说阻止 OpenProcess,ReadProcessMemory,WriteProcessMemory 这三个API就好? 不 - 相信我,这只能防防菜鸟而已.
即使你不考虑兼容性把 PsLookupProcessByProcessId,ObOpenObjectByPointer,ObOpenObjectByName,KeAttachProcess 等
全部HOOK,真的就能阻止修改了吗?
不,我们来看看下面的代码.
复制内容到剪贴板
代码:
Function GetInfoTable(ATableType:dword):Pointer;
var
mSize: dword;
mPtr: pointer;
St: NTStatus;
begin
Result := nil;
mSize := $4000;
repeat
mPtr := VirtualAlloc(nil, mSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
if mPtr = nil then Exit;
St := ZwQuerySystemInformation(ATableType, mPtr, mSize, nil);
if St = STATUS_INFO_LENGTH_MISMATCH then
begin
VirtualFree(mPtr, 0, MEM_RELEASE);
mSize := mSize * 2;
end;
until St <> STATUS_INFO_LENGTH_MISMATCH;
if St = STATUS_SUCCESS
then Result := mPtr
else VirtualFree(mPtr, 0, MEM_RELEASE);
end;
function iOpenProcess(ProcessId:DWORD):DWORD;
var
HandlesInf PSYSTEM_HANDLE_INFORMATION_EX;
ClientID:TClientID;
pbi:_PROCESS_BASIC_INFORMATION;
oa:TObjectAttributes;
hProcessCur,hProcessToDup,hProcessToRet:DWORD;
Ret:DWORD;
I:Integer;
begin
SetPrivilege(’SE_DEBUG’,TRUE);
Result:=0;
FillChar(oa,SizeOf(TObjectAttributes),0);
FillChar(ClientID,SizeOf(TClientID),0);
oa.Length:=SizeOf(TObjectAttributes);
HandlesInf=GetInfoTable(SystemHandleInformation);
for I:=0 to HandlesInfo^.NumberOfHandles do
begin
If (HandlesInfo^.Information.ObjectTypeNumber=5) Then //OB_TYPE_PROCESS
ClientID.UniqueProcess:=HandlesInfo^.Information.ProcessId;
If ZwDuplicateObject(hProcessToDup,HandlesInfo^.Information.Handle,GetCurrentProcess,@hProcessCur,PROCESS_ALL_ACCESS,0,$4)=STATUS_SUCCESS then
If ZwQueryInformationProcess(hProcessCur,ProcessBasicInformation,@pbi,Sizeof(_PROCESS_BASIC_INFORMATION),@Ret)=STATUS_SUCCESS then
If (pbi.UniqueProcessId=ProcessId) Then
If ZwDuplicateObject(hProcessToDup,HandlesInfo^.Information.Handle,GetCurrentProcess,@hProcessToRet,PROCESS_ALL_ACCESS,0,$4)=STATUS_SUCCESS then
begin
Result:=hProcessToRet;
Break;
end;
end;
if hProcessCur>0 then ZwClose(hProcessCur);
if hProcessToDup>0 then ZwClose(hProcessToDup);
VirtualFree(HandlesInfo,0,MEM_RELEASE);
SetPrivilege(’SE_DEBUG’,FALSE);
end;
这是枚举系统中所有已知举柄达到取得进程Handle的函数. 你或许会认为,拦截ZwDuplicateObject,ZwQueryInformationProcess不就解决问题了?
这没错,你是对的.但是你不能这样做,你做的是反外挂,不是ROOTKIT, 当你尝试这样做的时候,你会发现你的杀毒软件提示你. 这是ROOTKIT的典型行为
怎么办? 难道你要象ROOTKIT那样关闭掉玩家的杀毒软件? 还是联系各大杀毒软件厂商告诉他们: 麻烦您修改你们的规则?
说说过游戏保护一
最新推荐文章于 2020-01-17 13:36:38 发布