本文旨在技術(shù)探討故本文不提供工具,正常玩家請(qǐng)勿模仿,游戲中虛擬位置有封號(hào)風(fēng)險(xiǎn) 0x00 安卓定位方式歸類要偽造定位首先要摸清定位到底是如何實(shí)現(xiàn)的,首先從廣義上來區(qū)分安卓的定位方式實(shí)際上就gps和network兩種。但是network網(wǎng)絡(luò)定位過于抽象,到底是移動(dòng)網(wǎng)絡(luò)基站定位,還是寬帶ip定位還是wifi定位了,于是我又做了如下細(xì)分。 細(xì)分定位方式如下:
通常位置信息權(quán)重排序 :gps > wifi > 基站 ,實(shí)際上還和信號(hào)強(qiáng)度,以及軟件算法等多種因素有關(guān)。 功耗排序 : gps > 基站 > wifi 0x01位置欺騙可行方案針對(duì)上述定位方式可以假想如下方案進(jìn)行欺騙。 1.硬件放射gps信號(hào)欺騙。 成本較高,需要諸如hackrf這樣的硬件設(shè)備。我工位在窗戶邊真實(shí)gps信號(hào)十分強(qiáng),所以我偽造的信號(hào)就相對(duì)弱了導(dǎo)致整個(gè)方案成功率變低。具體操作可以參考下文。 2.android位置模擬。這種方式需要打開gps定位并且進(jìn)入開發(fā)者模式開啟位置模擬,這個(gè)方案較易操作。但是很多app對(duì)這種行為作了檢測(cè),例如pokemon go在檢測(cè)到位置模擬后便會(huì)提示Failed to detect location 3.hook系統(tǒng)調(diào)用,篡改location返回值,需要root權(quán)限。這個(gè)是我最終采用到方案。這個(gè)方案的優(yōu)點(diǎn)是比較穩(wěn)定,被檢測(cè)到異常的概率比較小。既可以正常人肉跑動(dòng)玩游戲,也可以偷懶利用pc上的插件點(diǎn)擊鼠標(biāo)滿地圖抓小精靈。 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模擬器運(yùn)行緩慢,x86模擬機(jī)雖然快但是兼容性差。命令行指定坐標(biāo) : telnet localhost 5554 geo fix <longitude value> <latitude value>``` 這類操作因?yàn)樾枰谀M器中進(jìn)行,所以體驗(yàn)和兼容性要差很多。 5.篡改軟件上傳的ip/wifi信息,實(shí)際操作難度較大。 0x02分析pokemon go APP
先觀察下網(wǎng)上公開的Pokemon go鎖區(qū)圖,從下圖可以看出東三省和新疆部分地區(qū)是不在鎖區(qū)范圍可以正常游戲的。為什么這樣,我個(gè)人猜測(cè)有這樣兩個(gè)原因
為了測(cè)試Pokemon Go的定位方式,我做了如下操作。 1.設(shè)置系統(tǒng)使用wlan和移動(dòng)網(wǎng)絡(luò)定位會(huì)提示 GPS signal not found,當(dāng)設(shè)置僅gps定位和gps/wlan/移動(dòng)網(wǎng)絡(luò)確定位置的時(shí)候可以正常游戲 2.監(jiān)控 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,在逆向過程中未發(fā)現(xiàn)調(diào)用getCellLocation/getBSSID方法,但是發(fā)現(xiàn)其有調(diào)用getLastKnownLocation。下文會(huì)描述這些方法的用處。 結(jié)論:pokemon go采用混合定位其中g(shù)ps定位為主,network定位為輔且gps定位可以獨(dú)立工作network定位無法獨(dú)立工作。 0x03偽造gps插件開發(fā)上文已經(jīng)簡(jiǎn)單分析了安卓定位的方式以及pokemon go采用的定位方案,在hook系統(tǒng)api前要先對(duì)這些api簡(jiǎn)單了解下。 需要關(guān)注的api:類以及方法如下 Class: android.location.Location Method: public double getLatitude () //獲取緯度,北緯為正數(shù),南緯為負(fù)數(shù)。 public double getLongitude () //獲取經(jīng)度 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可以發(fā)現(xiàn)不管采用何種定位方式,歸根到底還是要從loaction中取出經(jīng)緯度,也就是你的位置信息。所以這個(gè)類中的getLatitude/getLongitude方法就是hook的關(guān)鍵點(diǎn)。 現(xiàn)在已知開服區(qū)域:美國(guó)/澳大利亞/英國(guó)/日本。我選擇將自己的坐標(biāo)偏移到澳大利亞的堪培拉。 其實(shí)網(wǎng)上很多偽造位置的軟件,但是網(wǎng)上的軟件有三處不足: 1.可能有后門或者廣告 2.可能出現(xiàn)開飛機(jī)的現(xiàn)象(游戲中短時(shí)間大范圍變化坐標(biāo))后被封號(hào)。 3.可diy性差。 如果坐標(biāo)寫死,那么游戲依然是不能正常玩的,所以我是做了個(gè)偏移,就相當(dāng)于另一個(gè)地方有個(gè)影子同步在動(dòng)一樣。偏移量通過一個(gè)文件來計(jì)算,文件寫入的是需要偏移到的地址,這樣也方便與pc上的adb交互。如果炎炎夏日不想離開空調(diào)又想抓小精靈就只能再做個(gè)pc端控制偏移的插件來。 電腦控制端控制插件四個(gè)按鈕. addlon: longitude + 0.0005 sublon: longitude - 0.0005 addlat: latitude + 0.0005 sunlat: latitude - 0.0005 最后效果如下。PS:平時(shí)抓精靈多建議關(guān)掉AR,這樣更流暢抓的成功率高一些。 待開發(fā)功能:
0x04 問我ios怎么辦如果是ios用戶看到這里已是十分不易,所以附送一個(gè)ios pokemon go類似玩法: |
|