-
-
[原创]编译macOS Sonoma 14.4 XNU内核并运行调试
-
发表于: 2024-5-24 03:20 3282
-
初级难度
只编译内核静态分析,或使用CodeQL辅助, 调试KDK的内核
环境配置
- 任意版本macOS, 最好Sonoma 14.4 安装Xcode Command Line Tools,有Xcode就不用,已包含.
- 下载安装Kernel Debug Kit 14.4 build 23E214,简称KDK
编译内核
使用darwin-xnu-build项目, 在项目目录使用编译参数执行
1 | ARCH_CONFIG=X86_64 KERNEL_CONFIG=DEVELOPMENT MACHINE_CONFIG=NONE KC_FILTER= "com.apple.EXBrightKext" . /build .sh -k |
这项目使用脚本已经全自动下载官方的xnu内核源码并编译好内核了, 完全傻瓜化(编译的输出要留好, 加 > build.log)
*如需要CodeQL,把以上参数修改到codeql.sh
虚拟机运行macOS*
- 安装qemu,通过项目OSX-KVM,OSX-KVM项目的openCore.qcow2使用qemu-img挂载EFI分区, 并使用OCAT修改一下OC的config.list, 勾选上FixupAppleEFIimages(这是qemu的EDK2项目的bug, 真机不用)
- ./fetch-macOS-v2.py会自动下载最新的BaseSystem.dmg(安装和恢复模式的镜像,不是完整包),生成BaseSystem.img
- 可以使用自己编译的内核.也可以替换官方KDK的内核,参照KDK目录下KDK_ReadMe.rtfd生成BootKernelExtensions.kc.development, 将系统启动参数kcsuffix=development也可以添加到OC的config.plist中,挂载BaseSystem.img把BootKernelExtensions.kc.development复制到/System/Library/KernelCollections
- 启动qemu后可以使用lldb, gdb-remote调试内核
**现在可使用调试官方的KDK里的内核, 自己编译的内核缺少Tightbeam无法进入到系统桌面(Tightbeam模块苹果没有放到开源的XNU项目中),但也能进行大部分调试. 还有一个问题现在14.5发布了, 下载的BaseSystem.img可能是14.5, 相关的KDK和XNU源码要两三个月后才会发布.**
*因mac的这台内存不够, 在另一台ubuntu上跑的qemu
高级难度
在完成以上的情况下, 继续进行以下配置, (高级难度也可不需要本机安装KDK, 可在虚拟的系统中安装.)
高级环境配置
通过项目OSX-KVM完整下载指定版本的完整安装包, 参考目录下的run_offline.md,到 mrmacintosh.com下载14.4的版本InstallAssistant.pkg, 并制作dmg, 再转成qemu的img.
在qemu中安装macOS Sonoma 14.4.(需要预留至少30G的空间) 并安装KDK
高级难度的真正所在!: 构建Tightbeam模块
从官方的kernel.development中把缺少的Tightbeam模块相关函数代码转汇编, 缺少的函数可以用生成目录下的/build/xnu.obj/DEVELOPMENT_X86_64/symbolsets.plist对比官方KDK中的kernel.development中名为__LINKINFO,__symbolsets的section的内容.还要使用到capstone来对相关代码进行反汇编, 制作Tightbeam.s的汇编文件, 再修改相关引用.生成模块Tightbeam.o.
`
编译内核
- 编译参数这里把KC_FILTER="com.apple.EXBrightKext"删除,这个模块依赖Tightbeam,因为已经解决了Tightbeam模块
- 把Tightbeam加入到编译中, 可以修改XNU目录下makedefs/MakeInc.kernel
1 2 3 4 5 | # 也可以从之前的build.log中找到 clang .... version.o - o ... / kernel.development.unstripped.noctf # 添加上修改成 clang .... version.o Tightbeam.o - o... / kernel.development.unstripped.noctf # 再执行strip等操作 |
使用自编译的内核进入系统和Apple store下载App都正常.
- 调试自己编译的内核还可以查看具体所在的相关代码,比原来只有KDK更方便理解,如果需要好的理解代码,
- *可以把KERNEL_CONFIG的DEVELOPMENT换成DEBUG, DEBU优化为-O0, DEVELOPMENT为-O2
*DEBUG版本需要解决不少错误
~
~
有人说为什么要还要搞黑苹果,新系统准备都不支持x86的CPU了,或是研究XNU有什么用, 不过就是因为苹果全面转向自己的Apple Silicon了 才需要研究, 新硬件驱动支持越来越紧迫. 除了window, 还有什么桌面系统是好用的, 你想说各种linux发行版本?国内换皮linux的所谓国产系统??
~
黑苹果, XNU内核交流可QQ: 3=1=0=4=1=9=0=6=2 (倒序)
~
~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)