获取iOS任意线程调用堆栈(二)符号化理论:Mach-o文件结构

我们知道Windows下的文件都是PE文件,同样在OS X和iOS中可执行文件是Mach-o格式的。

所以我们如果要进行逆向分析,首先要熟悉Mach-o文件结构。
Mach-o包含三个基本区域:

  • 头部(header structure)。
  • 加载命令(load command)。
  • 段(segment)。可以拥有多个段(segment),每个段可以拥有零个或多个区域(section)。每一个段(segment)都拥有一段虚拟地址映射到进程的地址空间。
  • 链接信息。一个完整的用户级Mach-o文件的末端是链接信息。其中包含了动态加载器用来链接可执行文件或者依赖库所需使用的符号表,字符串表等等。

155909fovzv4dyqi9wb64o你也可以在这里找到Mach-o的官方资料。

一、我们先使用otool工具来查看Mach-o的头部,看看都包含哪些信息。

Snip20150112_7

头部的的结构如下(32位):

1
2
3
4
5
6
7
8
9
struct mach_header{
    uint32_t    magic;
    cpu_type_t  cputype;
    cpu_subtype_t   cpusubtype;
    uint32_t    filetype;
    uint32_t    ncmds;
    uint32_t    sizeofcmds;
    uint32_t    flags;
}

1.magic,是mach-o文件的魔数,0xfeedface代表的是32位,0xfeedfacf代表64位

2.cputype和cupsubtype代表的是cpu的类型和其子类型,例子中分别是c和9,定义如下:

#define CPU_TYPE_ARM((cpu_type_t) 12)

#define CPU_SUBTYPE_ARM_V7((cpu_subtype_t) 9

即为:armv7

3.接着是filetype,2,代表可执行的文件
#defineMH_EXECUTE 0×2

4.ncmds 指的是加载命令(load commands)的数量,例子中一共23个,编号0-22

5.sizeofcmds 表示23个load commands的总字节大小, load commands区域是紧接着header区域的。

6.最后个flags,例子中是0×00200085,可以按文档分析之。

Snip20150112_8

当然不用工具,直接使用UE看也是一样的。按照定义的结构来就行了。

Snip20150112_13二、头部之后就是加载命令。加载命令的数目以及总的大小在header中已经给出。

Snip20150112_9

1.cmd 是load command的类型,本文中值=1就是LC_SEGMENT,,LC_SEGMENT的含义是(将文件中的段映射到进程地址空间)

2.cmdsize 代表load command的大小(0×58个字节)。

3.segname 16字节的段名字,当前是__PAGEZERO。

4.vmaddr 段的虚拟内存起始地址

5.vmsize 段的虚拟内存大小

6.fileoff 段在文件中的偏移量

7.filesize 段在文件中的大小

8.maxprot 段页面所需要的最高内存保护(4=r,2=w,1=x)

9.initprot 段页面初始的内存保护

10.nsects 段中包含section的数量

11.flags 其他杂项标志位

三、接下来就是节了:

Snip20150112_10

结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct section { 
    char sectname[16]; 
    char segname[16]; 
    uint32_t addr; 
    uint32_t size; 
    uint32_t offset; 
    uint32_t align; 
    uint32_t reloff; 
    uint32_t nreloc; 
    uint32_t flags; 
    uint32_t reserved1; 
    uint32_t reserved2;
};

1.sectname 第一个是__text ,就是主程序代码

2.segname 该section所属的 segment名,第一个是__TEXT

3.addr 该section在内存的启始位置,0xa588。

4.size 该section的大小,0x84a

5.offset 该section的文件偏移,28116   0x6dd4

6.align 字节大小对齐 ,4

7. reloff 重定位入口的文件偏移,0

8.nreloc 需要重定位的入口数量,0

9.flags 包含section的type和attributes

S_REGULAR—This section has no particular type. The standard tools create a __TEXT,__text section of this type.

结构中的最后2项保留用。

段的命名规则是两个下划线紧跟着大写字母(如__TEXT),而section的命名则是两个下划线紧跟着小写字母(__text)。

下面列出段中可能包含的section:

__TEXT段:
__text, __cstring, __picsymbol_stub, __symbol_stub, __const, __litera14, __litera18;

__DATA段
__data, __la_symbol_ptr, __nl_symbol_ptr, __dyld, __const, __mod_init_func, __mod_term_func, __bss, __commom;

