close
当前位置: 物联网在线 > 技术文库 > android >

Android定位伪造-实战足不出户畅玩pokemon go

要伪造定位首先要摸清定位到底是如何实现的,首先从广义上来区分安卓的定位方式实际上就gps和network两种。但是network网络定位过于抽象,到底是移动网络基站定位,还是宽带ip定位还是wifi定位了,于是我又做了如下细分。

细分定位方式如下:

GPS定位:通过卫星定位,精度高耗电也高定位速度慢。但是需要搜索到三颗星以上才可以定位,室内的大多无法使用。

网络定位:多指wifi/宽带ip定位,其实也包括移动网络也就是第三点。

基站定位:通过运营商的基站三角定位,定位精度低功耗低。

混合定位:结合上面多种方式,AGPS定位。

第三方SDK: 百度地图/高德地图/谷歌地图,本质上还是使用上面4种方式。

通常位置信息权重排序 :gps > wifi > 基站 ,实际上还和信号强度,以及软件算法等多种因素有关。

功耗排序 : gps > 基站 > wifi

0x01位置欺骗可行方案

针对上述定位方式可以假想如下方案进行欺骗。

1.硬件放射gps信号欺骗。 成本较高,需要诸如hackrf这样的硬件设备。我工位在窗户边真实gps信号十分强,所以我伪造的信号就像对弱了导致整个方案成功率变低。具体操作可以参考下文。

2.android位置模拟。这种方式需要打开gps定位并且进入开发者模式开启位置模拟,这个方案较易操作。但是很多app对这种行为作了检测,例如pokemon go在检测到 位置模拟 后便会提示 Failed to detect location

Android定位伪造-实战足不出户畅玩pokemon go

3.hook系统调用,篡改location返回值,需要root权限。这个是我最终采用到方案。这个方案的优点是比较稳定,被检测到异常的概率比较小。既可以正常人肉跑动玩游戏,也可以偷懒利用pc上的插件点击鼠标满地图抓小精灵。

07-14 12:30:40.573 2657-3291/? D/pokemongoH﹕ location = -35.19044856,149.0560237 07-14 12:30:40.573 2657-3291/? D/pokemongoH﹕ getLatitude Result : -35.19044856 07-14 12:30:40.583 2657-3291/? D/pokemongoH﹕ getLongitude Result : 149.0560237

4.模拟器提供位置模拟功能,ARM模拟器运行缓慢,x86模拟机虽然快但是兼容性差。命令行指定坐标 :

