说说过游戏保护一
一.?论驱动反外挂?
随着国内软件安全行业的发展,驱动这一名词逐渐被摘去神秘的光环.?而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那样关闭掉玩家的杀毒软件??还是联系各大杀毒软件厂商告诉他们:?麻烦您修改你们的规则??