CS1.6全屏秒杀及飞刀逆向分析
1、 飞刀
大概两种思路:
1、动画音效。不同的动作有不同音效,并且在cs游戏下通常可以看到音效.wav文件,因此可以通过对音效的过滤回溯到相关逻辑。比如CreateFileA/W、PlaySound。
2、逻辑分析。手持枪械时,可以触发攻击逻辑,但近战武器则无法触发,通过定位射击逻辑回溯上层,找到原始的攻击触发逻辑进行修改。
这里使用第二种方法,这里可以假设伪代码如下:
1 | |
首先需要定位到关键位置,攻击生效的最明显体现就是扣减生命值,因此通过对敌人的血量进行访问后回溯
对光标处设置int3断点,然后使用近战武器攻击,是对方掉血,然后记录返回的堆栈。
这里只记录5层,因为实际上有分析过,5层中已经足够了,这里直接全部下断点。分析开始前,需要明确两个点:
1、只有攻击 & 攻击成功后才会触发逻辑,因此非该动作下不会触发断点。
2、由于不知道近战武器和枪械触发的逻辑是否属于同一链路,因此最好从最外层开始分析。
上边两点其实试一下就能有结果了,这里直接放结果。第5层就是触发攻击逻辑(nop call后无法触发攻击),对其进行下断点。
然后我们对着墙或者人物划一刀(可以击中的状态),断点被触发。
由于不知道枪械和近战是否存在逻辑区分,因此这里F7单步进入call后进行F8跟踪的时候需要额外注意跳转是否实现。这里中途可以看到上边的思路1的相关逻辑。
他这里会播放wav,实际上这里就是在判断近战武器是否击中,然后播放对应的音效。其实hit是击打音效,slash是未击打音效。大概跟一遍后,返回到外层,重新下断,这时候凭空攻击。
同样F7进入后,F8单步跟,并且记录跳转是否实现。
这里观察到之前的实现的跳转现在没有实现了,说明这里可能是一个关键点,包括下面这张图的位置。
最后会发现他去执行了这一串代码
这一串刚刚好是播放未击中音效的代码。再继续F8单步跟,发现他直接ret了,并没有去执行我们第4层的攻击代码。
经过以上分析,我们得出了两个关键点,那就是那两个jne跳转。在我们对墙壁或者人挥刀并且成功击打的时候该跳转是实现的,但是现在我们对着空气挥刀发现他跳转没有被实现,那么说明该跳转就是关键跳转,而且他们都是对同一个地址进行了读操作,所以游戏很有可能是对该地址的值进行一个校验,来判断是否能击打。
首先这个代码是一个很典型的浮点数比较代码,大概就是将0x19FEC660 和st(0)比较后把状态值传给ax,然后ah判断是否能击中物体。我们用CE看看这个地址的值。
发现是0,我们尝试改为1。回到游戏的时候,发现我们挥刀的时候竟然是击中的音效。此时全屏飞刀已经实现。
2、 全屏秒杀
虽然我们实现了全屏飞刀,但是会发现,当我们向敌人挥刀的时候,发现敌人并没有掉血。其实还需要一个东西,那就是选择攻击对象,对上边的call进一步分析,发现执行到倒数第4层时,发现了攻击对象。
这里做了简单的判断,如果攻击对象为NULL那么就ret,否则就对攻击力进行一个赋值,然后进行攻击。在这里我们可以去观察我们上边飞刀的时候,他的攻击对象一直为NULL,那就说明他没有选择一个攻击对象。我们换成枪,去打一下敌人,发现他的内容变了。我们直接锁定,然后换成刀去划,发现这个时候刀已经有伤害了,而且对着哪里划都能打中,包括枪。顺手再修改攻击力,这时直接是秒杀。
这里简单对攻击对象回溯了一下,发现有地方在初始化清NULL。
直接在头部ret,不让他初始0,然后再用程序去写入会更稳定些,因为游戏会调用这个call,进行清0。