自己动手实现 Pokemon Go 锁区破解 —— 记一次重签名
本文只用作技术交流,切莫干出格的事情,请使用者不忘初心。
事情的起因还是昨天虾神放出了这篇文章,外加上对 Pokemon 的强烈热爱,让我第一次有动力实现一次逆向。准确地说,只是第一次重签名。因为虾神把大部分事情都做完了,留给我们动手的只剩重签名这一步了。然而虽然仅仅只有一步,也让我这个逆向新人整整折腾了 5 个小时。不过收获嘛也不小,补了之前漏下的证书的那些事而且也入门一点逆向。
一. 重签名 .dylib
首先,我们 clone 好虾神的项目。你会看到这样的目录结构:
![]()
解压缩 pokemon_unsigned.zip 文件,多出一个 Payload 文件夹:
![]()
右键 pokemongo 显示包内容:
![]()
得到如下文件:
![]()
这时候,很多人会看到网上的教程就直接开始重签 .ipa 了,这也是我绕的远路。由于虾神注入了自己签好的 libLocationFaker.dylib,所以我们得先重签这个 .dylib 才行,否则就会报错。这里我觉得我应该告诉你我是怎么发现的,因为这样下次你可以自己 debug 其他问题了。答案就是 「Window」- 「Devices」- 「View Device Logs」,如图:
![]()
一开始你看到这弹幕一样的 log 你一定会吓一跳,滚这么快怎么看?!你往上滑一滑鼠标它就停了。但是这么多文字怎么找?很简单,直接搜关键字「pokemongo.ipa」,在定位到的附近扫几眼就能看到错误信息。比如我一开始没有重签这个 .dylib,发现应用启动就闪退,于是我找了这句报错:Your .dylib is not vaild
,又比如我安装失败了两次,两次 console 分别告诉我:「描述文件是 free 账户,无法安装」和 「描述文件和证书不匹配」。所以,学会看 log 真的很重要,他会把你往正确的地方带,要不是看了这几次 log 信息,我恐怕早就因为迷路而放弃了。
言归正传,如何签 .dylib? 很简单,打开虾神给我们准备好的 LocationFaker.xcodeproj,修改 Code Signing 的证书和描述文件。
注意,证书和描述文件,bundle id 一定要匹配,这里推荐使用通配符 “*” 的描述文件,这样你就不用改 bundle id 了。
然后,编译。这里,又引出一个坑,只有填了这个坑我们才能继续。那就是 iosOpenDev 。
你如果去官网下载了一个 pkg 安装文件然后点击安装,结果一般都会安装失败,官方给出的做法(先安装MacPorts,再更新 MacPorts,再安装 DPKG 文件.... )没 1 个小时别想跑完,不要问我怎么知道了,这就是新人的学费啊。其实官网那个 pkg 安装文件也没干啥,就是执行了一个 iod-setup 脚本,于是我们就手工执行了这个脚本吧:
-
cd /opt/iosopendevsetup/bin -
sudo ./iod-setup base
报错:PrivateFramework directory not found: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/PrivateFrameworks。 原因是是链接iOS 9.3的 private framework 失败,主要是在9.3的 SDK 里去掉了 private framework 。
解决办法:
1. 在[这里](https://jbdevs.org/sdks/)下载9.2的SDK。
2. 解压后放到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs。
3. 你可以把9.2里面的PrivateFrameworks文件夹复制到9.3对应的位置里path/to/iPhoneOS9.3.sdk/System/Library/。
4. 或者是修改/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Info.plist文件,将`MinimumSDKVersion`改为9.2。
5. 参考这篇[文章](http://iosre.com/t/xcode7-iosopendev-iosopendev-ios9/1963)把对应的 Specifications,user 文件放入指定目录。
6. 最后运行`sudo ./iod-setup sdk -sdk iphoneos`命令。
新建一个项目,你会发现已经可以集成越狱开发环境了:
![]()
再编译, successed!
在 Finder 找到生成的 .dylib,复制一份命名成 libLocationFaker.dylib 替换原先包内容里面的 libLocationFaker.dylib。
到这里,动态链接库 .dylib 我们已经签好了。下面开始修改包内容。
二. 修改包内容
先找到自己的描述文件,这里推荐使用通配符 * (比如:iOS Team Provisioning Profiel:*)的描述文件,因为这样你就不用改 ipa 的 Bundle ID 了。倘若你选择了形如 iOS Team Provisioning Profiel:com.kittenyang.pokemonHook 这样的描述文件,那么你需要一并修改包内容里面 info.plist 的 Bundle ID 为 com.kittenyang.pokemonHook.
如何找到描述文件?Xcode - Preference - Account - 选择一个 Team - View Details - 找到描述文件右键 Show In Finder.
拷贝出你准备用来签名的描述文件,改名成 embedded.mobileprovision到包内容里面替换原来的同名文件。注意!一定记得改名成 embedded.mobileprovision ,不要问我为什么要强调两遍,学费!
正如之前提到过的,如果你的描述文件不是通配符的而是类似 iOS Team Provisioning Profiel:com.kittenyang.pokemonHook,那么就把包内容里的 Info.plist 的 Bundle ID 也一并改成 com.kittenyang.pokemonHook。
好了,包内容的修改到这里全部结束了。下面去重签名 ipa。
3. 重签名 ipa
这一步有好多选择,fastlane、sigh resign、/usr/bin/codesign -f -s、iReSign,我选择了最弱智化操作的 iReSign.
![]()
第一个拖 ipa。没有 ipa?其实就是
Payload里的pokemongo.app啦,只要把它拖入 iTunes 的应用界面,在 Show In Finder 就会看到压缩好的对应的 ipa 了。把这个 ipa 拖到 iReSign 的第一个框。(这里建议把 ipa 先复制出来,不要直接从 iTunes 的目录下拖,因为 path 一长有可能会识别错误)把你用来签名的描述文件拖到第二个框
直接填最后一个证书,选择和描述文件描述文件匹配的证书哦。
重新签名!
最终会在 ipa 同级目录下导出一个 pokemongo-resigned.ipa.它,就是最终我们需要的 Pokemon Go 了。
最后通过 iTools 之类的软件连接手机直接拖进去就行了。
![]()