逆向Mach-o(二)

Mach-o(Mach Ojbect缩写)文件有11种格式(并不是所有的可执行文件都有Mach-o),是Mac/iOS上用于存储程序,库的标准格式

Mach-o常见格式:

  • 可执行文件
  • object   (a. 其中包括.o 文件   b. .a静态库文件 其实就是N个.o文件集合)
  •   DYLIB:动态库 (a. dylib  b.framwork)
  • 动态连接器
  • DSYM

例子1:

把上面的代码文件.c编程.o执行命令

  • clang -c main.c   (会生成一个main.o) (也可以直接生成多个 clang -c main.c test.c)
  • file main.o  (main.o: Mach-O 64-bit object x86_64)(属于Mach-o 是一个object 不是可执行文件
  • clang main.o (或者生成cusmain clang -o cusmain main.0)(生成a.out 在file a.out (a.out: Mach-O 64-bit executable x86_64) (可执行文件))
  • ./a.out 直接执行 (Hello, World!)

上面那几步也可以直接生成可执行文件 :

例子2:多文件文件合并成一个可执行文件

这个文件类交Test.c  (不需要引入#include..),另一个文件还是上面的main.c (和.c顺序没关系)

执行下面命令合并(会有警告 没关系)

它会生成一个sks可执行文件,./sks 直接执行就行

*find找文件 find /cust/dsk -name “*.a”


动态库共享缓存:

为了提高性能,系统的动态库文件都存在动态库共享缓存里面(其中动态库只有一份)

比如上面的dyld_shared….x86_64h 多个app动态库都放在这,起到公用库的作用(类似单利) (通过动态连接器加载动态库)

动态加载器(动态连接器)(dyld) (用来加载动态库) (是dynamic linker可执行文件)

  • dynamic linker
  • dynamic loadel


二进制文件

其中xcode中默认是Executable可执行文件

  • Executable (默认)
  • Dynamic Library
  • Bundle
  • Static Library
  • Relocatable Object File

xcode,debug下生成app可执行文件是arm64, 在release中是多个架构,这个debug中YES是当前真机的架构

Architectures和有效架构是取交集,所有上面只生成arm64 armv7,在Architectures加一种就可以生成armv7s架构

在分析汇编代码的时候,大多时候值分析一个架构就可以(经常用于静态库):

拆分二进制文件:

合并:


MachO

MachO主要分为3大块:

  • MachO Header (包含整个架构的信息,load Commands数量等)
  • Load Commands (区域位置)
  • Data (代码 全局变量等)

MachO工具

发表回复

电子邮件地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud