逆向第二天-dumpdecryprted
前言
在上一篇介绍class-dump中,我们提到了,从App Store中下载的App(以下简称StoreApp)是被苹果加密过的,可执行文件被套上了一层保护壳,而class-dump无法作用于加密过的APP。在这样的情况下,想要获取头文件,需要先解密App的可执行文件,俗称“砸壳”。dumpdecrypted就是由越狱社区的知名人士Stefan Esser(@i0nlc)出品的一款咋壳工具,被越狱社区广泛运用在iOS逆向工程研究中。
安装
dump decrypted在GitHub上开源了,得自行编译才能使用。
- 1 从GitHub下载dump decrypted
git clone git://github.com/stefanesser/dumpdecrypted/
- 2 cd到dump decrypted目录下执行make命令,这样就在该目录下生成了dumpdecrypted.dylib和dumpdecrypted.o两个文件。
这样就得到了砸壳所用的榔头dumpdecrypted.dylib了,这个文件生成一次就行了,以后可以重复使用,下次砸壳时不用再重新编译了。
砸壳
- 1 在手机上打开需要砸壳的App,用SSH连接到手机用到的命令:
1,ssh root@192.168.xxx.xxx (ip地址是手机的IP地址,在设置-无线局域网中查看)
2, ps -e (查看手机上的进程)
3, cycript -p (附加进程)
在iOS 8中,StoreAPP全部位于/var/mobile/Containers/下,其中可执行文件位于/var/mobile/Containers/Bundle/Application/XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX/TargetApp.app下。我们可以关掉手机上的其他应用,只打开目标应用,再执行ps -e命令 在终端下搜索“/var/mobile/Containers/Bundle/Application/”就可以快速找到了。
然后再利用cycript -p TargetApp找到TargetApp的Documents目录路径存起来。
- 2 拷贝dumpdecrypted.dylib到TargetAPP的Documents目录。用到的命令:
scp ~/dumpdecrypted.dylib root@手机ip:/var/mobile/Containers/Data/Application/XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX/Documents
- 3 执行砸壳
进入到Documents目录下,然后进行砸壳。用到的命令:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/
Application/XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX/xxx.app/xxxx
当前目录下会生成TargetApp.decrypted,即砸壳后的文件。把该文件就可以进行class-dump的操作了。
以上就是砸壳的过程,不难吧。在上面的过程中,有人会问 为什么要把dumpdecrypted.dylib拷贝到Documents目录下操作呢?在一开始我也有这样的疑问,就去搜索了一下:
我们都知道,StoreApp 对沙盒以外的绝大多数目录没有写权限。dumpdecrypted.dylib要写一个decrypted文件,但它是运行在StoreApp中的,与StoreApp的权限相同,那么它的写操作就必须发生在StoreApp拥有写权限的路径下才能成功。StoreApp一定是能写入其Documents目录的,因此在Documents目录下使用dumpdecrypted.dylib时,保证它能在当前目录下写一个decrypted文件,这就是把dumpdecrypted.dylib拷贝到Documents目录下的操作原因。
要是不放入Documents下 就会出现这样的错误:
dyld: could not load inserted library'dumpdecrypted.dylib' because no suitable image found. Did find:
dumpdecrypted.dylib: stat() failed with errno=1 Trace/BPT trap: 5
这里的errno的值是1,即“Operation not permitted”,砸壳失败。
参考资料:
书籍:iOS应用逆向工程(第2版)
网站:http://bbs.iosre.com/