易语言教程_易语言源码_易语言视频教程_易语言论坛

 找回密码
 点击注册

Vip新手入门区
新手学习指南  学员作品展示 Vip课程总纲  Vip绝密课程系列

Vip相关下载区
Vip模块下载   Vip模块绑定   Vip模块例子 魔鬼插件下载  魔鬼插件例子  教程工具下载

Vip论坛服务区
教程问题提问区   模块问题提问区 技术交流区   魔鬼插件建议   忘记密码找回

VIP会员办理QQ: 8643245   
【请先加好友,然后到好友列表双击联系客服,办理VIP会员。】
【基础篇】易语言辅助入门基础教程
VIP模块办理QQ: 7189694 办理正版魔鬼作坊VIP模块 【基础篇】OD与CE入门基础教程
办理【终身VIP会员】“秒杀价” 仅需 RMB278.00元… 【基础篇】零基础绝密汇编语言入门课程 (共26课已完成)…
办理VIP详情…猛击这里查看详情 【基础篇】VIP辅助入门基础教程-新手必学 已发布10课 ……
VIP教程免费试看章节…猛击下载 【第1款】制作“辅助挂”教程目录查看(共107+16_x64下更新课已完成)…
亲爱的VIP学员,请到此写下你学习的感受与发布作品截图… 【第2款】制作“任务挂”教程目录查看(共77+1_x64下更新课已完成)…
卍解吧!不用bp send类封包断点找CALL的各种通杀思路 【第3款】驱动过保护技术课程(共38课已完成)…
【绝密教程】VIP绝密教程系列---注意:随时会更新! 【第4款】VIP邪恶二叉树辅助课程 (共31+17_x64下更新课已完成)…
【精品第13款】3D射击游戏与页游透视 智辅课程 已完成17课… 【第5款】零基础易语言按键辅助教程 (30课已完成)…
【精品第14款】变态功能辅助是如何炼成的 已完成36课… 【第6款】从零开始学习封包辅助技术教程(20课已完成) …
【精品第15款】DNF商业变态辅助的修炼之路 已完成27课… 【第7款】大杀特杀分析来源与CALL吸血鬼课程 (56课已完成)
【精品第16款】中控台多线程多开自动化商业辅助课程 已完成66课… 【第8款】完全零基础网页辅助课程(40课已完成)
【全新精品第17款】检测原理与过游戏内存检测技术课程 已发布9课… 【第9款】自动登录与操控LUA技术课程 (共46+8_x64下更新课已完成)…
【全新精品第18款】手游全自动化任务脚本辅助课程 已发布25课…… 【第10款】网页辅助封包脱机进阶课程 已完成30课…
【全新精品第19款】D3D方框骨骼透视与自瞄辅助课程进阶篇 已发布34课…… 【第11款】VC++ Lua脚本辅助课程 已完成112课…
【全新精品第20款】 X64模拟器吃鸡游戏方框透视自瞄辅助课程 发布中... 【第12款】网游脱机封包智辅课程 已完成35课…
查看: 1566|回复: 5

如何过过游戏保护 转-作者不详-

[复制链接]

2

主题

30

回帖

18

积分

终身VIP会员

Rank: 7Rank: 7Rank: 7

魔鬼币
9664
发表于 2011-5-20 20:01:24 | 显示全部楼层 |阅读模式
这个问题很多人都想问吧!看看这篇文章,对你一定有帮助!

一. 论驱动反智辅
  随着国内软件安全行业的发展,驱动这一名词逐渐被摘去神秘的光环. 而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;

2

主题

30

回帖

18

积分

终身VIP会员

Rank: 7Rank: 7Rank: 7

魔鬼币
9664
 楼主| 发表于 2011-5-20 20:01:41 | 显示全部楼层
