[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

时间:2022-09-21 13:59:59

一、前言

关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xposed框架是免费的而且还是开源的,网上也有很多文章介绍了Xposed框架的原理实现,不了解的同学可以自行查阅即可,本文主要介绍如何通过这个框架来进行系统方法的拦截功能,比如我们开发过程中,对于一些测试环境很难模拟,特别是测试同学有时候像随机改变设备的imei,mcc等信息用来模拟不同测试场景,这时候如果可以去修改系统的这个值的话对于测试来说就非常方便了,其实这些在网上已经有很多类似的小工具了,下面就来详细的讲解如何使用这个框架。

二、需要解决的前提问题

在介绍如何使用这个框架之前,咋们得先解决这几个问题:

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

第二个问题:还有一个问题就是这个框架的适配问题,不是所有的设备所有的系统都支持这个框架的使用的,本人在实验的过程中就遇到了小米3+MIUI7就操作失败了,结果重新刷了一个Android原生4.4系统才成功的。

第三个问题:最后一个问题就是Xposed框架本身的版本问题,他针对不同系统也发布了多个版本,所以你得针对于自己的设备系统安装正确的Xposed版本。

解决了这三个问题咋们才能成功的安装Xposed框架的,而在这个过程中我们会发现遇到这两个问题是最多的:

第一个问题是不兼容问题:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

第二个问题是提示安装框架问题:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

这两个问题都是比较普遍和蛋疼的,因为底下的安装按钮点击不了,后续没办法操作了,所以很无助的,我也是遇到了这两个问题,最后也是没有找到合适的答案,所以一激动就刷了一个原生的Android4.4系统,

三、环境搭建

上面就提到了现阶段这个框架使用会遇到的一些问题,下面在来看一下具体的环境搭建,如果上面的问题都解决了,咋们在打开应用点击安装框架:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

这里还是提示未激活,点击进入:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

这时候看到了正常了,可以点击安装了,直接点击安装即可:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

这里是需要root授权的,点击允许,安装成功之后也会提示你重启生效的,因为要注入系统进程,必须重启才有效果的。

到这里我们就成功的安装了Xposed框架了,在这个过程中肯定有同学会遇到问题,而最多的问题就是上面提到的那两个问题,关于解决办法我也没有找到。我解决的最根本办法就是刷机了,所以本文我操作的环境是:

小米3移动版+Android原生4.4系统+Xposed_v33版本

四、编写模块功能

环境搭建好了,下面就开始操作了,上面安装的那个工具其实是一个模块管理器,我们如果想做一些hook操作还得自己编写模块也就是应用程序,然后把这个模块安装到设备中,这个工具就可以检测出来了,会提示你加载这模块然后在重启设备,模块功能就有效果了。那么下面来看一下如何编写一个Xposed模块呢?

第一步:新建一个Android项目,导入Xposed工具包

[转]Android中Xposed框架篇—利用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方法。

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

对于IXposedHookLoadPackage这个接口和回调方法,我们可以知道,应该是拦截系统中所有应用的运行信息,这里传递回来的一个LoadPackageParam参数类型就是包括了Hook应用的具体信息,我们可以打印应用的包名就可以看到效果了。

注意:

如果你想Hook一个类的具体方法,那么就必须要清楚的了解到这个方法的相信信息,比如参数类型和个数,返回类型等。因为在拦截的过程中必须要对这个方法进行分析,比如得到方法参数来进行具体参数修改,返回值信息来进行返回值修改,这里看到了获取imei值的方法是一个无参数的返回字符串类型的方法,那么如果要拦截他的返回值,就需要修改他的返回值使用setResult方法即可。所以从这里可以看到不管是你hook系统的方法,还是日后去hook第三方应用的具体类方法,第一步都得了解到你hook对象的具体信息,关于系统方法咋们可以通过查看源码来得到信息,而对于第三方应用的话那么只能借助反编译技术了,比如修改游戏金币功能,你必须先反编译游戏知道修改金币的类和具体方法才可行。

这里我不仅Hook了系统的imei信息,也简单的Hook了系统的地理位置信息,在Android中获取经纬度信息有三种方式,这里为了演示简单,用了GPS定位功能,一般获取经纬度信息的代码主要是两处:

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

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

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

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

所以如果想Hook系统的地理位置信息进行拦截,那么就需要操作这两处代码了,而他们有一个区别就是,第一处是通过返回值得到的,第二处是通过回调方法中的参数得到的。下面来看一下具体的Hook代码:

Hook第一处代码比较简单,直接构造一个假的Location对象然后设置返回值即可。

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

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

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

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

第三步:添加模块入口

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

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

这里的内容很简单,就是模块入口类的全称名称即可:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

第四步:添加模块的额外信息

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

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

xposedmodule:代表的是Android程序作为Xposed中的一个模块,所以值为true;
xposeddescription:代表的是对本模块的功能的描述,可以自己简单叙述下就可以了;
xposedminversion:代表的是本模块开发时用到的xposed的jar包的最低版本号,这里是30,而我所用的xposed的jar包版本是54;

经过上面四步之后咋们就完成了模块的定义了,最后咋们为了验证我们Hook的结果,在新建一个Activity类,在内部调用一下系统的获取imei方法以及位置信息方法,并且显示在屏幕中:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

六、运行模块

下面咋们就来运行一下模块程序,安装到设备之后,Xposed会提示模块未激活:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

这个XposedInstaller程序应该是通过安装广播,然后得到这个应用信息分析他是否包含了Xposed模块的特殊属性来判断的。我们点击进行激活:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

这时候看到,激活成功之后,会提示你再次重启设备才能生效,所以这里可以看到每次如果有新的模块或者是模块代码有更新了,比如这样:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

都是需要重启设备,模块才能生效的,这一点还是有点蛋疼的和麻烦的。然后咋们重启设备之后,在运行我们的模块代码看看效果:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

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

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

这时候咋们在来看一下打印的日志信息:

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

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

项目下载地址:http://download.csdn.net/detail/jiangwei0910410003/9654604

七、实际用途

本文主要是介绍了Xposed框架的基本使用以及一个简单作用,但是在实际过程中,这个框架是非常有用的,比如在文章开头就说到了,我们可以通过修改系统的一些信息来帮助测试模拟复杂的测试环境,但是这个框架现在用的最广泛的当属破解了,这个也是我们后续讲解的重点,用这个框架咋们可以进行应用的脱壳,游戏的外挂等。

八、总结

本文是介绍Xposed的基础篇,主要介绍了Xposed的具体使用,XposedInstaller.apk其实是一个模块载体和管理器,如果想实现具体的Hook操作,就必须自己在编写模块程序,然后在激活加载方可生效。后续会继续介绍用这个框架咋们来进行其他一些操作,比如应用的脱壳,游戏外挂编写,系统信息篡改等知识,期待大家多多期盼和点赞啦啦!!

转自:Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法的更多相关文章

  1. [转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法

    本文转载自: http://www.wjdiankong.cn/android%E4%B8%ADxposed%E6%A1%86%E6%9E%B6%E7%AF%87-%E5%88%A9%E7%94%A8 ...

  2. UI设计实战篇——利用Bootstrap框架制作查询页面的界面

    Bootstrap框架是一个前端UI设计的框架,它提供了统一的UI界面,简化了设计界面UI的过程(缺点是定制了界面,调整的余地不是太大).尤其是现在的响应时布局(我的理解是页面根据不同的分辨率,采用不 ...

  3. (转)UI设计实战篇——利用Bootstrap框架制作查询页面的界面

    原文地址:http://www.cnblogs.com/grenet/p/3413085.html Bootstrap框架是一个前端UI设计的框架,它提供了统一的UI界面,简化了设计界面UI的过程(缺 ...

  4. android 串口开发第二篇:利用jni实现android和串口通信

    一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...

  5. 在android中配置 slf4j + log4j 日志记录框架

    需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...

  6. CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)

      背景   结合上一篇CLion之C++框架篇-优化框架,引入boost(三),继续进行框架优化!在项目中,我们经常会通过get方式拉取第三方资源,这一版优化引入类库curl,用来拉取第三方资源库. ...

  7. Android中常见的图片加载框架

    图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...

  8. Android 中Json解析的几种框架(Gson、Jackson、FastJson、LoganSquare)使用与对比

    介绍 移动互联网产品与服务器端通信的数据格式,如果没有特殊的需求的话,一般选择使用JSON格式,Android系统也原生的提供了JSON解析的API,但是它的速度很慢,而且没有提供简介方便的接口来提高 ...

  9. Android中实现对/system/bin/surfaceflinger进程进行拦截和注入

    对于Android for arm上的so注入(inject)和挂钩(hook),网上已有牛人给出了代码inject.由于实现中的ptrace函数是依赖于平台的,所以不经改动只能用于arm平台.本文将 ...

随机推荐

  1. php变量内存完全释放

    <?php echo memory_get_usage().PHP_EOL;$a = 1;$b = $a;$a = null;$b = null;unset($a);unset($b);echo ...

  2. table 锁定表头,出滚动对齐

    前一段时间来了一个汇总的需求,想锁定表头,这个问题在网上找了老半天,实现起来都比较麻烦,经过这几天的摸索终于找到一个简洁的处理方法 下面介绍一下如何处理的: 1.thead 和tbody 放两个tab ...

  3. 把两个DataTable连接起来,相当于Sql的Inner Join方法

    在C#中把两个DataTable连接起来,相当于Sql的Inner Join方法 作者:浪漫十一狼在下面的例子中实现了3个Join方法,其目的是把两个DataTable连接起来,相当于Sql的Inne ...

  4. RH133读书笔记&lpar;7&rpar;-Lab 7 Advanced Filesystem Mangement

    Lab 7 Advanced Filesystem Mangement Goal: Develop skills and knowlege related to Software RAID, LVM, ...

  5. IE兼容

    这个基本知识http://www.cnblogs.com/yoosou/archive/2012/07/27/2612443.html 参考: http://www.cnblogs.com/cocow ...

  6. mysql的基本操作笔记

    环境:已安装MySQL5.7.18,上一篇文章:Windows下安装MySQL5.7.18的方法 登录方式一: mysql -h 127.0.0.1 -u root -p -h:当连接MySQL服务器 ...

  7. &lbrack;WC2018&rsqb;州区划分

    [WC2018]州区划分 注意审题: 1.有序选择 2.若干个州 3.贡献是州满意度的乘积 枚举最后一个州是哪一个,合法时候贡献sum[s]^p,否则贡献0 存在欧拉回路:每个点都是偶度数,且图连通( ...

  8. R语言三元相图的做法

    通常情况下,对于三维数据,我们会用三维图表来展示,想要从三维图表上观察出一定的规律,需要一定的空间想象力: 而三元相图,其实就是用二维平面的1个等边三角形来表征三维数据,三角形的每一条边对应1个维度, ...

  9. mmc生产任务分配问题续

    mmc生产任务分配问题续,本题目比上个题目难, 要注意的是,生产,销售,库存的关系, 生产+上月库存-销售=本月库存, 期初,生产=库存,销售没有.

  10. antdVG6随记

    g6是一个很棒的可视化工具 目前支持开发者搭建属于自己的图,图分析.图应用.图编辑器 图编辑器可以支持多种图例的创建 G6 是一个简单.易用.完备的图可视化引擎,它在高定制能力的基础上,提供了一系列设 ...