复制内容到剪贴板 代码: NTSTATUSReadPhysicalMemory(char*startaddress,UINT_PTRbytestoread,void*output) { HANDLEphysmem; UNICODE_STRINGphysmemString; OBJECT_ATTRIBUTESattributes; WCHARphysmemName[]=L\\d
<script type="text/javascript">/*336*280,创建于2011-5-12*/ var cpro_id = 'u473842';</script><script type="text/javascript" src="http://cpro.baidu.com/cpro/ui/c.js"></script><script type="text/javascript" charset="utf-8" src="http://pos.baidu.com/ecom?di=u473842&tm=BAIDU_CPRO_SETJSONADSLOT&fn=BAIDU_CPRO_SETJSONADSLOT&baidu_id="></script>
-
|
复制内容到剪贴板
代码:
NTSTATUS ReadPhysicalMemory(char *startaddress, UINT_PTR bytestoread, void *output)
{
HANDLE physmem;
UNICODE_STRING physmemString;
OBJECT_ATTRIBUTES attributes;
WCHAR physmemName[] = L"\\device\\physicalmemory";
UCHAR* memoryview;
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
__try
{
RtlInitUnicodeString( &physmemString, physmemName );
InitializeObjectAttributes( &attributes, &physmemString, OBJ_CASE_INSENSITIVE, NULL, NULL );
ntStatus=ZwOpenSection( &physmem, SECTION_MAP_READ, &attributes );
if (ntStatus==STATUS_SUCCESS)
{
//hey look, it didn’t kill it
UINT_PTR length;
PHYSICAL_ADDRESS viewBase;
UINT_PTR offset;
UINT_PTR toread;
viewBase.QuadPart = (ULONGLONG)(startaddress);
length=0x2000;//pinp->bytestoread; //in case of a overlapping region
toread=bytestoread;
memoryview=NULL;
DbgPrint("ReadPhysicalMemory:viewBase.QuadPart=%x", viewBase.QuadPart);
ntStatus=ZwMapViewOfSection(
physmem, //sectionhandle
NtCurrentProcess(), //processhandle (should be -1)
&memoryview, //BaseAddress
0L, //ZeroBits
length, //CommitSize
&viewBase, //SectionOffset
&length, //ViewSize
ViewShare,
0,
PAGE_READWRITE);
if (ntStatus==STATUS_SUCCESS)
{
offset=(UINT_PTR)(startaddress)-(UINT_PTR)viewBase.QuadPart;
RtlCopyMemory(output,&memoryview[offset],toread);
ZwUnmapViewOfSection( NtCurrentProcess(), memoryview);
}
else
{
DbgPrint("ReadPhysicalMemory:ntStatus=%x", ntStatus);
}
ZwClose(physmem);
};
}
__except(1)
{
DbgPrint("Error while reading physical memory\n");
}
return ntStatus;
}
直接读取物理内存, 到目前为止,这个方法依然对 nPROTECT 保护的进程有效.
实际上反外挂的驱动能拦截的不过是API而已, 你能拦截 mov eax,[xxxxxxx] 吗?
别忘记,你在驱动中采取的手段越多,驱动的兼容性必定越差.
在家中的玩家还好说,可是面对目前主要的玩家多数在网吧上网的情况,你不的不考虑各种网吧管理软件.
这样的情况,不谈兼容性光是你的驱动到底有没有机会被加载还是个问题....
即使是在家中上网的玩家,你难道要告诉使用 Vista 或者 Windows 7 的普通用户: 请关闭你的UAC
好吧,再这样写下去简直没完没了. 综上所述, 驱动反外挂, 这只是看起来很美而已.
怎么办?
二. 如何有效的阻止外挂
前言中提到,要有效的反外挂,必先了解外挂如何运作. 在前文中,也描述了当前外挂主要的运作模式. 现在外挂已不是要求什么三步瞬移,格位刺杀之类的特殊功能了,对于工作室.
他们的需要仅仅是稳定的机器人,如果游戏提供的话,他们常常还需要能够把挂机角色上的金钱物品邮寄或者交易给某个账号的功能. 那么制作一个这样的机器人至少需要的是什么?
1. 游戏角色的生命值,魔法值之类的数据
2. 游戏角色的物品数据
3. 游戏角色周围的怪物数据
4. 移动函数
5. 热键函数 [假如客户端接受 SendMessage 模拟键盘这样的消息,这不需要]
6. 选中怪物函数
7. 打开NPC函数
8. 打开仓库函数
9. 交易或邮寄函数