您的位置:首页 > 移动开发 > Android开发

Android中Xposed框架篇-利用Xposed框架实现拦截系统方法

2017-03-13 19:59 1411 查看
本文转载自Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

Xposed框架是Android中hook技术的一个著名的框架,免费而且开源,网上有很多文章介绍了Xposed框架的原理实现,不了解的同学可以自行查阅即可,本文主要介绍如何通过这个框架来进行系统方法的拦截功能。比如开发过程中对于一些测试环境很难模拟,特别是测试同学有时候需要随机改变设备的IMEI等信息用来模拟不同测试场景,这时候如果可以去修改系统的这个值的话对于测试来说就非常方便了。

在介绍如何使用这个框架之前,得先解决下面这几个问题。

第一个问题:这个框架的核心点就是系统进程注入技术,那么如果要注入系统进程,就必须要root权限,所以你如果想用这个框架的话就必须有一个root的设备。

第二个问题:不是所有的设备所有的系统都支持这个框架的使用,当然原生系统肯定是没问题的。我用的华为手机的EMUI系统对这个框架的支持就不是太好,幸好网上有大神给了一个修改版的能支持EMUI系统。

第三个问题:Xposed框架针对不同系统也发布了多个版本,得针对自己的设备系统安装正确的Xposed版本。

环境搭建好了就可以开始操作了,上面安装的Xposed其实是一个模块管理器,如果想做一些hook操作还得自己编写模块。编写好的模块安装到设备之后,Xposed会提示模块未激活。XposedInstaller程序应该是通过广播得到这个应用信息分析是否包含了Xposed模块的特殊属性来判断的。激活成功之后,会提示重启设备才能生效。下面来看一下如何编写一个Xposed模块。

一、新建Android项目导入Xposed工具包

这里一定要注意,不能使用libs文件夹而是lib文件夹,如果使用了libs文件夹的话,在成功安装模块之后重启会发现hook是失败的,通过打印tag为xposed的日志信息会发现下面这样的错误。

Java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

这个错误在以前开发插件的时候遇到过,主要是因为把接口包含到了插件工程中了,估计这里也是因为Xposed工具导致的。只需要把libs文件夹改成lib,然后add buildpath一下即可。Eclipse中如果把工具包放到libs文件中,默认是加入到编译路径中的,同时在编译出来的程序中也包含了这个工具包中的所有类。对于其他非libs文件夹,添加工具包之后再add buildpath只是做到了工程引用工具包的功能,最终并不会把这个工具包包含到程序中。

二、编写模块代码



模块代码编写还是比较简单的,只要新建一个实现IXposedHookLoadPackage接口的类,然后在handleLoadPackage回调方法中进行拦截操作即可,而具体的拦截操作是借助XposedHelpers.findAndHookMethod方法和XposedBridge.hookMethod方法实现的。这两个方法也比较简单,从参数含义可以看到,主要是hook的类名、方法名和拦截的回调方法,一般是拦截之前做什么的一个beforeHookedMethod方法和拦截之后做什么的一个afterHookedMethod方法。



IXposedHookLoadPackage应该是拦截系统中所有应用的信息,这里传递回来的一个LoadPackageParam参数类型包括了hook应用的信息,打印应用的包名就可以看到效果了。不管是hook系统的方法还是hook第三方应用的方法,第一步都得了解到你hook对象的具体信息。系统方法可以查看源码,而第三方应用的话只能借助反编译技术了,比如修改游戏金币功能必须先反编译游戏知道修改金币的类和具体方法才可行。这里我不仅hook了系统的IMEI信息,也简单hook了系统的地理位置信息,在Android中获取经纬度信息有三种方式,这里为了演示简单,用了GPS定位功能,一般获取经纬度信息的代码主要是以下两处。

一处是初始化的时候调用getLastKnowLocation方法获取最后一次系统中的地理位置信息。



还有一处就是监听地理位置变化的回调接口中的onLocationChanged回调方法。



它们的区别就是第一处是通过返回值得到的,第二处是通过回调方法中的参数得到的。下面来看一下具体的hook代码。hook第一处代码比较简单,直接构造一个假的Location对象然后设置返回值即可。



Hook第二处代码有点复杂,需要先找到添加位置监听的方法requestLocationUpdates,然后通过反射得到这个回调对象,找到具体的回调方法再进行操作。因为回调方法是通过参数把Location对象传递回来的,所以这里需要修改参数值。



好了,到这里我们就编写好了hook系统的IMEI值和地理位置信息的模块了。

三、添加模块入口

这一步非常重要也最容易忘,就是要告诉Xposed框架一个模块中Hook的入口,这里可以看到模块的入口是Main类,所以需要在模块的assets中添加一个xposed_init文件。



内容很简单,就是模块入口类的全称。



四、添加模块额外信息

最后一步在模块的AndroidManifest.xml文件添加额外信息,具体包括模块的描述信息、版本号等。



xposedmodule:代表Android程序作为Xposed中的一个模块,值为true。

xposeddescription:代表对本模块的功能的描述,自己简单叙述下就可以了。

xposedminversion:代表本模块开发时用到的Xposed的jar包的最低版本号,这里是30,而我所用的Xposed的jar包版本是54。

最后为了验证hook的结果,新建一个Activity类,在内部调用一下系统的获取IMEI方法以及位置信息方法显示在屏幕中。



五、运行模块

激活并重启设备之后,运行代码看看效果。



从显示结果看到hook成功了,没有Hook之前的效果是这样的。



看一下打印的日志信息。



百度地图在获取设备的IMEI和位置信息,当然这是符合正常情况的。这里可以看到,还可以利用这个技术来观察设备中有哪些应用在获取设备的一些隐私数据。

项目下载

本文主要介绍了Xposed框架的基本使用以及一个简单作用,实际这个框架是非常有用的,比如在文章开头就说到了可以通过修改系统的一些信息来帮助测试模拟复杂的测试环境。但是这个框架现在用的最广泛的当属破解了,这个也是我们后续讲解的重点,用这个框架可以进行应用的脱壳、游戏的外挂等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: