依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 23|回复: 0

一个编写传奇封外挂(反外挂)系统的完成过程 - 内存监测篇

[复制链接] 主动推送

2636

主题

2645

帖子

3377

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3377
发表于 昨天 19:37 | 显示全部楼层 |阅读模式
一个编写传奇封外挂(反外挂)系统的完成过程 - 内存监测篇
本节涉及到PE文件结构方面的知识,需要用到PE文件结构知识这里只是简单罗列和讲解一下,更详细的内容请自行学习了解。

      一个常规的PE文件包括:Dos头 + Nt头 + 数据目录 + 节表和节内容组成,有些PE文件在节内容最后还包含附加数据,但是附加数据是不会载入内存的、可以作为特殊数据存贮之用。

      PE文件结构体的定义在winnt.h中。

DOS头:

  1. typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
  2.     WORD   e_magic;                     // Magic number
  3.     WORD   e_cblp;                      // Bytes on last page of file
  4.     WORD   e_cp;                        // Pages in file
  5.     WORD   e_crlc;                      // Relocations
  6.     WORD   e_cparhdr;                   // Size of header in paragraphs
  7.     WORD   e_minalloc;                  // Minimum extra paragraphs needed
  8.     WORD   e_maxalloc;                  // Maximum extra paragraphs needed
  9.     WORD   e_ss;                        // Initial (relative) SS value
  10.     WORD   e_sp;                        // Initial SP value
  11.     WORD   e_csum;                      // Checksum
  12.     WORD   e_ip;                        // Initial IP value
  13.     WORD   e_cs;                        // Initial (relative) CS value
  14.     WORD   e_lfarlc;                    // File address of relocation table
  15.     WORD   e_ovno;                      // Overlay number
  16.     WORD   e_res[4];                    // Reserved words
  17.     WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
  18.     WORD   e_oeminfo;                   // OEM information; e_oemid specific
  19.     WORD   e_res2[10];                  // Reserved words
  20.     LONG   e_lfanew;                    // File address of new exe header
  21.   } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
复制代码
NT头:
  1. typedef struct _IMAGE_NT_HEADERS {
  2.     DWORD Signature;
  3.     IMAGE_FILE_HEADER FileHeader;
  4.     IMAGE_OPTIONAL_HEADER32 OptionalHeader;
  5. } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

  6. typedef struct _IMAGE_FILE_HEADER {
  7.     WORD    Machine;
  8.     WORD    NumberOfSections;
  9.     DWORD   TimeDateStamp;
  10.     DWORD   PointerToSymbolTable;
  11.     DWORD   NumberOfSymbols;
  12.     WORD    SizeOfOptionalHeader;
  13.     WORD    Characteristics;
  14. } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;


  15. typedef struct _IMAGE_OPTIONAL_HEADER {
  16.     //
  17.     // Standard fields.
  18.     //

  19.     WORD    Magic;
  20.     BYTE    MajorLinkerVersion;
  21.     BYTE    MinorLinkerVersion;
  22.     DWORD   SizeOfCode;
  23.     DWORD   SizeOfInitializedData;
  24.     DWORD   SizeOfUninitializedData;
  25.     DWORD   AddressOfEntryPoint;
  26.     DWORD   BaseOfCode;
  27.     DWORD   BaseOfData;

  28.     //
  29.     // NT additional fields.
  30.     //

  31.     DWORD   ImageBase;
  32.     DWORD   SectionAlignment;
  33.     DWORD   FileAlignment;
  34.     WORD    MajorOperatingSystemVersion;
  35.     WORD    MinorOperatingSystemVersion;
  36.     WORD    MajorImageVersion;
  37.     WORD    MinorImageVersion;
  38.     WORD    MajorSubsystemVersion;
  39.     WORD    MinorSubsystemVersion;
  40.     DWORD   Win32VersionValue;
  41.     DWORD   SizeOfImage;
  42.     DWORD   SizeOfHeaders;
  43.     DWORD   CheckSum;
  44.     WORD    Subsystem;
  45.     WORD    DllCharacteristics;
  46.     DWORD   SizeOfStackReserve;
  47.     DWORD   SizeOfStackCommit;
  48.     DWORD   SizeOfHeapReserve;
  49.     DWORD   SizeOfHeapCommit;
  50.     DWORD   LoaderFlags;
  51.     DWORD   NumberOfRvaAndSizes;
  52.     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  53. } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

  54. typedef struct _IMAGE_DATA_DIRECTORY {
  55.     DWORD   VirtualAddress;
  56.     DWORD   Size;
  57. } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
