VirtualHook使用

背景

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

环境搭建

  • apktool: https://github.com/iBotPeaches/Apktool

可以从github上拉取源码按照提示进行编译,

VirtualHook使用_第1张图片
image.png

或者直接下载编译好的工具包:
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=${PATH}:${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!


VirtualHook使用_第2张图片
image.png

实践

  • 1、AS导入刚才checkout下来的工程,熟悉相关代码。
  • 2、运行virtualhook工程,安装待分析的应用

直接点击run 按钮,将virtualapp安装到你的手机上,点击“添加app”安装要分析的应用程序,virtual提供了两种安装待分析应用的方式,一种是扫描sd卡进行安装,另外一种是从已有的安装列表中选择安装。
VirtualHook使用_第3张图片
device-2018-06-10-212404.png
  • 3、编写自己的插件

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

在编写好插件之后,切换到demoHookPlugin,
image.png
点击“锤子”按钮生成对应的app,并将生成的app导入我们的手机sdcard中,通过sd的方式进行安装。
  • 4、运行我们要分析的app。

这个时候可以看到,在logcat已经打印出了相关的hook信息。


qidian.png

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

插件编写技巧

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


VirtualHook使用_第4张图片
image.png

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

附录

  • 1、原理分析:http://rk700.github.io/2017/03/15/virtualapp-basic/
  • 2、其他例子:http://weishu.me/2017/12/02/non-root-xposed/
  • 3、JNI字段描述符:https://blog.csdn.net/jintiaozhuang/article/details/9016889

你可能感兴趣的:(VirtualHook使用)