Xposed初识
参考:http://blog.csdn.net/wxyyxc1992/article/details/17320911
Xposed简介
Xposed是GitHUB上rovo89设计的一个针对Android平台的动态劫持项目,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。与采取传统的Inhook方式(Dynamic Dalvik Instrumentation)相比,Xposed在开机的时候完成对所有的Hook Function的劫持,在原Function执行的前后加上自定义代码。
zygote进程
zygote(受精卵)进程是Android系统进程
在Android系统中,所有应用程序以及系统服务进程SystemSever都是有Zygote进程fork(孕育)出来的:当ActivityManagerService启动一个应用程序的时候,通过socket与zygote进程进行通信,请求zygote进程fork出一个子进程,作为这个即将要启动的应用程序的进程;Android系统中两个重要服务PackageManagerService和ActivityManagerService都是由SystemServer进程来负责启动的,而SystemServer是由zygote进程在启动时候fork出来的。
Android系统基于Linux内核,Linux中所有进程都是init进程的子孙进程,也就是说所有的进程都是直接或间接地由init进程fork出来的,因此zygote进程也产生于此。
概括:init进程->zygote进程->Android的所有子孙进程
Xposed hook原理
Xposed 框架中真正起作用的是对方法的hook
在Android系统启动的时候,zygote进程加载XposedBridge将所有需要替换的Method通过JNI方法hookMethodNative指向Native方法xposedCallHandler,xposedCallHandler在转入handleHookedMethod这个Java方法执行用户规定的Hook Func。
XposedBridge这个jar包含有一个私有的本地方法:hookMethodNative,该方法在附加的app_process程序中也得到了实现。它将一个方法对象作为输入参数(你可以使用Java的反射机制来获取这个方法)并且改变Dalvik虚拟机中对于该方法的定义。它将该方法的类型改变为native并且将这个方法的实现链接到它的本地的通用类的方法。换言之,当调用那个被hook的方法时候,通用的类方法会被调用而不会对调用者有任何的影响。在hookMethodNative的实现中,会调用XposedBridge中的handleHookedMethod这个方法来传递参数。handleHookedMethod这个方法类似于一个统一调度的Dispatch例程,其对应的底层的C++函数是xposedCallHandler。而handleHookedMethod实现里面会根据一个全局结构hookedMethodCallbacks来选择相应的hook函数,并调用他们的before, after函数。
当多模块同时Hook一个方法的时候,Xposed会自动根据Module的优先级来排序,调用顺序如下:
A.before -> B.before -> original method -> B.after -> A.after
Dynamic Dalvik Instrument(ddi) hook
参考:http://blog.csdn.net/roland_sun/article/details/38640297
java.lang.Instrument包是在JDK5引入的,程序员通过修改方法的字节码实现动态修改类代码。