KittenYang

自己动手实现 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 脚本,于是我们就手工执行了这个脚本吧:

  1. cd /opt/iosopendevsetup/bin
  2. 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.

  1. 第一个拖 ipa。没有 ipa?其实就是 Payload 里的 pokemongo.app啦,只要把它拖入 iTunes 的应用界面,在 Show In Finder 就会看到压缩好的对应的 ipa 了。把这个 ipa 拖到 iReSign 的第一个框。(这里建议把 ipa 先复制出来,不要直接从 iTunes 的目录下拖,因为 path 一长有可能会识别错误)

  2. 把你用来签名的描述文件拖到第二个框

  3. 直接填最后一个证书,选择和描述文件描述文件匹配的证书哦。

  4. 重新签名!

最终会在 ipa 同级目录下导出一个 pokemongo-resigned.ipa.它,就是最终我们需要的 Pokemon Go 了。

最后通过 iTools 之类的软件连接手机直接拖进去就行了。

KittenYang

写写代码,做做设计,看看产品。