游戏安全的学习(4)
游戏安全的学习(4)—— 猫里奥外挂编写。
这也就是一个单机游戏,如果游戏作者觉得侵权了可以联系删除。
游戏分析
突然想起了之前一个很搞人心态的游戏,就是这个猫里奥,各种陷阱防不胜防,因此今天打算用点科技的力量去对抗这个东西。八关版的外挂已经有人做了,这里我用九关版的,下载地址。
坐标读取和修改
首先最简单的就是获取坐标,使用CE反复横跳搜索内存,最终确定了 X 和 Y 坐标的地址分别是在 +78DDC
和 +78DE0
这两个地方,基于此可以做出一个读取坐标信息,修改的目的。
对应代码也非常简单。
1 | DWORD CCatMariGuaDlg::FindProcess() { |
演示:
也是可以成功实现功能。0,0坐标是当前屏幕的左上角,并且只对屏幕做相对坐标运算。
如果想要实时获取目标的坐标可以考虑
无限跳跃
首先可以确定一点是,代码实现跳跃功能肯定要加一个变量限制,如果不加那么肯定会实现无限跳跃的功能。加了之后我们可以选择,如果碰撞器碰到地面,那么这个时候变量恢复成1,表示可以按↑跳跃,在空中就不能跳跃。
经过分析,是在 0x0478D98
地址的变量保存了这个值。
如果我们把把这个值改成 0 的代码 patch 掉,就可以达到无限跳跃的目的,但是同时会失去碰撞体积,这里有两个代码,都patch掉才能无限跳跃。
1 | BYTE NOP[10]={ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }; |
这里我选择了一个复选框,让它勾选可以允许无限跳,做一下控件的API调用。
1 | void CCatMariGuaDlg::OnBnClickedCheck1() |
最终实现:
不死
这应该是我们比较追求的一个目标,但是由于场景中坑人的元素很多,它们代码不是共用的,所以我们要一一patch掉这些能让我们死的代码。最关键的数据地址在 0x478DD0,它标识了我们的状态,找到对它写的代码。共有以下的分析:
1 | 碰到怪物,发射火焰 2465D: |
一一做一个patch和恢复的控件和代码,其实原理都一样。
最后展示一下外挂的最终状态:
这里不一一演示其它的功能了
放一下最终外挂的exe程序,Y轴锁定和吃星星会死的设定我还没搞明白,也没有那么多时间去钻研了,也就图一乐,现在我也是能两分钟速通猫里奥的人了hhh。