Xposed是一个很强大的Android平台上的HOOK工具,而且作者为了方便开发者使用开发了一个APP(Xposed Installer,下文称为Installer) 来使用开发者自己开发的模块。开发者安装自己的模块后需要在Installer中勾选自己的模块然后重启手机自己的模块才会起作用。但是这样有点不利于开发者测试,每次都要点开Installer操作几下尤其是还要重启就显得有点麻烦了。

读过Xposed的源码后会发现仅通过更改XposedBridge.jar的源码就可以更简便一些:

1. 不需重启手机

2. 不需操作Installer这个App,且不用安装hook模块,只需push到手机即可

首先需要下载源码,rovo89链接里面有Xposed所有源码,我们只需要下载XposedBridge就好。原版的Xposed并不适用于三星手机,wanam改过的Xposed可以用,所以如果是三星手机的话就下载wanam的。

1. Xposed原理简介

现在安装Xposed比较方便,因为Xposed作者开发了一个Xposed Installer App,下载后按照提示傻瓜式安装(前提是root手机)。其实它的安装过程是这个样子的:首先探测手机型号,然后按照手机版本下载不同的刷机包,最后把Xposed刷机包刷入手机重启就好。刷机包下载 里面有所有版本的刷机包。

刷机包解压打开里面的问件构成是这个样子的:

META-INF/ 里面有文件配置脚本 flash-script.sh 配置各个文件安装位置。

system/bin/ 替换zygote进程等文件

system/framework/XposedBridge.jar jar包位置

system/lib system/lib64 一些so文件所在位置

xposed.prop xposed版本说明文件

所以安装Xposed的过程就上把上面这些文件放到手机里相同文件路径下。

通过查看文件安装脚本发现:

system/bin/下面的文件替换了app_process等文件,app_process就是zygote进程文件。所以Xposed通过替换zygote进程实现了控制手机上所有app进程。因为所有app进程都是由Zygote fork出来的。

Xposed的基本原理是修改了ART/Davilk虚拟机,将需要hook的函数注册为Native层函数。当执行到这一函数是虚拟机会优先执行Native层函数,然后再去执行Java层函数,这样完成函数的hook。如下图:

Xposed HOOK 原理

通过读Xposed源码发现其启动过程:

手机启动时init进程会启动zygote这个进程。由于zygote进程文件app_process已被替换,所以启动的时Xposed版的zygote进程。

Xposed_zygote进程启动后会初始化一些so文件(system/lib system/lib64),然后进入XposedBridge.jar中的XposedBridge.main中初始化jar包完成对一些关键Android系统函数的hook。

Hook则是利用修改过的虚拟机将函数注册为native函数。

然后再返回zygote中完成原本zygote需要做的工作。

这只是在宏观层面稍微介绍了下Xposed,要想详细了解需要读它的源码了。下面两篇写的挺好,要想深入理解的可以看看。

Android Hook框架Xposed原理与源代码分析

深入理解Android之Xposed详解

2. Xposed精简化

上面稍微介绍了下它的原理,下面就介绍如何精简化Xposed。下面只修改了XposedBridge.jar包中的XposedBridge.java这个文件,修改完重新Build apk然后把apk重命名为XposedBridge.jar然后替换刷机包中的jar包,刷入手机即可。

2.1 取消重启手机

看下XposedBridge.jar的源码

代码文件de.robv.android.xposed.XposedBridge.java

protected static void main(String[] args) {

// Initialize the Xposed framework and modules

try {

if (!hadInitErrors()) {

initXResources();

SELinuxHelper.initOnce();

SELinuxHelper.initForProcess(null);

runtime = getRuntime();

XPOSED_BRIDGE_VERSION = getXposedVersion();

if (isZygote) {

XposedInit.hookResources();

XposedInit.initForZygote();

}

//修改时需注释下面这行代码

XposedInit.loadModules();//*********load hook 模块*******************

} else {

Log.e(TAG, "Not initializing Xposed because of previous errors");

}

} catch (Throwable t) {

Log.e(TAG, "Errors during Xposed initialization", t);

disableHooks = true;

}

// Call the original startup code

if (isZygote) { //****代码修改位置****

ZygoteInit.main(args);

} else {

RuntimeInit.main(args);

}

}

