一、加壳
未加壳 vs 加壳加壳:利用特殊算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。
已加壳的程序,无法用 class-dump MachOView 等工具进行查看。
二、脱壳
硬脱壳 vs 动态脱壳脱壳:摘掉壳程序,将未加密的可执行文件还原出来(有些人也称为“砸壳”)
脱壳主要有 2 种方式:硬脱壳、动态脱壳
三、如何查看 App 是否被加壳了呢?
- 从App来源判断
- 一般而言,从
App Store
下载的 App 都是加壳的。开发上传到 App Store 之后,苹果会为程序进行加壳,从而保护开发者的代码。 - 从
越狱市场
下载的越狱软件一般就是未加壳或者说已经脱壳完毕的应用。
- 利用命令行工具
otool -l <应用名字> | grep crypt
查询
carrotdeMacBook-Pro:clutch carrot__lsp$ otool -l Beautiful_clutch | grep crypt
cryptoff 16384
cryptsize 98304
cryptid 0 // 这个字段为零或不存在,则表示以及已经未加壳
- 利用
MachOView
工具进行查看
已加壳
Load Commands
中的LC_ENCRYPTION_INFO_64
中的Crypt_ID
值为非零,表示已加壳.
四、Clutch 硬脱壳
- 下载最新版的 Clutch https://github.com/KJCracks/Clutch
- 建议去掉版本号,改名为
Clutch
- 将
Clutch
文件拷贝到 iPhone 的/usr/bin
目录下 - 如果在 iPhone 上执行
Clutch
指令,权限不够,赋予可执行的权限
赋予权限 - 使用
Clutch -i
指令,查询 iPhone 上需要脱壳的程序:
iPhone:~ root# Clutch -i
Installed apps:
1: FaceApp - AI Face Editor <io.faceapp.ios>
2: AsTools---简单的笔记工具 <rn.notes.best>
3: 顽皮兔 for 云顶之弈,多多自走棋 <com.netgamebox.appbox>
4: 网易云音乐-音乐的力量 <com.netease.cloudmusic>
5: 微信 <com.tencent.xin>
6: 中国象棋 <com.cnvcs.xiangqi>
7: 钉钉 <com.laiwang.DingTalk>
- 输入
Clutch -d APP序号或BundleID
指令 进行脱壳
iPhone:~ root# Clutch -d com.netgamebox.appbox
Zipping appbox.app
ASLR slide: 0x10096c000
Dumping <appbox> (arm64)
Patched cryptid (64bit segment)
Writing new checksum
DONE: /private/var/mobile/Documents/Dumped/com.netgamebox.appbox-iOS9.0-(Clutch-2.0.4).ipa
Finished dumping com.netgamebox.appbox in 55.2 seconds
如上所示,有一个 DONE 并且告诉一个 IPA 文件,表示脱壳成功。并非百分百能脱壳成功。
五、 dumpdecrypted 动态脱壳
- 下载 dumpdecrypted https://github.com/stefanesser/dumpdecrypted
- 在下载的文件目录中,执行
make
指令,生成dumpdecrypted.dylib
动态库文件.
目录结构 - 将 dylib 文件拷贝到 iPhone 的
/var/root
目录中 - 终端进入 dylib 所在目录,使用环境变量 DYLD_INSERT_LIBRARIES 将 dylib 注入到需要脱壳的可执行文件中(可执行文件的路径可以通过
ps -A
查看获取) - 执行命令
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/341BDAEF-27B4-41F2-BAA8-59C4FFAF0104/WeChat.app/WeChat
导出脱壳包。
weChat 脱壳包
六、 dumpdecrypted 动态脱壳遇到的三个问题
-
dylib所在的文件夹权限不够。
问题一
解决方法
将dylib放在用户所在文件夹: 如果是root用户,请将dylib放在/var/root目录。 如果是 mobile用户,请将dylib放在/var/ mobile目录。
- dumpdecrypted.dylib未签名导致。
dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found. Did find:
dumpdecrypted.dylib: required code signature missing for 'dumpdecrypted.dylib'
Abort trap: 6
解决方法
// 列出可签名证书
security find-identity -v -p codesigning
// 重新签名,需要注意该操作要在dumpdecrypted.dylib的路径下执行,否则dumpdecrypted.dylib要写明路径
codesign --force --verify --verbose --sign "iPhone Developer: XXX XXX (XXXXXXXXXX)" dumpdecrypted.dylib
- Xcode SDK版本与越狱手机 iOS SDK 版本不一致,我的Xcode是11.3,越狱手机是12.3.1。
dyld: Symbol not found: ___chkstk_darwin
Referenced from: dumpdecrypted.dylib
Expected in: /usr/lib/libSystem.B.dylib
in dumpdecrypted.dylib
解决方法
下载一个老版本的Xcode10,放在桌面,然后打开终端执行命令。
sudo xcode-select -s /Users/xxx/Desktop/Xcode10.app/Contents/Developer
然后cd到dumpdecrypted所在目录,删除原来生成的dumpdecrypted.dylib和dumpdecrypted.o文件,重新执行make命令。 最后别忘记了切换回原来的Xcode.
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
网友评论