逆向开发--6.MachO文件

一.MachO文件介绍

    1.MachO其实是Mach Object文件格式的缩写,是Mac以及iOS上可执行文件的格式,类似Windows上的PE格式(Portable Executable),linux上的ELF格式(Executable and Linking Format)

    2.作为.out格式的替代,Mach-O提供更强的扩展性

    3.常见MachO格式的文件

        a.目标文件.o

        b.库文件 .a .dylib Framework

        c.可执行文件

        d.dyld

        e.dsym

二.通用二进制文件(Universal binary)

    苹果公司提出的一种程序代码,能同时适用多种架构的二进制文件。同一程序包中同时为多种架构提供最理想的性能。需要存储多种代码,通用二进制文件通常比单一平台二进制的程序要大,但因为有共通的非执行资源,所以不会达到单一版本的几倍之多。而且执行时只调用一部分代码,运行起来也不需要额外的内存。

三.lipo命令

    1.使用lipo -info查看MachO文件包含的架构 armv7 armv7s arm64

 lipo -info MachO文件

    2.使用lipo -thin拆分某种架构

lipo MachO文件 -thin 架构 -output 输出文件路径

    3.使用 lipo -create合并多种架构

lipo -create MachO1 MachO2 -output 输出文件路径

四.MachO文件结构

1.Mach Header 

    Header包含该二进制文件的一般信息。字节顺序、架构类型、加载指令的数量等。使得可以快速确认一些信息,比如当前文件使用32位还是64位,对应的处理器是什么、文件类型是什么等

    struct mach_header_64 {

        unit32_t        magic;            /* 魔数,快速定位属于32位还是64位,MH_MAGIC_64 */

        cpu_type_t      cputype;          /* CPU类型,比如CPU_TYPE_ARM */

        cpu_subtype_t   cpusubtype;       /* CPU的具体类型,比如CPU_SUBTYPE_ARM_V7 / CPU_SUBTYPE_ARM_V7S / CPU_SUBTYPE_ARM64_ALL */

        unit32_t        filetype;         /* 文件类型,比如可执行文件,MH_EXECUTE */

        unit32_t        ncmds;            /* loadCommands条数 */

        unit32_t        sizeofcmds;       /* loadCommonds大小 */

        unit32_t        flags;            /* 标志位标识二进制文件支持的功能,主要是和系统加载、链接有关 */

        unit32_t        reserved;

    }

2.Load commands

    一张包含很多内容的表,内容包括位置的区域、符号表、动态符号表等

        LC_SEGMENT_64            将文件中(32位或64位)的段映射到进程地址空间中

        LC_DYLD_INFO_ONLY        动态链接相关信息

        LC_SYMTAB                符号地址
    
        LC_DYSYMTAB              动态符号表地址

        LC_LOAD_DYLINKER         使用谁加载,我们使用dyld

        LC_UDID                  文件的UDID

        LC_VERSION_MIN_IPHONEOS  支持最低的操作系统版本

        LC_SOURCE_VERSION        源代码版本

        LC_MAIN                  设置程序主线程的入口地址和栈大小

        LC_LOAD_DYLIB            依赖库的路径,包含第三方

        LC_FUNCTION_STARTS       函数起始地址表

        LC_CODE_SIGNATURE        代码签名

3.Data

    包含Segement的具体数据

猜你喜欢

转载自blog.csdn.net/liqun3yue25/article/details/86628514