当前位置: 代码迷 >> Web前端 >> 说说过游戏保护1
  详细解决方案

说说过游戏保护1

热度:213   发布时间:2012-09-05 15:19:34.0
说说过游戏保护一

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

  相关解决方案