一、Xposed框架的核心原理
修改/system/bin/app-process程序。在android执行第一个程序zygote进程之前进行截获,改变执行流程,进入到自身的Main函数体内。Main函数执行体内主要完成以下四步流程:
(XPOSED的安装器替换安卓系统的app_process文件,从而实现对系统的接管,通过回调模块的方式来达到不用修改APK就能改变其表现行为的目的。该框架比较成熟,对应的模块也非常多,常用的还有模拟地理位置,伪装手机设备信息等,脑洞是非常之大,基本上能想到的都能做到。)
app_process其实是一个程序,存放在systen/bin目录下的,作用就是启动一个程序,启动zygote进程,所有App启动。App_process只要找到需要运行程序的main函数,也就是入口函数,然后执行,他不仅能执行C/C++程序,也可以执行Java程序。
在Android中,zygote(受精卵)是整个系统创建新进程的核心进程。
Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是Zygoteinit进程的子孙进程,也就是说,所有的进程都是直接或者间接地由Zygoteinit进程fork出来的。
由于Xposed框架Hook了Android的核心进程Zygote,而其他应用启动都是从Zygote进程fork而来,就够达到针对系统上所有的应用程序进程的Hook。
二、Xposed内部的执行流程:
•创建新应用,获取包名等信息。
•调用XC_LoadPackage.callAll,依次执行各hook模块的代码。
•如果有包名匹配的hook模块,则注册模块中要hook的方法为本地方法。
•当该方被调用的时候,转移到本地xposedCallHandler。
•xposedCallHandler回调上层handlerHookedMethod(因为加载的hook模块代码,一些变量都存储在java层)。
•handlerHookedMethod执行加载的各hook模块
beforeHookedMethod 该方法在hook目标方法执行前调用,其中,参数param指的是目标方法的相关参数、回调、方法等信息;
afterHookedMethod该方法在hook目标方法执行后调用,其中,参数param指的是目标方法的相关参数、回调、方法等信息。
Xposed运行多个模块对同一个方法进行hook时,框架就会根据Xposed模块的优先级来排序,在具有a.before、a.after、b.before、b.after的情况下,运行的先后顺序如下:
hook是Windows中提供的一种用以替换DOS下“中断”的系统机制。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
Xposed框架核心思想:在于将java层普通函数注册成本地JNI方法,以此来变相实现HOOk机制。
三、API说明
1、IXposedHookLoadPackage.java
方法: handleLoadPackage,这个方法用于在加载应用程序的包的时候执行用户的操作
参数说明: final LoadPackageParam lpparam 这个参数包含了加载的应用程序的一些基本信息。
public Member method;//方法名
p2、XposedHelpers.java
方法: findAndHookMethod,这是一个辅助方法,可以通过静态导入使用
参数说明: findAndHookMethod(Class> clazz, ClassLoader, methodName, Object…, parameterTypesAndCallback )
Class> clazz, //需要 Hook 的类名;
ClassLoader,//类加载器,可以设置为 null String;
methodName, //需要 Hook 的方法名;
Object…,//对象类型;
parameterTypesAndCallback //回调方法
回调方法包括:a.XC_MethodHook b.XC_MethodReplacement
3、XposedBridge.java
方法: log(),打日志。
该方法可以将 log 信息以及 Throwable 抛出的异常信息输出到标准的logcat 以及/data/xposed/debug.log 这个文件中
无参方法: hookAllMethods/hookAllConstructors,该方法可以用来 hook 某个类中的所有方法或者构造函数,但是不同的Rom(非Android原生 Rom)会有不同的变种。
还有什么问题不明白,或者不会,我为你解答
欢迎加入我的Java与Android逆向开发交流QQ群,一起交流学习。