本文旨在技术探讨故本文不提供工具,正常玩家请勿模仿,游戏中虚拟位置有封号风险

0x00 安卓定位方式归类

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

细分定位方式如下:

  1. GPS定位:通过卫星定位,精度高耗电也高定位速度慢。但是需要搜索到三颗星以上才可以定位,室内的大多无法使用。
  2. 网络定位:多指wifi/宽带ip定位,其实也包括移动网络也就是第三点。
  3. 基站定位:通过运营商的基站三角定位,定位精度低功耗低。
  4. 混合定位:结合上面多种方式,AGPS定位。
  5. 第三方SDK: 百度地图/高德地图/谷歌地图,本质上还是使用上面4种方式。

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

功耗排序 : gps > 基站 > wifi

0x01位置欺骗可行方案

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

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

http://drops.wooyun.org/tips/10580

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

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

  1. 在android平台要玩此游戏需要 google play 框架,如果你手机是国行的肯定不会带此框架,必须root后才能安装。我所使用的nexus 5是自带的。
  2. 既然要使用google play的服务那在gfw的保护就必须得自备梯子了,我选择的是showsocks,vps在香港。
  3. 安装app,https://apkpure.com/pok%C3%A9mon-go/com.nianticlabs.pokemongo.
  4. 任天堂是一直不太care国服的,这次迫于服务器宕机的压力Pokemon go更是对大陆地区进行锁区操作。当你千辛万苦完成上述两个步骤后进行进入游戏会发现地图上没有任何小精灵和补给站以及道馆。所以这个时候就需要使用到本文讲解的技术定位伪造了。

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

  1. 这个长方形的锁区范围从开发角度易于实现
  2. 游戏运营初期策略较为宽松宁放过不误杀。

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

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

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。下文会描述这些方法的用处。

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

0x03伪造gps插件开发

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

需要关注的api:类以及方法如下

Class:
android.location.Location
Method:
public double getLatitude () //获取纬度,北纬为正数,南纬为负数。
public double getLongitude () //获取经度 Class:
android.location.LocationManager
Method:
public Location getLastLocation ()
public Location getLastKnownLocation (String provider) //通过provider获取location Class:
android.telephony.TelephonyManager
Method:
public CellLocation getCellLocation () //通过GSM获取location android.net.wifi.WifiInfo
public String getBSSID () //获取wifi的bssid

通过分析定位代码和android api可以发现不管采用何种定位方式,归根到底还是要从loaction中取出经纬度,也就是你的位置信息。所以这个类中的getLatitude/getLongitude方法就是hook的关键点。

现在已知开服区域:美国/澳大利亚/英国/日本。我选择将自己的坐标偏移到澳大利亚的堪培拉。

其实网上很多伪造位置的软件,但是网上的软件有三处不足:

1.可能有后门或者广告

2.可能出现开飞机的现象(游戏中短时间大范围变化坐标)后被封号。

3.可diy性差。

如果坐标写死,那么游戏依然是不能正常玩的,所以我是做了个偏移,就相当于另一个地方有个影子同步在动一样。偏移量通过一个文件来计算,文件写入的是需要偏移到的地址,这样也方便与pc上的adb交互。如果炎炎夏日不想离开空调又想抓小精灵就只能再做个pc端控制偏移的插件来。

电脑控制端控制插件四个按钮.

addlon: longitude + 0.0005

sublon: longitude - 0.0005

addlat: latitude + 0.0005

sunlat: latitude - 0.0005

最后效果如下。PS:平时抓精灵多建议关掉AR,这样更流畅抓的成功率高一些。

待开发功能:

  1. 多角度移动,如果有多点触控其实没必要。
  2. 自动跑步,检测到小精灵的时候停下 (自动加减坐标,监控到震动即停止跑步)
  3. pc端地图同步,人物坐标同步。
  4. ...

0x04 问我ios怎么办

如果是ios用户看到这里已是十分不易,所以附送一个ios pokemon go类似玩法:

https://github.com/kahopoon/Pokemon-Go-Controller

原帖地址:http://drops.wooyun.org/tips/17840

