** iOS/MacOSX/移动安全 ** exchen ** 3年前 (2018-04-27) ** 4682浏览 ** 0评论html
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 节中,如图