美文网首页
关于 mach-o 的一些笔记

关于 mach-o 的一些笔记

作者: JackYao | 来源:发表于2018-01-22 23:48 被阅读24次

    mach-o 格式文件

    mach-o 的文件类型

    image.png

    可以在xnu源码中,查看到Mach-O格式的详细定义(https://opensource.apple.com/tarballs/xnu/
    EXTERNAL_HEADERS/mach-o/fat.h
    EXTERNAL_HEADERS/mach-o/loader.h

    mach-o 的基本结构

    image.png

    一个Mach-O文件包含3个主要区域

    • Header
      文件类型、目标架构类型等

    • Load commands
      描述文件在虚拟内存中的逻辑结构、布局

    • Raw segment data
      在Load commands中定义的Segment的原始数据

    官方描述: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/MachOTopics/0-Introduction/introduction.html

    查看 mach-o 相关信息的工具

    • file
      • file 文件路径
    • otool
      • 查看 mach-o 特定部分和段的内容(具体可以使用 help 查看)
    • lipo
      • 对于多架构的 mach-o 文件处理 合并/导出/查看架构信息
    • MachOView
      • GUI 版本的 mach-o 文件信息查看器

    Universal Binary(通用二进制文件, 也叫胖二进制文件 也叫 Fat Binary)

    同时适用于多种架构的二进制文件
    包含了多种不同架构的独立的二进制文件

    注意

    • 因为需要储存多种架构的代码,通用二进制文件通常比单一平台二进制的程序要大
    • 由于两种架构有共同的一些资源,所以并不会达到单一版本的两倍之多
    • 由于执行过程中,只调用一部分代码,运行起来也不需要额外的内存

    如何查找系统动态库的可执行文件

    从iOS3.1开始,为了提高性能,绝大部分的系统动态库文件都打包存放到了一个缓存文件中(dyld shared cache)
    缓存文件路径:/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX

    如何从动态库共享缓存抽取动态库

    # 可以使用dyld源码中的launch-cache/dsc_extractor.cpp
    # 将#if 0前面的代码删除(包括#if 0),把最后面的#endif也删掉
    
    # 编译dsc_extractor.cpp
    clang++ -o dsc_extractor dsc_extractor.cpp
    
    # 使用dsc_extractor
    ./dsc_extractor  动态库共享缓存文件的路径   用于存放抽取结果的文件夹
    
    

    Mac/iOS 系统如何加载动态库

    利用/usr/lib/dyld 程序加载动态库

    注意
    dyld 只能加载以下三种mach-o文件

    • MH_EXECUTE
    • MH_DYLIB
    • MH_BUNDLE

    dyld 属于 DILINKER 类型, 所以不能自己加载自己

    APP 是从开发到安装到手机的过程

    工程 -> 编译,链接,签名 生成.app (可执行文件由源代码生成) -> zip 压缩为 IPA 包

    逆向的思路

    • 界面分析

      • Cycript、
      • Reveal
    • 代码分析
      对Mach-O文件的静态分析

      • MachOView、
      • class-dump、
      • Hopper Disassembler、
      • ida等
    • 动态调试
      对运行中的APP进行代码调试

      • debugserver、
      • LLDB
    • 代码编写

      • 注入代码到APP中
      • 必要时还可能需要重新签名、打包ipa

    其余的小技巧

    • 将可执行文件复制到/usr/local/bin 目录下,zsh 会有智能提示
    • zshrc 文件的方法定义与 shell 相同, 获取方法参数 使用$1 来获取第一个, $2获取第二个 ,以此类推
    • killall SpringBoard 可以用来重启桌面

    相关文章

      网友评论

          本文标题:关于 mach-o 的一些笔记

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