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的原始数据
查看 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
可以用来重启桌面
网友评论