telnet localhost 5554 geo fix <longitude value> <latitude value>```

这类操作因为需要在模拟器中进行,所以体验和兼容性要差很多。

5.篡改软件上传的ip/wifi信息,实际操作难度较大。

0x02分析pokemon go APP

在android平台要玩此游戏需要 google play 框架,如果你手机是国行的肯定不会带此框架,必须root后才能安装。我所使用的nexus 5是自带的。

既然要使用google play的服务那在gfw的保护就必须得自备梯子了,我选择的是showsocks,vps在香港。

安装app, https://apkpure.com/pok%C3%A9mon-go/com.nianticlabs.pokemongo .

任天堂是一直不太care国服的,这次迫于服务器宕机的压力Pokemon go更是对大陆地区进行锁区操作。当你千辛万苦完成上述两个步骤后进行进入游戏会发现地图上没有任何小精灵和补给站以及道馆。所以这个时候就需要使用到本文讲解的技术 定位伪造 了。

先观察下网上公开的Pokemon go锁区图,从下图可以看出东三省和新疆部分地区是不在锁区范围可以正常游戏的。为什么这样,我个人猜测有这样两个原因

这个长方形的锁区范围从开发角度易于实现

游戏运营初期策略较为宽松宁放过不误杀。

Android定位伪造-实战足不出户畅玩pokemon go

为了测试Pokemon Go的定位方式,我做了如下操作。

1.设置系统使用 wlan和移动网络定位 会提示 GPS signal not found ,当设置 仅gps定位gps/wlan/移动网络确定位置 的时候可以正常游戏

Android定位伪造-实战足不出户畅玩pokemon go

2.监控 location provider

07-14 12:30:22.573 2657-2657/? D/pokemongoH﹕ HOOK IT 07-14 12:30:40.553 2657-3291/? D/pokemongoH﹕ location provider is : gps 07-14 12:30:40.563 2657-3291/? D/pokemongoH﹕ location provider is : network

3.逆向app,在逆向过程中未发现调用getCellLocation/getBSSID方法,但是发现其有调用getLastKnownLocation。下文会描述这些方法的用处。

Android定位伪造-实战足不出户畅玩pokemon go

结论:pokemon go采用混合定位其中gps定位为主,network定位为辅且gps定位可以独立工作network定位无法独立工作。

0x03伪造gps插件开发

上文已经简单分析了安卓定位的方式以及pokemon go采用的定位方案,在hook系统api前腰先对这些api简单了解下。


(责任编辑:ioter)

用户喜欢...

Android Weekly #276 安卓开发周刊 中文版

您是否了解过Android的Lifecycle-Aware库?(android.jlelse.eu) 我们如何了解Lifecycle-Aware库代码? Nishant Srivastava展示了可以跟踪活动或Lifecycle-Aware的Lifecycle Arch组件的片段,并相应地调整其行为。 为Mos...


Android Weekly #275 安卓开发周刊 中文版

MapMe — Android地图适配器 (medium.com) Josh Burton介绍MapMe,是一个用Kotlin编写的Android库,可以将适配器模式带到地图上。 赞助 CloudRail - 连接到API 10x更快 (cloudrail.com) 当我们用单一的界面连接到所...


使用Android Studio开发可独立运行(runnable)混淆过的Jar程序

之前开发Java程序一直都是使用Eclipse 开发Jar程序,现在开发基本上都已经弃用Eclipse了,但是有时偶尔开发个小的Jar程序,还要切换回去好麻烦,刚好前几天有人问几个相关的问题,就顺便整...


Android Weekly #274 安卓开发周刊 中文版

探索Android Oreo上的别后执行限制(medium.com) 在这篇文章中,Joe Birch解释了关于Android Oreo在后台运行服务的变化。 non-Time领主的time – 第5部分 (blog.stylingandroid.com) Mark Allison继续分析JSR 310 date和...


Android Weekly #273 安卓开发周刊 中文版

开源你的Android代码(android.jlelse.eu) 通过您的开源Android代码,您将(希望地)为Android社区提供有价值的代码,收到建设性的反馈,并与您最初建立的内容进行协作从而使您的代码变得更好。这...


Android Weekly #272 安卓开发周刊 中文版

Android Dev 101:每个初学者都应该知道的一些做法() 看一些初学者或媒介等级开发人员(不要错过任何人)应该知道的一些做法,以便更好地摆脱Android框架。 99.9% crash free sessions (medium.com) Chr...


Android Weekly #271 安卓开发周刊 中文版

依赖注入检查(medium.com) 在本文中,MihályNagy引入了依赖注入检查,一种开源注释处理器,可帮助您解决一些出现在所有JSR 330 DI库中常见的问题。 使用Android Studio插件提高效率 (blog.mindorks.com...


Android Weekly #270 安卓开发周刊 中文版

带有RxJava2的SOLID Android分析 (medium.com) 在这篇文章中,Aris Papadopoulos将解释如何正确创建一个分析系统,同时遵循SOLID原则,并使用RxJava2来解决问题。 (blog.stylingandroid.com) Java中的编程时间很难...


Android内存泄漏思考

Android内存泄漏是一个经常要遇到的问题,程序在内存泄漏的时候很容易导致OOM的发生。那么如何查找内存泄漏和避免内存泄漏就是需要知晓的一个问题,首先我们需要知道一些基础知识。...


Android Weekly #269 安卓开发周刊 中文版

在Google上快速提出操作 () Wolfram Rittmeyer分享了开始在Google上快速创建操作所需的所有信息(为了家庭与助理)。 RxJava中的错误处理(rongi.github.io) 一旦开始编写RxJava代码,你就会意识到有些事...