起因是在蝦神的公眾號上看到一篇文章 《Pokemon Go 鎖區破解》,正好周圍幾個小夥伴正在玩這遊戲,便仔細研究了下所謂的破解鎖區。這次鎖區其實是 GPS 鎖區,遊戲開發商為了縮小初始運營範圍,在中國範圍內都無法正常遊戲,也就是服務端通過客戶端傳送的定位位置資料來判斷是否讓該玩家繼續遊戲。文章中介紹的原理就是利用 OC Runtime Method Swizzling 對原應用進行重寫 CLLocation 的 coordinate 方法返回自己想要的經緯度資訊,以達到欺騙服務端進行遊戲,然後進行重簽名打包。最讓人激動的是最終的應用可以在非越獄的裝置上執行,於是已阻止不了向前探索的腳步。
遊戲作弊是不支援的,但是技術研究可以有!
流程
大致流程如下,後面會詳細講解每一步:
- 脫殼:拿到解密後的 .ipa
- 注入:對原應用修改和注入
- 重簽名:用自己的證照籤名
- 打包:壓縮成 .ipa 進行安裝
脫殼
由於手裡沒有越獄機子,也沒有進行脫殼試驗,按 [Urinx/iOSAppHook] 中提到的方法直接從 xx助手 市場裡下載越獄應用可用。如果自己有越獄裝置的話可以用 dumpdecrypted 進行砸殼。
注入
如果是拿到 .ipa,進行解壓即可找到 Payload 資料夾,可安裝 iOSOpenDev 來建立工程,使用 CaptainHook 輕鬆方便寫 Hook 程式碼,iOSOpenDev 中已經整合了 CaptainHook ,具體相關程式碼可以參考 [PokemonHook] 。
生成動態庫(.dylib)後使用 yololib 工具進行注入,不知為何使用 [KJCracks/yololib] Release 中的 yololib-Mac 最終會在裝置上閃退,使用 Urinx/iOSAppHook 則沒有問題,一條命令對 .app 中的二進位制進行 .dylib 注入,再把注入的 .dylib 拖到目錄裡即可。注入成功後可以用 MachOView 程式檢視整個 MachO 檔案的結構,便可看到注入的 dylib 會在 Load Commands 區段中。
yololib xxx.app/xxx LocationFaker.dylib複製程式碼
重簽名
重簽名也是很重要的一個步驟,簽名錯誤或者失敗都會導致應用無法安裝使用。我比較喜歡用圖形化介面的 iOS App Signer 來重簽名,自動載入出本機的證照和 PP 檔案,相當方便;當然也有命令列工具,比如 Urinx/iOSAppHook 中的 AppResign 或者 Fastlane sign ,前提還是一樣需要把裝置的 UDID 加進 Provisioning Profile 中,一般來說 Bundle identifier 不需要改變即可,也有應用內做了相關檢測手段導致重簽名或者更改 Bundle identifier 後無法使用的情況,那就需要更多其他的手段進行反攻了。
打包
對 Payload 資料夾右鍵壓縮,改名 xx.ipa 即可,推薦用 Xcode (Window->Device) 安裝,失敗還有錯誤資訊可看。
另外在這裡推薦一個 Quick Look 外掛用來快速預覽 .mobileprovis 和 .ipa 的證照、簽名、裝置等資訊,對著檔案按下空格就能看到非常方便。 chockenberry/Provisioning
參考
推薦
- iOSRE - iOS逆向論壇,學習逆向有很多幹貨