说说过游戏保护(4)

复制内容到剪贴板 代码: 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&amp;tm=BAIDU_CPRO_SETJSONADSLOT&amp;fn=BAIDU_CPRO_SETJSONADSLOT&amp;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. 交易或邮寄函数 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值