注意上面的XposedInit.loadModules()这个函数,这个函数的作用就是load hook模块到进程中。

因为zygote启动时先跑到java层XposeBridge.main中,在main里面有一步操作是将hook模块load进来,模块加载到zygote进程中,zygote fork所有的app进程里面也有这个hook模块,所以这个模块可以hook任意app。(编写hook模块的第一步就是判断当前的进程名字,如果是要hook的进程就hook,不是则返回)。

所以修改模块后,要将模块重新load zygote里面必须重启zygote,要想zygote重启就要重启手机了。

所以修改的逻辑是不把模块load到zygote里面,而是load到自己想要hook的进程里面,这样修改模块后只需重启该进程即可。

在上面代码的代码修改位置添加如下代码,并将上面XposedInit.loadModules()注释掉即可。

if (isZygote) {

XposedHelpers.findAndHookMethod("com.android.internal.os.ZygoteConnection", BOOTCLASSLOADER, "handleChildProc",

"com.android.internal.os.ZygoteConnection.Arguments",FileDescriptor[].class,FileDescriptor.class,

PrintStream.class,new XC_MethodHook() {

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

// TODO Auto-generated method stub

super.afterHookedMethod(param);

String processName = (String) XposedHelpers.getObjectField(param.args[0], "niceName");

String coperationAppName = "指定进程名称如:com.android.settings";

if(processName != null){

if(processName.startsWith(coperationAppName)){

log("--------Begin Load Module-------");

XposedInit.loadModules()

}

}

}

});

ZygoteInit.main(args);

} else {

RuntimeInit.main(args);

}

2.2 取消操作Installer APP

通过读Install App的源码发现其实勾选hook模块其实app就是把模块的apk位置写到一个文件里,等load模块时会读取这个文件,从这个文件中的apk路径下把apk load到进程中。

看下loadmodules的源码

XposedInit.java

/**

* Try to load all modules defined in BASE_DIR/conf/modules.list

*/

/*package*/ static void loadModules() throws IOException {

final String filename = BASE_DIR + "conf/modules.list";

BaseService service = SELinuxHelper.getAppDataFileService();

if (!service.checkFileExists(filename)) {

Log.e(TAG, "Cannot load any modules because " + filename + " was not found");

return;

}

ClassLoader topClassLoader = XposedBridge.BOOTCLASSLOADER;

ClassLoader parent;

while ((parent = topClassLoader.getParent()) != null) {

topClassLoader = parent;

}

InputStream stream = service.getFileInputStream(filename);

BufferedReader apks = new BufferedReader(new InputStreamReader(stream));

String apk;

while ((apk = apks.readLine()) != null) {

loadModule(apk, topClassLoader);

}

apks.close();

}

apk配置文件就是installer app文件路径下的conf/modules.list这个文件data/data/de.robv.android.xposed.installer/conf/modules.list

或者data/user_de/0/de.robv.android.xposed.installer/conf/modules.list(不同手机版本位置不同)

所以我们改下,直接给他个确定的apk路径及名称。就定为/data/local/tmp/module.apk。

所以再把之前的代码改成如下的样子就好了

if (isZygote) {

XposedHelpers.findAndHookMethod("com.android.internal.os.ZygoteConnection", BOOTCLASSLOADER, "handleChildProc",

"com.android.internal.os.ZygoteConnection.Arguments",FileDescriptor[].class,FileDescriptor.class,

PrintStream.class,new XC_MethodHook() {

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

// TODO Auto-generated method stub

super.afterHookedMethod(param);

String processName = (String) XposedHelpers.getObjectField(param.args[0], "niceName");

String coperationAppName = "指定进程名称如:com.android.settings";

if(processName != null){

if(processName.startsWith(coperationAppName)){

log("--------Begin Load Module-------");

String path = "/data/local/tmp/module.apk";

//注意由loadModules换成了loadModule,记得改

XposedInit.loadModule(path, BOOTCLASSLOADER);

}

}

}

});

