mac os 内核调试

一 需求和目的:

逆向的时候出现内核方法, 想要更进一步调试, 因为ios 的内核调试比较困难
所以找了折中的方案,调试macos 内核

二: 调试准备

1: macos 主机上安装虚拟机 VMware funsion, 自己google安装步骤
2: 下载镜像
  目前我能找到的镜像都是dmg, 而且都是存放百度网盘的, 下载速度慢的可以, 限速限的真是够可以的,【我没时间,如果哪个热心的红领巾把它给逆了,记得传一份给我】没有办法只有自己制作iso 镜像, 可以看下一篇文章macos系统镜像iso 的制作, 注意虚拟机和主机系统应该一致,否者会出现各种恶心问题, 比如: 调试能断下来,按continue 后 ,但是无法进入桌面
3: 下载KDK (内核调试工具): 下载地址: https://developer.apple.com/download/more/
  一定要根据系统版本来确定KDK 的版本,使用命令行: sw_vers | grep BuildVersion 来查看系统编译版本, 或者使用界面查看


5: 接下来关闭SIP[系统正当性保护模式]
 它禁止让软件以root的身份在mac 上运行 ,这是osx 10.11 系统以后才有的机制
关闭SIP: 首先要进入恢复模式, 很多资料说系统重启, 按住Command +R 进入恢复模式, 尝试过, 根本进不去, 我怀疑Command+R 对虚拟机是无效的, 在虚拟机软件上找到了这个

启动到固件: 会进入到下面的界面: 上下键移动到enter setup

然后选中Boot from a file 继续下一步:

然后选中Recovery HD 继续下一步:

然后选中com.apple.recovery.boot 继续下一步!!

选中boot efi:继续, 随后会进入到苹果启动界面,最后进入恢复模式, 然后来到下面的界面, 选中实用工具

然后打开终端, 输入csrutil disable, 会提示你成功关闭
重启后, 进入到系统后, 终端输入csrutil status ,查看SIP 是否关闭,如下图:

6: 虚拟机中替换成调试内核
替换内核: KDK是安装在/Library/Developer/目录下, 注意: 一定是从根目录下开始查找这个Library,否则找不到, 将目录下的kernel.development 拷贝到/System/Library/Kernels/中
即终端中执行命令:

 sudo cp /Library/Developer/KDKs/KDK_10.12.6_16G29.kdk/System/Library/Kernels/kernel.development /System/Library/Kernels/

7: 然后输入命令设置boot-args ,使用nvram 将虚拟机设置成调试模式:

 sudo nvram boot-args="debug=0x141 kext-dev-mode=1 kcsuffix=development pmuflags=1 -v"
1>>boot-args:系统的启动参
2>>debug=0×141,表示系统可以进行远程链接调试
3>>kext-dev-mode=1允许加载未签名kext
4>>kcsuffix=development 允许我们启动系统,通过development,与之前我们copy到/Systems/Library/Kernel下的kernel.development对应,如果我们之前拷贝的是kernel.debug,那么这里填kcsuffic=debug
5>>pmuflags=1关闭定时器
6>>-v显示内核加载信息.

8: 在清除kext缓存 sudo kextcache -invalidate / 目的是让虚拟机系统的kext cache无效,使用新的内核调试.

9: 重启虚拟机即可, sudo reboot

10: 重启之后 , 系统会来到下面的界面, 这里就是等待外部主机进行调试

11: 需要源码调试的话: 现在虚拟机中查询xnu 的版本命令uanme -v ,这里我的版本为: xnu-3789.70.16~2
源码地址: https://opensource.apple.com/tarballs/xnu/
找到对应的版本源码: 下载后, 放入到主机中/Library/Cache/com.apple.xbs/xnu/中,如果没有这个目录自己创建

12: 外部使用命令行:输入kdp-remote 虚拟机ip

注意事项:
1>上述的内核调试是有问题的:
一旦内核启动并且调试器继续运行,内核就不能再从调试器中停止。所以我们需要重新设置:

$sudo nvram boot-args="debug=0x144 kext-dev-mode=1 kcsuffix=development pmuflags=1 -v"

之后如果想再运行时断下,就在虚拟机中按组合键就可以重新调试

Command-Option-Control-Shift-Escape

原因: 0x141: DB_DBG_POS_CORE && DB_ARP && DB_HALT , 0x144:DB_DBG_POS_CORE && DB_ARP && DB_NMI [即可以运行是中断]

2> 连上后, 出现Waiting for link to become available 的情况很多, 就是一直在等待,原因: 我安装VMware Tools 必须推出了OS Base System,进而到值会出现上述问题

解决方案: 可以重启一下CD/DVD, 当然看到要重新安装系统,则可以退出就行