iOS 逆向 day05 加壳 脱壳 clutch dumpencrypted

一、加壳

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

未加壳 vs 加壳

已加壳的程序,无法用 class-dump hopper-disassembler 等工具进行查看。

二、脱壳

脱壳:摘掉壳程序,将未加密的可执行文件还原出来(有些人也称为“砸壳”)
脱壳主要有 2 种方式:硬脱壳、动态脱壳

硬脱壳 vs 动态脱壳

三、如何查看 App 是否被加壳了呢?

1. 从App来源判断
  • 一般而言,从 App Store 下载的 App 都是加壳的。开发上传到 App Store 之后,苹果会为程序进行加壳,从而保护开发者的代码。
  • 越狱市场下载的越狱软件一般就是未加壳或者说已经脱壳完毕的应用。
2. 利用命令行工具otool -l <应用名字> | grep crypt查询
carrotdeMacBook-Pro:clutch carrot__lsp$ otool -l Beautiful_clutch | grep crypt
     cryptoff 16384
    cryptsize 98304
      cryptid 0 // 这个字段为零或不存在,则表示以及已经未加壳
3. 利用 MachOView 工具进行查看

已加壳

Load Commands 中的 LC_ENCRYPTION_INFO_64 中的 Crypt_ID 值为非零,表示已加壳.

四、Clutch 脱壳

1. 下载最新版的 Clutch https://github.com/KJCracks/Clutch
2. 建议去掉版本号,改名为 Clutch
3. 将 Clutch 文件拷贝到 iPhone 的 /usr/bin 目录下
4. 如果在 iPhone 上执行 Clutch 指令,权限不够,赋予可执行的权限
赋予权限
5. 使用 Clutch -i 指令,查询 iPhone 上需要脱壳的程序:
iPhone:~ root# Clutch -i
Installed apps:
1:   FaceApp - AI Face Editor 
2:   AsTools---简单的笔记工具 
3:   顽皮兔 for 云顶之弈,多多自走棋 
4:   网易云音乐-音乐的力量 
5:   微信 
6:   中国象棋 
7:   钉钉 
6. 输入 Clutch -d APP序号或BundleID 指令 进行脱壳
iPhone:~ root# Clutch -d com.netgamebox.appbox
Zipping appbox.app
ASLR slide: 0x10096c000
Dumping  (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 动态脱壳

1. 下载 dumpdecrypted https://github.com/stefanesser/dumpdecrypted
2. 在下载的文件目录中,执行 make 指令,生成dumpdecrypted.dylib 动态库文件.
目录结构
3. 将 dylib 文件拷贝到 iPhone 的 /var/root 目录中
4. 终端进入 dylib 所在目录,使用环境变量 DYLD_INSERT_LIBRARIES 将 dylib 注入到需要脱壳的可执行文件中(可执行文件的路径可以通过ps -A 查看获取)
5. 执行命令 DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/341BDAEF-27B4-41F2-BAA8-59C4FFAF0104/WeChat.app/WeChat 导出脱壳包。
weChat 脱壳包

六、 dumpdecrypted 动态脱壳遇到的三个问题

1. dylib所在的文件夹权限不够。
问题一

解决方法
将dylib放在用户所在文件夹: 如果是root用户,请将dylib放在/var/root目录。 如果是 mobile用户,请将dylib放在/var/ mobile目录。

2. 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

3. 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

你可能感兴趣的:(iOS 逆向 day05 加壳 脱壳 clutch dumpencrypted)