逆向學習 - 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章