浅谈如何修改游戏 (1)

很多很多年前,那时 DOS 游戏界有着两大逆天神器 GameBuster 和 FPE。不管是仙剑奇侠传还是红警神马的,一旦祭出神器,那是神挡杀神佛挡杀佛,弹指间敌人灰飞烟灭。

到如今几十年的发展,游戏变得越来越网游化和移动化。大游戏动辄十几G的容量,数据都存在服务器,外挂检查严而又严。小游戏在iPhone和Android上,麻雀虽小五脏俱全,对作弊的检查也是非常严格,数据加密和校验方法层出不穷。

然而道高一尺魔高一丈,本文就尝试粗浅的介绍下现如今修改游戏可以做的一些手段。

对于 Windows 游戏修改手段来说,大概可以分为下面一些层次,按照安全性排序:

  • 对数据段的内存读
  • 通过 PostMessage 对游戏模拟键盘和鼠标操作
  • 对 D3D9 的 EndScene 或者 D3D11 的 Present 函数挂钩子,进行远程调用
  • 创建远程线程 (RemoteThread) 去调用执行函数
  • 模拟游戏发送网络底层的命令包
  • 对数据段的内存写
  • 对代码段的直接修改

对游戏的数据段的读取,是最安全最可靠的。游戏本身无法判断其它应用是否对它进行内存读的操作。然而,只靠内存读可以做的事情非常少,不过依然有可能读取到游戏里隐藏给玩家的数据。比如人物的三维坐标、朝向、行进速度、或者隐藏Buff啦,比如法术的实际释放坐标和半径,以及前进路线啦。

想要更进一步的对游戏本身进行操作,那么可以用按键精灵,或者类似的工具,模拟鼠标和键盘事件发送给游戏。但是这依然无法产生逆天的效果,实际上可以做一些机械性重复性特别高的事情。这类工具本身的可侦测性也是非常低的,比较的安全可靠。

EndScene 和 Present 实际上是游戏UI线程一般在绘制完一帧图像之后必须调用的。很多录像软件也是 Hook 的这两个函数。所以实际上这是很安全而且很合法的钩子。在 EndScene 里做操作的好处在于,很多游戏里的操作函数需要运行在游戏UI线程。如果用 RemoteThread 的方式去调用函数往往会导致线程问题然后游戏崩溃。

RemoteThread 调用实际上用于一些简单的判断函数,比如得到某个游戏对象的名称,判断某个 NPC 的敌对状态。这些执行函数不需要在主线程执行,可以用 RemoteThread 飞快的调用完成。RemoteThread 的执行速度和 EndScene Hook 相比往往要快上百倍。

而发送游戏的网络底层命令包,则需要对游戏的网络通讯协议有一定的了解。它可以跳过游戏上层逻辑对命令合法性的判断,直接用底层协议对服务器通讯。通过这个办法可能可以做一些客户端里无法完成,但是服务器却允许的操作。它的安全性也不够高,如果命令非法,也可能造成服务器拒绝继续服务,导致掉线或者客户端崩溃的结果。

对数据段的内存写,实际上是早期游戏修改的大招了。然而,现今绝大多数网络游戏都有防护措施,他们不依赖客户端数据,服务器发现客户端数据不一致,就会拒绝继续服务,导致掉线甚至封号,得不偿失。所以这种手段用到的越来越少了。

对代码段的直接修改,是跳过一些客户端条件检查判断的手段。比如跳过客户端关于法术的 Cooldown 检查,直接向服务器发送法术发送命令。这个办法比直接发送网络底层命令包简单很多,只要对上层游戏逻辑进行修改就可以了,但是它却非常不安全。现今的网络游戏往往具有自我修改的检测能力,比如暴雪的 Warden 会定期的扫描自己可执行文件的代码段,看看有没有被注入钩子或者一些跳过检查的代码。如果被发现了你的客户端在内存中被做了修改,那么就等着过几天静悄悄的被无法登录游戏吧!

想要精确的定位到函数以及变量在内存中的地址,以及数据结构,就需要一些额外的辅助工具了。这里向大家介绍两个工具:Ollydbg 和 IDA Pro。可以说,有这两个工具在手,没有不能修改的游戏。IDA Pro 是非常强大的静态反编译工具,它的插件工具也相当多。读入静态 exe,它可以比较完美的分析出函数地址、函数调用关系、数据结构等。Ollydbg 是动态的运行中反编译工具,通过它,可以对在执行过程中的游戏增加断点,单步调试,等等。这两者可以结合在一起使用。

想要熟练掌握这两个工具,你必须会一些 X86 的汇编指令,可以熟练的编写汇编代码,对 C/C++ 编译有一些了解。有了这些基础之后,就可以随心所欲的对游戏下刀了。当然,有些游戏会有反跟踪和反“反编译”手段,想要修改成功,往往还需要一些耐心和毅力,以及一些直觉和洞察力。

最后,让我们来看看破解过得游戏能做到什么地步。其实很简单,就是能做到游戏的服务器端所容忍的上限。比如游戏客户端允许你的走路速度是 7 码/秒,施法距离是 40 码,而服务器考虑到网络延迟以及客户端的计算误差,往往上限会高一些,比如是 10 码/秒和 43 码。在绕过客户端限制之下,往往可以达到服务器允许的上限。再比如客户端在短期内连续发送很多移动命令,外加计算恰当的时间戳,可以让服务器觉得客户端是出现了卡顿,因此服务器会允许一大串移动命令和一大串偏移时间戳,在服务器看来,客户端卡顿了 10 秒并且移动了 70 码,但是客户端实际只经过了很短时间,做到了瞬间移动。这样的例子需要探索性实验。

如果服务器做的足够精美足够巧妙,其实是可以杜绝任何客户端的修改。然而这需要大量的服务器运算和负载。对于海量游戏数据处理来说,这无疑是会继续增加服务器运营费用和成本。因此很多国产网游的服务器检查非常粗糙和简陋,酝酿出大量的客户端修改和外挂。而好游戏在服务器端的强制检查判断则非常的严格和精妙,从而减少了客户端修改带来的收益。

最后告诫大家,游戏修改破坏平衡性,同时损害了游戏乐趣。网络游戏修改更加破坏了运营商的利益,破坏了游戏的生态环境,要小心被跨省追捕哦。修改有风险,入行需谨慎啊!

下次我们来谈谈 iPhone/Android 修改的一般性方法。

 

浅谈如何修改游戏 (1)》上有1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注