在iOS开发中,有时候想看下其他App里面用了哪些开源库,这时候就可以通过工具导出它的头文件来看。
从AppStore下载的App( 以下简称StoreApp) 是被苹果加密过的( 从其他渠道下载的一般没有加密) , 可执行文件被套上了一层保护壳, 而class-dump无法作用于加密过的App。 在这种情况下, 想要获取头文件, 需要先解密App的可执行文件, 俗称“砸壳”。 dumpdecrypted就是由越狱社区的知名人士Stefan Esser( @i0n1c) 出品的一款砸壳工具, 被越狱社区广泛运用在iOS逆向工程研究中。 引自 《iOS应用逆向工程第二版》
当然前提是你有一台越狱的设备哦。
这里就记录下,本人脱壳的步骤。
前提条件
- 越狱设备
- dumpdecrypted:用于脱壳
下载地址:
https://github.com/stefanesser/dumpdecrypted/archive/master.zip
下载后,解压运行make编译,就会在当前目录下生成dumpdecrypted.dylib文件
注:如果出现“make: Nothing to be done for 'all'”,说明目录下已经有dumpdecrypted.dylib了。 - class-dump:用于导出头文件
下载地址:http://stevenygard.com/
下载后,把class-dump放到/usr/bin,这样在终端就可以使用class-dump命令了。
步骤
-
上传dumpdecrypted.dylib到目标APP的Documents下
我们可以使用iFunBox或scp都可以。
- 确定APP的可执行文件的路径
/var/mobile/Containers/Bundle/Application/用于存放StoreApp的应用
/var/mobile/Containers/Data/Application/用于存放StoreApp的应用数据
把目标应用运行起来,然后通过SSH连接到设备上,运行ps -e来打印所有进程信息。(设备上要先安装Open SSH,在Cydia里面查找安装)
bogon:dumpdecrypted xxxx$ ssh root@192.168.95.3
root@192.168.95.3's password:
iPhone:~ root# ps -e```
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1616478-74ff09261ad25101.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
你也可以用91助手查看具体应用的安装目录:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1616478-e7da16668988f588.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3. 执行命令脱壳
定位到Documents下,执行如下命令
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/8F69D649-B0AE-47EC-9A7C-27E5762FD999/xxx.app/xxx
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1616478-835bd81f959fedf0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
此时就会在Documents下,生成一个xxx..decrypted的文件,这就是脱壳的文件了。
4. 使用class-dump导出头文件
把xxx.decrypted复制到mac上执行命令
class-dump --arch armv7 -H xxx.decrypted -o outHeader
就会在outHeader目录里面,生成出App的所有头文件。
之前由于没有加**--arch armv7**,而导致没有生成头文件。原因可能是APP里面包含了多个架构的可执行文件,因此需要针对架构导出头文件。
我们也可以用MachOView来查看下加密标志位。
App是有两个架构:armv7和arm64
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1616478-e854f61163654b03.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
脱壳前:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1616478-2afc8eb6caf7097e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
脱壳后:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1616478-dd8c84c98aa906af.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
arm64下的加密标志为1,说明arm64的架构是没有脱壳的。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1616478-4bfa197c0701d8ee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我们使用命令,是得不到头文件的。
class-dump --arch arm64 -H xxx.decrypted -o outHeader
是因为我使用的是iPhone 5c,它的架构是arm7s。
后来我是了一台iPhone6的话,使用--arch arm64这个命令是可以的,反而用--arch armv7就不行了。
因此,初步断定要使用你APP安装的设备一样的架构才可以。
最后在总结下:
1. 上传dumpdecrypted.dylib文件到设备上
2. ssh上设备,执行DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib命令
3. 用class-dump工具导出头文件
## 参考资料:
[如何实现远程连接(SSH)iPhone/iPad?](http://iphone.91.com/tutorial/syjc/130710/21589193.html)
[用dumpdecrypted给App砸壳](http://blog.csdn.net/oyzhx/article/details/38339129)
[class-dump 和 iOSOpenDev 的使用](http://blog.csdn.net/chaoyuan899/article/details/39271197)
[使用MachOView辅助破解AppStore应用](http://www.xuebuyuan.com/1682523.html)
### 目前为止Apple移动设备默认指令集(2014.8.22)
-------------------------------------------------------------------------------------
armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 设备: iPhone3GS, iPhone4, iPhone4S
iPad, iPad2, iPad3(The New iPad), iPad mini
iPod Touch 3G, iPod Touch4
armv7s设备: iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 设备: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)