美文网首页android进阶版
Art虚拟机学习之whale源码分析

Art虚拟机学习之whale源码分析

作者: 珍惜Any | 来源:发表于2020-03-04 16:25 被阅读0次

    whale是Lody大佬的一款支持Java层和So层Hook的优秀框架
    API和Xposed同款
    原项目地址

    https://github.com/asLody/whale

    没使用过可以看这里
    https://www.jianshu.com/p/fe1e3f236f42

    简单分析一波实现原理,Java层和Xposed差不多,可参考

    https://www.jianshu.com/p/b60b30180228

    不做具体分析主要看Native层函数

    在whale 有自己的Runtime

    其中知识点,初始化虚拟机,Hook流程,ArtMethod偏移计算等都很不错。

    在Hook函数执行之前 有一部WhaleRuntime初始化的过程 具体分析一下。

    1,虚拟机初始化过程分析

    源码位置
    whale->src->android->art->native_on_load.cc->JNI_OnLoad 函数
    详细的 我都打在注释上面,看着也方便


    native_on_load.cc->JNI_OnLoad

    入口很简单 主要是一个简单的初始化过程 ,并且将WhaleRuntime.java里面的Native进行注册

    gMethods

    开始初始化虚拟机在虚拟机里面的 runtime->OnLoad(vm, env, cl) 函数里面进行初始化

    art_runtime.cc->Onload①

    根据libhoudini.so判断是否是虚拟机
    将vm虚拟机设置为全局变量


    虚拟机小科普:

    JavaVM:这个代表java的虚拟机。所有的工作都是从获取虚拟机的接口开始的。
    我们的JNIEnv就是通过 vm->GetEnv 进行获取的。

    JNIEnv:JNI Interface Pointer, 是提供JNI Native函数的基础环境,线程相关,不同线程的JNIEnv相互独立。 只在当前线程中有效。本地方法不 能将JNIEnv从一个线程传递到另一个线程中。相同的 Java 线程中对本地方法多次调用时,传递给该本地方法的JNIEnv是相同的。但是,一个本地方法可被不同的 Java 线程所调用,因此可以接受不同的 JNIEnv。

    JavaVM则可以在进程中的各线程间共享。理论上一个进程可以有多个JavaVM,但Android只允许一个(JavaVm and JIEnv)。需要强调的是JNIEnv是跟线程相关的。sdk文档中强调了do not cache JNIEnv*,要用的时候在不同线程中再通过JavaVM jvm的方法来获取与当前线程相关的JNIEnv。两者都可以理解为函数表(Function Pointer Table), 前者是使用Java程序创建的运行环境(从属于一个JVM)提供JNI Native函数。

    然后将Java层的WhaleRuntime.java的Class对象 设置成全局变量。
    拿到handleHookedMethod 的methodID
    handleHookedMethod是WhaleRuntime里面的一个方法,和Xposed同款

    art_runtime.cc->Onload②

    下来开始计算偏移

    art_runtime.cc->Onload③

    reserved0 和 reserved1 是WhaleRuntime里面的 两个Native方法

    image.png

    主要是用于查找两个连续Method之间的间隔

    art_runtime.cc->Onload④

    根据两个函数指针的偏移,计算绝对偏移

    DistanceOf方法

    对虚拟机的偏移进行初始化赋值


    art_runtime.h art_runtime.cc->Onload⑤

    执行完毕以后初始化结束,主要是对Runtime里面的一些 变量和偏移进行赋值

    2,HookMethod 过程分析

    art_runtime.cc->HookMethod①

    ArtHookParam是一个自定义的结构体 保存了Hook的一些信息


    ArtHookParam

    进行简单的初始化 设置Hook 的信息


    art_runtime.cc->HookMethod②

    在ResolvedSymbols 保存了一些 真是ArtMethod里面的一些函数指针

    ResolvedSymbols

    在初始化的 Resolve 函数进行初始化的 ,方法的作用我写的很详细


    初始化Resolve函数① 初始化Resolve函数二

    返回 art_runtime.cc->HookMethod


    art_runtime.cc->HookMethod③

    对Native信息进行判断


    art_runtime.cc->HookMethod④ art_runtime.cc->HookMethod⑤

    执行完毕。

    项目地址:https://github.com/w296488320/whaleDoc


    喜欢文章的话 可以点个关注,如果对 逆向,脱壳,新技术 感兴趣的 同学 可以加 我Q群 欢迎各位能人志士 一起讨论

    欢迎加入故事,群聊号码:773642813 也可以加入笔者的 小密圈,各种安卓新技术,源码分享等

    image.png

    参考:
    https://www.cnblogs.com/fnlingnzb-learner/p/7366025.html
    https://www.jianshu.com/p/24dc1a15b58e

    相关文章

      网友评论

        本文标题:Art虚拟机学习之whale源码分析

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