一、安装
-
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 -
找到
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_armXdyld_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动态文件内容全部提取出来使用。