[转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法
一、前言
关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xposed框架是免费的而且还是开源的,网上也有很多文章介绍了Xposed框架的原理实现,不了解的同学可以自行查阅即可,本文主要介绍如何通过这个框架来进行系统方法的拦截功能,比如我们开发过程中,对于一些测试环境很难模拟,特别是测试同学有时候像随机改变设备的imei,mcc等信息用来模拟不同测试场景,这时候如果可以去修改系统的这个值的话对于测试来说就非常方便了,其实这些在网上已经有很多类似的小工具了,下面就来详细的讲解如何使用这个框架。
二、需要解决的前提问题
在介绍如何使用这个框架之前,咋们得先解决这几个问题:
第一个问题:首先我们知道这个框架的核心点就是系统进程注入技术,那么如果要注入系统进程,就必须要root权限,所以你如果想用这个框架的话就必须得现有一个root的设备。
第二个问题:还有一个问题就是这个框架的适配问题,不是所有的设备所有的系统都支持这个框架的使用的,本人在实验的过程中就遇到了小米3+MIUI7就操作失败了,结果重新刷了一个Android原生4.4系统才成功的。
第三个问题:最后一个问题就是Xposed框架本身的版本问题,他针对不同系统也发布了多个版本,所以你得针对于自己的设备系统安装正确的Xposed版本。
解决了这三个问题咋们才能成功的安装Xposed框架的,而在这个过程中我们会发现遇到这两个问题是最多的:
第一个问题是不兼容问题:
第二个问题是提示安装框架问题:
这两个问题都是比较普遍和蛋疼的,因为底下的安装按钮点击不了,后续没办法操作了,所以很无助的,我也是遇到了这两个问题,最后也是没有找到合适的答案,所以一激动就刷了一个原生的Android4.4系统,
三、环境搭建
上面就提到了现阶段这个框架使用会遇到的一些问题,下面在来看一下具体的环境搭建,如果上面的问题都解决了,咋们在打开应用点击安装框架:
这里还是提示未激活,点击进入:
这时候看到了正常了,可以点击安装了,直接点击安装即可:
这里是需要root授权的,点击允许,安装成功之后也会提示你重启生效的,因为要注入系统进程,必须重启才有效果的。
到这里我们就成功的安装了Xposed框架了,在这个过程中肯定有同学会遇到问题,而最多的问题就是上面提到的那两个问题,关于解决办法我也没有找到。我解决的最根本办法就是刷机了,所以本文我操作的环境是:
小米3移动版+Android原生4.4系统+Xposed_v33版本
四、编写模块功能
环境搭建好了,下面就开始操作了,上面安装的那个工具其实是一个模块管理器,我们如果想做一些hook操作还得自己编写模块也就是应用程序,然后把这个模块安装到设备中,这个工具就可以检测出来了,会提示你加载这模块然后在重启设备,模块功能就有效果了。那么下面来看一下如何编写一个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一个类的具体方法,那么就必须要清楚的了解到这个方法的相信信息,比如参数类型和个数,返回类型等。因为在拦截的过程中必须要对这个方法进行分析,比如得到方法参数来进行具体参数修改,返回值信息来进行返回值修改,这里看到了获取imei值的方法是一个无参数的返回字符串类型的方法,那么如果要拦截他的返回值,就需要修改他的返回值使用setResult方法即可。所以从这里可以看到不管是你hook系统的方法,还是日后去hook第三方应用的具体类方法,第一步都得了解到你hook对象的具体信息,关于系统方法咋们可以通过查看源码来得到信息,而对于第三方应用的话那么只能借助反编译技术了,比如修改游戏金币功能,你必须先反编译游戏知道修改金币的类和具体方法才可行。
这里我不仅Hook了系统的imei信息,也简单的Hook了系统的地理位置信息,在Android中获取经纬度信息有三种方式,这里为了演示简单,用了GPS定位功能,一般获取经纬度信息的代码主要是两处:
一处是初始化的时候调用getLastKnowLocation方法获取最后一次系统中的地理位置信息
还有一处就是监听地理位置变化的回调接口中的onLocationChanged回调方法:
所以如果想Hook系统的地理位置信息进行拦截,那么就需要操作这两处代码了,而他们有一个区别就是,第一处是通过返回值得到的,第二处是通过回调方法中的参数得到的。下面来看一下具体的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方法以及位置信息方法,并且显示在屏幕中:
六、运行模块
下面咋们就来运行一下模块程序,安装到设备之后,Xposed会提示模块未激活:
这个XposedInstaller程序应该是通过安装广播,然后得到这个应用信息分析他是否包含了Xposed模块的特殊属性来判断的。我们点击进行激活:
这时候看到,激活成功之后,会提示你再次重启设备才能生效,所以这里可以看到每次如果有新的模块或者是模块代码有更新了,比如这样:
都是需要重启设备,模块才能生效的,这一点还是有点蛋疼的和麻烦的。然后咋们重启设备之后,在运行我们的模块代码看看效果:
从这显示结果看到了,Hook成功了,在没有Hook之前的效果是:
这时候咋们在来看一下打印的日志信息:
看到了,百度地图在获取我们设备的imei和位置信息,当然这是符合正常情况的,从这里可以看到,我们还可以利用这个技术来观察设备中有哪些应用在获取设备的一些隐私数据。
项目下载地址:http://download.csdn.net/detail/jiangwei0910410003/9654604
七、实际用途
本文主要是介绍了Xposed框架的基本使用以及一个简单作用,但是在实际过程中,这个框架是非常有用的,比如在文章开头就说到了,我们可以通过修改系统的一些信息来帮助测试模拟复杂的测试环境,但是这个框架现在用的最广泛的当属破解了,这个也是我们后续讲解的重点,用这个框架咋们可以进行应用的脱壳,游戏的外挂等。
八、总结
本文是介绍Xposed的基础篇,主要介绍了Xposed的具体使用,XposedInstaller.apk其实是一个模块载体和管理器,如果想实现具体的Hook操作,就必须自己在编写模块程序,然后在激活加载方可生效。后续会继续介绍用这个框架咋们来进行其他一些操作,比如应用的脱壳,游戏外挂编写,系统信息篡改等知识,期待大家多多期盼和点赞啦啦!!
关注微信公众号,最新技术文章干货实时推送
[转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法的更多相关文章
- [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法
一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...
- (转载)Android中的Service:Binder,Messenger,AIDL(2)
前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建 ...
- UI设计实战篇——利用Bootstrap框架制作查询页面的界面
Bootstrap框架是一个前端UI设计的框架,它提供了统一的UI界面,简化了设计界面UI的过程(缺点是定制了界面,调整的余地不是太大).尤其是现在的响应时布局(我的理解是页面根据不同的分辨率,采用不 ...
- (转)UI设计实战篇——利用Bootstrap框架制作查询页面的界面
原文地址:http://www.cnblogs.com/grenet/p/3413085.html Bootstrap框架是一个前端UI设计的框架,它提供了统一的UI界面,简化了设计界面UI的过程(缺 ...
- android 串口开发第二篇:利用jni实现android和串口通信
一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...
- 在android中配置 slf4j + log4j 日志记录框架
需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...
- CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)
背景 结合上一篇CLion之C++框架篇-优化框架,引入boost(三),继续进行框架优化!在项目中,我们经常会通过get方式拉取第三方资源,这一版优化引入类库curl,用来拉取第三方资源库. ...
- Android中常见的图片加载框架
图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...
- [转载]android中The connection to adb is down,问题和解决
原网址:http://blog.sina.com.cn/s/blog_5fc93373010164p3.html 今天我出现了第3个错误,于是百度了一下.感觉这篇博客对我挺有帮助,推荐给大家.以下是原 ...
随机推荐
- tomcat切割日志的shell脚本
#!/bin/bash cd /usr/tomcats/ d=`date +%F` m1=`date -d'1 month ago' +%F` ` do cd tomcat808"$i&qu ...
- LeetCode 【235. Lowest Common Ancestor of a Binary Search Tree】
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
- RabbitMQ中 exchange、route、queue的关系
从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心,下面我们就围绕这三个主要组件 从应用使用的角度全面的介绍如何利用Rabbit MQ构建 ...
- 在Windows上,迁移VisualSVN server
最近在搭建自动化测试框架,顺便了解了一下SVN的搭建.对于一般的使用场景,VisualSVN还是挺方便的,而且上手特别快. 由于是第一个demo,后期要迁移到其他服务器上面,所以就熟悉了一下serve ...
- Maven学习3-使用Maven构建项目
转自:http://www.cnblogs.com/xdp-gacl/p/4240930.html maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项 ...
- Nginx 负载均衡学习
nginx作为负载均衡服务器,用户请求先到达nginx,再由nginx根据负载配置将请求转发至 tomcat服务器. nginx负载均衡服务器 tomcat1服务器 tomcat2服务器 1.1 ...
- 每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询
前言: 前一段时间一直都比较忙,没有什么时间进行总结,刚好节前项目上线,同时趁着放假可以好好的对之前遇到的一些问题进行总结.主要内容有使用SharePoint服务端对象模型进行查询.为SharePoi ...
- python学习-day15:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r
---恢复内容开始--- 一.全局变量与局部变量 在子程序中定义的变量称为局部变量, 在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序.当全局变量与 ...
- [git]git 分支
什么动作,关键看你想完成什么 1. 添加新的远程分支: git push origin current_local_branch:new_remote_branch 2. 删除远程分支(冒号前必须要有 ...
- Redis部分数据结构方法小结
package com.practice.util; import java.util.HashMap; import java.util.List; import java.util.Map; im ...