我向来不怕得罪朋友,因为既是朋友,就不怕得罪,不能得罪的就不是朋友,这是我的一贯作风。由这一点你也可猜出,我的朋友为什么这么少。
——王小波《似水流年》
简介class-dump是用来dump目标对象的头文件信息的工具。它利用Objective-C语言的runtime的特性,将存储在mach-O文件中的类/分类/协议等头文件信息提取出来并生产.h文件。
从AppStore下载的App是被苹果加密过的,可执行文件被套上了一层保护壳, 而class-dump无法作用于加密过的App。 在这种情况下,想要获取头文件,需要先解密App的可执行文件,俗称“砸壳”。 dumpdecrypted就是由越狱社区的知名人士Stefan Esser出品的一款砸壳工具,被广泛运用在iOS逆向工程研究中。
注意:如果不砸壳,直接使用class-dump现在已经无法dump出头文件的(之前可以dump出头文件但是是加密的),只会生成一个CDStructures.h文件.
所有资料文件&工具在这里
class-dump
下载安装class-dump关于的class-dump详细安装方法,请点击这里
class-dump 可用于查看闭源的应用、frameworks、bundles。
对比一个 APP 不同版本之间的接口变化。
对一些私有 frameworks 做些有趣的试验。
class-dump的简单使用
dump出Mac版微信的头文件1class-dump -H /Applications/WeChat.app -o ~/Desktop/dump/WeChat-dump
-H 要解析的文件
/Applications/WeChat.app 需要反编译的应用路径
-o 输出目录(后面跟路径)
~/Desktop/dump/WeChat-dump 头文件存放路径
也可以dump出系统库1
2class-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的头文件信息
打开查看某个头文件的内容
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源文件.
下载后解压,文件如下:
dumpdecryptedp编译下载后打开Makefile文件,注意第三行:
1SDK=`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
打开终端,进入下载的dumpdecryptedp文件夹目录, 执行make即可完成编译, 操作步骤如图所示:
1
2
3
4
5
6
7
8
9
10cd ~/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.dylib和dumpdecrypted.o两个文件。
dumpecrypted.dylib 签名如果不对该文件进行签名, 后续砸壳的操作会失败.
先找到已经在电脑上面安装的苹果开发者证书, 操作如下:
1
2## 列出可签名证书, 找到 mac 上面已经安装的证书
security find-identity -v -p codesigning
dumpecrypted.dylib签名, 命令如下:
1codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib
"iPhone Developer: xxx xxxx (xxxxxxxxxx)" 为上一步找到的你已经安装的开发者证书名称。
dumpdecryptedp的简单使用
查找目标 App 所在进程推荐先清空手机后台运行的所有程序
打开微信应用
通过电脑终端ssh登录iPhone手机,查看当前运行的所有的进程
1ps -e
会列出所有当前正在运行的进程,虽然我们杀掉了所有后台服务,但是会有很多的系统进程信息干扰,我们需要找到以WeChat结尾的进程,即是我们需要的微信进程PID 是微信进程的进程ID
CMD 是微信进程可执行文件的路径
WeChat.app 即是我们需要砸壳的目标app
1
2PID TTY TIME CMD
771 ?? 0:06.94 /var/containers/Bundle/Application/6EE23DA1-6DE3-4477-A099-1E34639EB9C1/WeChat.app/WeChat
补充查找可执行文件路径比较快的方法(如果知道可执行文件名称)
1find / -name WeChat.app
查找程序进程PID比较快的方法(如果知道可执行文件名称)
1ps aux | grep WeChat
查找目标app的Documents目录砸壳需要将我们编译生成的dumpdecrypted.dylib文件放入目标app的Documents目录下,所以我们需要找到目标app的Documents目录。
终端进入手机的根目录执行下面指令, 我们会进入cy#模式:771 是我们上一步查找到的微信的进程ID
1CoderBoy-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
5ssh 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目录路径。
1YLD_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
18mach-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
3exit
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一个文件
1class-dump --arch armv7 WeChat.decrypted -H -o /Users/sevencho/Desktop/dump/Wechat-decrypted-dump
现在就可以看到别人整个APP的.h文件信息了,除了可以优雅的学习大厂App的接口命名及设计规范外,当然还可以依靠强大的运行时特性做一些其他有意思的事情。