Xposed原理与应用Api

 一、Xposed框架的核心原理

修改/system/bin/app-process程序。在android执行第一个程序zygote进程之前进行截获,改变执行流程,进入到自身的Main函数体内。Main函数执行体内主要完成以下四步流程:

 

  1. initNative(). 为了方便Xposed框架的native方法对上层Java方法的调用,在该部分对相关native方法进行初始化工作。
  2. initXbrigdeZygote().主要hook几个涉及到应用进程创建,启动的关键类。
  3. loadModules,读取系统中放置的hook模块,然后把该模块的路径写进conf/moudules.list中。
  4. Xposed框架加载完毕后,将执行权还给第一个程序zygote,完成正常的系统启动流程。

(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的情况下,运行的先后顺序如下:

  1. before -> b.before ->originalMethod -> b.after -> a.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群,一起交流学习。

Xposed原理与应用Api_第1张图片

 

 

你可能感兴趣的:(Android,反编译)