介绍
Xposed是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。在这个框架下,我们可以编写并加载自己编写的插件APP,实现对目标apk的注入拦截等。
原理就是控制zygote进程,通过替换/system/bin/app_process程序控制zygote进程,使得它在系统启动过程中会加载Xposed framework的一个jar文件即XposedBridge.jar,从而完成对zygote进程及其创建的Dalvik/ART虚拟机的劫持,并且能够运行开发者独立的替代任何class,例如framework本身,系统UI又或者随意的一个app。
4.4以下Android版本安装较为简单,将root后的手机安装xposedInstaller,不过官网不再维护,导致无法直接通过xposedInstaller下载补丁包。
5.0开始,谷歌使用ART替换Dalvik,xposed分为两个部分,xposed*.zip和XposedInstaller.apk,zip文件是框架主体,需要进入Recovery后刷入,apk文件是xposed模块管理应用,主要用于下载,激活,是否启用模块等管理功能。首先完成对手机root,并刷入recove(如twrp),下载对应zip补丁包,进入recovery刷入,重启手机安装xposedinstaller并收入root权限。
Nexus6前arm32,后arm64
安卓8以上安装Edxposed,对于Xposed官方不支持的较新的Android版本可以先安装magisk,接着安装riru模块,最后再进行Edxposed的安装。
- Android Red Velvet Cake (11, sdk30)
- Android Queen Cake (10, sdk29)
- Android Pie (9, sdk28)
- Android Oreo (8.1, sdk27)
- Android Oreo (8.0, sdk26)
Magisk-v24.3.apk 实现root
1 | EdXposed-SandHook-v0.4.6.2.4529.-release.zip |
Hook
- 拷贝XposedBridgeApi.jar到新建工程的libs目录
- 修改app目录下的build.gradle文件,在AndroidManifest.xml中增加Xposed相关内容
- 新建hook类,编写hook代码
- 新建assets文件夹,然后在assets目录下新建xposed_init,在里面写hook类的完整路径
app/libs放入XposedBridgeApi-54.jar
app/build.gradle
1 | dependencies { |
AndroidManifest.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
Xposed01.java
1 | import android.content.pm.ApplicationInfo; |
app/src/main/assets/xposed_init
1 | com.kanxue.xposed01.Xposed01 |
构造函数
java反射或xposed的api属性修改
HookConstructors.java
1 | public class HookConstructors implements IXposedHookLoadPackage { |
动静属性
1 | public class HookFlag implements IXposedHookLoadPackage { |
DexClassLoader
Xposed不止可以实现对app自己试下拿到类构造函数hook,对于系统框架层的java函数可以进行hook,Hook所有classLoader包括加载dex中的,并打印这些classLoader中的类
1 | public class HookDexClassLoader implements IXposedHookLoadPackage { |
一般函数
1 | public class HookJavaFunction implements IXposedHookLoadPackage { |
JNI函数
1 | public class HookJni implements IXposedHookLoadPackage { |
主动调用
对于类中的静态函数,直接调用即可。对于非静态函数,需要先得到类的实例,才能完成调用。
1 | public class HookActiveInvoke implements IXposedHookLoadPackage { |
加壳app处理
类不在classLoader中,在自定义的Application中的attachBaseContext和onCreate中完成dex的解密和classLoader修正。
1 | public class HookJava implements IXposedHookLoadPackage { |
Lebo
1 | @Override |
SO函数处理
32位hook
Xposed01动态加载dex
1 | @Override |
git clone https://github.com/ele7enxxh/Android-Inline-Hook.git inline的hook库面向32位,复制include,inlineHook.c,relocate.c,relocate.h到cpp下,并在CMakeLists.txt中引入
1 | add_library( # Sets the name of the library. |
native-lib.cpp
1 | #include <jni.h> |
编译生成的libnative-lib.so重命名为hookso.so放到手机/data/data/com.kanxue.xposedhookso/files下,给予权限,重新启动,打开Xposed01 app,完成调用libc的strstr函数的hook。
64位hook
git clone https://github.com/asLody/SandHook.git 将cpp中代码拷贝到XposeeHookSoBySandHook项目的cpp中
build.gradle
1 | externalNativeBuild { |
native-lib.cpp
1 | #include <jni.h> |
编译生成so拷贝到/data/data/com.kanxue.xposedhookso/files/hookso.so下并配置权限
主动调用
XposeeHookSoBySandHook
1 | bool testhook(const char *content) { |
编译生成的libsandhook-native.so推送到/sdcard/32.so,重命名为hookso.so复制到/data/data/com.kabxue.xposedhookso/files下
进入xposed01项目中,定义XposedActiveCallSoFunction类
1 | @Override |
指纹检测与定制反检测
- Xposed插件管理-XposedInstaller
- Xposed对函数hook根本原理-java函数变native函数
- Xposed大量api
- Xposed框架特定文件等
Xposed框架组成
- XposedInstaller 完整的Android工程,编译生成apk,用于管理Xposed框架的插件
- Xposed 对Zygote进程定制,能够实现对接下来任何一个app进程的hook
- android_art 用于支持对Java类函数hook而对ART源码进程的一系列定制
- XposedBridge Xposed的java部分,可单独作为Android工程进行编译
- XposedTools 用于编译和打包Xposed框架
简单定制
修改Xposed框架中所有关于Xposed相关的类,函数等指纹信息(比如关键字Xposed),便可以绕过大多数Xposed框架指纹检测技术,其他的根据Xposed对Java函数hook的根本原理进行检测(如判断函数属性是否变为native),也可以在编写对应插件进行绕过。