VirtualHook使用

作者: 骑着蜗牛闯世界666 | 来源:发表于2018-06-10 22:05 被阅读0次

    背景

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

    环境搭建

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

    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错误。之后可以配置路径到环境变量里面,方便在其他文件夹直接使用。

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

    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!


    image.png

    实践

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


    image.png

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

    附录

    相关文章

      网友评论

        本文标题:VirtualHook使用

        本文链接:https://www.haomeiwen.com/subject/wbmqeftx.html