android进阶版

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

2020-03-04  本文已影响0人  珍惜Any

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

上一篇下一篇

猜你喜欢

热点阅读