ramlife

转自: https://www.zhihu.com/question/50708730/answer/685989048

作者:任鸟飞
链接:https://www.zhihu.com/question/50708730/answer/685989048
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

受宠若惊,出差一天近1000个赞,不好意思各位昨天没时间回评论。
近期还会放几个cs的功能,希望感兴趣的同学们多多关注哦。

Fps游戏中你的每一次视角移动,角色移动都是即时的,如果全局上传,误差极大。它对玩家的体验要求非常高,所以为了防止网络通信导致的人物卡顿等情况发生,很多重要数据都会放在本地去处理,这也为外挂提供了便利(错别字经评论指正 “之前是遍历”暴露职业)。

一般来说,FPS游戏的变态功能可以用两种办法实现,第一种是通过篡改游戏代码的方式来达到普通玩家无法实现的效果,第二种是通过篡改或者重发协议等方式实现。但其实现的根本还是在于协议封包的篡改和重发。下面我们通过篡改本地协议的方式来分析并实现CS1.6无限手雷。
首先,对手雷的基本情况进行分析,我们发现这款游戏最多只能带一个手雷,这样很不便于我们搜索数量寻找突破口,而闪光弹是可以带两个的,所以我们可以先找到闪光弹的数量,并在周围分析手雷的信息(如图)

用CE对闪光弹的数量进行查找和过滤,可以得到3个结果(如图)

扔掉一个闪光弹,并分别将三个结果改为2,发现第二个数据修改以后,可以改变真实的数量,于是我们在OD数据窗口中跟随这个地址(如图)

买一个手雷之后再次观察附近的地址(如图)

我们发现+4的位置从0变成了1,这很有可能是手雷的数量,我们在这个地址上下硬件写入断点,扔出手雷的瞬间游戏断下(如图)

手雷的数量来源是一个写入的ecx,而ecx来源于dec,这说明每次我们扔手雷,这里都会减一。而ecx又来源于[eax],这是手雷数量的另一个地址,为了能保证我们的手雷数量始终大于1,我们可以将1E787538处的代码改为mov byte ptr [eax],2 ,并且将1E78753B处的代码NOP掉,这样手雷的数量就固定在了2(如图)

手雷实现了无限数量,但是我们还需要让手雷的投掷速度加快,这就需要我们对周围的代码进行分析。一般来说,投掷速度的数值都是浮点数,所以我们在周围的代码中观察下是否有浮点数操作的代码出现。我们在上面的1E78745B处发现了一个浮点数参数(如图)

这个数值是1.5,和我们的投掷速度很接近,我们尝试将其改的小一些,比如0.1,这是再次投掷手雷,结果悲剧了,手雷在抛出的瞬间爆炸了(如图)

这说明我们找到的并不是手雷的投掷速度,而是爆炸时间。算是一个意外收获,我们可以将时间改长一点,当定时炸弹来使用。
电脑死机,重启继续分析投掷速度,在05B57508附近我们发现了几条浮点数传递的代码(如图)

首先观察基地址里面的双浮点数,数值为0.75(如图)

将其传递给esi+B8,用CE观察这个地址中数值的变化,我们发现在投掷手雷之后这个数值会从0.5逐渐减少为-1,说明这个数值是一个类似于投掷冷却的时间。我们尝试将基地址改小一些,再次投掷手雷,可以瞬间扔出很多个(如图)(如图)

当我们进行测试的时候发现这个数值不仅仅可以改变手雷的投掷速度,还可以改变游戏的重力效果,我们将其改小之后,不仅跳的高,而且落地不会受到伤害,说明这个基地址是对多个功能有效的,如果我们仅仅想改变手雷的投掷,则需要通过篡改相应的汇编代码而不是改变基地址里的数值。
最后放一个效果图

题外话
cf实现子弹加速
cs无限子弹 无后坐力 子弹加速
----------------------------分割线---------------------------
本人每天需要讲课 ,会把每天讲的课以文章的形式整理出来。
本文章仅限于交流,如果本文章侵犯了贵公司权益,请联系我删除。
点赞是一种鼓励,转载是一种美德,分享能给我最大的动力,如有不足之处请予指正。
编辑于 2019-05-22

分类:

技术点:

相关文章:

  • 2021-12-29
  • 2022-12-23
  • 2022-12-23
  • 2021-11-29
  • 2021-12-16
  • 2021-12-09
猜你喜欢
  • 2021-12-31
  • 2021-05-30
  • 2021-12-29
  • 2022-12-23
  • 2021-11-22
  • 2021-12-29
  • 2021-09-22
相关资源
相似解决方案