iOS应用逆向工程之初窥门径
前言:
最近刚刚接触逆向这一块,之前一直觉得是很高大上的一个方向,有点可望而不可即的样子。机缘巧合之下,开始了逆向之路,这两天一直在研究这一块,目前仅仅是砸了壳,得到了.h文件然后用hopper进行了简单的分析。所以这篇文章主要分享一下这几天遇到的坑以及解决方法,做一个记录同时也希望能帮助到跟我一样的人。OK,话不多说,开始。
1、开发的准备工作
- 首先需要一部iPhone或者iPad,iPhone的话版本要在10.2.0以下。我用的是全新的6s,初始版本是10.0.2,是可以越狱的。
- 关于越狱的话,我是直接用的PP助手,傻瓜式的越狱方式啊哈哈。因为手机版本的问题,Mac版的PP越狱助手支持的版本在iOS 10以下,所以用的Windows版的pp助手,直接一键越狱。当然也可以用其他的软件,爱思助手等等。
- 越狱过程很顺利越狱教程链接 照着教程来没有遇到问题。如果遇到问题可以到论坛上提问也可以在文章末提出来,可以一起交流。
- 记得在Cydia里面添加一些必要的软件源和插件,软件源的话我只添加了PP助手的,插件的话,Openssh、Cycript、Apple File Conduit"2" 这几个,很多是内置了。
2、开始逆向的第一步
有些从 APPStore 商店下载安装的APP 默认都被苹果加了一层壳,加了壳后我们就无法使用dump导出头文件等其它操作,常用的砸壳工具有dumpdecrypted、Clutch、AppCrackr。
这里我们使用dumpdecrypted砸壳。下载地址。通过make命令得到的dumpdecrypted.dylib就是我们的工具。
- “砸壳” :概括一下大概需要这几个步骤,
1、手机或者iPad中打开需要砸壳的APP。
2、SSH连接到手机,找到ipa包的位置并记录下来。
3、Cycript附加到进程,找到App的Documents文件夹位置并记录下来。
4、拷贝dumpdecrypted.dylib 到App的Documents 的目录。
5、执行砸壳后,并拷贝出砸壳后的文件,然后完成。
第一步:分别找到两个地址
我这里用的是WiFi连接,使用上有一定的局限性,更好的方案是使用USB连接,推荐两篇文章,之后我也会用USB进行连接。debugserver和lldb进行调试、iOS逆向工程之Hopper+LLDB调试第三方App .
用到的命令:
1, ssh root@10.10.245.208 (iP地址为设备的iP地址)
2, ps -e (查看进程)
3, cycript -p (附加进程)
4, [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask][0]
** 注意: ** 如果直接用IP地址不可以的话,可以打开电脑的pp助手,在工具里面有一个“打开ssh通道”,手动打开之后,弹窗会提示将设备的IP地址端口映射到了本地,并且给出了提示如何进入root权限,比如,ssh root@localhost -p 2223,密码都是默认的alpine,输入后即可进入了。
iOS逆向-用Cycript进行运行时分析(微信应用),iOS运行时工具-Cycript 。 这两篇文章可以了解一下Cycript。
第二步:拷贝dumpdecrypted.dylib 到App的Documents的目录,需要用到的命令:
scp ~/dumpdecrypted.dylib root@10.10.242.107:/var/mobile/Containers/Data/Application/2B4C6281-C015-4FF3-A8EC-5E5C7554D447/Documents 利用Scp命令进行拷贝) 截图第三步 :砸壳
进入到 Documents 目录下,然后进行砸壳:
需要用到的命令:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/
Application/BFED82A3-3238-4F41-B797-C1CB584CBE05/qqlive.app/qqlive
演示3
然后就会生成.decrypted的文件,这个就是砸壳后的文件。我们接下来就可以对他做操作了,比如导出头文件。
** 注意: ** 我在这里遇到问题了,一是无法用IP进行连接拷贝动态库,二是当我手动把动态库拷贝到documents/下面然后去进行砸壳的时候提示我,dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found. Did find:
dumpdecrypted.dylib: required code signature missing for 'dumpdecrypted.dylib'
错误。
- 在这里我一并解答,关于拷贝的话,可以直接手动拷贝的,用PP助手、iExplorer、IFunBox都可以。那为什么砸壳还失败呢,那是因为这里编译出的动态库还需要做一个签名。步骤如下:
- 列出可签名证书
security find-identity -v -p codesigning - 为dumpecrypted.dylib签名
codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib
之后重新上传砸壳既可。
第四步:拷贝出.decrypted文件并导出头文件
输入命令:
class-dump -S -s -H xxx.decrypted -o ./Headers (前面是脱壳文件的位置,后面是导出.h文件的目标文件夹)
** 如果, **没有成功,不要紧张,应该是导出头文件时指定的ARM架构不正确。所以,解决方法如下:
armv6:iPhone、 iPhone2、iPhone3G、 第一代和第二代iPod Touch
armv7: iPhone4、 iPhone4S
armv7s: iPhone5、iPhone5C
arm64: iPhone5S、iPhone6、iPhone6s
使用class-dump的--arch配置项来指定了具体的架构,例如
class-dump --arch armv7 -S -s -H WeChat.decrypted -o ./Headers
-
操作步骤和结果如下图所示, 导出成功,你可以慢慢的分析了。
演示4
简单说一下Hopper disassembler
下方就是使用Hopper打开“脱壳”文件的效果。当然,你也可以使用IDA Pro来查看,当然此处我们使用的是Hopper。从下方的截图来看,结果是OK的。
演示5
-
至此,分享告一段落。
-
等接下来继续研究反编译。
-
再有技术问题一起交流。
-
在学习以及研究过程中,感谢在网络上无私分享的那些人,是你们在不经意间帮助了很多人,很开心能有这样的技术氛围~
-
书籍的话在看《iOS应用逆向工程》第二版 ,受益匪浅
-
博客的话也学习了几篇文章,iOS逆向工程之砸壳 、iOS逆向之脱壳。
-
写此篇分享是在高铁上,一边享受回家的愉悦一边汇总着知识点。如有不足敬请指出。
-
希望能和志同道合之人多多交流,共同提高。