在 iOS 8 官方支持动态链接库开始,我就一直在想能不能挂一个动态链接库,来干一些嘿嘿嘿的事情。直到最近,看到了淘宝到处卖的微信多开。发现他们不仅是重签名,还做了很多 To 微商的 Feature。例如批量加好友啊,一键群发啊,最重要的是还不需要越狱,一台 iPad 联络 10w 用户。瞬间觉得我当初的 YY 是可行的,那就开搞吧。
那么搞谁呢?想了一下,我很喜欢一个叫做 Moves 的运动追踪软件,UI 很简洁,功能也达到了我的需求。但有个小缺点,这货在中国地图会漂移,如下图,我每天都骑三环辅路的:
试试能不能修正了它吧。
我们都知道,苹果的 Binary 文件,也就是可执行文件是独有的架构,叫做 Mach-O。很多黑科技,诸如 Class-Dump 都是因为他的特殊性来实现的。
通过阅读苹果的官方文档,得知如下图:
我们仅需修改 Mach-O 的 Load Commands 段,添加一个 LC_LOAD_DYLIB 就可以达到挂载一个新的动态链接库的行为。
实现起来还是相对复杂的,但是伟大的金正恩小组(Kim Jong Cracks),也就是做出来 Clutch 的那个组,帮我们造好了轮子,yololib。
首先,我们需要找个被砸过壳的 Moves。Moves 最低支持版本号 iOS 9,然而手头刚好没有 iOS 9 的越狱设备,但念茜女神的友情给我提供了一个。是一个 32bit 的 iPhone/iTouch 砸出来的,为什么强调这个,因为我们之前有提过 iOS 9 的 App Slicing,导致二进制架构、资源都根据这台设备而来,后面我们会因为这个被坑。
其次,需要一个 dylib。出于实验目的,我选择的是 libReveal.dylib,毕竟它是现成的。
修改二进制很简单,我把 yololib 塞到了 /usr/local/bin 中,所以就命令行执行:yolo Moves libReveal.dylib
签名相对复杂一些:
dylib 签名:codesign -f -s "iPhone Distribution: Blablabla." libReveal.dylib
ipa 签名,这里要签名所有的二进制文件,包括 App 中的二进制文件、其他动态链接库、以及 全部的 Extension,由于 Moves 除了基础的二进制,没有任何其他的。我就用了 FastLane
脚本,不过懒了只做了签名,没有把 dylib 部分放进来。
打包就是把 .app 塞入 Payload 中,打个 zip 的包,改名成 ipa 就好了。
为了方便测试,我们把它传到 FIR 上。fir publish moves.ipa
这个过程,要全程开着 iOS Console,因为你看到的要么是安装失败,要么是运行闪退,真正的原因会在 console 中说明。我比较喜欢用 terminal 下的 idevicesyslog (自行 Google)。
安装提示设备不支持这个包:因为前面说了这个包是通过 AppSlicing 的,会发现 info.plist 里面多了很多奇怪的东西,如下图:
解决方案是通过电脑上的 iTunes 下载一个完整的包,拆出来 plist 塞进去。
Mach-O 修改错误,在 Machoviewer 上可以看到 unknown,这是个 yololib 发生在 32bit 的 Bug,详见:https://github.com/KJCracks/yololib/issues/3
安装提示:Moves Requires version 1.0.0 or later but libReveal.dylib provides version 0.0.0。这个是因为 yolo 默认 version 是 1.0.0,而 libReveal 只有 0.0.0。可以通过 otool -L libReveal.dylib
看到。解决方案是改 yolo 源码,最上面的define,从 0x1000
改成 0x0
于是,我们成功的在一台非越狱设备上,跑起来了 Reveal。
这样核心部分就算完成了,下半部分主要是在讲怎么 Hook 了。