Xposed、Dexposed、Epic对比总结:
1、Xposed框架是需要root的,他的功能很全,能够hook掉系统方法,同时也可以hook掉其他应用的一些方法。
2、Dexposed框架是不需要root的,但是他只能hook掉在自己的应用进程中的一些方法,其他应用进程是没办法hook的。
3、Epic是基于Dexposed进行的修改,支持art虚拟机上面的Hook。
一、Xposed原理:
万物皆可 Hook,探究 Xposed 框架 Hook 原理 - 知乎
Android 系统是基于 Linux 的,其第一个由内核启动的用户进程是 init 进程。init 进程随后会创建 zygote 进程,Android 应用程序进程都是由 zygote 进程孵化而来。zygote 所对应的可执行程序是 app_process,xposed 框架通过替换系统的 app_process 可执行文件以及虚拟机动态链接库,让 zygote 在启动应用程序进程时注入框架代码,进而实现对应用程序进程的劫持。
设备root之后,system/bin/下面的文件替换了app_process等文件,app_process就是zygote进程文件。所以Xposed通过替换zygote进程实现了控制手机上所有app进程。因为所有app进程都是由Zygote fork出来的。使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。
Xposed的基本原理是修改了ART/Davilk虚拟机,将需要hook的函数注册为Native层函数。当执行到这一函数时虚拟机会优先执行Native层函数,然后再去执行Java层函数,这样完成函数的hook。
EnableXposedHook 方法的实现,代码位于 android_art/runtime/art_method.c,这里涉及较深入的 ART 虚拟机知识,大致可以这么理解这一段代码的意思,首先拿到 Hook 对象方法的执行地址,在此地址上替换成增加了 before 以及 after 实现的方法,让 Hook 对象方法运行时,可以按顺序执行 before、原方法以及 after。
通过读Xposed源码发现其启动过程:
1、手机启动时init进程会启动zygote这个进程。由于zygote进程文件app_process已被替换,所以启动的时Xposed版的zygote进程。
2、Xposed_zygote进程启动后会初始化一些so文件(system/lib system/lib64),然后进入XposedBridge.jar中的XposedBridge.main中初始化jar包完成对一些关键Android系统函数的hook。
3、Hook则是利用修改过的虚拟机将函数注册为native函数。
4、然后再返回zygote中完成原本zygote需要做的工作。
<