分析類方法名稱的原理

[iOS Hacker] class-dump 分析類方法名稱的原理

** iOS/MacOSX/移動安全 ** exchen ** 3年前 (2018-04-27) ** 4682瀏覽 ** 0評論html

class-dump 分析類方法名稱的原理

class-dump 能夠將應用的頭文件導出,頭文件裏包含了應用的類名和方法名的對應關係,咱們來分析一下實現的原理。ios

在數據段中有一個 __objc_classlist 節,存放着每一個類的信息保存的地址,好比圖中 0x0000C048 地址上保存着數據 0x0000C644,這個數據就是表示 AppDelegate 類的信息保存的地址macos

32 位類信息的結構體定義以下:安全

typedef struct objc_class_info{
int32_t isa;
int32_t wuperclass;
int32_t cache;
int32_t vtable;
int32_t data;
int32_t reserved1;
int32_t reserved2;
int32_t reserved3;
}objc_class_info;markdown

64 位的類信息的結構體定義以下:app

typedef struct objc_class_info_64{
int64_t isa;
int64_t wuperclass;
int64_t cache;
int64_t vtable;
int64_t data;
int64_t reserved1;
int64_t reserved2;
int64_t reserved3;
}objc_class_info_64;oop

到 0x0000C644 來看看有什麼信息,0x0000C644 是屬於數據段 __objc_data 節,經過 MachOView 看到的信息如圖spa

其中的 Data 數據是 0x0000C5FC,保存着類的數據信息,32位的結構體定義以下:.net

typedef struct objc_class_data{
int32_t flags;
int32_t instanceStart;
int32_t instanceSize;
int32_t ivarlayout;
int32_t name;
int32_t baseMethod;
int32_t baseProtocol;
int32_t ivars;
int32_t weakIvarLayout;
int32_t baseProperties;
};code

64 位的結構體定義以下:

typedef struct objc_class_data_64{
int32_t flags;
int32_t instanceStart;
int32_t instanceSize;
int32_t reserved; //only arm64
int64_t ivarlayout;
int64_t name;
int64_t baseMethod;
int64_t baseProtocol;
int64_t ivars;
int64_t weakIvarLayout;
int64_t baseProperties;
};

在數據段的 __objc_const 節中查看 0x0000C5FC 的信息,如圖

其中 Name 地址裏的數據是 0xB7A6, 保存的字符串是在代碼段的 __objc_classname 節中,在 0xB7A6 保存的果真是 AppDelegate 字符串

而後返回到 __objc_const 節 0x0000C5FC 處,其中 Base Methods 地址裏的數據是 0x0000C53C,到 0x0000C53C 來看看,能夠看到這個類的相關的方法都在這裏

其中 application:didFinishLaunchingWithOptions: 這個方法的地址是在 0xAE40,字符串保存在代碼段的 __objc_methname 節中,如圖

轉載請註明:exchen's blog » [iOS Hacker] class-dump 分析類方法名稱的原理

相關文章
相關標籤/搜索