iOS 开发 Objective-C

iOS 底层原理 day05 加壳 脱壳 clutch dum

2020-07-28  本文已影响0人  望穿秋水小作坊

一、加壳

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

未加壳 vs 加壳

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

二、脱壳

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

硬脱壳 vs 动态脱壳

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

  1. 从App来源判断
  1. 利用命令行工具otool -l <应用名字> | grep crypt查询
carrotdeMacBook-Pro:clutch carrot__lsp$ otool -l Beautiful_clutch | grep crypt
     cryptoff 16384
    cryptsize 98304
      cryptid 0 // 这个字段为零或不存在,则表示以及已经未加壳
  1. 利用 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 <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>
  1. 输入 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 动态脱壳

  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目录。

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

  1. 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
上一篇下一篇

猜你喜欢

热点阅读