OSX内核调试

搭建OSX调试环境

  1. VMware8.5.1
  2. Kernel_Debug_Kit10.11.4build_15E65
  3. 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"

关于这些参数

  1. debug=0x141启用了远程调试模式
  2. kext-dev-mode=1可以用来加载未签名的kext文件(kext文件:Mac OSX的内核扩展,通常用于设备驱动程序)
  3. kcsuffix=development我们之前复制的是kernel.development文件,这里允许我们根据这个文件进行引导内核发展
  4. pmuflags=1禁止看门狗定时器
  5. -v 内核调试的时候会有一些有用的信息

这时我们就要看看虚拟机网络配置以至于接下来远程连接到它

B5C02EBEC1AE2212BD1996E2FFE4F98C

这里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

09ED67D25ECEA5C31E9BA548ECBE74EE

然后我们重启虚拟机,等开机会就会看到提示远程连接的信息

QQ20161215-3@2x

这时候我们就开始在主机上远程连接了,还记得之前我们要记住的mac地址和ip地址吗?

我们在主机上启动lldb

kdp-remote 192.168.174.129

lldb控制台会输出一些信息并且在虚拟机中也会出现Connected to remote debugger,这样就远程连接到了虚拟机

QQ20161215-5@2x
QQ20161215-6@2x

到这里,基本上完成了内核调试的基础步骤,然后就进行和平时通过lldb一样的操作了,这里不再赘述,大家可以下来自己按照意愿来调试。

参考:http://ddeville.me/2015/08/kernel-debugging-with-lldb-and-vmware-fusion

文章目录
  1. 1. 搭建OSX调试环境
  2. 2. 进行内核调试
|