游戏外挂基本原理及实现

游戏外挂已经深深地影响着众多网络游戏玩家,今天在网上看到了一些关于游戏外挂编写的技术,于是转载上供大家参考

  1、游戏外挂的原理

  外挂现在分为好多种,比如模拟键盘的,鼠标的,修改数据包的,还有修改本地内存的,但好像没有修改服务器内存的哦,呵呵。其实修改服务器也是有办法的,只是技术太高一般人没有办法入手而已。(比如请GM去夜总会、送礼、收黑钱等等办法都可以修改服务器数据,哈哈)

  修改游戏无非是修改一下本地内存的数据,或者截获API函数等等。这里我把所能想到的方法都作一个介绍,希望大家能做出很好的外挂来使游戏厂商更好的完善自己的技术。我见到一篇文章是讲魔力宝贝的理论分析,写得不错,大概是那个样子。下来我就讲解一下技术方面的东西,以作引玉之用。

  2 技术分析部分

  2.1 模拟键盘或鼠标的响应

  我们一般使用:

  UINT SendInput( 
    UINT nInputs,   // count of input events 
    LPINPUT pInputs, // array of input events 
    int cbSize    // size of structure 
  );

  API函数。第一个参数是说明第二个参数的矩阵的维数的,第二个参数包含了响应事件,这个自己填充就可以,最后是这个结构的大小,非常简单,这是最简单的方法模拟键盘鼠标了,呵呵。注意,这个函数还有个替代函数:

  VOID keybd_event( 
    BYTE bVk,       // 虚拟键码 
    BYTE bScan,      // 扫描码 
    DWORD dwFlags, 
    ULONG_PTR dwExtraInfo // 附加键状态 
  );

  与

  VOID mouse_event( 
    DWORD dwFlags,      // motion and click options 
    DWORD dx,         // horizontal position or change 
    DWORD dy,        // vertical position or change 
    DWORD dwData,      // wheel movement 
    ULONG_PTR dwExtraInfo  // application-defined information 
  );

  这两个函数非常简单了,我想那些按键精灵就是用的这个吧。上面的是模拟键盘,下面的是模拟鼠标的。这个仅仅是模拟部分,要和游戏联系起来我们还需要找到游戏的窗口才行,或者包含快捷键,就象按键精灵的那个激活键一样,我们可以用GetWindow函数来枚举窗口,也可以用Findwindow函数来查找制定的窗口(注意,还有一个FindWindowEx),FindwindowEx可以找到窗口的子窗口,比如按钮,等什么东西。当游戏切换场景的时候我们可以用FindWindowEx来确定一些当前窗口的特征,从而判断是否还在这个场景,方法很多了,比如可以GetWindowInfo来确定一些东西,比如当查找不到某个按钮的时候就说明游戏场景已经切换了,等等办法。有的游戏没有控件在里面,这是对图像做坐标变换的话,这种方法就要受到限制了。这就需要我们用别的办法来辅助分析了。

  至于快捷键我们要用动态连接库实现了,里面要用到hook技术了,这个也非常简单。大家可能都会了,其实就是一个全局的hook对象然后SetWindowHook就可以了,回调函数都是现成的,而且现在网上的例子多如牛毛。这个实现在外挂中已经很普遍了。如果还有谁不明白,那就去看看MSDN查找SetWindowHook就可以了。

  不要低估了这个动态连接库的作用,它可以切入所有的进程空间,也就是可以加载到所有的游戏里面哦,只要用对,你会发现很有用途的。这个需要你复习一下Win32编程的基础知识了。呵呵,赶快去看书吧。

  2.2 截获消息

  有些游戏的响应机制比较简单,是基于消息的,或者用什么定时器的东西。这个时候你就可以用拦截消息来实现一些有趣的功能了。

  我们拦截消息使用的也是hook技术,里面包括了键盘消息,鼠标消息,系统消息,日志等,别的对我们没有什么大的用处,我们只用拦截消息的回调函数就可以了,这个不会让我写例子吧。其实这个和上面的一样,都是用SetWindowHook来写的,看看就明白了很简单的。

  至于拦截了以后做什么就是你的事情了,比如在每个定时器消息里面处理一些我们的数据判断,或者在定时器里面在模拟一次定时器,那么有些数据就会处理两次,呵呵。后果嘛,不一定是好事情哦,呵呵,不过如果数据计算放在客户端的游戏就可以真的改变数据了,呵呵,试试看吧。用途还有很多,自己想也可以想出来的,呵呵。

  2.3 拦截Socket包

  这个技术难度要比原来的高很多。

  首先我们要替换WinSock.DLL或者WinSock32.DLL,我们写的替换函数要和原来的函数一致才行,就是说它的函数输出什么样的,我们也要输出什么样子的函数,而且参数,参数顺序都要一样才行,然后在我们的函数里面调用真正的WinSock32.DLL里面的函数就可以了。

  首先:我们可以替换动态库到系统路径。

  其次:我们应用程序启动的时候可以加载原有的动态库,用这个函数LoadLibary然后定位函数入口用GetProcAddress函数获得每个真正Socket函数的入口地址。

  当游戏进行的时候它会调用我们的动态库,然后从我们的动态库中处理完毕后才跳转到真正动态库的函数地址,这样我们就可以在里面处理自己的数据了,应该是一切数据。呵呵,兴奋吧,拦截了数据包我们还要分析之后才能进行正确的应答,不要以为这样工作就完成了,还早呢。等分析完毕以后我们还要仿真应答机制来和服务器通信,一个不小心就会被封号。

  分析数据才是工作量的来源呢,游戏每次升级有可能加密方式会有所改变,因此我们写外挂的人都是亡命之徒啊,被人愚弄了还不知道。

  2.4 截获API

  上面的技术如果可以灵活运用的话我们就不用截获API函数了,其实这种技术是一种补充技术。比如我们需要截获Socket以外的函数作为我们的用途,我们就要用这个技术了,其实我们也可以用它直接拦截在Socket中的函数,这样更直接。

  现在拦截API的教程到处都是,我就不列举了,我用的比较习惯的方法是根据输入节进行拦截的,这个方法可以用到任何一种操作系统上,比如Windows 98/2000等,有些方法不是跨平台的,我不建议使用。这个技术大家可以参考《Windows核心编程》里面的545页开始的内容来学习,如果是Win98系统可以用“Windows系统奥秘”那个最后一章来学习。

