获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名
来源:互联网 发布:mac的usb不支持 编辑:程序博客网 时间:2024/06/10 23:14
下面来讲讲如何从Mach-o文件中分析出类名和方法名,也让我们了解下class-dump的原理。
Mach-o结构有两个节:__objc_classname 和 __objc_methname 其中就是类名和方法名。
其中__objc_classname的偏移为:ox7961 __objc_methname的偏移为0x6F9E 这里分析的arch文件,不是fat binary,所以不用加上arch的偏移。
用UE打开文件,来到0×7961处:
这里正是我们的类名。
再来到0x6F9E处:
这里便是方法名。
那怎么把类名和方法名联系起来呢?
其实每一个类的虚拟地址都保存在__objc_classlist中。
来到 0x80A0处:
第一个虚拟地址为0x0000C78C ,可以找到这地址在节__objc_data中,而且是起始地址,所以我们来到该节文件偏移处 0x878C:
此处的结构为:
2
3
4
5
6
7
8
9
10
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
此处的结构为:
2
3
4
5
6
7
8
9
10
11
12
13
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
所以第一个类名为AppDelegate。
baseMethod的虚拟地址为:0x00C518,在节__objc_const,转换为文件偏移:0×8518
前4个是entsize,后4个是该类拥有方法的个数,接着以12个字节为单位(前4个字节是方法名,中间4个是方法类型,后4个字节是imp)分别是每一个方法的信息。
我们得到第一个方法的name虚拟地址为:0x0000AFAC,在节__objc_methname,转换为文件偏移:0x6FAC
方法名为dealloc。class-dump-z 看一下:
其它的大家可以自己分析~~~
转载自:http://www.blogfshare.com/ioss-mach-o-dump.html
- 获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名
- 获取iOS任意线程调用堆栈(二)符号化理论:Mach-o文件结构
- 获取iOS任意线程调用堆栈(四)符号化实战
- 获取iOS任意线程调用堆栈(一)获取任意线程的调用栈地址列表
- 获取iOS任意线程调用堆栈(五)完整实现:BSBacktraceLogger
- java 获取调用类的类名和方法名
- 获取调用类和调用方法名-转贴
- Java获取当前类名、方法名
- PHP获取当前类名、方法名
- Java获取当前类名、方法名
- Java获取当前类名、方法名
- Java获取当前类名、方法名
- Java获取当前类名、方法名
- Java获取当前类名、方法名
- Java获取当前类名、方法名
- PHP获取当前类名、方法名
- Java获取当前类名、方法名
- java 调用方法栈获取类名,方法名,方法返回类型
- Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解
- 蚂蚁金服成立科学智囊团,机器学习之父Michael I.Jordan担任主席
- PHP PSR-1 规范
- 156. Binary Tree Upside Down
- Android Fragment 与 Fragment管理器
- 获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名
- 查找成绩排名第二的学生
- Windows中的时间(SYSTEMTIME和FILETIME)
- 面试题26复杂连标的复制
- Android应用自定义View绘制方法手册
- python入门(@property,@*.setter)
- 获取iOS任意线程调用堆栈(四)符号化实战
- Liunx线程的同步
- Java做题笔记