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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接] 主动推送

2636

主题

2645

帖子

3377

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3377
发表于 昨天 19:49 | 显示全部楼层 |阅读模式
一个编写传奇封外挂(反外挂)系统的完成过程 - API检测篇
游戏外挂的编写离不开对API的操作调用。通过逆向思维思考,我们要反外挂第一个要保护和监测的就是游戏进程的API函数。比如ws2_32.dll里面的send、recv,WSASend,WSARecv ,connect是必须要监测的,外挂程序可能会通过hook这些函数来达到监听和篡改游戏封包的目的。

   hook API函数常用的方法有使用微软提供的detours库或者使用inline hook 来修改。下面我们来了解一下hook api函数的方法。

一、detours库的使用
detours下载  比较简单,直接上演示代码,下面是hook connect函数的演示:

  1. #pragma once
  2. #include "pch.h"
  3. #include "detours.h"
  4. #include <Windows.h>
  5. #include <WinSock2.h>

  6. #pragma comment (lib,"detours.lib")

  7. typedef int (WINAPI* type_connect)(
  8.         _In_ SOCKET s,
  9.         _In_reads_bytes_(namelen) const struct sockaddr FAR* name,
  10.         _In_ int namelen
  11.         );

  12. type_connect g_fnconnect_real = ::connect;

  13. HANDLE g_thread_hook = NULL;

  14. void HookApi(LPVOID *trueFunction, LPVOID newFunction, bool install)
  15. {
  16.          
  17.         if (install)
  18.         {
  19.                 g_thread_hook = GetCurrentThread();

  20.                 //装载Hook
  21.                 DetourRestoreAfterWith();
  22.                 DetourTransactionBegin();
  23.                 DetourUpdateThread(g_thread_hook);
  24.                 DetourAttach(trueFunction, newFunction);
  25.                 DetourTransactionCommit();
  26.         }
  27.         else
  28.         {
  29.                 //卸载
  30.                 DetourTransactionBegin();
  31.                 DetourUpdateThread(g_thread_hook);
  32.                 DetourDetach(trueFunction, newFunction);
  33.                 DetourTransactionCommit();
  34.         }
  35. }
  36.   

  37. //调用函数 hook connect
  38. HookApi(&(LPVOID&)g_fnconnect_real, (LPVOID)&Hook_connect, true);  

  39. //hook 后会,每当执行connect函数时会首先执行转向本函数
  40. int WINAPI Hook_connect(
  41.     _In_ SOCKET s,
  42.     _In_reads_bytes_(namelen) const struct sockaddr FAR* name,
  43.     _In_ int namelen
  44. )
  45. {
  46.     //编写你的处理过程
  47.     ...

  48.     return g_fnconnect_real  (s,name,namelen;
  49. }
复制代码
二、inline hook的使用
    inline hook 其实就是通过直接修改可行代码,使之转向到执行我们的函数的过程。理论上inline hook 可以在任意位置进行hook转向 ,只要保证好堆栈平衡就行。

    inline hook的原理就是修改一条跳转代码(jmp xxxxx) ,机器码为 E9 。比如我们要 hook connect ,代码如下

  1. //1、保存真实connect的地址
  2. type_connect g_fnconnect_real = ::connect;

  3. //2、保存connect 函数开头5字节
  4. char g_first5chars[5];
  5. memcpy(g_first5chars,0,sizeof(g_first5chars));

  6. //修改机器码使之跳转到 Hook_connect
  7. //这里如果代码不可写,需要先调用 VirtualProtect 修改为可写属性
  8. *(BYTE*)g_fnconnect_real = 0xe9 ;
  9. *(DWORD*)((BYTE*)g_fnconnect_real +1) = (DWORD)Hook_connect - (DWORD)g_fnconnect_real  - 5;


  10. //hook 后会,每当执行connect函数时会首先执行转向本函数
  11. int WINAPI Hook_connect(
  12.     _In_ SOCKET s,
  13.     _In_reads_bytes_(namelen) const struct sockaddr FAR* name,
  14.     _In_ int namelen
  15. )
  16. {
  17.     //编写你的处理过程
  18.     ...

  19.     //还原原始函数头5字节
  20.     memcpy(g_fnconnect_real ,g_first5chars,sizeof(g_first5chars));


  21.     return connect_real (s,name,namelen;
  22. }
复制代码
三、监测API是否被hook
    我们已经了解外挂作者可能会如何 hook 我们的函数了,总之要hook API 必定会修改到我们的可执行代码。对应的版本有两个:一是不停地覆盖还原原始的代码,让hook失效。二是检测代码是否被修改,如果修改了就告知服务器(注意:一般封挂都不是在客户端直接弹出提示,让破解者轻易找到应对办法),由服务器端处理发送消息、断开连接、记录日志等。

    一般可使用crc校验法或者自己编写累加和算法校验。可随意设计,下面是自己编写的校验和例子:

  1. DWORD game_memory::calc_checksum(BYTE* pBuffer, DWORD dwCheckLen, DWORD dwStartSum )
  2. {
  3.     DWORD dwSUM = dwStartSum;
  4.     WORD* pWord = (WORD*)pBuffer;
  5.     while (dwCheckLen >= 2)
  6.     {
  7.         dwSUM += *pWord;
  8.         if (dwSUM >= 0xffffffff - 0xffff * 2)
  9.         {
  10.             dwSUM = (dwSUM & 0xffff) + (dwSUM >> 16);
  11.         }
  12.         pWord++;
  13.         dwCheckLen -= 2;
  14.     }

  15.     pBuffer = (BYTE*)pWord;
  16.     while (dwCheckLen > 0)
  17.     {
  18.         dwSUM += *pBuffer;
  19.         pBuffer++;
  20.         dwCheckLen--;
  21.     }
  22.     return dwSUM;
  23. }
复制代码
总结
      本文是介绍HOOK API的常见方法,以及通过校验API函数是否被非法HOOK 来判断玩家是否使用了外挂的方法。具体编写实现方法可自行设计,尽量让设计隐晦一些不那么容易被发现和破解,程序设计时尽量不要有API参考和字符串产考、尽量不要使用静态全局变量保存重要数据,指针层数越深越好。不要通过本地检测之后直接得出结论并弹出提示。

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠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 17:54

Powered by Net188.com X3.4

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

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