前言
在 iOS 8 官方支持动态链接库开始,我就一直在想能不能挂一个动态链接库,来干一些嘿嘿嘿的事情。直到最近,看到了淘宝到处卖的微信多开。发现他们不仅是重签名,还做了很多 To 微商的 Feature。例如批量加好友啊,一键群发啊,最重要的是还不需要越狱,一台 iPad 联络 10w 用户。瞬间觉得我当初的 YY 是可行的,那就开搞吧。
那么搞谁呢?想了一下,我很喜欢一个叫做 Moves 的运动追踪软件,UI 很简洁,功能也达到了我的需求。但有个小缺点,这货在中国地图会漂移,如下图,我每天都骑三环辅路的:查看图片
试试能不能修正了它吧。
修改 Mach-O,注入 dylib
我们都知道,苹果的 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 了。