抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(中)

简介: Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。

0x5、Xposed如何Hook Zygote


从上面的跟踪结果,不难得出这样的调用链:


init进程init.rcapp_process(app_main.cpp) → 启动Zygote进程ZygoteInit的main() →  startSystemServer() → fork出system_server子进程


接着来看下Xposed具体是怎么注入Zygote的,打开Xposed的仓库,发现这样两个文件:


网络异常,图片无法展示
|


em...区分Android 5.0 前后版本,打开 Android.mk


网络异常,图片无法展示
|


呕吼,定制 app_process 文件,而且可以根据sdk版本选择对应文件作为入口,打开 app_main2.app,跟到下述位置:


网络异常,图片无法展示
|


有点眼熟,跟下:xposed.cpp –> initialize,部分代码如下:


bool initialize(bool zygote, bool startSystemServer, const char* className, int argc, char* const argv[]) {
    // ① 初始化xposed相关变量
    xposed->zygote = zygote;
    xposed->startSystemServer = startSystemServer;
    xposed->startClassName = className;
    xposed->xposedVersionInt = xposedVersionInt;
    ...
    // ② 将XposedBridge.jar加载到系统的CLASSPATH路径中。
    return addJarToClasspath();
}


跳回前面,如果初始化成功,调用 调用 XPOSED_CLASS_DOTS_ZYGOTEde.robv.android.xposed.XposedBridge  的 main() 方法,若初始化失败,则按照正常流程初始化。跟下 XposedBridge → main(),部分代码如下:


网络异常,图片无法展示
|


到此Xposed Hook Zygote的流程很明了了:


编译生成自定义app_process → 把原先调用 ZygoteInit.main() 处 改为调用 XposedInit.main() → Hook资源和一些准备工作 → 调用系统原本启动Zygote的方法。


0x6、Xposed如何替换系统app_process


上面说到系统的app_process替换成自定义的了,那具体是怎么替换的呢?


那就得看看 XposedInstaller 了,除了介绍那里说到的管理Xposed模块外,它还有两个核心功能:替换系统app_process将XposedBridge.jar文件放到私有目录中


打开XposedInstaller项目搜下app_process


网络异常,图片无法展示
|


在Code没找到,却在某次commit找到了,点开,定位到 assets/install.sh


网络异常,图片无法展示
|


流程简洁明了,改权限搬运文件,不过这是旧版的,在新版中却没找到这个关键字。


打开手机XposedInstaller抓下包,发现了这样的请求:


http://dl-xda.xposed.info/framework.json


接着项目中搜索下域名:


网络异常,图片无法展示
|


跟url有点不同,请求下framework.json:


网络异常,图片无法展示
|


可以,就是拼接zip包url的模板,包含:系统sdk版本架构xposed版本号,以我的魅蓝e2为例,拼接后的url:


http://dl-xda.xposed.info/framework/sdk23/arm64/xposed-v89-sdk23-arm64.zip


下载解压后,开始找搬运脚本,可却只找到了二进制文件、so库和XposedBridge.jar:


网络异常,图片无法展示
|


尴尬,只能从源码入手了,XposedInstaller点击安装时会弹出 InstallInstall via recovery,搜下后面这个字符串:


网络异常,图片无法展示
|


跟到:FrameworkZips → INSTALLER


网络异常,图片无法展示
|


不难看出这个函数是拿来解析framework.json的


网络异常,图片无法展示
|


哪里调用到了 parseZipSpec()


网络异常,图片无法展示
|


哪里调用到了 getOnline()


网络异常,图片无法展示
|


跟下:StatusInstallerFragment → addZipViews() → addZipView() → showActionDialog()


网络异常,图片无法展示
|


这个 flash() 就是刷入方法,可以看到第二个参数类型是不一样的:FlashDirectly 和  FlashRecoveryAuto,先跟下前者的flash()方法:


网络异常,图片无法展示
|


再看看 FlashRecoveryAutoflash() 方法:


网络异常,图片无法展示
|


当系统处于recovery模式会自动检测command文件是否存在,存在其中的指令,后续刷入跟前者一致。


不过,还是没有解决我的疑问,啥时候替换的app_process,网上说update-binary其中会调用一个 flash-script.sh 文件,在zip包中可以找到此文件:


网络异常,图片无法展示
|


em...很明显,就是替换文件的脚本,还对32位及64位的情况作了区分,验证起来有些麻烦,后面我如果自己编译Xposed再验证下吧,暂且记住这个结论:


XposedInstaller下载补丁包 → 获取root权限 → 解压复制update-binary文件到特定目录 → 文件执行时会调用flash-script.sh脚本,将app_process、Xposedbridge.jar、so库等写到系统私有目录。


相关文章
|
存储 分布式计算 监控
应用层---网络模型
应用层---网络模型
306 3
|
机器学习/深度学习 传感器 定位技术
基于WGS84 椭球恒向线距离计算沿纬度_经度路径行驶的距离附matlab代码
基于WGS84 椭球恒向线距离计算沿纬度_经度路径行驶的距离附matlab代码
|
SQL 存储 API
阿里云实时计算Flink的产品化思考与实践【下】
本文整理自阿里云高级产品专家黄鹏程和阿里云技术专家陈婧敏在 FFA 2023 平台建设专场中的分享。
111806 154
阿里云实时计算Flink的产品化思考与实践【下】
|
数据处理 Python
熵值法计算权重
熵值法计算权重是一种基于信息论的方法,用于多指标综合评价。通过计算各指标的信息熵,反映指标的变异程度,从而确定其在综合评价中的权重。熵值越小,表示信息量越大,指标的重要性越高。该方法适用于样本数据较少的情形,能有效避免主观因素的影响。文中详细介绍了熵值法的原理、计算步骤及Python实现代码。
2456 1
|
并行计算 C++ 异构计算
【环境配置】安装windows版本的TensorRt
【环境配置】安装windows版本的TensorRt
1819 4
|
前端开发 JavaScript 算法
React 运行时的难点和挑战
【10月更文挑战第25天】深入研究React运行时需要开发者具备扎实的JavaScript基础、对React框架的深入理解以及丰富的实践经验。只有克服这些难点和挑战,才能更好地发挥React的优势,构建出高性能、高质量的用户界面和应用程序。
|
运维 监控 Python
自动化运维:使用Python脚本实现日常任务
【9月更文挑战第24天】在现代的软件开发周期中,运维工作扮演着至关重要的角色。本文将介绍如何利用Python编写简单的自动化脚本,来优化和简化日常的运维任务。从备份数据到系统监控,Python的易用性和强大的库支持使其成为自动化运维的首选工具。跟随这篇文章,你将学习如何使用Python编写自己的自动化脚本,提高运维效率,减少人为错误,并最终提升整个开发流程的质量。
|
Web App开发 数据采集 移动开发
开发uniapp过程中对app、微信小程序与h5的webview调试
开发uniapp过程中对app、微信小程序与h5的webview调试
2371 1
|
数据库连接 PHP
深入PHP内核:理解Zend Engine和PHP生命周期
【5月更文挑战第4天】 在本文中,我们将探讨PHP的核心——Zend Engine。我们会详细解释Zend Engine的工作原理,以及它如何驱动PHP代码的执行。此外,我们还将深入讨论PHP生命周期的各个阶段,包括从请求开始到输出结果的整个过程。这篇文章将为你提供一个深入的理解,关于PHP如何处理你的代码,以及它在背后是如何运作的。
347 3
|
Ubuntu 物联网 Android开发
QT应用编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)
QT应用编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)
1839 0
QT应用编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)