Xposed源码剖析(二)

  • 内容
  • 评论
  • 相关

0x00 背景

       之前提到当安装Xposed framework后,Xposed framework会替换一个新的app_process/system/bin/中,app_process 就是Android中的Zygote进程,这期以app_process的实现为主线来详细分析Xposed framework的实现    作者 | 赵杰

0x01 框架分析

     首先从main函数开始:

Xposed源码剖析(二)

     在修改的main函数中,首先调用initialize函数初始化Xposed的运行时环境,然后再调用runtimeStart启动运行时环境。

initialize函数的内部实现如下:

Xposed源码剖析(二)

       其内部主要做了三件事情,首先给XposedShared对象内部的成员赋值,然后调用startAll()接口启动所有服务,最后调用addJarToClasspath()XposedBridge.jar添加至系统目录,之后会将它加入到Zygote进程地址空间中。

这里最重要的就是startAll(),进一步来看它的代码实现:

Xposed源码剖析(二)

代码有所删减,关于SELinux的部分不详细展开,只要知道如果开启SELinux时,需要初始化一段供Xposed使用的内存,然后通过fork系统调用创建子进程,并在子进程中调用systemServiceappService来添加Xposed需要的服务。

来看appService的代码实现

Xposed源码剖析(二)

首先通过defaultServiceManager()获取Server Manager的远程接口,即一个BpServiceManger类实例,然后通过addService接口注册新的服务。服务的定义如下所示:

Xposed源码剖析(二)

这里不详细分析这些接口,只要知道这个服务是用来进行IPC的即可。我们来继续看Android启动虚拟机的逻辑:

Xposed源码剖析(二)

Xposed实现了自己的Runtime,实现代码如下所示:

Xposed源码剖析(二)

onVmCreated的回调进入到xposed::onVmCreated中,在它的代码实现中,首先通过
dlopen打开Xposed的动态库,这个动态库分artdalvik两个版本,然后调用这个动态库的
xposedInitLib接口,并且又一次调用了onVmCreated方法,几个onVmCreated只是名字一样而已。分析到这里,其实看不出什么,我们需要进一步借助
libxposed_art.so的源码来分析。

实现源码在libxposed_art.cpp文件中,代码实现如下:

Xposed源码剖析(二)

xposedInitLib接口中把onVmCreated函数指针设为onVmCreatedCommon,也就是说,在之前的xposed->onVmCreated(env);实际调用的是onVmCreatedCommon,这个接口会进一步调用initXposedBridgeinitZygoteService来初始化环境,先往下延伸,看到在onVmCreatedCommon最后又调用了一个onVmCreated,这个onVmCreated的实现在如上代码的最后一部分,就是给xposed_callback_classxposed_callback_method两个变量赋值,这两个值是通过initXposedBridge函数获取到的,来看一下它的实现:

Xposed源码剖析(二)

首先通过FindClass接口去找到CLASS_XPOSED_BRIDGE这个类,并创建一个该类的全局引用。然后调用register_natives_XposedBridge注册这个类的native方法。最后把methodXposedBridgeHandleHookedMethod设置成handleHookedMethod的方法ID。

回到onVmCreatedCommon函数中,在调用了initXposedBridge函数之后,还调用了initZygoteService函数,这个函数的内部实现类似于initXposedBridge,只不过初始化的类是CLASS_ZYGOTE_SERVICECLASS_FILE_RESULT

至此完成了框架的初始化工作。我们来回顾一下这个过程,首先注册了两个服务,然后创建了几个重要的类,并注册了它们的native方法,另外还给ArtMethodxposed_callback_classxposed_callback_method两个变量赋了值。那么这两个值到底有什么作用呢?

在上一期我们分析了被Hook方法的执行过程,在执行到InvokeXposedHandleHookedMethod方法时:

Xposed源码剖析(二)

可以结合上一期的分析一起看,此处借助ArtMethodxposed_callback_classxposed_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 

Xposed源码剖析(二)

  1. Install

Xposed源码剖析(二)

成功后,会看到如下:

Xposed源码剖析(二)


始发于微信公众号:同程研发中心