逆向学习 - class-dump


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

2. git: https://github.com/nygard/class-dump

二、源码分析
1. 读取文件
1.1 CDFile
a. 读取文件,根据Magic生成CDFatFile或CDMachOFile;

1.2 CDMachFile (以X86_64格式分析)

a. 读取Mach64 Header
根据magic读取header信息,包括cpu type、file type、number of load commands、size of load commands 等;

b. CDDataCursor
负责读取数据,提供读取BigEndian和LittleEndian数据,包括int 16位、32位、64位等;

c. CDMachOFileDataCursor
继承CDDataCursor,通过设置headerOffset,数据定位到Load Commands 上;

c. Load Commands
循环加载所有Command,读取每个Command 的cmd字段,根据不同类型来生成不同的Command子类,并读取该Command下的所有信息;


d. CDLCSegment
CDLoadCommand 子类,Segment 下面包含多个Section,初始化时读取segment信息和包含所有section信息;


e. CDSection
 


2. 分析OC数据
首先判断文件是否加密,对于没有加密的文件进行分析,主要包括:
符号表、动态库符号表、协议、类、类别。

2.1 加载符号表 CDLCSymbolTable
a. 找到LC_SEGMENT_64(__DATA), 读取 vm address;
b. 创建CDMachOFileDataCursor, 以_symtabCommand.symoff (LC_SYMTAB 的Symbol Table Offset)为偏移量;
c. strtab 通过LC_SYMTAB 的String Table Offset 指向 String Table;
d. 读取符号表(Symbol Table)信息(String Table Index, Type…);
e. 读取 strtab+StringTableIndex 位置字符串;
f. 生成CDSymbol,添加到symbols中,并把前缀带有_OBJC_CLASS_$_ 的分别放到_classSymbols and _externalClassSymbols中;

2.2 加载动态库符号表
a. 创建CDMachOFileDataCursor,以_dysymtab.extreloff(LC_DYSYMTAB - ExtRef Table Offset)为偏移量;
b. 循环加载数据;

2.3 加载协议

a. 在Commands 中查找 CDSection (__DATA - __objc_protolist);
b. 创建CDMachOFileDataCursor,  以a的section为参数(section data 有offset开始,大小为size);
c. 遍历数据,通过cursor 读取地址(__DATA,__objc_protolist),传给protocolAtAddress;

d. protocolAtAddress
.  创建CDMathOFileDataCursor,设置offset;
.  offset  为:找到 Commands 里对应上面地址的section (__DATA - __data),通过section的offset + 上面地址 - addr;
. 读取__DATA,__data 里数据,生成cd_objc2_protocol;
. name 转字符串,查找section(__TEXT - __objc_classname),  通过section 的offset 从__TEXT,__objc_classname 里读取名称;
. 读取实例方法、类方法、可选实例方法、可选类方法、属性;


2.4 加载类
2.4.1 找到 Commands 里对应的section(__DATA - __objc_classlist);
2.4.2 通过section 创建CDMachOFileDataCursor,section data 从machOFile 起始地址+section.offset开始,长度为section.size;
2.4.3  读取一个int指针(__DATA,__objc_classlist - 第一个Data),传递给 loadClassAtAddress,生成 CDOCClass;

2.4.4 loadClassAtAddress
a.  创建CDMachOFileDataCursor,( 指针指向__DATA, __objc_data),读取类信息;
b.  设置cursor 地址,(指向__DATA, __objc_const ),读取类信息;
c.  通过上面读取的数据创建CDOCClass,加载方法,变量,协议,属性等;

2.5 加载类别
和2.4同理:


3. 导出头文件
3.1 willBeginVIsiting

3.2 recursivelyVisit
生成 protocol、class and category;

3.3 didEndVisiting

你可能感兴趣的:(iOS逆向-学习(QT))