ZygoteInit.main(args);

} else {

RuntimeInit.main(args);

}

链接:https://www.jianshu.com/p/6b4a80654d4e

深入理解android(三):xposed详解,Xposed原理相关推荐

  1. 深入理解Emoji(三) —— Emoji详解

    深入理解Emoji(一) -- 字符集,字符集编码 深入理解Emoji(二) -- 字节序和BOM Emoji字符是Unicode字符集中一部分. 特定形象的Emoji表情符号对应到特定的Unicod ...

  2. Android 动画框架详解

    Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...

  3. Android Studio 插件开发详解三:翻译插件实战

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78113868 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  4. Android进阶——Preference详解之Preference系的基本应用(三)

    引言 前面一篇文章Android进阶--Preference详解之Preference系的基本应用和管理(二)介绍了二级Preference的使用和特点,接下来进入系统给我提供的底级Preferenc ...

  5. Android编译过程详解(三)

    Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359.html Android编译过程详解(二):h ...

  6. Android 虚拟分区详解(三) 分区状态变化

    Android Virtual A/B 系统简称 VAB,我将其称为虚拟分区. 本系列文章基于 Android R(11) 进行分析,如果没有特别说明,均基于代码版本 android-11.0.0_r ...

  7. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  8. Android 动画框架详解,第 1 部分

    2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...

  9. Android之canvas详解

    首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...

  10. Android 4.4 NotificationManagerService使用详解与原理分析(二)__原理分析

    前置文章: <Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解> 转载请务必注明出处:http://blog. ...

最新文章

  1. 开机运行记事本怎么回事
  2. cocoapods使用教程
  3. 线上直播丨Hinton等6位图灵奖得主、百余位顶级学者邀你群聊AI
  4. http://snmp.adventnet.com/help/snmpapi/snmpv3/table_handling/snmptables_rowdata.html
  5. Java中的queue和deque
  6. 带你剖析WebGis的世界奥秘----Geojson数据加载(高级)
  7. Uva 201 Squares (暴力 + 枚举)
  8. 老板思维:有支出必须有对应的收入
  9. Redis底部的几种存储结构(sds、dict、ziplist、intset、skiplist)
  10. OpenCV精进之路(八):图像轮廓和图像分割修复——轮廓查询和多边形包围轮廓
  11. 给网页添加跟随你鼠标移动的线条动画
  12. win10 没有计算机策略,Win10家庭版没有组策略怎么办
  13. 重症监护室(ICU)100260
  14. 洛谷P2342 叠积木
  15. 一文读懂:制造业头部企业如何构建经营分析数字化体系
  16. Qt Quick事件处理之鼠标 键盘 定时器
  17. 387 stream中间操作:filter
  18. DNF2020年全新脚本展示第二部分
  19. 快速理解图像处理中注意力机制的应用
  20. halcon学习地址

热门文章

  1. erlang io:format io_lib:format
  2. 2021-2022年度“扣哒杯”AI世青赛初赛落下帷幕
  3. 移动端300ms延迟的由来及解决方案
  4. 爬虫--Item Pipeline 介绍(21)
  5. 数据致敬'总裁'-C罗
  6. 世界足坛十大球队球星全力出击
  7. 点菜宝系统服务器无响应,点菜宝系统精典方案介绍
  8. 1+x云计算中级,第二天串讲,拓扑图
  9. matlab计算轮廓曲率半径,【转】求最小曲率半径matlab源程序
  10. linux 加速度传感器数据获取,Android传感器SensorEventListener之加速度传感器