作者:疯狂的蛋神
近来对iOS逆向十分感兴趣,就在业余时间里自己在上网找了各种资料学习,发现许多资料对于一些细节描述的不够详细,所以也踩了很多坑,我也将自己踩的一些坑总结出来,希望对大家有所帮助。
注:逆向是为了学术学习的目的而去探索,不为了非法盈利或其他不正当行为而进行的。本文如有侵犯隐私或其他请联系我,我将在第一时间整改或删除。
一、前期准备
1、Mac Book Pro(笔者做iOS开发,暂时没有研究Windows环境下的一些工具或者配置,或许有些许不同)。
2、一部越狱设备(没有越狱设备的,可以下载爱思助手等工具进行一键越狱,在一键越狱那边有对应的版本号,这里就不对越狱过多描述。这里我准备的是一部8.3版本的iPhone 5s)
爱思助手
3、dumpdecrypted(砸壳工具)
4、pp助手(用于下载准备砸壳的App应用)
5、iFunBox(用于将砸壳完成后的文件导出)
6、iTools Pro(用于导入编译后的dumpdecrypted.dylib文件,以及对照查看文件目录)
7、Terminal(终端,我们会大量的运用到这个工具)
8、class-dump(砸壳工具)
二、分析目标
1、下载App应用
使用pp助手下载我们准备砸壳的App应用(这里我用的是微信做示范)。
目标软件——微信
2、手机OpenSSH连接
把手机与Mac通过USB连接,保证手机与Mac处在同一WiFi环境下,为的是能够连接上手机。
①点击手机里的设置->Wi-Fi->已连接上的WiFi最右侧的感叹号->BootP或
②点击手机里的设置->Wi-Fi->已连接上的WiFi最右侧的感叹号->IPV4地址选择BootP,选择右上角存储。
这时我们的设备的IP地址已固定,这么做是为了防止动态IP的情况下IP地址被占用或地址更改。
3、打开终端
输入ssh 以及我们上一步展示的IP地址。
例如:ssh root@192.168.1.1
这是我们需要输入OpenSSH的连接密码,连接密码的初始值为alpine。
到这里我们成功连接上手机了。
4、进入我们要砸壳的对应目录下
首先我们将手机中的所有进程杀死,回到桌面,然后点开我们要砸壳的App应用,让应用保持在前台。
然后在终端输入ps -e,我们会发现一个很是奇怪的进程。
微信
再打开iTools Pro根据圈出的对应目录进行查看,我们会发现这个目录就是微信所在的目录,如果找不到的同学可以试试在不打开微信和打开微信后通过ps -e命令输出的结果不同点在哪儿,就能找到了。
iTools Pro下微信完整路径
在WeChat.app文件夹中包含了大量的素材文件,配置文件以及WeChat项目文件,这时候我们先看一下这个项目文件是否加壳,与不加壳有什么区别。
此时我们将WeChat.app导出至Mac中,右键选择WeChat,选择显示包内容,新建一个终端窗口,cd到包内容所在的路径中。
在终端输入:otool -l WeChat | grep crypt,我们会看到一个重要的信息,cryptid 1,这表明这个项目文件还未没砸壳,0则表示已经完成砸壳。
目标文件分析大致到这儿已经满足我们需要的,接下来开始正式进入砸壳。
三、砸壳
1、下载并解压dumpdecrypted.zip文件(觉得Github慢的同学可以在上文中找到对应的下载地址)。
我们可以看到里面包含的文件很简单,就是三个文件,分别是一个.c文件,一个是Make编译文件,一个是README说明文件。
我们打开一个新的终端窗口,并cd到Makefile所在的路径,输入make。
编译dumpdecrypted.dylib库
编译完成
编译完成后会得到dumpdecrypted.dylib文件,然后我们要对这个文件进行一次签名,如果不对该文件进行签名, 后续砸壳的操作会失败。
在终端输入security find-identity -v -p codesigning,会打印出mac上面已经安装的证书,这里我用自己的个人账号进行测试签名。
输入--force --verify --verbose --sign "iPhone Developer: XXXXX (XXXXX)" dumpdecrypted.dylib进行签名。
签名成功
这里已经完成了对dumpdecrypted.dylib文件的签名,如果有出现以下提示,则是因为在钥匙串中存在无效或者大量重复的证书导致,需要在钥匙串中删除无效的证书。
存在重复证书
2、找到WeChat的目录
WeChat路径及ID编号
从上图中我们可以看到微信在运行是的路径以及ID编号,在终端中我们输入cycript -p XXXX就可以勾住进程,通过OC语法查找到文件目录。(下图我重启了机子。。。进程编号就改变了,别在意 - -)。
成功勾住进程
如果出现输入cycript -p XXXX后提示-sh: cycript: command not found,则是因为设备中没有安装Cycript插件,打开Cydia,搜索Cycript并安装重启后即可。
Cycript插件
勾住进程后,我们输入[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomans:NSUserDomainMask][0]后,会打印出WeChat的Document目录所在路径。
打印路径
根据这个路径,我们打开iFunBox工具,按着这个路径将我们签名后的dumpdecrypted.dylib文件复制进去。
选择Copy From Mac,将文件导入
按control+d退出勾子,cd到Document目录中,再输入DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /WeChat所在的WeChat.app路径
砸壳
输入后会展现以下内容,表示砸壳成功了,成功后会生成WeChat.decrypted文件,这就是我们下一步要反编译的文件了。
砸壳成功
通过ls指令,我们可以看见WeChat.decrypted文件就存放在Documents,我们通过iFunBox可以看到文件,并导出到Mac中
WeChat.decrypted文件
导出文件到本地
在本地把WeChat.decrypted文件的后缀名去掉,再用otool -l WeChat | grep crypt指令查看。
砸壳成功
明显的看到这里显示的是cryptid 0,也就是脱壳了。这时再使用class-dump -H WeChat指令将目标文件反编译出来。我们会看到反编译出来很多很多的头文件。我们整理到一个文件夹里。
反编译成功
到这里我们的砸壳与反编译已经完成。接下去就可以根据得到的头文件进行分析以及Hook等等。
后续会继续对逆向这个方向进行深入的研究,欢迎各位大佬指教,文中有许多不足的地方多多包涵。
欢迎各位大佬给予批评意见,让我们一起学习进步。