抱歉,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库等写到系统私有目录。


相关文章
|
消息中间件 缓存 安全
抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(下)
Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。
1589 0
|
4月前
|
Python
惊呆了!学会这一招,你的Python上下文管理器也能玩出花样来文管理器也能玩出花样来
【7月更文挑战第6天】Python的上下文管理器是资源优雅管理的关键,与with语句结合,确保资源获取和释放。通过实现`__enter__`和`__exit__`,不仅能做资源分配和释放,还能扩展实现如计时、自动重试、事务处理等功能。例如,TimerContextManager类记录代码执行时间,展示了上下文管理器的灵活性。学习和利用这一机制能提升代码质量,增强功能,是Python编程的必备技巧。
33 0
|
数据库连接 数据库
红皮书——错误点
红皮书——错误点
红皮书——错误点
|
小程序 Java 机器人
使用Java实现发送微信消息(附源码)_此程序在手再也不怕对象跟你闹了
此程序在手再也不怕女朋友跟你闹了!!!!自从有了女朋友比如:早安、晚安之类的问候语可不能断,但是也难免有时候会忘记那么该咋么办呢?很简单写一个程序么,近日闲来无趣想着用Java写一个自动发送微信的小程序,实现定时给指定的好友发送指定的消息,这不就很Nice了?本文主要包括实现的思路、代码的实现、打包为jar快捷方式!
155 0
|
JSON 应用服务中间件 数据格式
杨洋撒撒一大片,Controller接收中文不再“不正经”,乱码问题这样解决,你信或不信
杨洋撒撒一大片,Controller接收中文不再“不正经”,乱码问题这样解决,你信或不信
124 0
杨洋撒撒一大片,Controller接收中文不再“不正经”,乱码问题这样解决,你信或不信
|
安全 Java API
抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(上)
Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。
369 0
|
Java Linux API
抱歉,Xposed真的可以为所欲为——1.基础知识储备(上)
本节简单介绍了什么是Xposed,基本原理,如何创建一个Xposed项目以及Xposed常用的类与方法。
440 0
|
API
抱歉,Xposed真的可以为所欲为——1.基础知识储备(下)
本节简单介绍了什么是Xposed,基本原理,如何创建一个Xposed项目以及Xposed常用的类与方法。
748 0
|
存储 网络协议 数据安全/隐私保护
邮件传输的过程都看不懂。那我走(狗头)
给学习网络的新手一个我自己总结的建议: 我觉得学网络先要先把最基础最常用的协议的原理搞的明明白白,然后再学习难的协议或者是拓展的协议就好理解容易上手了。
231 0
邮件传输的过程都看不懂。那我走(狗头)
|
SQL
开胃菜解析
开胃菜解析
153 0