Mach-O文件解析

简介

Mach-O是iOS/OS可执行文件。编译成功后,找到app文件->显示包内容,即可找到可执行文件。


Mach-O

常用指令

  • 查看Mach-O格式
lipo -info <可执行文件>
格式
  • 查看Mach-O架构
lipo -info <可执行文件>
架构
  • 查看Mach-O的Header
otool -h <可执行文件>
Header1
otool -hv <可执行文件>
Header2
  • 查看Mach-O的Load Commands
otool -lv <可执行文件>
image.png

Mach-O文件读取工具MachOView

工具下载地址

MachOView

Mach-O文件解析

  • Mach64Header

magic(魔数):0xfeedface-32位、0xfeedfacf-64位、0xcafebabe-通用格式
(魔数的读取:32位为小端读取,低地址在低位,高地址在高位、64位为大端读取,低地址在高位,高地址在低位)
cputype、cpusubtype:CPU的平台与版本
armv7:cputype-12、cpusubtype-9
arm64:cputype-16777228、cupsubtype-0

filetype:可执行文件(2)、库文件、Core、内核扩展
OBJECT(目标文件)-1、EXECUTE(可执行文件)-2、DYLIB(动态库)-6

ncmds、sizeofcmds:Load Commands的个数和长度
flags:dyld加载时需要的标志位,PIE表示开启地址空间随机化
Reserved:只有64位时才存在

  • Load Commands


    image.png

    LC_SEGMENT/LC_SEGMENT_64 - 将文件中(32位或64位)的段映射到进程地址空间中
    LC_SYMTAB - 符号表信息
    LC_DYSYMTAB - 动态符号表信息
    LC_LOAD_DYLINKER - 加载动态链接器(/usr/lib/dyld)
    LC_UUID - 文件的唯一标识,crash解析中也会有,去匹配dysm文件和crash文件
    LC_VERSION_MIN_IPHONEOS - 二进制文件要求最低操作系统版本
    LC_MAIN - 设置程序主线程的入口地址和栈大小
    LC_ENCRYPTION_INFO - 加密信息,查看文件加密信息(otool -l <可执行文件> | grep cryptid)
    LC_LOAD_DYLIB - 加载的动态库,包括动态库地址和名称,当前版本号,兼容版本号(otool -l <可执行文件>)
    LC_FUNCTION_STARTS - 函数起始地址表
    LC_CODE_SIGNATURE - 代码签名信息

main函数地址查看


image.png

某些Segment中包含Section,Section是具体数据存放的地方
__TEXT中节分类:
__text - 主程序代码
__stub_helper - 用于动态链接的存根
__picsymbolstub4 - 用于动态链接的存根
__objc_methname - Object-C的方法名
__objc_classname - Object-C的类名
__objc_methtype - Object-C的方法类型
__cstring - 字符串

指令查看节的信息
otool -s __TEXT __text <可执行文件>


image.png

显示最上面的10行数据
otool -tv <可执行文件名> |head -n 10


image.png

__DATA中节分类:
__la_symbol_ptr - 延迟加载节,通过dyld_stub_binder辅助链接(程序在加载时,符号的地址没有对应到真实的地址,只有在第一次使用这个符号时,才会去匹配这个符号的地址,第二次使用时就可以直接找到)
__nl_symbol_ptr - 非延迟加载节(程序在加载时,符号的地址已经确定下来,使用时可以直接找到)
__mod_init_func - 初始化的全局函数的地址,会在main函数之前执行
__mod__term_func - 结束函数地址
__cfstring - Core Foundation用到的字符串
__objc_classlist - Object-C的类列表
__objc_protollist - 协议的列表
__objc_nlclslist - Object-C的load函数列表,比__mod_init_func更早执行
__objc_const - Object-C的常量
__data - 初始化的可变的变量
__bss - 未初始化的静态变量

  • 查看可执行文件签名信息
codesign -dvvv <可执行文件名>
image.png

Mach-O解析案例

  • 主程序代码__text真实偏移的计算(以armv7为例)
    将可执行文件,拖入Mach-OView中


    image.png

    armv7起始偏移:16384->0x4000


    image.png

    Section Header偏移:24936->0x6168
    image.png

    Section(__TEXT,__text)真实偏移:0x4000+0x6168->0xA168
  • 通过Mach-O查看类名、方法名、字符串
    新建类MyObject,然后编译,将mach-o文件拖入MachOView中
#import "MyObject.h"
@implementation MyObject
- (void)my_init {
    char *cStr = "c string is there";
    NSString *ocStr = @"oc String is there";
}
@end

新建的类

image.png

新增的方法
image.png

代码中的字符串
image.png

__DATA,_cfstring中只有oc的字符串
image.png

生活如此美好,今天就点到为止。。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 1. 介绍 Mach-O是Mach Object文件格式的缩写。它是用于可执行文件,动态库,目标代码的文件格式。作...
    沉江小鱼阅读 761评论 0 1
  • 导论 Mach-o 文件图解 Mach-o 文件中专有名词解释 Mach-o 文件中函数存储地址 Mach-o 文...
    ProfessorFan阅读 2,688评论 2 10
  • Mach-o文件 Mach-O 是iOS/macOS系统上应用程序的格式 通用二进制文件(胖二进制文件) 因为Ma...
    CharType阅读 949评论 0 2
  • 一、前言 本文简要解析Mach-O文件格式、结构,主要是自己认识Mach-O文件,学习的一个过程,一些地方可能介绍...
    KinKen阅读 1,599评论 0 4
  • 概述   本文档描述了Mach-O文件格式的结构,它被用来存储程序和库到硬盘中,作为Mac OS X程序的二进制接...
    VenpleD阅读 1,402评论 0 5