iOS 逆向(四)脱壳

iOS 逆向(四)脱壳这个系列,是很早听 MJ 课程时的整理,现在分享出来。 其中一些参考资料有些有引用,有些可能忘记添加了,如果有引用部分资料,可以联系我。 利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。 脱壳主要有2种方法:硬脱壳、动态脱壳。 Mach-…

这个系列,是很早听 MJ 课程时的整理,现在分享出来。 其中一些参考资料有些有引用,有些可能忘记添加了,如果有引用部分资料,可以联系我。

iOS 逆向(一)环境搭建
iOS 逆向(二)Cycript
iOS 逆向(三)逆向工具
iOS 逆向(四)脱壳
审核中 iOS 逆向(五)Theos工具 iOS 逆向(六)动态调试
iOS 逆向(七)重签名

一、加壳

利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。

iOS 逆向(四)脱壳

iOS 逆向(四)脱壳

二、脱壳

摘掉壳程序,将未加密的可执行文件还原出来(有些人也称为“砸壳”)

脱壳主要有2种方法:硬脱壳、动态脱壳。

2.1 是否脱壳

Mach-O文件中,Crypt ID为1代表加密,即加壳。

  1. 查看Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID的值,0代表未加密

iOS 逆向(四)脱壳

  1. 通过otool命令行 otool -l 可执行文件路径 | grep crypt

iOS 逆向(四)脱壳

2.2 脱壳工具

脱壳工具有很多,比如Clutch、dumpedcrypted。

另外,还有其他脱壳工具,如AppCrackr、Crackulous。

三、Clutch

3.1 安装

3.1.1 建议去掉版本号,改名为Clutch

3.1.2 将Clutch文件拷贝到iPhone的/usr/bin目录

iOS 逆向(四)脱壳

3.1.3 提示权限不足,赋予可执行权限:

5s:~ root# Clutch
-sh: /usr/bin/Clutch: Permission denied
5s:~ root# chmod +x /usr/bin/Clutch

3.2 使用

Clutch [OPTIONS]
-b --binary-dump     Only dump binary files from specified bundleID
-d --dump            Dump specified bundleID into .ipa file
-i --print-installed Print installed application
--clean              Clean /var/tmp/clutch directory
--version            Display version and exit
-? --help            Display this help and exit



### 3.2.1 列出应用


列出已经安装的应用


![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-225456.png#align=left&display=inline&height=173&margin=%5Bobject%20Object%5D&originHeight=173&originWidth=500&status=done&style=none&width=500)


### 3.2.2 脱壳


根据上面列出的,输入app序号或者bundle id进行脱壳操作:


Clutch -d app序号 Clutch -d bundleid



![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-233036.png#align=left&display=inline&height=130&margin=%5Bobject%20Object%5D&originHeight=362&originWidth=1388&status=done&style=none&width=500)![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-233400.png#align=left&display=inline&height=63&margin=%5Bobject%20Object%5D&originHeight=132&originWidth=524&status=done&style=none&width=250)


### 3.2.3 脱壳完成


脱壳完成之后,会显示路径:


![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-233228.png#align=left&display=inline&height=66&margin=%5Bobject%20Object%5D&originHeight=66&originWidth=1240&status=done&style=none&width=1240)


去对应路径,将脱壳头文件拷出即可。


![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-234118.png#align=left&display=inline&height=46&margin=%5Bobject%20Object%5D&originHeight=74&originWidth=562&status=done&style=none&width=350)![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-234156.png#align=left&display=inline&height=95&margin=%5Bobject%20Object%5D&originHeight=150&originWidth=554&status=done&style=none&width=350)


当然也可能会脱壳失败:


![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-233510.png#align=left&display=inline&height=100&margin=%5Bobject%20Object%5D&originHeight=100&originWidth=830&status=done&style=none&width=830)


那么,有**两种方案**1. 再次尝试脱壳;
2. 利用dempdecrypted尝试脱壳。



# 四、dumpdecrypted


## 4.1 编译


下载源代码,然后在源代码目录执行make指令进行编译,获得dylib动态库文件


![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-231328.png#align=left&display=inline&height=159&margin=%5Bobject%20Object%5D&originHeight=255&originWidth=800&status=done&style=none&width=500)![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-231349.png#align=left&display=inline&height=138&margin=%5Bobject%20Object%5D&originHeight=198&originWidth=358&status=done&style=none&width=250)


将dylib文件拷贝到iPhone上(如果是root用户,建议放/var/root目录)


![](http://blog-1251606168.file.myqcloud.com/blog_2018/2018-10-29-234718.png#align=left&display=inline&height=484&margin=%5Bobject%20Object%5D&originHeight=892&originWidth=922&status=done&style=none&width=500)


## 4.2 破壳


_注:以下操作均在手机端完成。_


### 4.2.1 终端进入dylib所在的目录


### 4.2.2 DYLD_INSERT_LIBRARIES


使用环境变量DYLD_INSERT_LIBRARIES将dylib注入到需要脱壳的可执行文件:


- 可执行文件路径可以通过`ps -A`查看获取,也可以通过[MJAppTools](https://github.com/CoderMJLee/MJAppTools)获取。



找到芒果TV对应的路径:


> /var/mobile/Containers/Bundle/Application/81DF5B23-4935-4E4D-81CA-03B6EE5B400F/MGTV-iPhone-appstore.app/



通过ps命令,得到的是app包的路径,还要找到app下对应的可执行文件。


此处,其对应的可执行文件为MGTV-iPhone-appstore,所以完整路径是:


> /var/mobile/Containers/Bundle/Application/81DF5B23-4935-4E4D-81CA-03B6EE5B400F/MGTV-iPhone-appstore.app/MGTV-iPhone-appstore



- DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib   可执行文件路径



​```bash DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/81DF5B23-4935-4E4D-81CA-03B6EE5B400F/MGTV-iPhone-appstore.app/MGTV-iPhone-appstore 
  • 小提示:
    • 获取对应APP的可执行文件,在找到app路径之后,app内一般可执行文件都以MB为单位,比较大
    • 另外,可执行文件,一般以APP应用名称有关联,比如微信是Wechat等。

4.2.3 破壳文件重命名

在dylib目录下找到对应的破壳程序,.decrypted就是破壳程序,将其重新命名为.ipa即可。

iOS 逆向(四)脱壳

4.2.4小问题

☞假如遇到下面提示

iOS 逆向(四)脱壳

☞原因:对dylib所在的文件夹权限不够

☞解决方案:将dylib放在用户所在文件夹,比如

  • 如果是root用户,请将dylib放在/var/root目录
  • 如果是mobile用户,请将dylib放在/var/mobile目录

参考

链接

  1. Clutch
  2. Clutch Release
  3. dumpdecrypted

今天的文章iOS 逆向(四)脱壳分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20843.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注