iOS攻防(四):使用Dumpdecrypted 砸壳 & class-dump 导出头文件


我向来不怕得罪朋友,因为既是朋友,就不怕得罪,不能得罪的就不是朋友,这是我的一贯作风。由这一点你也可猜出,我的朋友为什么这么少。

——王小波《似水流年》

简介

class-dump

下载安装class-dump

  • 关于的class-dump详细安装方法,请点击这里
  • class-dump 可用于
    • 查看闭源的应用、frameworks、bundles。
    • 对比一个 APP 不同版本之间的接口变化。
    • 对一些私有 frameworks 做些有趣的试验。

class-dump的简单使用

dump出Mac版微信的头文件

1
class-dump -H /Applications/WeChat.app -o ~/Desktop/dump/WeChat-dump
  • -H 要解析的文件
  • /Applications/WeChat.app 需要反编译的应用路径
  • -o 输出目录(后面跟路径)
  • ~/Desktop/dump/WeChat-dump 头文件存放路径

也可以dump出系统库

1
2
class-dump /System/Library/Frameworks/AppKit.framework // AppKit
class-dump /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/UIKit.framework // UIKit

dumpMac版微信结果

  • 执行完成后即可在指定输出目录查看dump的头文件信息
dump_wechat
  • 打开查看某个头文件的内容
dump_wechat_file

dumpdecrypted

  • 我们都知道Clutch是一个非常厉害的砸壳工具, 那么为什么还需要dumpdecrypted这个工具呢?
  • 因为Clutch并不是万能的,无法砸开含有兼容WatchOs2的App, 从AppStore下载的有些App(比如WeChat)并不能使用Clutch来进行砸壳, 使用Clutch工具来进行砸壳会失败。

我的准备

  • MacOS 10.13.5
  • iPhone 5C 10.3.2
  • dumpdecrypted
  • class-dump
  • 在Cydia中安装 cycript, 可以先不用管 cycript 是什么, 后续会单独详讲.
  • iTools或者其他助手工具

下载安装dumpdecrypted

  • 去 Github 下载dumpdecrypted源码, 源码就一个C源文件.
  • 下载后解压,文件如下:
    dumpdecrypted_fileList

dumpdecryptedp编译

  • 下载后打开Makefile文件,注意第三行:
1
SDK=`xcrun --sdk iphoneos --show-sdk-path`
  • 这里填写的SDK必须与你越狱的iPhone系统版本需要一致,你可以使用如下指令先查看你Xcode的SDK版本:
1
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk
  • 虽然我的Xcode的SDK版本是11.4,但是我查看了下支持的目录文件,是有10.3的支持文件的,所以可以直接编译,查看目录如下:
1
2
// 进入Application内,Xcode右键显示包内容
/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
iPhone_support_sdk
  • 打开终端,进入下载的dumpdecryptedp文件夹目录, 执行make即可完成编译, 操作步骤如图所示:
1
2
3
4
5
6
7
8
9
10
cd ~/Desktop/dumpdecrypted

make

// 编译完输出信息如下
`xcrun --sdk iphoneos --find gcc` -Os -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c
`xcrun --sdk iphoneos --find gcc` -Os -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -dynamiclib -o dumpdecrypted.dylib dumpdecrypted.o
ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/PrivateFrameworks'
ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/PrivateFrameworks'
ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/PrivateFrameworks'
  • 编译成功后会在dumpdecryptedp文件目录下会生成dumpdecrypted.dylibdumpdecrypted.o两个文件。

dumpecrypted.dylib 签名

  • 如果不对该文件进行签名, 后续砸壳的操作会失败.

  • 先找到已经在电脑上面安装的苹果开发者证书, 操作如下:

1
2
## 列出可签名证书, 找到 mac 上面已经安装的证书
security find-identity -v -p codesigning
  • dumpecrypted.dylib签名, 命令如下:
1
codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib
  • "iPhone Developer: xxx xxxx (xxxxxxxxxx)" 为上一步找到的你已经安装的开发者证书名称。

dumpdecryptedp的简单使用

查找目标 App 所在进程

  • 推荐先清空手机后台运行的所有程序
  • 打开微信应用

  • 通过电脑终端ssh登录iPhone手机,查看当前运行的所有的进程

1
ps -e
  • 会列出所有当前正在运行的进程,虽然我们杀掉了所有后台服务,但是会有很多的系统进程信息干扰,我们需要找到以WeChat结尾的进程,即是我们需要的微信进程
    • PID 是微信进程的进程ID
    • CMD 是微信进程可执行文件的路径
    • WeChat.app 即是我们需要砸壳的目标app
