這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
免責聲明:本文只是從技術的角度去探討遊戲當中的缺陷,任何組織與個人不得利用本文中的內容從事非法活動,請不要傳播或利用本文中提到的漏洞,否則後果自負。
Pokemon Go是最近比較流行的基於AR和LBS的收集向遊戲,老牌IP號召了一票玩家。遊戲目前bug較多,這裡討論的是0.29.0版本以及在安卓平台下的反mock GPS的機制。
在未閱讀過源碼之前,一下的分析都基於實際測試結果,也就是黑箱測試。
目前已知的情報有:
1.遊戲中存在檢測偽造gps資訊的機制,目前來看是只在用戶端,至於服務端有沒有無從而知
2.當遊戲檢測到使用者正在使用mock gps之類的軟體的時候會顯示“failed to detect location”之類的字樣,並終止與伺服器端的互動
3.重啟遊戲可以解決上述問題
4.遊戲的檢測程式應該是寫在了resume事件裡,也就是當你從其他程式切換回遊戲的時候會檢測
5.遊戲代碼中有多個地方進行了gps定位,一類是定時的,也就是每隔一段時間定位一次,一類是事件出發的,也就是再你抓完精靈或者點完商店後定位
基於以上幾點推斷,可行的hack方法有很多,這裡只介紹一種可行的:
先上一個圖
由我們可以看出:
1.這個hack是利用了偽造軟體修改完gps緩衝和系統重新獲得當前位置的時間差
2.偽造gps軟體的開關時機很重要,如果關閉後系統重開了gps服務,則緩衝中偽造的位置將被新的真實位置覆蓋。
3.如果hack成功,遊戲會顯示“gps signal lost”之類的提示,即當前的gps服務正在重啟中,遊戲會讀取緩衝的位置,也就是我們偽造的位置
4.如果hack失敗,遊戲會顯示“failed to detect location”之類的提示,也就是偽造軟體關閉的慢了,在切換回遊戲的時候被遊戲發現了,遇到這種情況只能重啟
5.總而言之,這種方法並不能保證100%的成功,偽造軟體的開關時機很大程度上決定了是否能成功。
最後談一下如何防範這類hack:
如果使用者一直hack成功,這類hack是比較難防範的。對伺服器而言,使用者的行為是gps訊號丟失後出現在了另一個地方,這種情況很常見,例如使用者進入了建築物或者訊號差的地區,所以很難從邏輯上篩選出哪些使用者是偽造了gps。如果以使用者在一定時間內的移動距離作為依據也不妥,偽造者可以在小範圍內偽造位置,而且也會有正常使用者進行換號互刷的情況(例如你在中國,讓美國的的朋友幫你玩)。
如果hack失敗,目前的懲罰是重啟遊戲,這並不耽誤太多時間。合理的措施應該是禁止登陸一段時間。目前看來可能是遊戲廠商還有許多的debug和feature要做,所以只是簡單的防範了一下一直開著偽造軟體的使用者,並未想到有使用者利用gps緩衝去hack。