【游戏修改】单机游戏无敌不死功能的原理及实现
前言
在游戏中打遍天下无敌手,一直是我们梦寐以求的。
本篇以经典游戏《雷电2》为例,演示在PC单机游戏中无敌功能的实现。
开始
游戏中要想无敌(不死),根据游戏的不同,修改方式也有不同。
大致可以分为两种:
1.根据血量来判断人物是否死亡,一般血量等于或小于0则触发死亡。
2.碰撞检测来判断人物是否死亡(如碰到怪物、子弹等)。
这里我们以《雷电2》为例,来实现该游戏的无敌功能。
游戏界面如图:
这个游戏是一款纵版射击游戏,想必也是许多人儿时的回忆,非常经典。
分析思路:
该游戏的死亡方式为:碰到敌方怪物,或者被子弹击中。
我们定位到相关代码,修改其逻辑即可实现无敌。
我们知道,游戏类中都会有人物(这里是飞机)状态的属性(是否死亡)。
而游戏线程中则会判断体积碰撞,如果碰到敌机,或者子弹,则改变这个属性的值,主线程则更新人物(飞机)状态等业务。
因此我们可以通过在内存中搜索这个属性的值来定位,找出是哪里修改了这个值,则可以找到碰撞判断的代码。
这里我们假设该属性为“人物死亡 ”无敌单机游戏,也就是说正常状态下,该属性的值为false(0),死亡状态下,该属性的值为true(1)。当然实际情况可能相反,我们可以多次尝试。
我们用Cheat Engine打开游戏,在死亡的时候,搜索1(2字节):
然后等待人物复活,再搜索0:
如此循环往复过滤搜索到的数据:
只剩下两个了,这里的第一个是绿色的(代表基址),我们优先选择这个。
然后在上面点击右键-找出是什么改写了这个地址:
再去游戏里面玩一会,就可以得到以下结果:
我们选择碰撞到飞机的那一条无敌单机游戏,点击显示反汇编程序:
就可以定位到汇编代码中。
可以看到上方有个jne(不相等则跳)跳转跳过了这个修改人物状态的代码,可以猜测就是碰撞检测的判断,我们把这个jne修改为jmp,即可让他跳过死亡的代码。修改后:
再去游戏里看看:
可以发现现在即使我们撞到了敌机,也不会死亡了。
但是会被子弹打死,我们再以同样的方式修改子弹判断的地方:
至此我们便实现了无敌功能:
总结
游戏线程中一般存有人物状态的属性或称变量(是否死亡或者是否存活)。
我们可以在死亡和存活的状态变换,然后搜索0或者1,来定位该属性的基址。
通过寻找修改这个属性的地址,找到碰撞检测,或者死亡CALL,修改其逻辑从而达到无敌的效果。
上一篇:邪恶玄武怎么捕捉?
推荐阅读