搭建OSX调试环境
- VMware8.5.1
- Kernel_Debug_Kit10.11.4build_15E65
- Install El Capitan 10.11.4 (15E65)
这里现在Mac上安装VM,在装虚拟机的过程中遇到了个坑,因为是8.x的VM,所以运行OSX系统时会出现与vmmon模块的版本不匹配,需要308.0,现有304.0
,网上找了很多方法也没办法解决,最后重启了一遍电脑竟然可以了。
紧接着就是在本机和虚拟机中安装KDK
Kernel Debug Kit是苹果官方提供的调试工具包,每一个正式的系统中都会有对应的KDK,下载地址在这里
下载了对应版本的kdk后,在虚拟机中和本机中都要安装这个KDK,安装后的目录在/Library/Developer/KDKs/Kernel_Debug_Kit_10.11.4_build_15E65
中
在OSX中,内核的可执行文件位于/Systems/Library/Kernels
下,所以我们只需要在KDK安装目录的可执行文件下找到kernel.development
可执行文件,复制到/Systems/Library/Kernels
即可,但是OSX使用了 “rootless” 的机制,所以我们可能无法复制,这时我们需要关闭系统完整性保护机制,如何做呢?我们首先要在虚拟机中重启,然后立即按住option+command+R
,直到出现🌐地球,然后我们顶部找到终端,打开后输入csrutil disable
,即可关闭,然后再重启,就可以复制了。
复制后我们要设置系统调试参数:
sudo nvram boot-args="debug=0x141 kext-dev-mode=1 kcsuffix=development pmuflags=1 -v"
关于这些参数
debug=0x141
启用了远程调试模式kext-dev-mode=1
可以用来加载未签名的kext文件(kext文件:Mac OSX的内核扩展,通常用于设备驱动程序)kcsuffix=development
我们之前复制的是kernel.development文件,这里允许我们根据这个文件进行引导内核发展pmuflags=1
禁止看门狗定时器-v
内核调试的时候会有一些有用的信息
这时我们就要看看虚拟机网络配置以至于接下来远程连接到它
这里Mac地址00:0c:29:1b:7d:f0
和IP地址192.168.174.129
是要记住的
由于我们要进行新的内核调试,所以我们要设置kext缓存为无效
sudo kextcache -invalidate
进行内核调试
我们首先在虚拟机上启动lldb
然后创建内核调试任务
target create /Library/Developer/KDKs/KDK_10.11.4_15E65.kdk/System/Library/Kernels/kernel.development
然后我们重启虚拟机,等开机会就会看到提示远程连接的信息
这时候我们就开始在主机上远程连接了,还记得之前我们要记住的mac地址和ip地址吗?
我们在主机上启动lldb
kdp-remote 192.168.174.129
lldb控制台会输出一些信息并且在虚拟机中也会出现Connected to remote debugger
,这样就远程连接到了虚拟机
到这里,基本上完成了内核调试的基础步骤,然后就进行和平时通过lldb一样的操作了,这里不再赘述,大家可以下来自己按照意愿来调试。
参考:http://ddeville.me/2015/08/kernel-debugging-with-lldb-and-vmware-fusion