【干货】如何使用CE进行游戏逆向?09:实现子弹连发

文摘   社会   2025-01-01 18:02   广西  
本期教程我们将探讨如何实现子弹的快速连发效果。首先,我们回到游戏中,观察开枪的过程。我们可以发现,第一枪和第二枪之间存在明显的间隔。第一枪可以立即发射,但第二枪需要等待一段时间,直到第一枪加载完毕后才能发射。
我们可以推测,在游戏中可能存在类似计时或计数的机制,不断检测时间或计数值,当达到某个条件时,就可以发射第二枪。那么,如何搜索这个值呢?考虑到之前学过的搜索未知数值的方法,我们可以尝试使用类似的方法。由于数据类型不确定,可能是浮点数,也可能是整数,我们可以选择扫描所有类型或搜索未知初始值来进行搜索。
然而,现在的问题是,如何进行第二次搜索?我们希望找到这个数值的变化,但问题是如何进行搜索?我们可以尝试在开枪瞬间搜索这个变化,但很明显,这个变化瞬间太难捕捉了,因为它发生得太快了,甚至在我们把鼠标移到准心上之前就已经发生了。
有人可能会考虑使用热键,但即使使用了热键,也很难捕捉到这个间隔。那么我们该怎么办呢?我们可以尝试切换到另一把枪,比如狙击枪。因为狙击枪的加载速度非常慢,所以效果会更好。但为了演示方便,我们选择了散弹枪,因为它的速度介于步枪和狙击枪之间。
好,我已经切换到散弹枪了,大家可以看到它的速度明显比之前慢了很多。但是我要演示的不是这个。我要假设一种情况:假设散弹枪的速度仍然是难以捕捉的。
那么我们该怎么办呢?其实在C中有一个功能叫做变速,我们可以打开这个启动加速器。当然,这个版本的翻译可能有些奇怪,但在其他类似的标签中也会有这样的功能。勾选上以后,我们可以将速度调整得更快,比如调成五倍速。现在我已经将速度调好了,现在是五倍速。
你可以发现游戏已经非常快了,整个游戏不仅仅是开枪速度,所有的一切都以五倍速运行。当然,这不是我们想要的效果,我只是告诉你,这个功能可以实现全局加速或减速的效果。
那么我们利用这一点,将速度调慢一些,比如调到0.25倍。现在,不论是人物走路还是开枪,所有的一切都变得非常慢。这样我们就更有时间来捕捉开枪瞬间的变化,这样就更有利于我们去搜索了。
现在我们再去选择新扫描,搜索未知的初始值。然后在开枪瞬间去搜索这个变化的数值。我直接按下了热键,为了加快速度。因为我是在开枪瞬间去搜索这个变化的值,现在子弹已经准备好了,我可以再次去搜索变化的值。
因为我们还没有开枪,现在还是准备状态,所以我们搜索未改变的值。然后再走两步路,再次搜索未改变的值。然后将枪切换一下,再切回来,现在仍然是准备状态。
我们再次搜索这些未改变的值,然后再跑跑、跳一跳,以观察速度,然后再次开枪,搜索变化的值。等到子弹准备就绪后,再次搜索变化的值。我们可以反复这样筛选,然后再切换武器,再切回来。
好,现在通过不断的筛选,我们终于只保留了八个值。现在我们可以通过开箱来看看这些值,将它们全部拿下来。其中,有很多是双精度浮点数,你会发现它们有一部分的地址是完全相同的。为什么会出现这种情况呢?是因为他们将同一个地址里面的数据解析成了四字节整数和双精度浮点数,实际上他们都是同一份数据。我们只需要确定哪个类型是我们需要的即可,包括后面的三个和前面的三个都是这种情况。
我们开箱来看一下,可以发现如果将它们当成小数来解析,会变得特别复杂,所以我们可以将这些特别杂碎的小数全部删掉。这样只剩下三个值了。其中,第一个值是开枪的瞬间是一和880,而子弹准备就绪的时候,它们两个都是零。那到底哪个是我们需要的呢?我们可以分别锁定看一下。
如果我们锁定第二个,你会发现子弹已经用完了,而如果我们锁定第一个,你会发现它无法实现连发。所以,我们现在已经实现了一个可以连续射击的简单快速射击效果。
但是,如果我们换成之前的步枪,你会发现效果不同。开枪后,你会发现步枪好像被锁成零,根本没有变化。那么我们该怎么做才能让它实现对步枪有效的修改呢?
我们可以利用之前讲过的修改代码的方式来解决这个问题。现在我们再切回那个场景,当我们开枪时,这个地址的值又会变成880,你可以看到吧?然后我们去查找谁写入了这个地址,可以发现有一条不断往里面写零的代码。我们之前分析过,当它为零时,我们就可以开枪,所以我们希望它保持零的状态,这样我们就可以开枪。
我们再次开枪看一下,你会发现里面立马多了一条代码。我们可以看一下它的值是多少,它的ECX的值是多少,因为他在往这个地址里面复制。我们转换一下,可以看到它就是十进制的880。也就是说,这条代码一旦执行,我们这个地址里面的值就会变成880,这样我们就没有办法再开枪了。所以我们希望它不要执行,我们之前也讲过了,只要把它替换为空的操作码,就能让它什么也不做,也就是说他根本就没办法给这个地址里面附一个880的值。
我们把它替换为空的操作码以后,我们再来实现一下,这个时候我并没有锁定这点,但是同样可以实现一个快速射击的效果。你看到了吧?没子弹了,子弹已经打出去了,但是子弹已经用完了,这个枪口火焰没了,但是还是可以看到子弹确实是打出去了。然后我们再切换到步枪看一下效果,把我们的子弹改多一点,再来到我们之前找到的无后坐力的地方,把这条代码给它替换为空的操作码,可以实现一个鼠标的无后坐力。
然后我们再开箱看一下,你会发现,因为我们只是改掉了鼠标的后坐力,所以说他这个反冲的效果还在,只不过鼠标已经不会再乱晃了。这个时候你可以看一下,我这个射速到底有多快啊,看到了吧?这个通过这个后坐力就已经能够发现我们的射速有多夸张了。因为我们这边子弹的数量是锁定的,所以看不出来。我们把它解锁了,看一下,现在是2000发子弹,我就按一秒钟,你会发现我只用了一秒钟时间就打出来了六七十发子弹。这个射速可以看到吧?很夸张啊。而且现在的速度,他这个CE的这里变速好像有点问题,但是实际上现在还是一个处于比较慢的状态,我能感觉到,因为我在操作,你们看文章可能感觉不到。
那我们可以开几枪试一下这个射速啊,看到了吧?这个是非常夸张的啊。那我们本期教程就讲到这里,主要是还是带大家去体会一下,如何通过修改代码的方式来修改游戏的逻辑。这是第一,第二呢就是了解了一下我们这个修改游戏速度,来帮助我们去搜索一些难以捕捉的值这样一个方法。
这几期的内容其实是有一点重复的,但是就是锻炼一下大家的思维,让大家知道怎么去修改游戏中的一些功能,实际上就是通过相关数据,然后去查找一些关键的代码去修改这条代码,或者说去修改一些关键的跳转。那么本期教程就到这里了。

暮色的狐
这是一只高强度上网冲浪、高质量输出内容的狐狸。主打ACGN杂谈、技术干货分享、第九艺术鉴赏、网梗百科解析、情感树洞鸡汤、正能量价值观~
 最新文章