获取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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取iOS任意线程调用堆栈(四)符号化实战

转载自:http://blog.csdn.net/jasonblog/article/details/49909209 1. 相关API和数据结构 由于我们在上面回溯线程调用栈拿到的是一组地址,所以这里进行符号化的输入输出应该分别是地址和符号,接口设计类似如下: - (NSString *)s…

获取iOS任意线程调用堆栈(五)完整实现:BSBacktraceLogger

转载自:https://toutiao.io/posts/aveig6/preview BSBacktraceLogger 是一个轻量级的框架,可以获取任意线程的调用栈,开源在我的 GitHub,建议下载下来结合本文阅读。 我们知道 NSThread 有一个类方法 callstackSymbols 可以获取调…

Mac电脑如何彻底删除清除数据?CleanMyMac X软件更专业

虽然不用杀毒,但是日常的清理还是有必要的,特别是卸载一些软件会有残留,可以用命令mdfind来找,然后删,这里给新手用户推荐一款应用clean my mac x,定期清理一下,不用的时候关掉就可以。 CleanM…

Git的思想和基本工作原理

转载自:http://www.nowamagic.net/academy/detail/48160210# 在开始学习 Git 的时候,请不要尝试把各种概念和其他版本控制系统(诸如 Subversion 和 Perforce 等)相比拟,否则容易混淆每个操作的实际意义。Git 在保存和处…

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

本文转自:http://www.aboutyun.com/thread-9341-1-1.html一、入门1、简介Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存…

深入理解Hadoop集群和网络

云计算和Hadoop中网络是讨论得相对比较少的领域。本文原文由Dell企业技术专家Brad Hedlund撰写,他曾在思科工作多年,专长是数据中心、云网络等。文章素材基于作者自己的研究、实验和Cloudera的培训资料。 本文将着重于讨论Hadoop集群的体系结构和方法&am…

iOS中WebKit框架应用与解析

一、引言 在iOS8之前,在应用中嵌入网页通常需要使用UIWebView这样一个类,这个类通过URL或者HTML文件来加载网页视图,功能十分有限,只能作为辅助嵌入原生应用程序中。虽然UIWebView也可以做原生与JavaScript交互的相关处理&#xf…

六、区块链主流共识算法浅析

转自:http://www.cocoachina.com/cms/wap.php?actionarticle&id22240。 一、概述: 1.工作量证明(Proof of Work): 通过所有节点的工作量竞争来达成一致。竞争的是运算力。 2.权益证明(Proof of S…

七、区块链如何运用merkle tree验证交易真实性

转载自:https://www.tangshuang.net/4117.html 本文假设你已经知道区块链中merkle tree的原理,现在搞明白具体怎么来实现交易真实性验证。 Merkle Tree 这个小节简述一下merkle的原理。简单说,merkle tree就是一个hash二叉树,父…

java基础 --- Arrays.asList():返回指定数组支持的固定大小列表

Arrays.asList():返回指定数组支持的固定大小列表 首先看下这个方法的源码注释,注意第一句,Returns a fixed-size list backed by the specified array., 意思就是:返回指定数组支持的固定大小列表 所以:…

Notepad++中的UTF-8无BOM格式编码

Notepad中,关于utf-8的编码格式,有两种:以UTF-8无BOM格式编码和以UTF-8格式编码。 很容易给人一种错觉,第一反应会选择以UTF-8格式编码,感觉这种就是平时所说的UTF-8,然而这种编码是默认带BOM的&#xff0…

Java 线程状态---WAITING(部分转载)

看到一篇关于写线程waiting状态的文章,感觉很生动有趣,转过来保存下。 总结: waiting这个状态,就是等待,明确了等待,就不会抢资源了。 一个线程A在拿到锁但不满足执行条件的时候,需要另一个线…

服务端高并发分布式架构演进之路(转载,图画的好)

这个文章基本上从单机版到最终版,经历了加缓存,加机器,高可用,分布式,最后到云等过程,其实我一直想总结一套类似的东西,没想到有人已经先弄出来了,那就不重复造轮子了,而…

限流算法(漏桶算法、令牌桶算法)对比

限流算法(漏桶算法、令牌桶算法) 漏桶算法: 有个桶,比如最大能进2个单位的水(请求),桶底有个洞,每个单位的水都会在桶里待3秒后漏下去。 那么这个桶就可以同时处理2个单位的水。 如…

mongodb 索引详解

使用springboot连接mongodb的时候,涉及到索引的使用 举例: Document(collection"book") //注释的是复合索引 //CompoundIndexes( // { // CompoundIndex(name "复合索引名字",def "{字段01:1,字段02:…

mongodb数据库,批量插入性能测试记录

spring boot 框架下,操作mongodb数据库 maven:spring-data-mongodb:2.1.3.RELEASE mongo数据库用的是本地的mongo,所以环境不一样,可能结果不一样。但趋势应该是一样的。 测试保证每次批量插入时,库里的数据量都是一…

[转载] --- 数据库基本知识

里面的很多点,我之前都总结过,但是感觉这篇把这些都连起来了,总结的挺好,转载保存一下 【从入门到入土】令人脱发的数据库底层设计前言 说到数据库这个词,我只能用爱恨交加这个词来形容它。两年前在自己还单纯懵懂的时…

spring-boot发送邮件失败 AuthenticationFailedException: 535 Authentication Failed

发送邮件失败,平时一直是好的,突然有天开始失败了,最后是发现邮箱密码失效了。。。 有的邮箱,需要定期更改密码。

互联网广告行业(01)------ 初识了解DSP、SSP、ADX

最近有幸接触到公司的一个实时竞价系统,也算是公司的核心系统之一了,增加了很多新的知识,可能有点乱,先总结一波: 广告行业,先介绍概念 广告主:需要打广告的站点,一般就是卖东西的…

互联网广告行业(02)------OpenRTB(实时竞价)规范解读

RTB:(Real Time Bidding实时竞价),RTB是一种广告交易的方式 OpenRTB:简单理解就是一个行业规范,是一个为了促进RTB方式广告的标准,有对应的api文档,大家都按照这个规范去传参数,那么发送方和接收…