复制代码
节表:
  1. typedef struct _IMAGE_SECTION_HEADER {
  2.     BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
  3.     union {
  4.             DWORD   PhysicalAddress;
  5.             DWORD   VirtualSize;
  6.     } Misc;
  7.     DWORD   VirtualAddress;
  8.     DWORD   SizeOfRawData;
  9.     DWORD   PointerToRawData;
  10.     DWORD   PointerToRelocations;
  11.     DWORD   PointerToLinenumbers;
  12.     WORD    NumberOfRelocations;
  13.     WORD    NumberOfLinenumbers;
  14.     DWORD   Characteristics;
  15. } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
复制代码
通过内存监测判断是否存在非法外挂是外挂监测的最重要最有效的方法。只要有非法外挂一定会存在内存操作(非注入式全局加速、以及驱动层拦截篡改游戏封包挂除外,后面会有章节介绍)。我们需要检测游戏进程本身的代码节内存和允许加载的合法DLL的代码内存。需要重点检测PE文件的代码节和节间空间内存,检测内存是否被篡改。

        ​​​​​​外挂程序一般会修改我们的游戏程序以达到相关功能目的,所以需要监控游戏程序的代码节,确定没有被修改。外挂程序还可能注入一小段程序用来间接调用我们的函数。

       内存检测的处理方法是校验在游戏程序正常运行过程中确定不会被更改的数据的校验和判断的。正常方式编写的程序,代码节与数据节是分开的,我们可以认为代码节数据以及PE头数据以及节间空白区域的内存是不会变动的,通过定时计算他们的校验合来检测非法外挂。

     野内存:与我们的“线程监测篇”相似、非预料空间外的线程叫“野线程”,那么非预料空间的内存我们就叫‘野内存’。通过注入法远程调用函数一定存在野内存。我们通过不断扫描内存页面可以发现野内存的存在,需要用到VirtualQuery函数,请自行查阅函数相关文档。 从函数基地址逐一扫描内存页,遇到拥有可执行的属性的野内存就可判定使用了外挂程序。需要注意的是:有些外挂作者会很聪明地将自己的代码写入到PE节间的空白处理,或者程序的其它空白处,所以校验的时候要一并纳入监测。

  1. WINBASEAPI
  2. SIZE_T
  3. WINAPI
  4. VirtualQuery(
  5.     _In_opt_ LPCVOID lpAddress,
  6.     _Out_writes_bytes_to_(dwLength,return) PMEMORY_BASIC_INFORMATION lpBuffer,
  7.     _In_ SIZE_T dwLength
  8.     );
复制代码
还有一个方法就是,取消我们认为正常情况下不可能修改的内存区域的写属性。但凡发现该区域属性变化,也可能是外挂程序所位。但是外挂程序也可能快速地赋予可写属性之后再修改回去。还是得配合内存校验法才行、可能用到的相关函数如下:
  1. BOOL
  2. WINAPI
  3. VirtualProtect(
  4.     _In_  LPVOID lpAddress,
  5.     _In_  SIZE_T dwSize,
  6.     _In_  DWORD flNewProtect,
  7.     _Out_ PDWORD lpflOldProtect
  8.     );

  9. BOOL
  10. WINAPI
  11. VirtualProtectEx(
  12.     _In_ HANDLE hProcess,
  13.     _In_ LPVOID lpAddress,
  14.     _In_ SIZE_T dwSize,
  15.     _In_ DWORD flNewProtect,
  16.     _Out_ PDWORD lpflOldProtect
  17.     );

  18. BOOL
  19. WINAPI
  20. ReadProcessMemory(
  21.     _In_ HANDLE hProcess,
  22.     _In_ LPCVOID lpBaseAddress,
  23.     _Out_writes_bytes_to_(nSize,*lpNumberOfBytesRead) LPVOID lpBuffer,
  24.     _In_ SIZE_T nSize,
  25.     _Out_opt_ SIZE_T* lpNumberOfBytesRead
  26.     );

  27. BOOL
  28. WINAPI
  29. WriteProcessMemory(
  30.     _In_ HANDLE hProcess,
  31.     _In_ LPVOID lpBaseAddress,
  32.     _In_reads_bytes_(nSize) LPCVOID lpBuffer,
  33.     _In_ SIZE_T nSize,
  34.     _Out_op
复制代码
本篇的检测还应该包含监测注入的DLL程序, 外挂作者可能直接将代码写程序DLL注入到进程正常空间中,而不使用野内存,这种方式检测较为简单直接,可使用特征库来直接判断。

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-2-5 14:50

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表