iOS逆向之Mach-O文件(上)

本文详细介绍了iOS中的Mach-O文件格式,包括目标文件、库文件(静态库与动态库)、可执行文件、dyld动态链接器以及.dsym文件。探讨了静态库与动态库的区别,以及如何通过终端命令验证文件类型。此外,还讲解了通用二进制文件的概念,用于解决不同硬件平台的兼容性问题,并展示了如何使用lipo命令进行拆分和合并。
摘要由CSDN通过智能技术生成

本文主要介绍Mach-O文件格式以及通用二进制文件

Mach-O文件概述

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

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

Mach-O文件格式

常见的Mach-O格式有以下几种

  • 1、目标文件.o

  • 2、库文件,细分主要有以下几种:

    • .a

    • .dylib

    • .framework

  • 3、可执行文件

  • 4、dyld

  • 5、.dsym

我们可以通过终端的file指令来查看文件的类型

1、目标文件.o

  • 1、新建一个C文件
#include <stdio.h>

int main(){
    printf("test\n");
    return 0;
}

  • 2、通过clang命令编译C文件

    • 查看文件夹:ls

    • clang -c test.c : 将.c文件编译成.o文件(OC在后端中使用的是LLVM编译,而前端使用的工具是clang,即理解为 LLVM包含clang)。

    • file test.o :查看文件类型 - Mach-O文件、64位、x86_64架构

    • clang test.o :将.o文件编译成可执行文件

    • ./a.out :执行可执行文件

  • 3、也可以通过一行命令将c文件编译成可执行文件:clang -o test2 test.c

  • 重复3的操作,再次生成一个可执行文件 test3。此时问题来了,这三个可执行文件(即a、test2、test3)是否是一样的?我们可以通过md5验证,如果hash值一样则说明是一样的,反之不一样

中间产物.o文件

其中.c.out文件的区别是中间多了一个.o文件。而在我们的实际开发中,其实是有多个源码的,所以最终的可执行文件是由多个源码生成的,如下所示,将两个.o文件编译成一个可执行文件

  • 通过clang生成.o文件: clang -c test1.c test.c

  • 通过clang将.o文件编译成可执行文件:clang -o demo1 test1.o test.o

  • 如果此时换一下链接顺序呢?,例如: clang -o demo2 test.o test1.o

  • 多个源码一次性生成可执行文件:clang -o demo test1.c test.c

  • 对比上述生成的三个可执行文件,是否是同一个?这里我们也通过md5生成的hash值进行对比

    结论:通过对比发现,如果改变了.o文件的连接顺序,那么Mach-O的也会随之发生变化

  • 这里可以通过 objdump查看Mach-o链接顺序,例如:

    • objdump --macho -d demo + objdump --macho -d demo1,这里demo和demo1的源文件链接顺序是test1 + main

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值