__IMPORT段
__jump_table, __pointers;

其中__TEXT段中的__text是实际上的代码部分;__DATA段的__data是实际的初始数据。

可以通过otool –s查看某segment的某个section。

Snip20150112_11可以通过otool –t直接查看代码段(__TEXT)的反汇编代码:

Snip20150112_12

其它的大家参考官方文档就行了。

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


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

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

相关文章

linux---基础02

二、用户、组管理命令 Linux采用组来组织和管理用户 在Linux中每个用户有唯一的用户标识符UID,该UID是一个无符号整数。 同时每个用户也必须至少属于一个组,也有组标识符GID。 其中UID与GID独立编号。 1. groupadd命令 (1)grou…

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

下面来讲讲如何从Mach-o文件中分析出类名和方法名,也让我们了解下class-dump的原理。 Mach-o结构有两个节:__objc_classname 和 __objc_methname 其中就是类名和方法名。 其中__objc_classname的偏移为:ox7961 __objc_methname的偏移为0x6…

linux---基础03

三、 文件属性操作命令 1. chown命令 (1)chown示例一:改变文件的属主 [rootserver1 ~]# chown user1 hello.txt功能:将指定文件hello.txt的属主(所有者)改为user1。(2)chown示例…

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

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

linux---基础04

六、网卡配置 分配临时IP地址: ifconfig eth0 up // 启用eth0网卡ifconfig eth0 192.168.1.104 netmask 255.255.255.0静态分配IP地址: vi /etc/sysconfig/network-scripts/ifcfg-eth0service network restart //重启 network服务(重新加载网卡配置)动态…

记录---基于BigDecimal的特殊的四舍五入

机试问题—实现基于BigDecimal的特殊的四舍五入。 这是一道外企的机试题,我把里面的某个难点部分,摘出来详细如下: //实现特殊的四舍五入,先普通四舍五入取到小数点后两位,然后最后一位向后进位,0和5不变&…

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

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

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

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

git总是提示输入用户名密码的解决记录

git总是提示输入用户名密码的解决记录 git改过密码后,再用命令行pull代码(举个例子),就会每次让你输入用户名密码,很麻烦,比如: git pull origin dev:dev 输入用户名密码,ok了 git…

Git的思想和基本工作原理

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

java后端获取客户端(用户)真实ip,原理

java后端获取客户端真实ip,原理: 一般都是下面代码中的做法:但很多人只知道这样能拿到,稍微有改动就不知道怎么办了 看看网上的各种说法,接下来容我一一讲解,如有纰漏,敬请指正。 public sta…

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

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

git大小写解决

git大小写解决 git reset --hard head git的回退操作 git config --get core.ignorecase 查看git忽略大小写的状态,true就是忽略大小写,false就是不忽略大小写 git config core.ignorecase false 更改git为不忽略大小写 情景1:(…

深入理解Hadoop集群和网络

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

Method-Swizzling实战-实现iOS原生网络请求性能采集

一、方法交换实现步骤(实例方法和类方法处理逻辑类似) 1.检查原类(要被替换方法的类)的原实例方法是否存在,如果不存在,则不交换;2.检查新类(最终被使用的方法所在的类)的…

java8新特性(1)--- lambda表达式

java8新特性(1)— lambda表达式 函数式编程,简化开发 新增语法(->) package com.common.jdk8;// 试想,如果在jdk1.7中,我们要实现基于这个接口的加法运算,一般会这样 // 先创建…

iOS中WebKit框架应用与解析

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

java8新特性(2)--- 方法引用

java8新特性(2)— 方法引用 新增语法双冒号(::) package com.common.jdk8;import java.util.Arrays; import java.util.List;//方法引用 public class Jdk8Test2 {public static void main(String[] args) {//构造器引用&#x…

让WKWebView支持NSURLProtocol

NSURLProtocol能够拦截UIWebView内所有的请求,但是WKWebView 中的请求却完全不遵从这一规则,只是象征性调用canInitWithRequest方法,之后的整个请求流程似乎就与 NSURLProtocol 完全无关了。使我一度认为WKWebView请求不遵守NSURLProtocol协议…

java8新特性(3)--- 函数式接口

java8新特性(3)— 函数式接口 有且仅有一个抽象方法 package com.common.jdk8;import java.util.Arrays; import java.util.List; import java.util.function.Predicate;// 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,…