MachO

作者: Code_人生 | 来源:发表于2019-10-18 19:07 被阅读0次

MachOView

一、MachO文件

Mach-O其实是Mach Object文件格式的缩写,是mac以及iOS上可执行文件的格式, 类似于windows上的PE格式 (Portable Executable ), linux上的elf格式 (Executable and Linking Format)

1、Mach-O文件格式
  • Mach-OMach object文件格式的缩写,它是一种用于可执行文件、目标代码、动态库的文件格式。作为a.out格式的替代,Mach-O提供了更强的扩展性。

  • 属于MachO格式的常见文件
    目标文件.o
    库文件:.a、.dylib、Framework
    可执行文件
    dyld
    .dsym

  • File指令
    通过 $file 文件路径 查看文件类型

2、通用二进制文件(Universal binary
  • 苹果公司提出的一种程序代码。能同时适用多种架构的二进制文件
  • 同一个程序包中同时为多种架构提供最理想的性能。
  • 因为需要储存多种代码,通用二进制应用程序通常比单一平台二进制的程序要大。
  • 但是 由于两种架构有共通的非执行资源,所以并不会达到单一版本的两倍之多。
  • 而且由于执行中只调用一部分代码,运行起来也不需要额外的内存。
3、lipo命令
  • 使用lifo -info 可以查看MachO文件包含的架构
    $lipo -info MachO文件

  • 使用lifo –thin 拆分某种架构
    $lipo MachO文件 –thin 架构 –output 输出文件路径。eg:lipo Demo -thin armv7 -output mach_armv7

  • 使用lipo -create 合并多种架构
    $lipo -create MachO1 MachO2 -output 输出文件路径。eg:lipo -create mach_armv7 mach_arm64e mach_armv7s -output mach_DYZ

二、MachO文件结构

因为MachO文件本身是一种文件格式,所以我们一定需要了解其文件内部结构。

1、MachO文件结构

Mach-O 的组成结构如图所示包括了

  • 1⃣️、Header 包含该二进制文件的一般信息
    • 字节顺序、架构类型、加载指令的数量等。
    • 使得可以快速确认一些信息,比如当前文件用于32位还是64位,对应的处理器是什么、文件类型是什么
  • 2⃣️、Load commands 一张包含很多内容的表
    • 内容包括区域的位置、符号表、动态符号表等。
  • 3⃣️、Data 通常是对象文件中最大的部分
    • 包含Segement的具体数据
2、Header的数据结构
  • command + shift + o 搜索类
3、LoadCommands
  • LC_SEGMENT_64:将文件中(32位或64位)的段映射到进程地址空间中
  • LC_DYLD_INFO_ONLY:动态链接相关信息
  • LC_SYMTAB:符号地址
  • LC_DYSYMTAB:动态符号表地址
  • LC_LOAD_DYLINKER:使用谁加载,我们使用dyld
  • LC_UUID:文件的UUID
  • LC_VERSION_MIN_MACOSX:支持最低的操作系统版本
  • LC_SOURCE_VERSION:源代码版本
  • LC_MAIN:设置程序主线程的入口地址和栈大小
  • LC_LOAD_DYLIB:依赖库的路径,包含三方库
  • LC_FUNCTION_STARTS:函数起始地址表
  • LC_CODE_SIGNATURE:代码签名

三、操作

  • vi test.c

  • clang -c test.c 编译一下,会出现一个test.o(目标文件)文件

  • file test.o 查看

  • clang test.o 链接 test.o,会出现一个a.out(可执行文件)文件

  • clang -o abc test.c 编译并链接,生成一个abc的可执行文件(黑框框)
    clang test.o -o abc 目标文件生成可执行文件(黑框框)

  • ./abc ./执行

  • find / -name "*.a" 根目录下查找.a文件

  • find / -name "*.dylib" 根目录下查找.dylib文件

  • 看出dSYM

  • 编译的是生成的是可执行文件
  • relase版本 iOS11以下的,显示包内容里面的可执行文件会生成多架构的(是因为Build Settings,中的Build Active Architecture Only 为No)
  • arm64、arm64e都是64位的,armv7、armv7s都是32位的
  • 添加了啥编译的时候就可以编译出来啥,前提是iOS11以下(因为iOS11开始不支持32位,所以armv7、armv7s将会编译不过)

相关文章

  • 从macho中解析类名

    1什么是macho 2 macho总体描述 3以查询一个类名为例,说明查找过程 1什么是macho macho是m...

  • 6.MachO

    MachO文件 MachO文件 MachO文件结构 DYLD Mach-O其实是Mach Object文件格式的缩...

  • 六 Hock原理分析

    在上篇文章MachO文件解析已经详细介绍了MachO,并且由MachO引出了dyld,再由dyld讲述了App的启...

  • iOS逆向(6)-从fishhook看runtime,hook系

    在上篇文章不知MachO怎敢说自己懂DYLD中已经详细介绍了MachO,并且由MachO引出了dyld,再由dyl...

  • iOS逆向(6)-从fishhook看runtime,hook系

    在上篇文章不知MachO怎敢说自己懂DYLD中已经详细介绍了MachO,并且由MachO引出了dyld,再由dyl...

  • 7.Mach-O&LLDB

    [TOC] MachO文件结构 单个架构的mach-O文件包含:MachO Header、Load Command...

  • iOS逆向-砸壳(Clutch & dumpdecryp

    MachO文件 -> 苹果加密 -> 加壳文件加壳文件 -> 苹果解密 -> MachO文件(DYLD) 解密过程...

  • macho cstring 之混杂

    cstring区:macho TEXT段中的__cstring区。 这次解析下cstring区 用macho-vi...

  • Golang标准库——debug/macho

    macho 包macho可以实现对Mach-O对象文件的访问。 Constants Variables 如果文件不...

  • MachO

    MachOView 一、MachO文件 Mach-O其实是Mach Object文件格式的缩写,是mac以及iOS...

网友评论

      本文标题:MachO

      本文链接:https://www.haomeiwen.com/subject/bmfimctx.html