1
2
PID  TTY        TIME     CMD
771 ?? 0:06.94 /var/containers/Bundle/Application/6EE23DA1-6DE3-4477-A099-1E34639EB9C1/WeChat.app/WeChat
补充
  • 查找可执行文件路径比较快的方法(如果知道可执行文件名称)
1
find / -name WeChat.app
  • 查找程序进程PID比较快的方法(如果知道可执行文件名称)
1
ps aux | grep WeChat

查找目标app的Documents目录

  • 砸壳需要将我们编译生成的dumpdecrypted.dylib文件放入目标app的Documents目录下,所以我们需要找到目标app的Documents目录。
  • 终端进入手机的根目录执行下面指令, 我们会进入cy#模式:
    • 771 是我们上一步查找到的微信的进程ID
1
CoderBoy-iPhone:~ root# cycript -p 771
  • cy#模式使用OC方法查找微信应用的Documents目录, 输入下面代码
1
[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
  • 成功后会输出微信应用的Documents目录路径,如下:
    • 注意: 执行过程中, 在iPhone上面打开运行一下微信, 不然上面的执行一直卡在那里不动.
    • 成功后输入ctrl+d退出cycript
1
#"file:///var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents/"

砸壳

  • 拷贝dumpdecrypted.dylib这个之前编译签名好的文件到iPhone上面该目标APP的Documents目录.
  • 方法一:直接在电脑上通过助手软件将dumpdecrypted.dylib放入到目标app的Documents目录。
  • 方法二:也可以使用指令将dumpdecrypted.dylib放入到目标app的Documents目录,操作如下:
    • 在Mac上新建一个终端,如果当前是在手机root模式,也可以输入exit直接退出,输入如下指令:
1
2
3
4
// ~/Desktop/dumpdecrypted/dumpdecrypted.dylib 编译签名好的dumpdecrypted.dylib文件路径
// /var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents/ 上一步获取到的目标app的Documents目录

scp ~/Desktop/dumpdecrypted/dumpdecrypted.dylib root@192.168.1.60:/var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents/
  • 进入到手机Documents目录, 查看dumpdecrypted.dylib文件是否存在
1
2
3
4
5
ssh root@192.168.1.60

cd /var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents

ls -l
  • 开始砸壳,注意
    • DYLD_INSERT_LIBRARIES=后填写的是你刚刚传输到Documents目录的.dylib文件名,我的是 dumpdecrypted.dylib
    • dumpdecrypted.dylib后的路径是需要砸壳的目标app的可执行文件路径,也即是之前查找目标app进程时获取到的路径,而不是Documents目录路径。
1
YLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/6EE23DA1-6DE3-4477-A099-1E34639EB9C1/WeChat.app/WeChat
  • 砸壳成功后输入信息如下:
    • 砸壳成功后会在Documents目录生成一个名为AppName.decrypted文件,如当前操作会生成一个WeChat.decrypted文件,可以使用ls -l指令查看。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mach-o decryption dumper

DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.

[+] detected 32bit ARM binary in memory.
[+] offset to cryptid found: @0x59a4c(from 0x59000) = a4c
[+] Found encrypted data at address 00004000 of length 54755328 bytes - type 1.
[+] Opening /private/var/containers/Bundle/Application/6EE23DA1-6DE3-4477-A099-1E34639EB9C1/WeChat.app/WeChat for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a plain MACH-O image
[+] Opening WeChat.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset a4c
[+] Closing original file
[+] Closing dump file
  • 使用Mac的助手工具直接将生成的WeChat.decrypted文件拷贝到桌面即可,也可使用终端指令拷贝,如下
    • 退出手机Root模式,拷贝砸壳后文件到电脑桌面
1
2
3
exit

scp root@192.168.1.60:/var/mobile/Containers/Data/Application/8B12B9B9-06BE-49C2-ADC2-96BB1C4F5E79/Documents/WeChat.decrypted ~/Desktop/WeChat.decrypted

class dump 砸壳后的文件

  • 砸壳后的WeChat.decrypted文件就可以使用class-dump导出头文件,如下
    • --arch armv7是指定架构,dumpdecrypted只会砸你手机处理器对应的那个壳,fat binary的其它部分仍然是有壳的
    • class-dump的默认目标又不是被砸壳的那个部分,如果不指定架构只能导出CDStructures.h一个文件
1
class-dump --arch armv7 WeChat.decrypted -H -o /Users/sevencho/Desktop/dump/Wechat-decrypted-dump
  • 现在就可以看到别人整个APP的.h文件信息了,除了可以优雅的学习大厂App的接口命名及设计规范外,当然还可以依靠强大的运行时特性做一些其他有意思的事情。
wechat_dump_iOS_header

wechat_dump_iOS_header_file
要不要鼓励一下😘