class-dump
是用来dump
目标文件的类信息的工具。它利用Objective-C
语言的runtime
特性,将存储在mach-O
文件中的@interface
和@protocol
信息提取出来,并生成对应的.h文件
安装class-dump
下载后将class-dump 复制到/usr/bin/class-dump。如果是OS X 10.11,因为没有/usr/bin文件夹的写权限,所以将class-dump复制到/usr/local/bin/class-dump即可。执行命令赋予其执行权限:
1 | sudo chmod 777 /usr/local/bin/class-dump |
放到/usr/bin目录下会发现系统管理员也没有权限进行写操作,是因为由于系统启用了SIP(System Integerity Protection)导致root用户也没有修改权限,如果需要屏蔽掉这个功能,具体做法是:
1.电脑重启按住command+R,进入恢复模式
2.打开终端,输入csrutil disable,重启即可
3.如果想打开SIP,重复上两步,命令改为csrutil enable
对于/sbin
、/bin
、/usr/sbin
、/usr/bin
、/usr/local/bin
、/usr/local/sbin
这些目录的区别,直接摘抄引用
所有用户皆可用的系统程序放在/bin
超级用户才能使用的系统程序放在/sbin
所有用户都可用的应用程序放在/usr/bin
超级用户才能使用的应用程序放在/usr/sbin
所有用户都可用的与本地机器无关的程序存放在/usr/local/bin
超级用户才能使用的与本地机器无关的程序存放在/usr/local/sbin
由于我之前安装了MonkeyDev,而MonkeyDev
内部集成了class-dump
,所以可以直接使用,class-dump
是放在/opt/MonkeyDev/bin
的目录下
使用class-dump
官网上已给出相关用法
以微信和支付宝为例,首先要拿到越狱包,我这里是从pp
助手下载,如果是非越狱包要先砸壳再dump
打来越狱包,显示包内容,找到可执行文件
dump
出来的头文件大概有一万多个,直接拖到Xcode
可能会比较卡,我这里直接拖到Sublime
,
有时class-dump指令会执行失败,无法得到想要的头文件或者只有CDStructures
文件,出现这种情况是因为class-dump的作用对象必须是未经加密的
可执行文件,经过签名加密的,这个时候需要先进行砸壳
MachO(Mach Object)文件
上面dump
用到的可执行文件就是MachO
文件的一种,官方介绍共有11种格式,是Mac OS X\iOS
上用于记录可执行文件、对象代码、共享库、动态加载代码和内存转储的文件格式
常见格式:
- 1.可执行文件
- 2.objcet
- .o 文件(目标文件)
- .a 静态库文件(是N个.o文件的集合)
- 3.DYLIB: 动态库文件
- dylib
- framework
- 4.动态链接器(dynamic linker,专门用来加载动态库)
- 5.dSYM (用来保存16进制函数地址映射信息的中转文件)
.o文件
.a文件
dylib
framework
dSYM
动态链接器
通用二进制文件
通用二进制文件,也叫做胖MachO文件。MachO文件是包含一种架构(i386、x86_64、arm64等)的对象文件,而胖文件可能包含若干不同架构(i386、x86_64、arm、arm64 等)的对象文件。
通过ida
可打开指定架构的可执行文件
瘦身
lipo 可执行文件 -thin armv7 -output MachO_armv7
lipo 可执行文件 -thin armv64 -output MachO_armv64
整合
lipo -create 可执行文件armv7 可执行文件arm64 -output 可执行文件
MachOView
MachOView
可以用来查看MachO的文件格式信息,使用Mac
自带的otool
其实也可以查看,这里以微信为例
使用MachOView
可以可视化查看MachO
文件的内部信息,但是这个软件相当占内存
通过上图可以看到,MachO
文件具体可以分为几个部分
- 文件头
Mach64 Header
- 加载命令
Load Commands
- 代码段
__TEXT
- 数据段
__DATA
- 动态库加载信息
Dynamic Loader Info
- 入口函数
Function Starts
- 符号表
Symbol Table
- 动态库符号表
Dynamic Symbol Table
- 字符串表
String Table
Mach64 Header文件中,各字段含义
字段 | 说明 |
---|---|
Magic Number |
魔数,系统加载器通过改字段,判断该文件是用于32位or64位 |
Cpu Type |
CPU 类型以及子类型字段,该字段确保系统可以将适合的二进制文件在当前架构下运行 |
Cpu SubType |
CPU 指定子类型,对于Inter ,Arm 等CPU 架构,其都有各个阶段和等级的CPU 芯片,该字段就是详细描述其支持的CPU 子类型 |
File Type |
该MachoO 文件类型(可执行文件,库文件,核心转储文件,内核扩展,DSYM 文件,动态库等) |
Number of Load Commands |
加载命令条数 |
Size of Load Commands |
加载命令大小 |
Flags |
标志位,该字段表示二进制文件支持的功能,主要是和系统加载,链接相关 |
Reserved |
保留字段 |
ida
工具获取到的方法地址,其实是通过MachOView
分析macho
文件得到的
如有任何疑问或问题请联系我:fishnewsdream@gmail.com,欢迎交流,共同提高!
Objective-C/Swift技术开发交流群201556264,讨论何种技术并不受限,欢迎各位大牛百家争鸣!
微信公众号OldDriverWeekly
,欢迎关注并提出宝贵意见
老司机iOS周报,欢迎关注或订阅
刚刚在线工作室,欢迎关注或提出建设性意见!
刚刚在线论坛, 欢迎踊跃提问或解答!
如有转载,请注明出处,谢谢!