栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

面试:Hook框架Xposed、Dexposed、Epic原理

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面试:Hook框架Xposed、Dexposed、Epic原理

Xposed、Dexposed、Epic对比总结:

1、Xposed框架是需要root的,他的功能很全,能够hook掉系统方法,同时也可以hook掉其他应用的一些方法。

2、Dexposed框架是不需要root的,但是他只能hook掉在自己的应用进程中的一些方法,其他应用进程是没办法hook的。

3、Epic是基于Dexposed进行的修改,支持art虚拟机上面的Hook。
 

一、Xposed原理:

设备root之后,替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。

那么这里就引出了一个问题,为什么要替换app_process程序呢?

简述:

关于app_process程序网上也有很多讲解了,他其实是一个程序,存放在system/bin目录下的,他的作用就是启动一个程序,比如我们熟知的zygote进程,还有所有app启动,app_process只要找到需要运行程序的main函数也就是入口函数,然后执行,他不仅能执行C/C++程序,也可以执行Java程序。

详述:

首先在Android系统中,应用程序进程都是由Zygote进程孵化出来的,而Zygote进程是由Init进程启动的。Zygote进程在启动时会创建一个Dalvik虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个Dalvik虚拟机实例复制到新的应用程序进程里面去,从而使得每一个应用程序进程都有一个独立的Dalvik虚拟机实例。这也是Xposed选择替换app_process的原因。
Zygote进程在启动的过程中,除了会创建一个Dalvik虚拟机实例之外,还会将Java运行时库加载到进程中来,以及注册一些Android核心类的JNI方法来前面创建的Dalvik虚拟机实例中去。注意,一个应用程序进程被Zygote进程孵化出来的时候,不仅会获得Zygote进程中的Dalvik虚拟机实例拷贝,还会与Zygote一起共享Java运行时库。这也就是可以将XposedBridge这个jar包加载到每一个Android应用程序中的原因。XposedBridge有一个私有的Native(JNI)方法hookMethodNative,这个方法也在app_process中使用。这个函数提供一个方法对象利用Java的Reflection机制来对内置方法覆写。

综上就是Xposed框架选择app_proess作为入口的一个原因,因为这个入口有两个好处:

1、一旦修改了,就可以修改了所有的app

2、这里的时机是最早的,可以加载所有的东西
 

二、Dexposed原理

主要分为Java层和Native层的,通过下图一目了然:

 第一、首先我们来分析一下Java层的DexposedBridge.java类

这个方法是一个native类型的。

参数说明:

1)需要hook的方法对象

2)需要hook的方法所属的类

3)方法的slot值,关于这个slot的含义就是方法中局部变量存储的最小单位,一个Slot可以存放一个32位以内的数据类型.在Java程序编译为Class文件时,在方法的Code属性的max_locals数据项中确定了该方法所需要分配局部变量表的最大容量.

4)额外附加信息,比如我们需要hook方法的回调的对象,hook方法的返回类型,参数类型等信息,下面看到hookMethodNative方法的调用地方。
 

handleHookedMethod方法是整个Dexposed框架Java层最核心的一个方法,这个方法就是用来替换我们需要hook的那个方法,具体如何替换的等下面说到native层再说。然后这个方法中做了三件事:

1、执行需要hook之前的所有回调方法beforeMethod

2、执行被hook的原生方法

3、执行需要hook之后的所有回调方法afterMethod
 

第二、上面分析完了DexposedBridge.java核心类,下面来看一下native层的实现 dexposed.cpp

1、首先在JNI_OnLoad函数中做了三件事:

        1)获取设备信息dexposedInfo

        2)注册JNI方法(com_taobao_android_dexposed_DexposedBridge_hookMethodNative)

        3)初始化信息(获取Java层DexposedBridge中方法的Method对象)

2、然后在com_taobao_android_dexposed_DexposedBridge_hookMethodNative函数中主要做了两件事:

        1)把Java层传递的信息构造成DexposedInfo信息

        2)设置hook方法为native,并且指定nativeFunc函数

3、最后在执行第二步中的nativeFunc函数dexposedCallHandler函数中主要做了两件事:

        1)获取刚刚构造的DexposedInfo信息

        2)调用Java层DexposedBridge.java中的handleHookedMethod方法

所以我们在整个过程中可以看到,先通过JNI注册,从Java世界转到Native世界,然后在native世界中主要修改被hook方法的一些信息,然后在通过反射调用handleHookedMethod回到Java世界。
 

三、Epic原理

直接看作者的讲解:

我为Dexposed续一秒——论ART上运行时 Method AOP实现 | Weishu's Notes

Xposed原理: 

Xposed原理简介及其精简化 - 简书

Xposed 实现原理分析_l0neman 的博客-CSDN博客_xposed原理

Dexposed原理

Android中免Root实现Hook的Dexposed框架实现原理解析以及如何实现应用的热修复_尼古拉斯.赵四的博客-CSDN博客_dexposed

Epic原理

我为Dexposed续一秒——论ART上运行时 Method AOP实现 | Weishu's Notes

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/679350.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号