何为加壳?
如前面所介绍的,拿到一个App的ipa包可以通过class-dump
、 Hopper Disassembler
等工具进行分析,然而当我们利用这些分析手机里从App Store下载的App安装包时,会发现都是一些经过加密的文件,无法进行分析
这是因为App Store对我们上传的App进行了加壳操作,那么何为加壳呢?其实是利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的
- 加壳前,App可执行文件中的代码会被装载到内存中
- 加壳后,App可执行文件进行加密,其外部会包一层壳程序。由于壳程序本身也是Mach-O文件,程序执行时,就会将壳程序装载到内存中。紧接着壳程序会使用解密算法对App可执行文件进行解密操作,解密完成之后就会去执行文件,将代码装载进内存中
如何判断App可执行文件是否加壳?
想要判断App可执行文件是否加壳,主要是通过Crypt ID(App可执行文件加密类型)是否为0判断,如果为0则代表未曾加密、反之非0就代表加密
可以使用以下两种方式进行判断:
- 使用otool命令行
# 搜索Load Commands中的crypt关键字
otool -l 可执行文件名称 | grep crypt
- 利用MachOView查看可执行文件
脱壳
既然无法分析加壳后App可执行文件,那么就需要对程序进行脱壳操作
脱壳方式有两种,硬脱壳和动态脱壳:
- 硬脱壳,直接将壳程序通过执行解密算法得到解密后的可执行文件(iOS通常做法)
- 动态脱壳,程序运行之后,可执行文件已经被解密,然后从内存中导出
脱壳工具
clutch
首先下载该工具(点击下载),然后分别执行以下步骤
- 利用iFunBox将Clutch文件拷贝到手机的/usr/bin目录
- SSH登录手机,执行Clutch命令,若显示
Permission denied
,则输入以下命令获取权限
chmod +x /usr/bin/Clutch
- 执行以下命令,列出当前手机可以脱壳的App
Clutch -i
- 通过
序号
或者bundle ID
进行脱壳操作(注意:不完美越狱iOS12以上不可用
)
Clutch -d 2
Clutch -d com.netease.cloudmusic
dumpdecrypted
- 下载源代码,然后在源代码目录执行make指令进行编译,获得dylib动态库文件
- 将dylib文件拷贝到iPhone上(如果是root用户,建议放/var/root目录)
- 终端进入dylib所在位置,使用环境变量DYLD_INSERT_LIBRARIES将dylib注入到需要脱壳的可执行文件(
通过ps -A查看可执行文件的完整路径
)
# 此路径就是ps -A指令打印出来的
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/992C4ACA-4B99-4FC2-8BEE-11A3BDA1E9D0/neteasemusic.app/neteasemusic
- 执行完成之后,在/var/root目录下会生成neteasemusic.decrypted文件,这就是脱壳之后的可执行文件,然后使用otool命令查看Load Commands可以发现Crypt ID为0
dumpdecrypted脱壳时可能出现的错误
dumpdecrypted.dylib未签名错误:
dyld: warning: could not load inserted library 'dumpdecrypted.dylib' into hardened process because no suitable image found. Did find:
dumpdecrypted.dylib: code signature in (dumpdecrypted.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
2020-12-15 22:30:03.444 neteasemusic[3758:559109] [OTRLocation: ../Tweak/Tweak.xm:121] ERROR: logos: nil class SpringBoard
2020-12-15 22:30:03.811 neteasemusic[3758:559109] [SnowBoard Launcher] Loader check passed. Loading SnowBoard...
2020-12-15 22:30:03.859 neteasemusic[3758:559132] [SnowBoard] reloadWithoutExtensions (0) took 0.000333 s
[2020/12/15 22:30:04:035] [NMLLogger:26] ---------- application start, version: 7.3.01 ----------
[2020-12-15 22:30:04:070] file:NELPLocationManager.m line:76)<<<<[NELPLocationManager authorizationStatus] = 0
Abort trap: 6
解决办法就是给dumpdecrypted.dylib签名,输入以下指令(前提在dumpdecrypted.dylib目录下
)
ldid -S dumpdecrypted.dylib
今天的文章04-加壳和脱壳分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24310.html