iOS逆向——砸壳与反编译

作者:疯狂的蛋神

近来对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等等。

后续会继续对逆向这个方向进行深入的研究,欢迎各位大佬指教,文中有许多不足的地方多多包涵。

欢迎各位大佬给予批评意见,让我们一起学习进步。