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③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
网友评论