Mach-O

2019-12-06  本文已影响0人  大冯宇宙

Mach-O是什么?

Mach-O是Mach object的缩写,是Mac、iOS上用于存储程序、库的标准格式。像iOS的App的可执行文件,就是Mach-O格式

为什么要了解Mach-O?

一是知识储备,用来面试,或者写出更好的代码。

二是实际用途,比如我想去破解别人app,我想知道别人的APP有哪些东西,只有充分了解了这些,才能往他内存当中去注入一些代码。比如说我知道了他的数据段在哪个地方,我才知道可以修改的数据在哪里。或者我知道了他的动态库信息在哪个地方,我就可以修改动态库符号表的信息,就可以链接我自己的一个动态库,注入一些新的动态库。

属于Mach-O格式的文件类型

这些东西可以从苹果源码里查,或者从XNU里查,XNU就是mac系统的内核。(https://opensource.apple.com/tarballs/xnu

常见的Mach-O文件类型

MH_OBJECT

我们可以简单的创建一个.c文件,生成目标文件后,使用file命令可以看到test.o就是Mach-O的格式。

//编写代码保存为test.c
#include<stdio.h>
int main() {
 printf("test--");
 return 0;
}
//命令行下可以看到Mach-O的文件格式
clang -c test.c 
file test.o 
test.o: Mach-O 64-bit object x86_64

Mach-o的结构

官方描述:


一个Mach-O文件包含3个主要区域

其实这个Mach-O就相当于一本书,Header就相当于一本书的绪,开头标题。Load commands就相当于一本书的目录,告诉了你每一个段从哪里开始,到哪里结束。Data就相当于一本书的内容。

Header

在读取整个mach-o文件的时候,首先被解析的就是这个Header文件。通过header然后去加载.



Load commands
窥探Mach-O的结构

file: 查看Mach-O的文件结构

➜ **Desktop** file Zeus 
Zeus: Mach-O 64-bit executable arm64
➜ **Desktop** otool 

-f print the fat headers //打印胖二进制文件的头信息

-a print the archive header

-h print the mach header // 打印mach文件的头信息,实际上就是打印armv7 arm64二进制文件的头信息

-l print the load commands

-L print shared libraries used //打印依赖的framework

-D print shared library id name

-t print the text section (disassemble with -v)
GUI工具

MachOView (https://github.com/gdbinit/MachOView)

dyld和mach-o

dyld 也是Mach-O文件,加载以下类型的Mach-O文件

MH_EXECUTE - 可执行文件

MH_DYLIB - 动态库文件

MH_BUNDLE

总结一下,Mach-O组成

我们平时常用的反编译软件,其实就是解析了这个mach-o文件,以可视化的方式呈现。

上一篇下一篇

猜你喜欢

热点阅读