说说过游戏保护一

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值