class-dump和MachO文件


class-dump是用来dump目标文件的类信息的工具。它利用Objective-C语言的runtime特性,将存储在mach-O文件中的@interface@protocol信息提取出来,并生成对应的.h文件

安装class-dump

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指定子类型,对于InterArmCPU架构,其都有各个阶段和等级的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周报,欢迎关注或订阅

刚刚在线工作室,欢迎关注或提出建设性意见!

刚刚在线论坛, 欢迎踊跃提问或解答!

如有转载,请注明出处,谢谢!

本站总访问量 本文总阅读量