代码的编译过程
简单来说我们的oc经过编译会生成汇编语言,汇编语言经过编译最后生成机器语言,其中机器语言和汇编语言是一一对应的也就是说,我们的机器语言可以反编译生成汇编语言。
但是从上图中也看到了,我们的汇编是不能生成我们唯一的oc语言的,怎么办?其实我们可以借助工具来将我们的汇编生成oc,相当于是伪代码,这样的话我们可以大概来研究一下别人的代码,如果我们完全100%还原oc代码个人觉得也不太现实,因为苹果的加密机制我觉得做的还是很ok的。
借助Hopper Disassembler来将我们的汇编代码进行还原。
1.将我们的Mach-o文件拖拽到Hopper Disassembler中,需要等待进度条完毕。
2.展示结果如下
5.相信大家按部就班的做就可以了,一些快捷键的展示如下:
7.按照上边我给你介绍的文章,我已经成功把我这个项目的(.m)文件全部导出来了,如下图:
首先xcode报错我们不用管,但是很多人还是想说 还是看不懂,怎么还是汇编感觉,其实个人觉得完全拆成oc是不现实的,我们可以通过他的大概加上我们的猜测进行猜测。(我们之前已经找到.h文件了,再次找到了.m文件加上我们的项目经验来进行破解),比如我想查看一个对象怎么实现的
结合自己的经验进行分析。
动态库共享缓存
1.运用之前的方法,我们连接上我们的手机,查看UIKit这个库位置
但是我们找啊找 也找不到我们的UIKit这个库,那他到底去哪里了呢? 其实我们苹果从ios3.1开始就使用动态库共享缓存的机制。具体大致的意思是:他会把我们苹果工程师(我说的是苹果的,不是我们现在的普通程序员)写好的UIKit、CoreGraphics库等等集中放到手机中的一个地方,然后有dyld动态链接。那么他这样做的明显的一个好处就是:节省我们手机的内存,更大的提高开发效率。用一张图来解释就是:
那么他的动态库的缓存文件的在哪里? 他在
/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX 顺便给大家说下ios架构的问题
现在我们来找一下UIKit库所在的位置,我们找到这个
我们可以看到很大的两个包一个是64位架构的,一个是armv7s架构的,我现在xcode是12的 大家根据上图,知道为什么没有armv7架构的了吧,因为5基本没人用了,xcode也基本对他不支持了。(顺便说一句,用ifunbox将这个包导入到mac,不用直接拖那样会少很多东西,点击这个包右键->拷贝到mac) 将第一个包拖进去安装好的Hopper Disassembler,直接输入UIkit,选择framework那个
然后直接next,点击ok
接下来就是漫长的等待中,直到他下面出现完成的语句。
但是如果你是Hopper Disassembler3的话 他是解析不出来的,Hopper Disassembler4是可以的。