class-dump 分析类方法名称的原理
class-dump 可以将应用的头文件导出,头文件里包含了应用的类名和方法名的对应关系,我们来分析一下实现的原理。
在数据段中有一个 __objc_classlist 节,存放着每个类的信息保存的地址,比如图中 0x0000C048 地址上保存着数据 0x0000C644,这个数据就是表示 AppDelegate 类的信息保存的地址
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;
64 位的类信息的结构体定义如下:
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;
到 0x0000C644 来看看有什么信息,0x0000C644 是属于数据段 __objc_data 节,通过 MachOView 看到的信息如图
其中的 Data 数据是 0x0000C5FC,保存着类的数据信息,32位的结构体定义如下:
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;
};
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 节中,如图