本帖最后由 淡然出尘 于 2015-2-3 18:39 编辑
按照上文的约定,我们继续第三篇文章,找一个游戏来测试此框架和插件的稳定性。
游戏以及测试Hook代码都在附件,这里不再重复叙述,希望读者可以自己对附件中的游戏进行测试分析,掌握hook的简单使用,才是本文最主要的目的。
一个解谜逃脱类的游戏,挺好玩的,我还是未破解情况下玩通上一个版本了,新版本其实也出来两三个月了,过了那个新鲜劲头,就直接破解得了。 游戏正常的破解方面,读者自己去搞吧,一般是看完我以前发过的所有文章,这个游戏是很简单搞定的,在这里,我们不用暴力破解的方式来搞,假设游戏里面加入了很多防护,如文件md5验证,dex修改,签名验证,防回编译之类的,那么只能反编译而回编译不了或者回编译的包不能运行,所以我们需要在不修改游戏原包情况下来操作游戏的破解了。 所以我们先静态分析一下游戏,然后找到关键类: 过程这里不再重复,读者自己去分析一下,hook是基于对方法的操作,如果都找不对关键的call,那么一切都是无用的。
通过这个类,已经很明显的定义了一个Money的Model,用于所有跟Money相关资源的定义。 这里我们对此getMoney()方法来进行hook。 上面截图大家可以看到,我是先采用的暴力破解,直接修改金币数量为99999,如果这个软件有防护,那我们就开始编写插件。 软件使用的基本框架,参照前两篇文章即可,我们只需要用第二篇文章提到的工程,简单修改一些代码即可使用。 1.我们需要hook的类 2.我们需要hook的方法 3.hook方法后的操作 按照我们归纳的这三点: 首先是修改这里,将需要hook的类换成游戏中这个类:
MS.hookClassLoad("com.gipnetix.escapeaction.scenes.money.MoneyModel", new MS.ClassLoadHook()
然后就是hook的方法:(无参,后面用null) log=arg0.getMethod("getMoney", null);
接着就是hook后这个方法的操作:
//调用原getMoney方法,将原方法的返回值放到aa中
float aa=(Float) old.invoke(arg0, arg1);
//修改aa为777777,即原方法返回值已经修改掉了 aa=777777;
System.out.println("金币已经修改为777777");
//返回aa return aa;
Float类型的方法,返回值必然也是float,所以上面我们已经修改数据返回为77777,然后就是安装此插件,重启手机激活插件。 运行游戏,查看log日志:
好了,通过上面两个图,证明我们的修改是有效的。
总结一下:
本文主要进行修改的是无参数方法的hook,修改方法的返回值,然后达到破解的效果,不过一般方法来说,还是有参数的为多,那么下一篇,我们就开始分析一个有参数的方法的hook代码的编写。 编码基础不好的同学,请注意自主学习,网上很多资料的,多翻翻多看看,有付出才会有进步。
相关代码和文档附件:
|