MaciOS *** 作系统之MachO(1)

MaciOS *** 作系统之MachO(1),第1张

苹果在OSX/iOS中推出了非常创新的“通用敏升二进制(Universal Binary)”这一概念,这个格式的基本思想是提供一个能够在任意架构上执行的完全可移植的二进制格式。不过实际上,“通用”二进制格式只不过是其支持的各种架构的二进制文件的打包文件。我们可以做个小实验来验证下。

上面的执行可以看到, /bin/ls 这个二进制文件,实际上是包含了两个架构的可可执行文件,我们简单的可以认为他就是把两个架构的可执行文件打包在了一起。

作为一个 iOS 开发那么我们在 iOS 的二进制文件中在做一次实验

上面我们拿 NKCoreModel 来测试发现,这个库里面包含了四个架构,所以这个通用二进制格式,其实就是把各种架构的二进制文件有规则的整合在来一起。

接下来我们研究一下他是怎么有效的整合在一起的。

其实这个文件就在 <mach-o/fat.h>中

我们可以看到 MAC 下面 lipo 工具读取到了 2 个架构: x86_64/arm64e ,这两个架构是通过 cputype+cpusubtype 分析出来的,详情可以查看 <mach-o/arch.h>文件,其实就是一些 if/else/swift 判断,这里就不展开了。

然后我们发现 next arch offset != last offset + size ,这里就涉及到对齐了,对齐的作用主要是就是让硬盘读取速度变快,这里也不展开了。所以真正的 next arch offset = ceil(last offset + size) / align * align

前面我们介绍了各个架构二进制内容怎么在文件中的排列,那么各个架构中的详细内容是怎么排列的呢?

UN*X基本上标准化了一个通用的可移植的二进制格式,这个格式的名字其实大家应该看到过很多次 ELF(Executable and Library) ,我想看桥败老到这个全称估计大家知道他是什么意思了。 OSX/iOS 维护了自己的一套二进制格式: Mach-Object (简写 Mach-O )。

定义在 <mach-o/load.h>中

从上面的枯纤定义我们可以很容易的发现,同一种二进制格式可以用作多种用途(executable/library等),在 <mach-o/load.h>中有定义文件类型,我们就关注一下 iOS 开发中的比较常用的几个文件类型吧

MachO文件。iOS是由帆握苹果公司开发的移动 *** 作系统升空。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,其中逆向hook文件态笑庆根据系统默认的设置储存在MachO文件中。在JS逆向中,通常把替换原函数的过程都称为hook。

当软件运行在内存中后,实际上内存中软件已经被解密为二进制数据,我们键掘只需要将内存中的数据取出来,再把MachO文件的加密部分替换冲亩掉即可完成砸壳 *** 作。

打印出如下信息

输出结果:

通过 MachOView工具打开MachO文件,找到 LC_ENCRYPTION_INFO_64 ,稿判核再找到 Crypt ID 。将其的Data值修改为 0 ,然后保存。

新年快乐!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12154536.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存