这是枚举系统中所有已知举柄达到取得进程Handle的函数. 你或许会认为,拦截ZwDuplicateObject,ZwQueryInformationProcess不就解决问题了?
  这没错,你是对的.但是你不能这样做,你做的是反智辅,不是ROOTKIT, 当你尝试这样做的时候,你会发现你的杀毒软件提示你. 这是ROOTKIT的典型行为
  怎么办? 难道你要象ROOTKIT那样关闭掉玩家的杀毒软件? 还是联系各大杀毒软件厂商告诉他们: 麻烦您修改你们的规则?
  这仅仅是RING 3的普通运用而已, 千万不要认为做智辅的不会驱动. 相反,与游戏开发公司那点可怜的薪水比起来. 智辅的利润只会让更多的驱动开发者
  加入这一行列. 即使你HOOK接管了这一切函数,不管是inline还是普通的ssdt. 下面的驱动很轻易的就能突破任意的HOOK.
  复制内容到剪贴板
  代码:
  .....................
  NTSTATUS NTAPI GetRealAddress(PIMPORT_ENTRY Import)
  {
  MODULE_INFORMATION mi,idmi;
  DWORD         i,j;
  DWORD         dwKernelBase;
  NTSTATUS         status;
  PDWORD         KiServiceTable;
  UNICODE_STRING NtdllName;
  if (KeGetCurrentIrql()!=PASSIVE_LEVEL) return STATUS_PASSIVE_LEVEL_REQUIRED;
  RtlZeroMemory(&mi,sizeof(mi));
  if (!NT_SUCCESS(status=MapKernelImage(&mi,&dwKernelBase))) return status;
  RtlZeroMemory(&idmi,sizeof(idmi));
  RtlInitUnicodeString(&NtdllName, L"\\SystemRoot\\System32\\ntdll.dll");
  if (!NT_SUCCESS(status=MapPeImage(&idmi,&NtdllName))) return status;
  try {
  for (i=0;Import.szName;i++){
  Import.dwAddress=0;
  switch (Import.dwType) {
  case IMPORT_BY_NAME:
  if (!(Import.dwAddress=GetProcRva(mi.hModule,Import.szName))) {
  #ifdef DEBUG
  DbgPrint("GetRealAddress(): Failed to get %s rva!\n",Import.szName);
  #endif
  }
  break;
  case IMPORT_BY_RVA:
  Import.dwAddress=(DWORD)Import.szName;
  break;
  case IMPORT_BY_ADDRESS:
  Import.dwAddress=(DWORD)Import.szName-dwKernelBase;
  break;
  case IMPORT_BY_SERVICE_ID:
  // do not search this rva if it has been already found
  if (!KiServiceTable_RVA) {
  if (!(KiServiceTable_RVA=FindKiServiceTable(mi.hModule))) {
  #ifdef DEBUG
  DbgPrint("GetRealAddress(): Failed to get KiServiceTable RVA!\n");
  #endif
  break;
  }
  }
  KiServiceTable=(PDWORD)(KiServiceTable_RVA+mi.hModule);
  Import.dwAddress=KiServiceTable[(DWORD)Import.szName]-mi.dwImageBase;
  break;
  case IMPORT_BY_SERVICE_NAME:
  if (!KiServiceTable_RVA){
  if (!(KiServiceTable_RVA=FindKiServiceTable(mi.hModule)))         break;
  }
  Import.dwId=GetIdForName(idmi.hModule,Import.szName);
  KiServiceTable=(PDWORD)(KiServiceTable_RVA+mi.hModule);
  Import.dwAddress=KiServiceTable[Import.dwId]-mi.dwImageBase;
  break;
  default:
  break;
  } //Case End
  if (Import.dwId==0){
  if (!KiServiceTable_RVA)
  KiServiceTable_RVA=FindKiServiceTable(mi.hModule);
  KiServiceTable=(PDWORD)(KiServiceTable_RVA+mi.hModule);
  for (j=0;KiServiceTable[j];j++){if (Import.dwAddress==KiServiceTable[j]-mi.dwImageBase){Import.dwId=j;break;}}
  }
  Import.dwAddress=dwKernelBase+Import.dwAddress;
  }
  }except(EXCEPTION_EXECUTE_HANDLER){
  return STATUS_ADD_FUNCTION_FAILED;
  }
  try {
  UnmapPeImage(&mi);
  UnmapPeImage(&idmi);
  }except(EXCEPTION_EXECUTE_HANDLER){  
  return STATUS_CODE_REBUILDING_FAILED;
  }
  return STATUS_SUCCESS;
  }
  ...........


  恩..这不是完整的代码,这理所当然,不是么?
  面对任何HOOK,只需要从NT的内核文件中取出其真实的地址,很轻易的就可以饶过SSDT的HOOK,INLINE HOOK只需要恢复代码即可.
  更何况你的驱动肯定会比智辅的驱动还晚加载.
  即使除开上面这些不谈,你依然要面对你的驱动被PATCH,又或者被个假冒的驱动所替代. 更别说 lpk.dll usp10.dll 了.
  这时候你应该会想反驳我,看看 nPROTECT ,安博士 吧. 好的,那么我们来看看下面这段函数
  复制内容到剪贴板

  代码:
  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. 交易或邮寄函数
  其中的 4-9 可以被一个数据包发送函数所替代,例如
  复制内容到剪贴板
  代码:
  procedure SendPack(buf:PChar;len:DWORD); stdcall;
  procedure TOSEND; stdcall;
  asm
  push     -1
  push     SENDPACK_STAK
  mov      eax, dword ptr fs:[0]
  push     eax
  mov      dword ptr fs:[0], esp
  sub      esp,$18
  push     ebx
  push     esi
  push     edi
  mov      edi, ecx
  xor      ebx, ebx
  xor      eax, eax
  jmp      SENDPACK_JMP
  end;
  begin
  asm
  pushad;
  mov ecx, [CALL_BASE];
  push len;
  push buf;
  mov ecx, [ecx+$20];
  call TOSEND;
  popad;
  end;
  end;
  procedure SendBuyItem(ItemId,ItemPos,ItemCount:DWORD);
  var
  //25 00 01 00 00 00 14 00 00 00 00 00 00 00 01 00 00 00 AA 21 00 00 01 00 00 00 01 00 00 00
  //25 00 01 00 00 00 ByteCount 00 00 00 00 GroupCount ItemId ItemPos ItemCount
  Pack:Array [0..29] of Byte;
  begin
  FillChar(Pack,SizeOf(Pack),0);
  Pack[0]:=$25;
  Pack[2]:=$01;
  Pack[6]:=$14;
  Pack[14]:=$01;
  CopyMemory(@Pack[18],@ItemId,4);
  CopyMemory(@Pack[22],@ItemPos,4);
  CopyMemory(@Pack[26],@ItemCount,4);
  SendPack(@Pack[0],30);
  end;


  归根结底, 要反智辅,主要防御的只有两点:
  1. 防止外部修改内存
  2. 防止外部调用函数
  对于第一点,比如修改某个怪物的数据,使得客户端判断该怪物在游戏角色的攻击范围之内.
  最佳的解决办法不是去HOOK什么内存读写函数. 而是把判断这些数据的责任交给服务器端
  可如果是引进的游戏呢? 解决办法便是CRC32或者别的什么HASH算法校验这段内存数据.
  对于第二点,最简单的办法便是在函数内取得 ESP 判断函数的返回地址. 以上面的那段函数为例.
  只要游戏开发商稍微更改一下他的发包函数,判断下call 的来源, 我想这已经会让智辅的作者头痛
  很久.

