class-dump
- 其作用是把Mach- O文件的class信息导出来,生成对应的.h头文件;
- 官方地址:http://stevenygard.com/projects/class-dump/
- 下载完工具包后将class-dump文件复制到
/usr/local/bin
文件路径下,这样在终端就能识别class-dump命令了; - 终端输入命令:
class-dump app的Mach-O文件路径
,能在终端打印出Mach-O文件中所有类class的头文件信息; - 终端输入命令:
class-dump -H app的Mach-O文件路径 -o 指定文件目录
,将Mach-O文件中所有类class的头文件放在指定文件目录中;
OC代码的编译
- OC代码经过编译生成汇编代码,最后生成Mach-O文件机器码;
- 汇编代码与Mach-O机器码可以相互转化,是可逆的,从Mach-O机器码->汇编代码我们称之为反编译;
- OC代码与汇编代码之间是不可逆的,因为不同的OC代码可能会编译成相同的汇编代码;
Hopper Disassembler
- 可将Mach-O文件的
机器语言代码
反编译成汇编代码,OC伪代码或者Swift伪代码
; - 下载地址为:https://www.hopperapp.com
- 将Xcode编译运行之后生成的
Mach-O文件直接拖拽到Hopper Disassembler中
,如下所示:
- 如何查找系统UIKit框架的Mach-O路径?
- 在Mac上进入应用程序 --> Xcode --> 显示包内容 --> Contents --> Developer --> Platforms --> iPhoneOS.platform --> Developer --> SDKs --> iPhoneOS13.2.sdk --> System --> Library --> Frameworks --> UIKit.framework --> 显示包内容 --> UIKit.tbd --> 在Sumlime Text中打开,可以看到
install-name: '/System/Library/Frameworks/UIKit.framework/UIKit'
,USB连接手机利用iFunBox查看iPhone此路径下的文件,发现并没有UIKit框架的Mach-O文件,实际上UIKit框架的Mach-O文件是放在动态库共享缓存中(dyld shared cache)
- 在Mac上进入应用程序 --> Xcode --> 显示包内容 --> Contents --> Developer --> Platforms --> iPhoneOS.platform --> Developer --> SDKs --> iPhoneOS13.2.sdk --> System --> Library --> Frameworks --> UIKit.framework --> 显示包内容 --> UIKit.tbd --> 在Sumlime Text中打开,可以看到
动态库共享缓存
- 从iOS3.1开始,为了提供性能,绝大部分的系统动态库文件都打包存放到一个缓存文件中,即dyld shared cache,其路径为:
/System/Library/Caches/com.apple.dyld_shared_cache_arm64
- 使用动态库共享缓存,可以极大的节省内存,所有的App可以共享缓存中的动态库;
CPU指令集架构
- iPhone的CPU指令集架构均为ARM,存在不同的类型,如下所示:
- armv6:iPhone3G
- armv7:iPhone4,iPhone4S
- armv7s:iPhone5,iPhone5C
- arm64:iPhone5S -- 到之后当前的版本
- CPU指令集架构是向下兼容的;
动态库的加载
- 在Mac/iOS中,加载动态库是使用了 /usr/lib/dyld路径下的dyld来进行加载的;
- dyld:dynamic link editor 动态链接编辑器,动态加载器;
- 其源码路径为:https://opensource.apple.com/tarballs/dyld/
常见命令行
- open /usr/bin :打开bin文件夹