最新消息:本站技术交流 QQ 群:28124927

[iOS Hacker] class-dump 分析类方法名称的原理

iOS/MacOSX/移动安全 exchen 8135浏览 0评论

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 节中,如图

转载请注明:exchen's blog » [iOS Hacker] class-dump 分析类方法名称的原理

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址