新人见面会流程框架求教如何用Xposed框架改下GPS位置

6724人阅读
Android(6)
最近在参加第八届全国大学生信息安全竞赛,成功杀入决赛。本人负责核心模块的hook,hook的实现还是用开源框架Xposed。其中的一个需求就是保护用户的敏感数据:当前位置信息。前期做了很多尝试都失败了,这里换一种角度思考,顿时眼前一亮。呵呵,不在这里扯淡了,开始进入正题。
LBS应用的定位原理
经常用微信、人人的用户会发现,这一类客户端有个比较有意思的功能,就是在你发状态的时候可以添加自己的位置,可以查找“附近的人”,而且定位得相对比较准确。即使不开启手机的GPS服务,它可以定位,用WiFi它仍然可以定位,用运营商的移动网络它依然可以定位,这个功能是不是很强大?
其实,像微信这一类应用的“找朋友”功能的实现上借助的是“基于位置的服务”(Location Based Service,LBS),它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网、WIFI热点)或外部定位方式(如GPS)获取到用户实时所在的地理位置(地理坐标),在GIS(Geographic Information System,地理音讯系统)平台的支持下,为用户提供相应服务的一种功能。
LBS是借助手机基站来实现定位。每座手机基站都有自己的独立编号,手机在开机状态下会同时接收到多座基站的信号,往常打电话时它与只其中信号最佳的一座基站建立通讯衔接,但在需求定位时就会丈量周边3个或更多的基站信号,根据,推算出手机所处的位置。
可以把手机基站的覆盖范围想像成一个个以基站为圆心的圆,需要定位时,手机就向周边多座基站发送测量信号,并计算这些测量信号抵达基站所需要的时间,推算出手机距离基站的直线距离,再经过数学运算,手机位置坐标就可由3个基站圆的交点来确定。手机定位的准确度与基站密度、现场环境有很大联系,市区内精度范围大致在200米左右,郊区精度范围大致在1000米~2000米左右,随着技术的不时开展,基站的密度增加。在某有些场所下,手机定位的精度已能到达50米。不过,我个人还是不是很理解这种三点定位的方式,呵呵。
原理部分已经介绍完毕,下面就进入我们的正题,如何拦截你的位置,that is a question……
拦截的思路
其实思路比较简单,既然已经知道LBS定位的原理是借助手机基站来实现的。每座手机基站都有自己的独立编号,手机在开机状态下会同时接收到多座基站的信号,在定位时会就会丈量周边neighbour基站的信号,然后利用三角定位的方式,推算出手机所处的位置。所以这类应用在定位的时候,会尝试读取周围基站的信号,那么我们可以这样思考,我们可以尝试着Hook安卓操作系统中有关该基站、网络定位的部分,将其内容全部置空。然后迫使该类应用只能通过GPS来实现定位,那么,我们可以考虑向相关的GPS接口中传入一个假的经纬度的值就可以实现完美的拦截。研究一下Android操作系统中有个基站、网络、GPS定位的源码[这里推荐几个网站,一个是,一个是,这两个网站提供Android操作系统各个版本的源码,很强大,为广大程序员“Read the fucking source code”提供了很大的方便,呵呵]。仔细研究一下,会发现需要拦截的东西确实不多,主要是android.net.wifi.WifiManager类的getScanResults方法、android.telephony.TelephonyManager类的getCellLocation和getNeighboringCellInfo方法、以及android.location.LocationManager类的requestLocationUpdates方法、getGpsStatus方法。
需要多说一句,开发安全方面的应用,缺少不了一款开源神器Xprivacy,这款神器可以实时查看每个应用的调用过程,甚至内部的调用函数,可以为开发者寻找解决方案提供很有价值的参考信息,减少不少阻力。下面给出核心的编码实现,主要是针对微信、人人、QQ等提供LBS服务的应用。效果就是修改自己当前的位置信息,制造一个假的地理位置信息。
核心实现的源码如下:
package com.whu.
import de.robv.android.xposed.*;
import de.robv.android.xposed.XC_MethodHook.MethodHookP
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageP
import de.robv.android.xposed.XposedB
import android.app.A
import android.location.GpsS
import android.location.GpsS
import android.location.L
import android.location.LocationL
import android.location.LocationM
import android.os.B
import android.util.L
import java.lang.reflect.InvocationH
import java.lang.reflect.M
import java.lang.reflect.M
import java.lang.reflect.P
import java.util.HashM
import java.util.I
* Li Jiansong
上午10:39:39
*借助Xprivacy应用查看各个类的调用过程
*hook com.tencent.mm
*android.net.wifi.WifiManager的getScanResults
*android.telephony.TelephonyManager的getCellLocation和getNeighboringCellInfo方法
*android.location.LocationManager的requestLocationUpdates方法、getGpsStatus方法
*北京经纬度:(116..862559)
public class GPSHooker implements IXposedHookLoadPackage{
private final String TAG = "Xposed";
private LoadPackageParam mL
private static Share share = new Share();
public void log(String s){
Log.d(TAG, s);
XposedBridge.log(s);
private void hook_method(Class&?& clazz, String methodName, Object... parameterTypesAndCallback)
XposedHelpers.findAndHookMethod(clazz, methodName, parameterTypesAndCallback);
} catch (Exception e) {
XposedBridge.log(e);
private void hook_method(String className, ClassLoader classLoader, String methodName,
Object... parameterTypesAndCallback)
XposedHelpers.findAndHookMethod(className, classLoader, methodName, parameterTypesAndCallback);
} catch (Exception e) {
XposedBridge.log(e);
private void hook_methods(String className, String methodName, XC_MethodHook xmh)
Class&?& clazz = Class.forName(className);
for (Method method : clazz.getDeclaredMethods())
if (method.getName().equals(methodName)
&& !Modifier.isAbstract(method.getModifiers())
&& Modifier.isPublic(method.getModifiers())) {
XposedBridge.hookMethod(method, xmh);
} catch (Exception e) {
XposedBridge.log(e);
public void handleLoadPackage(LoadPackageParam lpp) throws Throwable {
share.reloadX();
HashMap&String, String& gpslist=share.getallX("gps");
XposedBridge.log("----------gps"+gpslist.toString());
if(gpslist.containsKey(mLpp.packageName))
XposedBridge.log("-----------没有保护,所以获取是假地址:"+mLpp.packageName);
hook_method("android.net.wifi.WifiManager", mLpp.classLoader, "getScanResults",
new XC_MethodHook(){
* Android提供了基于网络的定位服务和基于卫星的定位服务两种
* android.net.wifi.WifiManager的getScanResults方法
* Return the results of the latest access point scan.
* the list of access points found in the most recent scan.
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
param.setResult(null);
hook_method("android.telephony.TelephonyManager", mLpp.classLoader, "getCellLocation",
new XC_MethodHook(){
* android.telephony.TelephonyManager的getCellLocation方法
* Returns the current location of the device.
* Return null if current location is not available.
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
param.setResult(null);
hook_method("android.telephony.TelephonyManager", mLpp.classLoader, "getNeighboringCellInfo",
new XC_MethodHook(){
* android.telephony.TelephonyManager类的getNeighboringCellInfo方法
* Returns the neighboring cell information of the device.
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
param.setResult(null);
hook_methods("android.location.LocationManager", "requestLocationUpdates",
new XC_MethodHook() {
* android.location.LocationManager类的requestLocationUpdates方法
* 其参数有4个:
* String provider, long minTime, float minDistance,LocationListener listener
* Register for location updates using the named provider, and a pending intent
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (param.args.length == 4 && (param.args[0] instanceof String)) {
LocationListener ll = (LocationListener)param.args[3];
Class&?& clazz = LocationListener.
Method m = null;
for (Method method : clazz.getDeclaredMethods()) {
if (method.getName().equals("onLocationChanged")) {
if (m != null) {
Object[] args = new Object[1];
Location l = new Location(LocationManager.GPS_PROVIDER);
double la=39.862559;
double lo=116.449535;
l.setLatitude(la);
l.setLongitude(lo);
m.invoke(ll, args);
XposedBridge.log("fake location: " + la + ", " + lo);
} catch (Exception e) {
XposedBridge.log(e);
hook_methods("android.location.LocationManager", "getGpsStatus",
new XC_MethodHook(){
* android.location.LocationManager类的getGpsStatus方法
* 其参数只有1个:GpsStatus status
* Retrieves information about the current status of the GPS engine.
* This should only be called from the {@link GpsStatus.Listener#onGpsStatusChanged}
* callback to ensure that the data is copied atomically.
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
GpsStatus gss = (GpsStatus)param.getResult();
if (gss == null)
Class&?& clazz = GpsStatus.
Method m = null;
for (Method method : clazz.getDeclaredMethods()) {
if (method.getName().equals("setStatus")) {
if (method.getParameterTypes().length & 1) {
m.setAccessible(true);
int svCount = 5;
int[] prns = {1, 2, 3, 4, 5};
float[] snrs = {0, 0, 0, 0, 0};
float[] elevations = {0, 0, 0, 0, 0};
float[] azimuths = {0, 0, 0, 0, 0};
int ephemerisMask = 0x1f;
int almanacMask = 0x1f;
int usedInFixMask = 0x1f;
if (m != null) {
m.invoke(gss,svCount, prns, snrs, elevations, azimuths, ephemerisMask, almanacMask, usedInFixMask);
param.setResult(gss);
} catch (Exception e) {
XposedBridge.log(e);
本人的真实地理位置信息是在湖北武汉:
打开微信客户端,查看自己当前位置,可以发现显示的是帝都的位置:
打开人人,查找附近的人,也是在帝都:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:219389次
积分:2279
积分:2279
排名:第16153名
原创:86篇
评论:115条
(1)(1)(3)(5)(1)(4)(2)(8)(7)(1)(35)(8)(4)(6)新人求教,xposed使用过程中产生的大量日志文件怎么删?【xposed框架吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:139,934贴子:
新人求教,xposed使用过程中产生的大量日志文件怎么删?收藏
如题,谢谢了
根目录,进data再进去找data,然后有个 de.robv.android.xposed.installer,然后进去,找到log这个文件夹,删除,再创建一个名字一样的,OK
精品贴里有个一劳永逸的方法,自寻                     没有会员不敢出来水经验(;一_一)        --来自贴吧客户端
登录百度帐号推荐应用【提问】新人报道兼求教【xposed框架吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:139,934贴子:
【提问】新人报道兼求教收藏
本人高二狗,最近入手魅蓝note,使用了魅工具箱开始接触xposed框架,最近看到吧里很多大神自己修改的锁屏,状态栏,十分羡慕,想学着使用,可是又不知如何入手,所以求教大神指点迷津。要用什么能够修改状态栏的启动图标,比如什么Wifi,GPS这一类的,还有,用什么可以更改电池图标,锁屏又用什么,求指教,谢谢咯?
重力工具箱,FS状态栏,
登录百度帐号推荐应用焦油, 积分 55, 距离下一级还需 145 积分
焦油, 积分 55, 距离下一级还需 145 积分
焦油, 积分 55, 距离下一级还需 145 积分
主题 : 2|帖子 : 16|积分 : 55
我于2015年购买了1+2代手机&&
参考&&这个帖子 成功ROOT了
现在想要安装XPOSED并安装自己的插件。问题来了!
首先是&&网上下载的XPOSED .APK& & 该软件根本没有 安装/更新 这个按钮,它是灰色的不可按,。&&或者就是显示红色的大字英文
不与我的-sdk22-arm64&&对应,&&吓的我不敢点击安装
后来看到这位大师的帖子
我下载了里面的 XPOSED&&安装好进去软件,里面不能点击安装/更新,显示需要我安装ZIP包
我找到了我对应的ZIP包 应该是我对应的xposed-v75-sdk22-arm64.ZIP&&应该是这个没错
那么我该把这个ZIP 放在根目录的哪里? 用什么方案安装呢 我找了半天没有教程。 请教各位大师 谢谢!!!
煤油, 积分 3151, 距离下一级还需 1849 积分
煤油, 积分 3151, 距离下一级还需 1849 积分
煤油, 积分 3151, 距离下一级还需 1849 积分
主题 : 3|帖子 : 335|积分 : 3151
进re,刷~~~
焦油, 积分 55, 距离下一级还需 145 积分
焦油, 积分 55, 距离下一级还需 145 积分
焦油, 积分 55, 距离下一级还需 145 积分
主题 : 2|帖子 : 16|积分 : 55
进re,刷~~~
谢谢回复,进RE我会了, 进去后怎么刷?
点击安装刷机包吗? 然后用那个ZIP???
煤油, 积分 3151, 距离下一级还需 1849 积分
煤油, 积分 3151, 距离下一级还需 1849 积分
煤油, 积分 3151, 距离下一级还需 1849 积分
主题 : 3|帖子 : 335|积分 : 3151
在抢救一下 发表于
谢谢回复,进RE我会了, 进去后怎么刷?
是的,点安装刷机包,选中那个zip包就行了
焦油, 积分 55, 距离下一级还需 145 积分
焦油, 积分 55, 距离下一级还需 145 积分
焦油, 积分 55, 距离下一级还需 145 积分
主题 : 2|帖子 : 16|积分 : 55
是的,点安装刷机包,选中那个zip包就行了
好的 非常感谢!!
主题 : 84|帖子 : 4325|积分 : 253556
慎重使用xposed,如果还不太会用recovery的话
---来自一加社区手机客户端
主题 : 84|帖子 : 4325|积分 : 253556
慎重使用xposed,如果还不太会用recovery的话
---来自一加社区手机客户端
柴油, 积分 5599, 距离下一级还需 4401 积分
柴油, 积分 5599, 距离下一级还需 4401 积分
柴油, 积分 5599, 距离下一级还需 4401 积分
主题 : 544|帖子 : 2216|积分 : 5599
进入rec安装框架 ,开机安xp的apk就行了
焦油, 积分 55, 距离下一级还需 145 积分
焦油, 积分 55, 距离下一级还需 145 积分
焦油, 积分 55, 距离下一级还需 145 积分
主题 : 2|帖子 : 16|积分 : 55
进入rec安装框架 ,开机安xp的apk就行了
请问 田园大师,我刷好ZIP 以后 安装了XPOSED 主程序 变成这个样子了,是不是可以?我装了模块 似乎没用。
安装/卸载按钮依然是灰色的,但是不提示红色的RAM不匹配问题了。
我是1+2代 谢谢您啦!
(68.8 KB, 下载次数: 15)
19:44 上传
一加手机1勋章
一周年纪念勋章
一加一周年纪念勋章
在线小达人
社区上线100天纪念勋章
一加手机X勋章
二周年纪念勋章
一加二周年纪念勋章
一加手机3勋章
三周年纪念勋章
一加三周年纪念勋章
圣诞节勋章
圣诞节专属勋章
元旦纪念勋章
我是零点控
零点控勋章 只为感谢而来
资源分享达人
社区分享20个优质资源即可申请
猴年纪念勋章 猴年猴赛雷
猴年特殊勋章
深圳市万普拉斯科技有限公司 版权所有(Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能 - 简书
Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能
一、前言前文已经介绍了Xposed框架的基本使用规则,本文主要来介绍一个实际案例就是如何通过这个框架来修改系统的地理位置信息来实现隐藏功能,在如今社交工具的发展特别是微信,他有一个实时位置共享功能,那么对于那些不是单身狗的同学来说可能会有些蛋疼,哪天媳妇要查岗发送位置,结果你不在她期望的位置这时候就尴尬了,而且朋友圈在分享内容的时候可以选择当前位置,有的屌丝就像我一样没钱但是又想到处旅游,那么这时候咋们就可以一本正经的装个逼了。二、定位原理看到上面说的那么多,感觉这个功能必须要搞起来了,好处太多了,下面咋们就开始操作了,但是在这之前一定要先熟悉Xposed框架的使用规则,还不了解的同学可以去这里查看:Xposed框架的使用规则 在这篇文章中我们了解到了我们只需要在实现了IXposedHookLoadPackage接口的类中的回调方法handleLoadPackage中做拦截操作即可。但是这里我们还得先做一件事,那就是关于Android中的定位系统知识,我们知道手机定位有多种方式,一般有这几种方式:第一、卫星定位GPS(Global Positioning System)即全球定位系统,是由美国建立的一个卫星导航定位系统,利用该系统,用户可以在全球范围内实现全天候、连续、实时的三维导航定位和测速;另外,利用该系统,用户还能够进行高精度的时间传递和高精度的精密定位。第二、基站定位移动电话测量不同基站的下行导频信号,得到不同基站下行导频的TOA(到达时刻)或 TDOA(到达时间差),根据该测量结果并结合基站的坐标,一般采用三角公式估计算法,就能够计算出移动电话的位置。实际的位置估计算法需要考虑多基站(3个或3个以上)定位的情况,因此算法要复杂很多。一般而言,移动台测量的基站数目越多,测量精度越高,定位性能改善越明显。第三、WiFi定位每一个无线AP(路由器)都有一个全球唯一的MAC地址,并且一般来说无线AP在一段时间内不会移动;设备在开启Wi-Fi的情况下,无线路由器默认都会进行SSID广播(除非用户手动配置关闭该功能),在广播帧包含了该路由器的MAC地址;采集装置可以通过接收周围AP发送的广播信息获取周围AP的MAC信息和信号强度信息,将这些信息上传到服务器,经过服务器的计算,保存为“MAC-经纬度”的映射,当采集的信息足够多时候就在服务器上建立了一张巨大的WiFi信息网络;当一个设备处在这样的网络中时,可以将收集到的这些能够标示AP的数据发送到位置服务器,服务器检索出每一个AP的地理位置,并结合每个信号的强弱程度,计算出设备的地理位置并返回到用户设备,其计算方式和基站定位位置计算方式相似,也是利用三点定位或多点定位技术;位置服务商要不断更新、补充自己的数据库,以保证数据的准确性。当某些WiFi信息不在数据库中时,可以根据附近其他的WiFi位置信息推断出未知WiFi的位置信息,并上传服务器。第四、AGPS定位AGPS(AssistedGPS:辅助全球卫星定位系统)是结合GSM/GPRS与传统卫星定位,利用基地台代送辅助卫星信息,以缩减GPS芯片获取卫星信号的延迟时间,受遮盖的室内也能借基地台讯号弥补,减轻GPS芯片对卫星的依赖度。AGPS利用手机基站的信号,辅以连接远程定位服务器的方式下载卫星星历 (英语:Almanac Data),再配合传统的GPS卫星接受器,让定位的速度更快。是一种结合网络基站信息和GPS信息对移动台进行定位的技术,既利用全球卫星定位系统GPS,又利用移动基站,解决了GPS覆盖的问题,可以在2代的G、C网络和3G网络中使用。
在Android中关于这几种定位都有具体的调用方法,所以如果想修改系统的定位信息,那么就必须先了解这几种调用方式,在之前的一篇文章中也说到了,Hook的最关键一点就是需要找到Hook的地方,这个就需要去阅读源码来查找了。在Android中一般获取位置信息就涉及到下面的几个类和方法:第一个:采用基站定位信息android.telephony.TelephonyManager+getCellLocation+getPhoneCount+getNeighboringCellInfo+getAllCellInfoandroid.telephony.PhoneStateListener+onCellLocationChanged+onCellInfoChanged第二个:采用Wifi定位信息android.net.wifi.WifiManager+getScanResults+getWifiState+isWifiEnabledandroid.net.wifi.WifiInfo+getMacAddress+getSSID+getBSSIDandroid.net.NetworkInfo+getTypeName+isConnectedOrConnecting+isConnected+isAvailableandroid.telephony.CellInfo+isRegistered第三个:采用GPS定位android.location.LocationManager+getGpsStatus+getLastLocation+getLastKnownLocation+getProviders+getBestProvider+addGpsStatusListener+addNmeaListener
三、拦截操作有了这些方法和类,下面就开始拦截操作了,但是本文采用是这种拦截方式,因为在多次试验之后,发现Android中很多定位app绝大部分都是采用基站+GPS+Wifi这三种混合方式来进行定位的,但是如果我们要去都拦截这三种方式那就太费劲了,所以这里我们这么干,只拦截操作GPS定位,而其他两种方式拦截之后返回值全部设置空,这样让系统强制的使用GPS定位,为什么要采用GPS定位这种方式呢?因为其他的两种方式在拦截之后去构造假的数据有点麻烦,而对于GPS这种方式咋们只需要构造一个假的Location对象就可以了,操作非常方便。到这里咋们思路有了,下面就来开始操作了:
首先咋们先把其他的定位方式信息拦截之后全部返回null值,这样就可以强制系统使用GPS定位数据了,接下来就开始拦截GPS定位系统数据了,因为本人梦想去台湾看看五月天,所以这里就构造一个假的台北数据:
直接构造一个假的Location对象,然后设置成参数即可,因为这里的location对象是通过回调方式传回去的,所以需要修改参数而不是返回值哦。这里如果有同学想去其他地方,又不知道具体的经纬度信息,该怎么办呢?这个可以使用百度地图的拾取器功能:
点击去之后就可以随意选择地理位置了:
选中之后,可以看到了经纬度信息,在右上角处就可以赋值信息了:
好了,到这里咋们就成功了修改了系统中的地理位置信息,接下来咋们就开始运行了,运行步骤也很简单,先运行模块,然后XposedInstaller工具会提示模块更新或者有新模块需要激活,进入工具点击激活或者更新,然后重启设备生效即可。
四、操作结果演示当我们再次重启之后,打开百度地图惊奇的发现没什么数据?这里不是我们拦截出错了,而是我们在室内,所以GPS定位可能会失败,所以如果想看到数据需要去室外操作即可,下面是我的百度地图的截图:
有了这地图,咋们就要开始真正的装逼了,先搜索一下附近的美女哈:
这台湾的妹子除了会嗲之外,总是喜欢用英文名哈!先不管了,找个妹子聊聊先~然后咋们再去去朋友圈晒一晒:
这里先选择地理位置哈。
哈哈,看到了,这个逼装的我措手不及,自己都差点相信了,看到这里的定位信息点击去看到也是真实的,而不是我们以往看到的:"该位置由用户自己定义的",到这里咋们这个逼算是装成功了。
项目下载:
五、总结本文主要介绍了Xposed框架的一个实际使用案例,就是修改设备的地理位置信息,让自己装个逼,但是还是的说,晒图有风险,装逼需谨慎!一切珍重。本文使用了修改地理位置信息实现了周末去一趟台北的愿望功能,也希望大家能够借助这篇文章满足自己多年来的旅游愿望,最后也希望台湾早日回到祖国的怀抱!
更多内容:
关注公众号,最新技术干货实时推送
猿,能够改变世界的动物;}

我要回帖

更多关于 ssm框架增删改查 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信