12

主题

-5

回帖

22

积分

终身VIP会员

Rank: 7Rank: 7Rank: 7

魔鬼币
15669
发表于 2011-5-21 00:30:08 | 显示全部楼层
传说中的沙发?嘎嘎

0

主题

3

回帖

0

积分

编程入门

Rank: 1

魔鬼币
0
发表于 2013-3-19 19:30:59 | 显示全部楼层
好复杂。。。真看不懂了

67

主题

208

回帖

359

积分

终身VIP会员

Rank: 7Rank: 7Rank: 7

魔鬼币
28488
发表于 2014-2-16 15:34:59 | 显示全部楼层
留名。。。。。。

0

主题

1

回帖

1

积分

编程入门

Rank: 1

魔鬼币
15
发表于 2023-10-24 11:22:01 | 显示全部楼层













































































































{2023年10月01日}2023冬季,全球 崩 盘,三 峡 溃 坝

{2023年10月01曰}2023冬季,全球 崩 盘,三 峡 溃 坝



作者 : 薛桦镰
时间:  2023年10月01曰 О8:49:57        星期曰        农历八月十七
           上正宗指 3110.48点    恒指 17809.66点   道指33507.50点
           囯际音乐节      囯际老人节
           


         
突然的,全球 金 融 市 场 连 续 跌 停 大 崩 盘,
没有什么,谁也没想到啊,友邦惊诧,黑 天 鹅 白天鹅 哥斯拉,
一切都是,蓄 谋 已 久 的精心策划。zéi 喊捉zéi。


{一} 今时今曰{癸卯2023年10月01曰 } :
今时今曰,我预.测,人类有始.以来最大的金.融.崩 盘 ,未来三个月
之内,即,2023年11月、12月、2024年元月,将 震 撼呈 现。
---- 中卝囯股市、全球股市、全球金融市场 连序跌婷大崩 盘 , 大盘连
       续或稍稍间断30/40多个跌亭板,人类有.史以来最大的金融.嗨啸。
股市、汇市、债市、期货商品、可能还有楼卝市,全部连卝锁式彻底崩溃。
黄 金 价 格 应 该 避 险 bào 涨。
忽 然 之 间 ,天 塌 了。{ 全 球 闪 崩 }
十 八 级 金融大 地.震,史无前例地球崩卝盘,要 多 惨 有 多惨,世界沫曰。
金融天坑,股市雪崩、铡 dāo 斩 首 、bào 雷 溃 坝 ,希 特 勒 巴巴罗萨
金融闪击战 。画 皮 ,终 于 撕 去 了 。
最热的天气,最冷的人心。
道琼斯,憋了14年的一泡shǐ{⑥440.О8},2023冬季,总算找到了,公共厕所。
缠中说禅17年之前预卝言的,2019毁miè性下跌。{有四年误差}
已故“周期天王”周金涛的,“2018年到2019年是康波周期的万卝劫卝不卝复之年”。
以金.融战.争为表现形式的,第 叁 次.世.戒.大.战,全面 bào.发。
---- 一切友好互访探讨分歧,新型大囯关
您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

魔鬼作坊|易语言教程|易语言源码|易语言论坛|易语言视频教程| 论坛导航|免责申明|手机版||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表魔鬼作坊立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2019 All Right Reserved.
快速回复 返回顶部 返回列表