小议安卓定位伪造-实战足不出户畅玩Pokemon Go的更多相关文章

  1. 怎样让你的安卓手机瞬间变Firefox os 畅玩firefox os 应用

    Firefox os 手机迟迟不能在国内大面积上市.如今能买到的Firefox os手机国内就一款Firefox os ZET OPEN C ,但这款手机配置确实还不如人意.价格方面也不实惠,对于我们 ...

  2. 荣耀3X畅玩版狙击红米note!

    华为与小米的战争史,可以追溯到 红米 799,华为独立初荣耀品牌推出荣耀3C,定价798,就是比你少一快; 小米3 定价1999,华为出荣耀3X,定价1980; 最近的红米Note,标配版定价799, ...

  3. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  4. 华为荣耀畅玩5C NEM-UL10 ROOT那些事儿(亲测成功)

    以前ROOT手机都是在手机上安装KingRoot 刷机精灵等软件分分钟成功(不排除偶然,,比如这款华为荣耀...) 手机安装KingRoot等软件,,,失败   电脑上安装连接手机Root,,,,失败 ...

  5. 华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery 及 root

    华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery  及 root 下载地址    http://pan.baidu.com/s/1hsn6VzA 1. 在官网申请解锁码    申 ...

  6. windows 安装 RabbitMQ 并添加用户 – 畅玩Coding

    原文:windows 安装 RabbitMQ 并添加用户 – 畅玩Coding 1.RabbitMQ 使用 Eralng,所以需要先安装 Eralng 下载: http://www.erlang.or ...

  7. cordova 生成发行版apk,并添加证书 – 畅玩Coding

    原文:cordova 生成发行版apk,并添加证书 – 畅玩Coding 首先jdk生成证书. 1.进入jdk安装目录 D:\Java\jdk1.7.0\bin 2.执行命令 keytool -gen ...

  8. windows server 安装 mysql – 畅玩Coding

    原文:windows server 安装 mysql – 畅玩Coding windows server 安装 mysql 2018年12月11日2018年12月11日 admin 下载:https: ...

  9. DELPHI安卓定位权限申请

    DELPHI安卓定位权限申请 安卓8及以后版本的权限分为静态和动态申请2部分,而之前的安卓版本只需要静态申请权限. 1)静态申请定位权限: 2)动态申请定位权限: uses System.Permis ...

随机推荐

  1. ADB指令

    对于ADB指令的应用,首先应该配置环境,将文件所在路径复制到高级系统设置里面的环境变量path,然后就可以在命令符上进行ADB的指示 例如adb kill-server是关掉活动 adb start- ...

  2. "Unity测试系列"文章索引

    对Unity各种API的细节进行测试 Common 一些Unity基础操作的性能测试 Animation/Animator Animation Play/Stop测试 关于Animation动画事件的 ...

  3. LA 5135 井下矿工

    题目链接:http://vjudge.net/contest/141787#problem/B 白书P318 题目大意:有N个矿井 ,由一些隧道连接起来,现在要修建尽量少的安全通道,使得无论哪里发生事 ...

  4. 服务器端查看log的shell脚本

    持续过滤log脚本 服务器端持续查看log的shell脚本(其中path1和path2替换为路径特征名,“tail -f”后面接的路径替换为路径特征名所对应的log文件路径): #! /bin/sh ...

  5. RebotFrameWork的分层思想

    RebotFrameWork的分层思想 分层思想,就是通过关键字调用的方法,把大杂烩的代码根据脚本特征拆封开来,提高代码的灵活性和清晰度,从而也让一些组件层内容可扩展.可复用.可维护. 解析下目录结构 ...

  6. Android first---文件读取(登录案例编写为主)

    以android登录案例来介绍文件的读取与androidAPI给予的方法 第一步:绘制界面 绘制方法:在线性布局下面设置相对布局 代码部分: <LinearLayout xmlns:androi ...

  7. R----DT包介绍学习

    DT包:查看矩阵或数据框的内容 12 library(DT)datatable(iris, options = list(pageLength = 5)) DT包提供大量UI定制功能,即修改展示的HT ...

  8. C# Global Application_Error不执行

    今天在开发过程中遇到一个很奇特的问题,就是 Global 文件中的Application_Error 方法不执行的问题,很是苦恼,查了有关这方面的问题,感觉网友们回答的都有点乱,有些人说 在编译时不需 ...

  9. [Mysql] mysql临时表corrupt

    问题描述 机房临时硬件问题, 机器掉电. 恢复后, 重启mysql进程, 结果出现core dump. 而且一直循环, 无法终止, 只能kill掉. backtrace如下. # service my ...

  10. Python_Day1_基础1

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...