- 注册时间
- 2011-5-9
- 最后登录
- 2024-6-21
- 在线时间
- 29 小时
终身VIP会员
- 魔鬼币
- 9743
|
这个问题很多人都想问吧!看看这篇文章,对你一定有帮助!
一. 论驱动反智辅
随着国内软件安全行业的发展,驱动这一名词逐渐被摘去神秘的光环. 而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; |
|