首页 > 编程语言 >xposed源码分析

xposed源码分析

时间:2022-12-30 16:13:18浏览次数:42  
标签:分析 调用 函数 xposed zygote apk 源码 加载

xposed原理

zygote进程是android系统第一个apk进程,其他所有的apk进程都是通过zygote进程fork的。xposed是一个hook框架,其通过修改zygote进程的native层代码和java层代码在zygote进程启动时将xposed框架使用的jar包(XposedBridge.jar)加载到android虚拟机中,然后将所有xposed插件模块也加载进android虚拟机中。因为zygote之后fork其他进程的时候会共享这些资源,所以所有的apk都会加载所有的xposed模块(这也是卡顿和费电的原因)。另外因为这些操作是在zygote进程启动的时候加载的,所以如何要更改或添加新的xposed模块就需要重新启动手机,因为zygote fork其他apk进程的时候并不会重新执行这些加载xposed模块的代码了。

xposed源码分析

app_process.main

zygote进程对应的native层代码的入口在app_process模块中,此模块对应的代码为app_process.cpp文件。查看xposed源码中也有app_process.cpp文件,来到入口点main函数处。

  • 其会调用xposed::initialize进行初始化,此函数通过设置环境变量CLASSPATCH预先加载xposed的XposedBridge.jar,这样后续加载的xposed模块就可以使用此jar包中的api进行hook操作了。
  • 接着判断xposed(就是上一步的jar包)是否加载,如果加载了就通过反射调用de.robv.android.xposed.XposedBridge类的入口main函数。如果没有加载xposed就还调用原始zygote进程的java层代码com.android.internal.os.ZygoteInit类的入口main函数。

de.robv.android.xposed.XposedBridge.main

  • 调用loadModules加载所有的xposed插件模块。
  • 此函数会调用initForZygote函数进行初始化,initForZygote函数内部会hook一些系统框架层的函数:例如会hook handleBindApplicaton函数并在此函数调用之前调用回调函数。
  • 最后执行zygote进程原始的执行流程。

loadModules

  • loadModules函数会动态加载xposed插件apk,然后获取apk中的xposed_init文件每一行设置的hook接口名称并实例化类。
  • 因为这些xposed_init文件中的类都需要实现handleLoadPackage接口函数,调用hookLoadPackage函数将所有的handleLoadPackage接口函数都保存到一个全局的回调函数链表sLoadedPackageCallbacks中。

initForZygote

initForZygote函数会hook handleBindApplicaton()并设置回调函数。在调用handleBindApplication函数调用之前此回调函数被调用,回调函数会获取当前加载apk的包名packageName,进程名processName,classLoader等信息并作为参数调用sLoadedPackageCallbacks全局回调函数链表中的所有回调函数。sLoadedPackageCallbacks链表中的回调函数就是handleLoadPackage接口函数。所有在编写xposed模块时编写handleLoadPackage接口函数是在handleBindApplication函数调用前调用的。

因为加壳apk都是在handleBindApplication函数调用的Application.attachBaseContext函数中修正classloader为自定义的classloader,并利用此自定义的classloader动态加载原始apk的dex文件。而xposed编写的handleLoadPacked函数是在handleBindApplication函数调用之前调用的所以这个时候获取到的classloader是壳的并不是原始apk的,因此利用此classloader是无法hook原始apk中的java类的,需要通过反射获取修正后的classloader进行hook。

标签:分析,调用,函数,xposed,zygote,apk,源码,加载
From: https://www.cnblogs.com/revercc/p/17015140.html

相关文章

  • anki vector源码浅试
    官方源码地址:https://github.com/digital-dream-labs/vector下载源码:gitclone https://github.com/digital-dream-labs/vector.git目录说明:drwxr-xr-x9rootroot......
  • Linux性能分析工具vmstat
    1、vmstat简介vmstat(VirtualMemoryStatistics虚拟内存统计)命令用来显示Linux系统虚拟内存状态,也可以报告关于进程、内存、I/O等系统整体运行状态。vmstat命令报告关......
  • 直播软件源码,利用uniapp checkbox判断是否选中
    直播软件源码,利用uniappcheckbox判断是否选中<checkbox-group@change="selfChangde"name=""><label><checkbox:checked="selfChecked"color="#DC143C"style="transf......
  • lightdb/postgresql中的MemoryContext out of memory原因分析及解决思路
    内存上下文的设计思路可以参考src/backend/utils/mmgr/README。https://www.pgcon.org/2019/schedule/attachments/514_introduction-memory-contexts.pdfhttp://www.lig......
  • 视频直播app源码,css预加载旋转动画与流光字体
    视频直播app源码,css预加载旋转动画与流光字体一、预加载旋转动画css body{}.concentric_round{width:200rpx;height:200rpx;position:relative;position:absolu......
  • Redis源码剖析系列博文开篇&大纲
    今年我启动了好几个比较有挑战的个人项目,比如写一门编程语言、成为一名视频UP主、写科幻小说……这些项目目前进度都很堪忧,一方面这些项目挑战都比较大,另一方面业余时间还......
  • VTK_Learning_图形基本操作进阶_连通区域分析
    1.连通区域分析许多图形数据中,并非只包含一个对象(连通区域)。而在处理这些图形数据时,有时需要对每一个对象单独处理或者让其单独显示。比如,利用MarchingCube方法提取三维图像......
  • Zabbix与乐维监控对比分析(六)——图形图表篇
    前面我们详细介绍了乐维监控与Zabbix的架构与性能、Agent管理、自动发现、权限管理、对象管理、告警管理、可视化的对比分析,相信大家对二者的对比分析有了更加深入的了解,接......
  • SpringCloud Gateway源码中的适配器模式
    SpringCloudgateway中有两种过滤器,路由过滤器(接口为GatewayFilter)和全局过滤器(接口为GlobalFilter);路由过滤器GatewayFilter的定义:1publicinterfaceGatewayFilter......
  • 使用 SQL 实现同比环比分析
    场景描述在做数据分析时,经常会需要展示同比和环比的数据,可以通过SQL来完成同比和环比的计算,再配合数据可视化工具进行展示,每个月都会自动展示当月数据与上月的对比(环比),以......