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
+getAllCellInfo

android.telephony.PhoneStateListener
+onCellLocationChanged
+onCellInfoChanged

第二个:采用Wifi定位信息
android.net.wifi.WifiManager

+getScanResults
+getWifiState
+isWifiEnabled

android.net.wifi.WifiInfo
+getMacAddress
+getSSID
+getBSSID

android.net.NetworkInfo

+getTypeName
+isConnectedOrConnecting
+isConnected
+isAvailable

android.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定位可能会失败,所以如果想看到数据需要去室外操作即可,下面是我的百度地图的截图:

有了这地图,咋们就要开始真正的装逼了,先搜索一下附近的美女哈:

这台湾的妹子除了会嗲之外,总是喜欢用英文名哈!先不管了,找个妹子聊聊先~

然后咋们再去去朋友圈晒一晒:

这里先选择地理位置哈。

哈哈,看到了,这个逼装的我措手不及,自己都差点相信了,看到这里的定位信息点击去看到也是真实的,而不是我们以往看到的:"该位置由用户自己定义的",到这里咋们这个逼算是装成功了。

项目下载:http://download.csdn.net/detail/jiangwei0910410003/9655663

五、总结

本文主要介绍了Xposed框架的一个实际使用案例,就是修改设备的地理位置信息,让自己装个逼,但是还是的说,晒图有风险,装逼需谨慎!一切珍重。本文使用了修改地理位置信息实现了周末去一趟台北的愿望功能,也希望大家能够借助这篇文章满足自己多年来的旅游愿望,最后也希望台湾早日回到祖国的怀抱!

更多内容:点击这里

关注微信公众号,最新技术干货实时推送

时间: 2024-08-06 07:58:59

Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能的相关文章

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

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

[转载] 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%A8xposed%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E6%8B%A6%E6%88%AA%E7%B3%BB%E7%BB%9F%E6%96%B9%E6%B3%95/ 一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还

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

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

Android中Xposed框架篇---基于Xposed的一款脱壳神器ZjDroid工具原理解析

一.前言 在前文中我们介绍了如何使用Xposed框架修改地理位置信息来进行自身的隐藏功能,本文将继续介绍Xposed框架的另外一个功能就是实现应用的简单脱壳,其实说是Xposed的作用其实也不是,主要是模块编写的好就可以了,主要是利用Xposed的牛逼Hook技术实现的,下面就先来介绍一下这个脱壳模块工具ZjDroid的原理,因为他是开源的,所以咋们直接分析源码即可,源码的下载地址:https://github.com/halfkiss/ZjDroid 不过可惜的时候他只公开了Java层的代码,

Android中Xposed框架篇-微信实现本地视频发布到朋友圈功能

微信非常庞大,还好有一些强大的工具,下面就来总结收获的知识. 一.使用adb shell dumpsys activity top命令快速定位页面 二.使用Jadx进行方法跟踪时候如果发现没有结果,可能这个方法是抽象的,需要找到这个抽象方法最原始的定义的地方继续跟踪 项目在github:https://github.com/houjingyi233/WechatUploadVideo

Android应用程序框架层和系统运行库层日志系统源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6598703 在开发Android应用程序时,少不了使用Log来监控和调试程序的执行.在上一篇文章Android日志系统驱动程序Logger源代码分析中,我们分析了驱动程序Logger的源代码,在前面的文章浅谈Android系统开发中Log的使用一文,我们也简单介绍在应用程序中使Log的方法,在这篇文章中,我们将详细介绍Android应用程序框架

Android中网络框架的简单封装

个人博客 http://www.milovetingting.cn Android中网络框架的简单封装 前言 Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能.访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库.由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架.如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会

Android中ButterKnife框架

Android中ButterKnife框架 前言:发现一个不错的注入框架,为了偷懒,还是拿来用了,其实我不是一个喜欢偷懒的码农,但 - - Introduction Annotate fields with @Bind and a view ID for Butter Knife to find and automatically cast the corresponding view in your layout. class ExampleActivity extends Activity

关于linux input device输入子系统架构及android中的框架

关于linux input device输入子系统架构及android中的框架 应用app和windowmanagerservice的input event通信方式 在Native层的InputChannel就是一个通道,仅仅是一个通道,仅仅具有通信功能,不包含其他的.至于从数据流动方向,与InputChannel无关.数据流向是由InputPublisher和InputConsumer在组合了InputChannel后决定的.把InputChannel由应用程序传递到WindowManageS