回编译之后,我们运行程序,发现有问题,就是点击程序的icon,没反应,运行不起来,我们在查看log中的异常信息,发现也没有抛出任何异常,那么这时候,我们就判断,他内部肯定做了什么校验工作,这个一般回编译之后的程序运行不起来的话,那就是内部做校验了,一般做校验的话,有两种:
1、对dex做校验,防止修改dex的
2、对apk的签名做校验,防止重新打包
那我们就需要从新看看他的代码,来看看是不是做了校验:
我们在分析代码的时候,肯定先看看他有没有自己定义Application,如果有定义的话,就需要看他自己的Application类,这里我们看到他定了自己的Application:com.shuqi.application.ShuqiApplication
我们解压apk,得到dex,然后dex2jar进行转化,得到jar,再用jd-gui查看这个类:
这里我们看到他的代码做混淆了,但是一些系统回调方法肯定不能混淆的,比如onCreate方法,但是这里我们一般找的方法是:
1、首先看这个类有没有静态方法和静态代码块,因为这类的代码会在对象初始化之前运行,可能在这里加载so文件,或者是加密校验等操作
2、再看看这个类的构造方法
3、最后再看生命周期方法
我们这里看到他的核心代码在onCreate中,调用了很多类的方法,猜想这里的某个方法做工作了?
这时候我们就来注入我们的代码来跟踪是哪个方法出现问题了,这里有的同学有疑问,其实就这几个方法,直接一个一个看不就结了,哎,我们这篇文章就是要介绍静态分析技术,当然就需要做案例啦。
下面来看看我们怎么添加我们的日志信息,其实很简单,就是添加日志,需要修改smail文件,我们在去查看smail源码:
关于smail语法,本人认为不是很难,所以大家自己网上去搜一些资料学习一下即可,这里我们可以很清晰的看到调用了这些方法,那么我们就在每个方法加上我们的日志信息,这里加日志有两种方式,一种就是直接在这里调用系统的log方法,但是有两个问题:
1、需要导入包,在smail中修改
2、需要定义一个两个参数,一个是tag,msg,才能正常的打印log出来
明显这个方法有点麻烦,这里我们就自己定义一个MyLog类,然后反编译,得到MyLog的smail文件,添加到这个ShuqiApplication.smail的root目录下,然后在代码中直接调用即可,至于为何要放到root目录下,这样在代码中调用就不需要导入包了,比如SuqiApplication.smail中的一些静态方法调用:
编写日志类MyLog,这里就不粘贴代码了,我们新建一个项目之后,反编译得到MyLog.smail文件,放到目录中:
我们得到这个文件的时候,一定要注意,把MyLog.smail的包名信息删除,因为我们放到root目录下的,意味着这个MyLog类是没有任何包名的,这个需要注意,不然最后加的话,也是报错的。
我们在ShuqiApplication的onCreate方法中插入我们的日志方法:
invoke-static {}, LMyLog;->print()V
但是我们在加代码的时候,需要注意的是,要找对地方加,所谓找对地方,就是在上个方法调用完之后添加,比如:
invoke-virtual,invoke-static等,而且这些指令后面不能有:move-result-object,因为这个指令是获取方法的返回值,所以我们一般是这么加代码的:
1、在invoke-static/invoke-virtual指令他的返回类型是V之后可以加入
2、在invoke-static/invoke-virtual指令返回类型不是V,之后的move-result-object命令之后可以加入