获取iOS任意线程调用堆栈(二)符号化理论:Mach-o文件结构
来源:互联网 发布:平价时尚欧美女装知乎 编辑:程序博客网 时间:2024/06/14 08:10
我们知道Windows下的文件都是PE文件,同样在OS X和iOS中可执行文件是Mach-o格式的。
所以我们如果要进行逆向分析,首先要熟悉Mach-o文件结构。
Mach-o包含三个基本区域:
- 头部(header structure)。
- 加载命令(load command)。
- 段(segment)。可以拥有多个段(segment),每个段可以拥有零个或多个区域(section)。每一个段(segment)都拥有一段虚拟地址映射到进程的地址空间。
- 链接信息。一个完整的用户级Mach-o文件的末端是链接信息。其中包含了动态加载器用来链接可执行文件或者依赖库所需使用的符号表,字符串表等等。
你也可以在这里找到Mach-o的官方资料。
一、我们先使用otool工具来查看Mach-o的头部,看看都包含哪些信息。
头部的的结构如下(32位):
2
3
4
5
6
7
8
9
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,可以按文档分析之。
当然不用工具,直接使用UE看也是一样的。按照定义的结构来就行了。
二、头部之后就是加载命令。加载命令的数目以及总的大小在header中已经给出。
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 其他杂项标志位
三、接下来就是节了:
结构如下:
2
3
4
5
6
7
8
9
10
11
12
13
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。
可以通过otool –t直接查看代码段(__TEXT)的反汇编代码:
其它的大家参考官方文档就行了。
转载自:http://www.blogfshare.com/ioss-mach-o.html
- 获取iOS任意线程调用堆栈(二)符号化理论:Mach-o文件结构
- 获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名
- 获取iOS任意线程调用堆栈(四)符号化实战
- 获取iOS任意线程调用堆栈(一)获取任意线程的调用栈地址列表
- 获取iOS任意线程调用堆栈(五)完整实现:BSBacktraceLogger
- 了解mach-o文件结构
- IOS安全–了解Mach-o文件结构
- IOS安全–了解Mach-o文件结构
- iOS Crash文件的符号化(二)
- iOS瘦身之删除FrameWork中无用mach-O文件
- iOS逆向之五-MACH-O文件解析
- iOS崩溃堆栈信息的符号化解析
- iOS崩溃堆栈信息的符号化解析
- 如何获取当前线程的调用堆栈
- 符号化(Symbolicating) iOS Crash文件 .
- iOS 系列译文:Mach-O 可执行文件
- iOS 系列译文:Mach-O 可执行文件
- iOS 系列译文:Mach-O 可执行文件
- CDOJ-----最长上升子序列
- Android与MVC设计模式
- 选择排序
- Win32时间类型FILETIME/SYSTEMTIME/WINDOWSTIME(FILETIME这个名字很奇怪,其实他跟FILE并没有直接关系,只是很多File的API中,都以这个为时间的类型)
- linux\windows上mongodb的安装与配置,以及开启php扩展
- 获取iOS任意线程调用堆栈(二)符号化理论:Mach-o文件结构
- Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解
- 蚂蚁金服成立科学智囊团,机器学习之父Michael I.Jordan担任主席
- PHP PSR-1 规范
- 156. Binary Tree Upside Down
- Android Fragment 与 Fragment管理器
- 获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名
- 查找成绩排名第二的学生
- Windows中的时间(SYSTEMTIME和FILETIME)