Android逆向 Xposed原理

转载自:http://blog.csdn.net/ascii2/article/details/47974217

第三个问题::Xposed框架做了什么?

image

Xposed修改了app_process程序,在执行第一个java程序(com.Android.internal.os.ZygoteInit)之前进行截获,改变执行流程,进入到自身的main函数体内,这部分java层代码都写在了XposedBridge.jar中。执行的入口点在XposedBridge.jar包中的XposedBridge.java。main函数执行体内主要完成了下面四个部分功能,我们来逐条研究。

image

initNative是本地方法,完成了Xposed框架的初始化工作。
为了方便Xpsoed框架的native方法对上层java方法的调用,在该部分对相关native方法进行了初始化工作。刚才提到的native层方法xposedCallHander回调的handleHookedMethod真正实现体就放在java层。同时将invokeOriginalMethodNative注册为本地方法,初始化了hook资源文件时用到的对象等。

image

比较重要。

initXbridgeZygote()主要hook了几个涉及到应用进程创建、启动的关键类。新的应用进程创建时会调用这几个类的特定方法(调用其中的一种,与应用进程创建模式有关系),Xposed框架通过截获应用进程创建时的相关信息来决定对其处理逻辑(是否加载开发人员所写的hook模块,有感兴趣的应用,如微信、相机等创建时,去注册hook模块中所指定的相关方法为本地方法)。

第一处,

image

下面一段代码是执行自定义代码的示例,

image

下面这几行代码是hook了xposedInstaller(Xposed框架提供给用户的管理工具)的getActiveXposedVersion方法,如果系统中的Xposed框架没有正常启动,显示的版本号不正确。

image
image
image

第二处,

image

第三处,

image
image

这一处用于处理资源文件hook。

image

下面在来看看main函数体内做的第三件重要的事情,读取系统中放置的hook模块。简单的说就是把hook模块随便找个地方丢进去,然后把该模块的路径写进conf/modules.list中就可以了。

•读取“conf/modules.list”文件中写入的apk名称。

•从每一个apk中读取其“/assets/xposed_init”文件中声明的hook主模块类的名称。

•classLoader加载各hook主模块类。

•判断加载的类属于哪一种类别。

•判断加载的类属于哪一种类别,根据类别调用不同的处理方法。

image

共有三种,常用的IXposedHookLoadPackage

image
image

Xposed框架加载完毕后执行将执行权还给com.android.internal.os.ZygoteInit,完成正常的系统启动流程。Xposed框架加载完毕,系统正常启动。

最后,简单总结一下,Xposed框架执行流程:

•创建新应用,获取包名等信息。

•调用XC_LoadPackage.callAll,依次执行各hook模块的代码。

•如果有包名匹配的hook模块,则注册模块中要hook的方法为本地方法。

•当该方被调用的时候,转移到本地xposedCallHandler。

•xposedCallHandler回调上层handlerHookedMethod(因为加载的hook模块代码,一些变量都存储在java层)。

•handlerHookedMethod执行加载的各hook模块。

image

(不同hook模块可设置优先级,根据优先顺序来执行)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值