天天看点

跟着鬼哥学android java hook(三)

    按照上文的约定,我们继续第三篇文章,找一个游戏来测试此框架和插件的稳定性。

一个解谜逃脱类的游戏,挺好玩的,我还是未破解情况下玩通上一个版本了,新版本其实也出来两三个月了,过了那个新鲜劲头,就直接破解得了。

    游戏正常的破解方面,读者自己去搞吧,一般是看完我以前发过的所有文章,这个游戏是很简单搞定的,在这里,我们不用暴力破解的方式来搞,假设游戏里面加入了很多防护,如文件md5验证,dex修改,签名验证,防回编译之类的,那么只能反编译而回编译不了或者回编译的包不能运行,所以我们需要在不修改游戏原包情况下来操作游戏的破解了。

    所以我们先静态分析一下游戏,然后找到关键类:

过程这里不再重复,读者自己去分析一下,hook是基于对方法的操作,如果都找不对关键的call,那么一切都是无用的。

跟着鬼哥学android java hook(三)

通过这个类,已经很明显的定义了一个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日志:

跟着鬼哥学android java hook(三)
跟着鬼哥学android java hook(三)

    好了,通过上面两个图,证明我们的修改是有效的。

总结一下:

    本文主要进行修改的是无参数方法的hook,修改方法的返回值,然后达到破解的效果,不过一般方法来说,还是有参数的为多,那么下一篇,我们就开始分析一个有参数的方法的hook代码的编写。

编码基础不好的同学,请注意自主学习,网上很多资料的,多翻翻多看看,有付出才会有进步。

继续阅读