我向来不怕得罪朋友,因为既是朋友,就不怕得罪,不能得罪的就不是朋友,这是我的一贯作风。由这一点你也可猜出,我的朋友为什么这么少。
——王小波《似水流年》
简介
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版微信的头文件
1 | class-dump -H /Applications/WeChat.app -o ~/Desktop/dump/WeChat-dump |
-H
要解析的文件/Applications/WeChat.app
需要反编译的应用路径-o
输出目录(后面跟路径)~/Desktop/dump/WeChat-dump
头文件存放路径
也可以dump出系统库
1 | class-dump /System/Library/Frameworks/AppKit.framework // AppKit |
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
文件,注意第三行:
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 | // 进入Application内,Xcode右键显示包内容 |
- 打开终端,进入下载的
dumpdecryptedp
文件夹目录, 执行make
即可完成编译, 操作步骤如图所示:
1 | cd ~/Desktop/dumpdecrypted |
- 编译成功后会在
dumpdecryptedp
文件目录下会生成dumpdecrypted.dylib
和dumpdecrypted.o
两个文件。
dumpecrypted.dylib 签名
如果不对该文件进行签名, 后续砸壳的操作会失败.
先找到已经在电脑上面安装的苹果开发者证书, 操作如下:
1 | ## 列出可签名证书, 找到 mac 上面已经安装的证书 |
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
是微信进程的进程IDCMD
是微信进程可执行文件的路径WeChat.app
即是我们需要砸壳的目标app
1 | PID TTY TIME CMD |
补充
- 查找可执行文件路径比较快的方法(如果知道可执行文件名称)
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
直接退出,输入如下指令:
- 在Mac上新建一个终端,如果当前是在手机root模式,也可以输入
1 | // ~/Desktop/dumpdecrypted/dumpdecrypted.dylib 编译签名好的dumpdecrypted.dylib文件路径 |
- 进入到手机
Documents
目录, 查看dumpdecrypted.dylib
文件是否存在
1 | ssh root@192.168.1.60 |
- 开始砸壳,注意
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 | mach-o decryption dumper |
- 使用Mac的助手工具直接将生成的
WeChat.decrypted
文件拷贝到桌面即可,也可使用终端指令拷贝,如下- 退出手机
Root
模式,拷贝砸壳后文件到电脑桌面
- 退出手机
1 | exit |
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的接口命名及设计规范外,当然还可以依靠强大的运行时特性做一些其他有意思的事情。