一、安装
- Hopper Disassmbler 能够将
Mach-O
文件的机器语言代码
反编译成汇编代码
或OC伪代码
或Swift伪代码
。 - 我这里安装的是试用版,官方下载地址。
安装好打开后,没有购买的就点试用
然后就进来了
二、使用
- 将
Mach-O
文件拖到 Hopper Disassmbler 软件里面,我现在拖的是应用程序
文件,右键显示包内容里面就有Mach-O
,区别只是你找到或它找到Mach-O
。
- 每项配置的含义,翻译下就知道了,直接点
OK
就行了,然后就得到了Mach-O
文件汇编代码
,如果包比较大,解析需要点时间,使用也会有点卡,可以提早进行解析。
- 先看下我用来测试的
Mach-O
文件源码,方便做比较。
- (void)viewDidLoad { [super viewDidLoad]; NSString * string = @"dzm"; NSLog(@"%@", string); }
- 通过
Hopper Disassmbler
看到汇编代码之后,怎么看OC
或者Swift
伪代码呢?
/* @class ViewController */ -(void)viewDidLoad { var_20 = self; [[&var_20 super] viewDidLoad]; var_28 = [@"dzm" retain]; NSLog(@"%@", var_28); objc_storeStrong(&var_28, 0x0); return; }
会发现 伪代码
跟 原代码
还是有很多相似地方的。
下面是扩展内容,可以不看。
三、如何查看官方框架源代码呢?比如:UIKit
?
- 怎么找到
UIKit
的Mach-O
文件,通过路径找到UIKit.framework
, 需要手动按文件层级照下来,路径是一样的。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/UIKit.framework • 1
- 找到
UIKit.framework
之后,会发现并没有Mach-O
文件,只有一个UIKit.tbd
文件,这个UIKit.tbd
文件里面就有存放UIKit
的Mach-O
文件路径,它就是文本文件,直接打开就行。 - 但是这个路径是手机上的存放路径,所以我们需要通过
命令行连接手机
或者iFunBox
来访问这个路径并将Mach-O
拷贝出来。
/System/Library/Frameworks/UIKit.framework/UIKit
- 也可以通过命令行获得路径
UIKit
在手机上的路径,这个跟上面查看UIKit.tbd
得到的文件路径一致,选其一即可。
// 连接手机 dengzemiaodeMacBook-Pro:~ dengzemiao$ sh /Users/dengzemiao/Desktop/ssh/login.sh // 搜索 app PID iPhone:~ root# ps -A | grep neteasemusic PID TTY TIME CMD 621 ?? 0:28.44 /var/containers/Bundle/Application/C32DF80E-733A-4426-B915-FD05A426E319/neteasemusic.app/neteasemusic // 监听 PID iPhone:~ root# cycript -p 621 // 导入 DZMCycript cy# @import DZMCycript {} // 加载 UIKit cy# DZMLoadFramework('UIKit') // 查看导入路径,路径跟上面是一样的。 #"NSBundle </System/Library/Frameworks/UIKit.framework> (loaded)"
- 通过
iFunBox
访问手机系统目录/System/Library/Frameworks/UIKit.framework
,找到UIKit
的Mach-O
文件。 - 进来文件之后,并没有看到找到
UIKit
的Mach-O
文件,那它在哪里呢? 这里有个概念叫动态库共享缓存( dyld shared cache )
。
四、什么是 动态库共享缓存( dyld shared cache )
?
- 从
iOS3.1
开始为了提高性能,绝大部分的系统动态库文件都打包存放到了一个缓存文件中( dyld shared cache )
,缓存文件路径:
/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX
dyld_shared_cache_armX
的X
代表ARM
处理器指令集架构,可能是..._armv6
、..._armv7
、..._arm7s
、..._arm64
等,所有指令集原则上都是向下兼容
的,高等级支持所有低等级的。- 既然知道了
UIKit
的Mach-O
在哪个文件,可以找到它看看,找到目录之后发现是有个dyld_shared_cache_arm64
的文件,我们把它导出来到桌面。 - 然后将它拖拽到
Hopper Disassmbler
里面,发现会是DYLD Shared Cache (individual file)
,这个时候我们就需要通过下面的搜索找到UIKit
了,并选中它,点击Next
。
搜索之后,由于有很多都是UIKit
的,我们可以看路径,找到我们之前得到的路径/System/Library/Frameworks/UIKit.framework
,匹配上了就是它了。
点击Next
就识别到了UIKit
的Mach-O
了,点击OK
就行了。 - 下章会写到 dsc_extractor 动态库提取器,将
dyld_shared_cache_armX
动态文件内容全部提取出来使用。