月度归档:2013年07月

浅谈如何修改游戏 (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 修改的一般性方法。

 

着凉与发烧

在中国传统里,冷是非常可怕的东西。比如传统坐月子时妇女一定要穿得严严实实,门窗紧闭不能出门。比如传统家长带孩子时,即使夏天也要捂的严严实实,袜子也是必不可少的,因为“寒气脚上来”。传统认为,感冒是着凉引起的。一旦着凉了,会变得怕冷。如果出现了高烧,需要用被子捂出汗来才能好。总之,冷是一切邪恶的根源。

众所周知,现代医学已经证明了,感冒是由感冒病毒引起的。它和寒冷到底有没有关系呢?其实医学界对此问题一直非常的感兴趣,做了很多得类似实验。比如,让两组大学生志愿者先接触感冒病毒,然后A组被迫去洗冷水澡,然后光着身子用空调对着头猛吹,B组则穿着大衣温暖舒适的在屋里休息。经过统计分析,两组人之后染上感冒的概率基本是一样的。类似很多实验都证明了这一点,就是感染感冒和冷热变化无关,只和是否接触到感冒病毒有关。

为什么直观感受觉得冬天感冒的人比较多呢?其实也有很多猜测,比如因为冬天大家减少了室外活动,在室内,因为近距离接触,感冒病毒增加了传播几率。

冷确实会带来一些不适。比如有些人遇到冷会流鼻涕,有些人会拉肚子。但这些并不是感冒引起的。人体在冷热变化很大的情况下会有各种不适反应,但是其实和感冒无关。其实在多接触冷热变化之后,人体也会慢慢适应冷环境,身体会变得更好。

7d000298gw1e09gaai20yj在西伯利亚生活的孩子们,两三岁就会脱光了在冰天雪地里跑步锻炼身体。毛主席也有冬泳的好习惯。冷锻炼实际上会增加抵抗力,改变人怕寒的习惯。一直窝在温暖房间里的孩子,才会一旦遇到冷就身体各种不舒服。

之前有网上流传过的一个帖子,说苏联当年让中国人养成了穿秋裤的习惯,就是为了要改变中国人种,让中国人从此不能耐寒。这篇文章毫无科学依据,也很搞笑,是一篇钓鱼贴。但是实际上有一些道理,就是人需要从小培养不怕冷的习惯,只有习惯了冷热变化,才不会变的娇生惯养,遇到冷就哭爹喊娘。

下面说说发烧。发烧大多数情况是由于感冒引起的。先来说一说人为什么会发烧。人是一种恒温动物。对于身体现在需要散热还是保温,是靠什么来调节的呢?人的脑部有一个视丘下部的区域,负责收集皮肤和血液里的温度变化,它的敏感度能精确到0.007摄氏度的程度。一旦发现冷了,就会收缩血管皮肤,减少体表流动血液,控制肌肉抖动制造热量;一旦发现热了,就会控制皮肤和血管扩张汗腺流汗,等待空气流动使汗液蒸发带走多余热量。在人生病的时候,视丘下部会适当调高这个温度,使得人体温度上升。为什么会主动调高温度呢?很多研究表明,这其实是进化出来的一种技巧,过热的温度会加速免疫反应,增强白细胞和巨噬细胞的能力,还会对某些对温度敏感的入侵细菌有致命作用。所以发烧其实是人体保护自己的一种手段。

在低烧的时候,其实不需要进行任何处理,因为上面说了,发烧本身是一种人体自我保护的机制,等病好了,人体又会自动恢复回原来的体温。但是如果高烧过了40度,就会对身体的细胞组织造成伤害,也可能让人体丧失温度控制的技能,这时候才需要对人体进行降温。这时候其实最为有效的,就是物理降温。

每当我看到有家长说孩子高烧40多度,物理降温无效,我往往会觉得很荒谬。自从空调被人类发明出来以后,物理降温早就不可能是什么问题了。有些家长一边给孩子吃着退烧药,一边用被子捂着汗。缺少空气流动,流再多的汗也无法散去身体里多余的热量,反而会使得孩子越来越热。发烧时确实会觉得冷,因为这时候身体温度阈值过高,大脑会调用体表血液去内脏,保证关键部位的温度,这时候会手脚冰凉,打哆嗦让肌肉抖动产生额外热量。但是发烧时如果要物理降温,千万不能捂着,不管如何吃药出汗,捂在被子里只会物理升温。

至于说空调会给高烧的孩子带来什么危害,实际上上面也说过了,寒冷不会给人体带来什么额外的烦恼,也不会增加孩子发病的几率,最多是有一些不适和不舒服。寒冷和人体的抵抗力无关。一旦发烧需要物理降温时,空调或者电风扇是最好的降温手段,衣服应该尽可能的少穿。有一个极端的例子,一位家长带着高烧的孩子去国外医院看病,大夫把孩子身上裹着厚厚的大棉袄剥光,拉过来一个电风扇,对着猛吹了10分钟,这时候高烧已退。

当然,水分的补充是必不可少的,因为人体主要带走热量的手段就是靠汗液的蒸发。吃退烧药,实际上是最后的不得已的手段,对于孩子来说,不管哪种退烧药都有强烈副作用,而退烧药的唯一作用也就是恢复温度调节,让人体增加汗液蒸发。退烧药并不会吃下去就能退烧,热量最终依然还是得依靠汗液蒸发被带走。

一个在水木社区上看到的真实的故事:孩子高烧了几天,不停的说觉得手脚冷。家长用大被子裹着孩子,给孩子喂了很多退烧药都没法退烧,孩子到后来还不肯吃药。家长把孩子带去北京306医院急诊。医院给用了有巨大副作用的中药注射液:喜炎平,刚开始吊水5分钟,孩子就陷入了过敏性昏迷。医院经过了半小时抢救总算是缓了过来。在医院住院了5天,吊了很多瓶水,最后康复。

这样的故事在身边不断上演,实际上,脱了衣服吹一吹电风扇或者空调就可以解决的事情,却演变为吃药、吊水、住医院。很多医生也一再在微博上呼吁,孩子感冒发烧不用送医院来急诊排长队,浪费钱浪费医院资源,也损害孩子的健康。儿童医院的急诊已经被发烧完全占领,真正的大病急病没法得到及时医治,医院往往为了让家长安心,不得不找一些无效甚至有害的药来吊水,最后是谋财害命的悲剧。

当然,不是说所有发烧都不提倡去医院。只有确认是感冒引起的发烧,是无需去医院的。因为感冒没有治愈手段,等待人体6-7天自愈即可。对于孩子来说,尽可能避免在6岁前吃任何药(除了打疫苗)是对他健康成长最大的帮助。