Game Plug-ins(1)相关推荐

  1. Announcing the Updated NGINX and NGINX Plus Plug‑In for New Relic (Version 2)

    In March, 2013 we released the first version of the "nginx web server" plug‑in for New Rel ...

  2. Struts Validator验证器使用指南

    作者: David Winterfeldt大卫 James Turner詹姆斯 Rob Leland罗伯特 翻译: 侯思超 验证器: 从0.5版,验证器在一些form中就已经实现了,他最初包含在开发人 ...

  3. xcode扩展_如何将Xcode插件转换为Xcode扩展名

    xcode扩展 by Khoa Pham 通过Khoa Pham 如何将Xcode插件转换为Xcode扩展名 (How to convert your Xcode plugins to Xcode e ...

  4. 错误整理:No plugin found for prefix 'jetty' in the current project and in the plugin groups

    在maven进行jetty的调试中出现错误: [ERROR] No plugin found for prefix 'jetty' in the current project and in the ...

  5. 粒子群matlab工具箱,科学网—PSO粒子群优化算法Matlab工具箱 - 白途思的博文

    PSO做实数优化有自身特性优势.而且全局寻优性能比较好. 只是该工具箱中的Trelea, Clerc两种类型的PSO我不了解,正在找这方面的资料看看. Robust Particle Swarm to ...

  6. maven使用mvn命令创建项目异常java.lang.NoClassDefFoundError: org/apache/commons/collections/ExtendedProperties

    命令: mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-gri zzly2 -DarchetypeGroupId=org. ...

  7. 关于SAP2000插件开发的一些总结

    摸索了这么多,总结一下SAP2000插件的开发,以下总结的部分信息引用自CSI SAP2000的英文帮助文档.(中文文档是从英文翻译过来的二手文档,有时候不够新.所以情况许可的话尽量阅读英文文档) S ...

  8. Photoshop菜单_中英文对照

    一.file 文件 1.new 新建 2.open 打开 3.open as 打开为 4.open recent 最近打开文件 5.close 关闭 6.save 存储 7.save as 存储为 8 ...

  9. SitePoint Podcast#32:云中的一切

    Episode 32 of The SitePoint Podcast is now available! This week your hosts are Patrick O'Keefe (@ifr ...

  10. 【ftp】725本电子书下载

    [ftp]725本电子书下载 ftp://202.96.64.144/pub/books/(Ebook%20-%20Pdf%20-%20Java)%20O'Reilly%20-%20J2Me%20In ...

最新文章

  1. Ubuntu 14.04下java开发环境的搭建--2--Eclipse的安装
  2. 如何用python数据挖掘_Python数据挖掘-文本挖掘
  3. python excle写数据
  4. 使用mybatis中的自定义TypeHandler处理PostgreSQL中的Json类型
  5. 各大券商进军人工智能 业内人士:应多措并举促发展
  6. 数据结构压缩_将数据压缩到数据结构中
  7. Python: PyCharm中导入matplotlib时报错:“Backend Qt5Agg is interactive backend”的解决方案...
  8. 学习进度条__软件工程概论第一周学习计划
  9. iOS中 点击按钮无响应
  10. Asp.net Core 一个实用的自定义TagHelpers
  11. JavaWeb之上传与下载
  12. css3怎么实现筛子的效果??transform得常用属性??
  13. android中文首字母排序,Android 实现中文按拼音排序方法
  14. 程序猿的世界~~~~
  15. Aggregation-Based Graph Convolutional Hashing forUnsupervised Cross-Modal Retrieval
  16. QT下载速度慢的解决方法
  17. 检查 Windows 版本与 Windows 更新
  18. plotly画图(包含x轴设置marker类型设置)
  19. 爬取拉勾网招聘信息(招聘岗位,公司名称,薪资等)
  20. 网站存活,ip反查,权重备案查询(方法)

热门文章

  1. docker run出现问题(Client.Timeout exceeded while awaiting headers)
  2. Spring MVC PUT 表单参数获取
  3. 泰坦尼克号 第三章 模型搭建和评估
  4. 数据结构-第一讲 基本概念-学习笔记(MOOC 浙江大学 陈越 何钦铭)
  5. Julia数据可视化:Gadfly.jl包的使用
  6. simple craft system
  7. uni-app动态切换样式
  8. ssd [Error] UnicodeDecodeError: 'gbk' codec can't decode byte 0x81 in position【已解决】
  9. 梅科尔工作室苏慎臻,Django使用ORM增删改
  10. 【FPGA】十一、I2C通信回环