关于 mach-o 的一些笔记

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文件? Mach-O是Mach object的缩写,是Mac\iOS上用来存储程序、库的标准格式...
    Andres工坊阅读 830评论 0 0
  • 逆向App的基本步骤 界面分析Cycript、Reveal 代码分析对Mach-O文件的静态分析MachOView...
    迷心迷阅读 760评论 0 0
  • 一、APP从开发到安装到手机的过程 1.1、生成ipa包的过程选择手机下的可执行文件 1.2、真正安装的过程安装方...
    IIronMan阅读 1,831评论 0 4
  • 13. Hook原理介绍 13.1 Objective-C消息传递(Messaging) 对于C/C++这类静态语...
    Flonger阅读 1,438评论 0 3
  • Mach-O是什么? Mach-O是Mach object的缩写,是Mac、iOS上用于存储程序、库的标准格式。像...
    大冯宇宙阅读 386评论 0 2