Xposed源码剖析(二)
0x00 背景
之前提到当安装Xposed framework
后,Xposed framework
会替换一个新的app_process
至/system/bin/
中,app_process
就是Android
中的Zygote
进程,这期以app_process
的实现为主线来详细分析Xposed framework
的实现。 作者 | 赵杰
0x01 框架分析
首先从main
函数开始:
在修改的main函数中,首先调用initialize函数初始化Xposed的运行时环境,然后再调用runtimeStart启动运行时环境。
initialize
函数的内部实现如下:
其内部主要做了三件事情,首先给XposedShared对象内部的成员赋值,然后调用startAll()接口启动所有服务,最后调用addJarToClasspath()
将XposedBridge.jar
添加至系统目录,之后会将它加入到Zygote
进程地址空间中。
这里最重要的就是startAll()
,进一步来看它的代码实现:
代码有所删减,关于SELinux
的部分不详细展开,只要知道如果开启SELinux
时,需要初始化一段供Xposed
使用的内存,然后通过fork
系统调用创建子进程,并在子进程中调用systemService
和appService
来添加Xposed
需要的服务。
来看appService的代码实现
:
首先通过defaultServiceManager()
获取Server Manager的远程接口,即一个BpServiceManger
类实例,然后通过addService
接口注册新的服务。服务的定义如下所示:
这里不详细分析这些接口,只要知道这个服务是用来进行IPC的即可。我们来继续看Android启动虚拟机的逻辑:
Xposed实现了自己的
Runtime
,实现代码如下所示:
onVmCreated的回调进入到
xposed::onVmCreated中,在它的代码实现中,首先通过
dlopen打开
Xposed的动态库,这个动态库分
art和
dalvik两个版本,然后调用这个动态库的
xposedInitLib接口,并且又一次调用了
onVmCreated方法,几个
onVmCreated只是名字一样而已。分析到这里,其实看不出什么,我们需要进一步借助
libxposed_art.so
的源码来分析。
实现源码在libxposed_art.cpp
文件中,代码实现如下:
在xposedInitLib
接口中把onVmCreated
函数指针设为onVmCreatedCommon
,也就是说,在之前的xposed->onVmCreated(env);
实际调用的是onVmCreatedCommon
,这个接口会进一步调用initXposedBridge
和initZygoteService
来初始化环境,先往下延伸,看到在onVmCreatedCommon
最后又调用了一个onVmCreated
,这个onVmCreated
的实现在如上代码的最后一部分,就是给xposed_callback_class
和xposed_callback_method
两个变量赋值,这两个值是通过initXposedBridge
函数获取到的,来看一下它的实现:
首先通过FindClass
接口去找到CLASS_XPOSED_BRIDGE
这个类,并创建一个该类的全局引用。然后调用register_natives_XposedBridge
注册这个类的native方法。最后把methodXposedBridgeHandleHookedMethod
设置成handleHookedMethod
的方法ID。
回到onVmCreatedCommon
函数中,在调用了initXposedBridge
函数之后,还调用了initZygoteService
函数,这个函数的内部实现类似于initXposedBridge
,只不过初始化的类是CLASS_ZYGOTE_SERVICE
和CLASS_FILE_RESULT
。
至此完成了框架的初始化工作。我们来回顾一下这个过程,首先注册了两个服务,然后创建了几个重要的类,并注册了它们的native方法,另外还给ArtMethod
的xposed_callback_class
和xposed_callback_method
两个变量赋了值。那么这两个值到底有什么作用呢?
在上一期我们分析了被Hook方法的执行过程,在执行到InvokeXposedHandleHookedMethod
方法时:
可以结合上一期的分析一起看,此处借助ArtMethod
的xposed_callback_class
和xposed_callback_method
调用handleHookedMethod
方法。
0x02 写在最后
Xposed的安装方式官方都有教程,
Android5.0以上需要刷flash。如果你有一台运行Android系统的开发板,并且支持从SD卡启动,那么有一种手动安装Xposed的方法可供选择。步骤如下
:
1. 把烧有Android系统的SD卡插入Linux中
2. # ln -sf /media/user/system /system
3. 下载最新的安装包# unzip xposed-v84-sdk22-arm64.zip
4. cp META-INF/com/google/android/flash-script.sh .
5. modify flash-script.sh
-
Install
成功后,会看到如下:
始发于微信公众号:同程研发中心