背景

想要逆向分析其他应用,除了需要有smali语法功底外,一套好用的良好的逆向装备也是必不可少的,并且当我们想要更加深入去了解一款app的实现的时候,可能还需要用到调试、替换(修改原有的逻辑),解决方案有很多种,这里推荐使用apktool + jadx + virtualhook,apktool解决资源文件的问题,jadx解决反编译查看代码的问题,virtualhook解决热替换的要求。

环境搭建

  • apktool: https://github.com/iBotPeaches/Apktool
可以从github上拉取源码按照提示进行编译,

apk反编译java源码 重新打包 apk反编译hook_apk反编译java源码 重新打包


或者直接下载编译好的工具包:


1.下载

脚本代码

,保存为apktool;


2.下载最新的

apktool_x.jar


3.将下载的jar包重命名为apktool.jar;


4.将下载的apktool和apktool.jar移到/usr/local/bin目录


sudo mv apktool.jar /usr/local/bin


sudo mv apktool /usr/local/bin


sudo chmod a+x apktool


sudo chmod a+x apktool.jar


在配置的时候需要加上上面两行,要不然执行的时候会报permission denied错误。之后可以配置路径到环境变量里面,方便在其他文件夹直接使用。

  • jadx: https://github.com/skylot/jadx

将下面两行添加到环境变量文件.bash_profile 方便使用。
export JADX=/Users/你用电脑名称/Programs/jadx-0.7.1
export PATH=apk反编译java源码 重新打包 apk反编译hook_apk反编译java源码 重新打包_02{JADX}/bin
有时候jadx在编译大文件的时候回遇到卡死现象,可以增加jvm的最大内存来避免这种情况发生。
export JVM_ARGS="-Xmx4096m -XX:MaxPermSize=1024m"

  • virtualhook: https://github.com/asLody/VirtualApp/blob/master/CHINESE.md

1、命令行拉取代码:git clone https://github.com/rk700/VirtualHook.git
2、ndk 环境变量配置。virtualhook的使用需要用到ndk,所以需要你的电脑先配置安装好。具体可以参考:https://www.jianshu.com/p/c9bd4f88336f
3、导入Android Studio直接使用。

适用场景

这套工具能适用的场景是:ART机器下、加壳或者未加壳应用都可以,并且,手机不要求Root!不要求Root!

apk反编译java源码 重新打包 apk反编译hook_逆向分析_03

实践

  • 1、AS导入刚才checkout下来的工程,熟悉相关代码。
  • 2、运行virtualhook工程,安装待分析的应用
直接点击run 按钮,将virtualapp安装到你的手机上,点击“添加app”安装要分析的应用程序,virtual提供了两种安装待分析应用的方式,一种是扫描sd卡进行安装,另外一种是从已有的安装列表中选择安装。

apk反编译java源码 重新打包 apk反编译hook_VirtualHook_04

  • 3、编写自己的插件
Virtual的Hook实现跟Xposed一样,也是使用插件的方式,不用交互界面,在开发完成之后生成一个没有界面的app,通过刚才说的SD卡安装的方式进行安装,并且插件在安装列表上都会有一个特殊的角标,至于hook的方式可以参考demoHookPlugin的编写,demoHookPlugin工程是一个很好的示例,可以让我们快速上手。
在编写好插件之后,切换到demoHookPlugin,

apk反编译java源码 重新打包 apk反编译hook_反编译_05

点击“锤子”按钮生成对应的app,并将生成的app导入我们的手机sdcard中,通过sd的方式进行安装。

  • 4、运行我们要分析的app。
这个时候可以看到,在logcat已经打印出了相关的hook信息。

apk反编译java源码 重新打包 apk反编译hook_apk反编译java源码 重新打包_06


另外,我们还可以通过在我们所写的插件里面下断点的方式,来debug我们想要分析的应用程序!!!任何安装在容器内运行的app都可以进行调试!!!

插件编写技巧

在编写自己的插件的时候,可以参考demo工程的例子进行编写,最后需要在HookInfo类里面进行配置:

apk反编译java源码 重新打包 apk反编译hook_运行时hook_07


在编写的过程,要hook的类名直接使用jadx反编译之后的结果即可,反编译之后类名是什么就写什么。方法名也是,即使你知道源码里面的方法名,也需要使用反编译之后的。对于hook的方法,参数和返回值方向需要对JNI字段描述符有一些认识,例如"Ljava/lang/String;"就是表示类型String; "[I"就是表示int[];