通过两个if语句判断进入上帝模式,在上帝模式里,对人物属性的hungry,sick,wounded等属性做了修改。我猜测这个是官方预留的内挂,通过特定途径,可以开启上帝模式,也就是作弊模式,人物不会饥饿受伤。
切换到ida-view界面查看汇编语句是这样的。
标红的三行,是if语句之后的跳转语句。即把这几个if语句的跳转汇编代码改成nop,函数就不会跳到后面的else GodMode Disabled了。
通过观察,我猜测sub_1DCA34是一个输出函数,如果开启上帝模式,会输出GodMode Enabled;
如果正常游戏,则会输出GodMode Disabled。
于是通过一个HOOK函数输出日志
以上是关键代码。
sub_1DCA34这个函数会被很多函数调用的,所以如果不加个过滤的话,会输出来一大堆无用的字符,干扰我们去找重要的字段。所以同时hook sub_112154。
然后编译,将编译好的dylib拖进ipad,开启游戏,等待奇迹出现的时刻。
随着游戏的加载,出来一大串输出,GodMode Disabled。
看来有戏。
接着想办法干掉那两个if判断,直接执行if语句里面的内容吧。
先看看ida里的汇编代码:
cmp或者tst后面跟一个beq,先比较后跳转,如果把所有的beq改成nop,不就可以直接执行到if里面去了么。
说干就干,先在ida里改下字节码看看效果。已知nop的字节码是 00 bf。
更改完成,接下来按下F5看看伪代码变成什么样子了。
伪码中已经没有了if语句,看来修改是成功的。接下来只需要hook进这个函数,修改内存中的字节码就可以了。
把上文中的func_new_modmem()修改成下面这样
解释一下,int result那一行是把需要修改的地址那个内存分页权限改为可读可写,也就是19,然后下面是修改内存中地址的字节码,最后还要把内存分页的读写权限改回来,也就是后面result那行代码来实现的。
不然编译会报错。
接下来编译通过,把dylib拖进ipad,再次打开游戏,观察syslog刷新
奇迹出现了!
成功开启了上帝模式,这时候游戏已经loading完毕了,看一下我的人,固然所有属性全满,显示content字样,到这里,Twom的上帝模式开启辅助实录就可以结束了。
另外说一下重要的事情,以上的地址,需要使用This war of Mine 1.1版的程序,目前商店已经更新了1.2版本,地址应该不会相同了,不过函数如果还在的话,可以搜索字符串找到,比如在字符串中直接搜索"GodMode"。
如果是64位设备需要模仿本教程的话,需要自行修改游戏的mach-o文件头,改成32位运行模式。当然了,在ida中还是分析32位的binary就好了。
Have a good time。以后有时间我会把打包好的插件放出来的,动手能力强的同学可以自己试着做下,或许会受益匪浅。