Xposed框架学习

Xpsed是一个Android虚拟机劫持代码注入框架,通过替换系统的app_process程序,在初始化zygote进程之前加载自身程序,注入系统三类重要函数,可以实现全局hook三个部分:zygote初始化,apk包加载,资源加载。

在学习的过程中遇到很多问题,当然主要是自身积累不够。我觉得在学习之前需要搞明白以下几个知识点:

  • Android类加载机制,了解dex文件优化及解释过程,知道ClassObject,Method等虚拟机运行时数据结构。

  • Android系统启动时zygote进程,SystemServer的启动流程。

  • Android虚拟机dalvik运行原理,这个知识点我也是知之甚少,在源码中也涉及到一些dalvik虚拟机函数但也只是明白功能没有深入原理,日后仍需加强。

如果以上三点不清楚没关系,可以移步以下三个连接学习了解:

有了以上的基础我们就开始学习源码,我在跟源码的过程中绘制了如下流程图,通过该图可以清晰观察到Xposed在初始化时调用流程。

黄色:Xposed初始化进行三次关键调用。

xposed初始化流程

简单总结:

在系统初始化zygote进程之前Xposed加载运行注入代码,主要由如下过程:

一.initNative()初始化两个方法:

(1)handleHookedMethod(),主要目的是获取该方法的Method指针,用于在native层调用该方法。当代码执行到我们需要hook处,执行该方法,而该方法实现是在XposedBridge.java中。主要实现对用户自定义接口回调,流程:回调before–>执行源函数–>回调after。

(2)invokeOriginalMethodNative(),获取该函数Method指针并为其设置jni的实现。实际调用执行的是jni层方法。该函数其实就是在如上第一个方法流程中“执行源函数”回调的,因为需要hook的原函数Method指针保存在jni层需要使用dalvik函数执行,所以需要实现这样一个函数来完成对原函数的执行。

二.initForZygote()预先hook系统关键函数:

(1)ActivityThread.handleBindApplication:新进程fork之后,初始化App。

(2)com.android.server.ServerThread. initAndLoop:SystemServer调用初始化服务。

(3)LoadedApk构造函数:加载Apk资源时创建。

(4)android.app.ApplicationPackageManager. getResourcesForApplication:PackageManager资源获取函数。

执行流程:

(1)获取需要hook的函数对象,保存该对象及回调对象。

(2)修改需要hook函数的Method结构体改变执行流向为native方法。

(3)在native方法中回调java方法,处理回调对象方法:before->调用invokeOriginalMethodNative()执行原方法->after

三.loadModule()加载用户安装的Xposed模块,此部分没有详细划分其主要就是:

(1)读取配置文件获取模块apk安装路径,读取配置文件获取模块入口类,此类必须是继承自三个hook时机抽象类。

(2)使用ClassLoader加载类文件实例化,添加到对应的Set中,等待hook的系统关键函数执行时调用。

四.按正常流程初始化系统。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值