获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名

下面来讲讲如何从Mach-o文件中分析出类名和方法名,也让我们了解下class-dump的原理。

Mach-o结构有两个节:__objc_classname 和 __objc_methname 其中就是类名和方法名。

Snip20150113_2 其中__objc_classname的偏移为:ox7961    __objc_methname的偏移为0x6F9E  这里分析的arch文件,不是fat binary,所以不用加上arch的偏移。

用UE打开文件,来到0×7961处:

Snip20150113_3

这里正是我们的类名。

再来到0x6F9E处:

Snip20150113_4这里便是方法名。

那怎么把类名和方法名联系起来呢?

其实每一个类的虚拟地址都保存在__objc_classlist中。

Snip20150113_5来到 0x80A0处:

Snip20150113_6

第一个虚拟地址为0x0000C78C   ,可以找到这地址在节__objc_data中,而且是起始地址,所以我们来到该节文件偏移处 0x878C:

Snip20150113_7

Snip20150113_8

此处的结构为:

1
2
3
4
5
6
7
8
9
10
typedef  struct objc_class {
         unsigned  long  long isa ;
         unsigned  long  long wuperclass ;
         unsigned  long  long cache ;
         unsigned  long  long vtable ;
         unsigned  long  long data ;
         unsigned  long  long reserved1 ;
         unsigned  long  long reserved2 ;
         unsigned  long  long reserved3 ;
}objc_class ;

关键的信息存储在data中:

data的虚拟地址为0x0000C5D8,而这个虚拟地址在节__objc_const中。所以在文件中的偏移地址=虚拟地址-节起始地址+节的文件偏移。

0x0000C5D8-0x0000C0B8+0x80B8 = 0x85D8

Snip20150113_10

此处的结构为:

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef  struct objc_classdata {
     long  long flags ;
     long  long instanceStart ;
     long  long instanceSize ;
     long  long reserved ;
     unsigned  long  long ivarlayout ;
     unsigned  long  long name ;
     unsigned  long  long baseMethod ;
     unsigned  long  long baseProtocol ;
     unsigned  long  long ivars ;
     unsigned  long  long weakIvarLayout ;
     unsigned  long  long baseProperties ;
}

其中的name虚拟地址为:0x00B961,在节__objc_classname  按上面的公式转换为文件偏移:0×7961

Snip20150113_12

所以第一个类名为AppDelegate。

baseMethod的虚拟地址为:0x00C518,在节__objc_const,转换为文件偏移:0×8518

Snip20150113_14

前4个是entsize,后4个是该类拥有方法的个数,接着以12个字节为单位(前4个字节是方法名,中间4个是方法类型,后4个字节是imp)分别是每一个方法的信息。

我们得到第一个方法的name虚拟地址为:0x0000AFAC,在节__objc_methname,转换为文件偏移:0x6FAC

Snip20150113_15

方法名为dealloc。class-dump-z 看一下:

Snip20150113_16

其它的大家可以自己分析~~~

转载自:http://www.blogfshare.com/ioss-mach-o-dump.html


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值