MacOS内核调试环境搭建

http://ddeville.me/2015/08/using-the-vmware-fusion-gdb-stub-for-kernel-debugging-with-lldb
http://ddeville.me/2015/08/kernel-debugging-with-lldb-and-vmware-fusion
https://blog.csdn.net/qq_32400847/article/details/79297177
https://media.defcon.org/DEF%20CON%2025/DEF%20CON%2025%20presentations/DEFCON-25-Min-Spark-Zheng-macOS-iOS-Kernel-Debugging.pdf
https://theori.io/research/korean/osx-kernel-exploit-1

方法一:LLDB+VMware Fusion+KDK

准备工作

1.在Mac中安装好LLDB(安装适合自己mac版本的xcode即可,xcode中自带lldb),下载地址:https://developer.apple.com/download/more/

2.在Mac中安装好VMware Fusion,

3.准备好一个macos镜像

4.下载对应版本内核调试工具包(KDK,下载地址;https://developer.apple.com/download/more/

对于虚拟机中的操作

1.安装MacOS虚拟机

2.安装对应版本内核调试工具包(KDK)

3.关闭SIP

关闭虚拟机的SIP,开机的时候按Command+R进入恢复模式,然后在终端输入csrutil disable。重启之后可以用csrutil status命令查看是否成功关闭。

4.内核替换

将位于KDK安装目录下的可执行文件kernel.development复制到/System/Library/Kernels

cp /Library/Developer/KDKs/KDK_10.12.1_16B2657.kdk/System/Library/Kernels/kernel.development /System/Library/Kernels

5.设置boot-args

为了将虚拟机设置成调试模式,需要使用nvram设置boot-args,命令如下

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

debug=0x141含义如下图所示

kext-dev-mode=1允许加载未签名kext,kcsuffix=development指定加载上面拷贝的kernel.development,pmuflags=1关闭定时器,-v显示内核加载信息

6.清除kext缓存

sudo kextcache -invalidate /

让虚拟机系统的kext cache无效,使用新的内核调试

7.下载内核代码

运行uname -v命令查看xnu源码版本,并从苹果开源代码上下载,下载地址:https://opensource.apple.com/tarballs/xnu/

8.查看虚拟机网络配置信息

为了将调试器连接到虚拟机,我们需要一些关于其网络配置的信息

对于主机中的操作

1.安装Xcode

Xcode中自带了lldb,选择适合自己mac版本的xcode版本进行安装,我这里选择8.3.3

2.安装内核调试工具包

安装与虚拟机中相同版本的内核调试工具包

3.关闭SIP

开始调试

1.重启虚拟机

虚拟机会等待调试器链接

2.启动LLDB并将目标设置为位于KDK中的(本地)内核二进制文件

$lldb
(lldb)target create /Library/Developer/KDKs/KDK_10.12.1_16B2657.kdk/System/Library/Kernels/kernel.development

如果遇到以下问题

就执行以下命令

(lldb) command script import "/Library/Developer/KDKs/KDK_10.12.1_16B2657.kdk/System/Library/Kernels/kernel.dSYM/Contents/Resources/DWARF/../Python/kernel.py"

$ echo "settings set target.load-script-from-symbol-file true" > ~/.lldbinit

再重新启动LLDB并将目标设置为位于KDK中的(本地)内核二进制文件

3.连接虚拟机

执行命令

kdp-remote 虚拟机IP地址

就可以开始调试

存在的问题

一旦内核启动并且调试器继续运行,内核就不能再从调试器中停止。

1.改进

在虚拟机中执行

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

之后如果想再运行时断下,就在虚拟机中按组合键

Command-Option-Control-Shift-Escape     

就可以了

方法二:VMware Fusion GDB stub + LLDB

修改虚拟机配置文件

每个虚拟机文件都包含一个可以编辑的.vmx配置文件.vmwarevm(确保虚拟机在编辑时没有运行)

在文本编辑器中打开它并添加以下行:

# If you are debugging a 32-bit machine use `guest32`
debugStub.listen.guest64 = "TRUE"

用gdb进行调试

mac中gdb需要自己安装,请大家自行解决

启动虚拟机,在gdb中附加虚拟机进行调试

(gdb) file /Library/Developer/KDKs/KDK_10.10.5_14F27.kdk/System/Library/Kernels/kernel.development
Reading symbols from /Library/Developer/KDKs/KDK_10.10.5_14F27.kdk/System/Library/Kernels/kernel.development...Reading symbols from /Library/Developer/KDKs/KDK_10.10.5_14F27.kdk/System/Library/Kernels/kernel.development.dSYM/Contents/Resources/DWARF/kernel.development...
done.
(gdb) target remote localhost:8864
Remote debugging using localhost:8864
0xffffff800f9f1e52 in ?? ()

用lldb进行调试

LLDB实际上支持使用gdb-remote命令连接到GDB远程机器

(lldb) file /Library/Developer/KDKs/KDK_10.10.5_14F27.kdk/System/Library/Kernels/kernel.development
Current executable set to '/Library/Developer/KDKs/KDK_10.10.5_14F27.kdk/System/Library/Kernels/kernel.development' (x86_64).
(lldb) gdb-remote 8864
Kernel UUID: C75BDFDD-9F27-3694-BB80-73CF991C13D8
Load Address: 0xffffff800f800000
Kernel slid 0xf600000 in memory.
Loaded kernel file /Library/Developer/KDKs/KDK_10.10.5_14F27.kdk/System/Library/Kernels/kernel.development
Loading 87 kext modules ....................................................................................... done.
Target arch: x86_64
Connected to live debugserver or arm core. Will associate on-core threads to registers reported by server.
Process 1 stopped
* thread #3: tid = 0x0066, name = '0xffffff801c91d9c0', queue = 'cpu-0', stop reason = signal SIGTRAP
    frame #0: 0xffffffffffffffff

实时断点

只需要Ctrl + C即可及时在调试器中断下

原文地址:https://www.cnblogs.com/elvirangel/p/9096517.html

时间: 2024-11-07 17:32:42

MacOS内核调试环境搭建的相关文章

linux内核调试环境搭建

版本linux4.17 ubuntu18.04先给系统至少80G内存1.编译内核先配置文件make mrpropermake menuconfig我这里需要的依赖有 sudo apt install make cmake gcc g++ clang sudo apt-get install libncurses5-dev libncursesw5-dev sudo apt install ncurses-dev sudo apt-get install bison sudo apt-get in

通过虚拟机搭建windows内核调试环境

今天我们来记录下通过虚拟机搭建windows内核调试环境. 这里是官方文档. 1.在虚拟机设置中为目标计算机创建命名管道 2.在目标计算机中开启调试 3.在windbg中输入目标计算机(虚拟机)的地址信息 4.在windbg菜单中点击[Debug|Break]开始内核调试.

使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境

原总结debug调试kernel debugwindbgbcdeditvirtualKD转储双机调试双机内核调试 前言 当我们没有两台物理机时,又想做双机内核调试怎么办?当然是装虚拟机啦!本文总结了使用 VMware15.5 + win10 + virtualkd + windbg 搭建双机内核调试环境. 安装环境 VMware 版本: 15.5 pro .可以到 VMware 官网下载地址 下载最新版本. 我的物理主机系统:win10 1909.其它版本的 windows 也可以,VMware

VT 调试环境搭建

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html VT 调试环境搭建 调试方法: VmWare + win7x64 + windbg + IDA64位 一.虚拟机配置 1.打开win7的虚拟机文件,找到一个 .vmx 文件,在后面加上下面几句话,之后保存,启动虚拟机. debugStub.listen.guest64.remote = "TRUE" monitor.debugOnStartGuest64

EAS客户端调试环境搭建

客户端调试环境搭建说明 适用场景:在现场跟踪问题或者在研发内部跟踪定位测试环境的问题时,开发人员需要快速搭建一个可供调试的环境以供分析问题,以下说明可供开发人员在需要时使用,注意该方式只支持客户端调试,服务端调试配置方式类似(链接远程jvm调试端口即可),但由于服务器不能随便启动停止,在现场应用客户端调试更为普遍一些. 环境要求 在进行以下工作前需要安装一个eclipse反编译插件,可以从网上下载. 安装完毕后注意配置以下参数设置: 详细配置 安装完毕接下来按照以下步骤配置环境即可 新建一个ja

Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建

Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建 由于公司里的Solr调试都是用远程jpda进行的,但是家里只有一台电脑所以不能jpda进行调试,这是因为jpda的端口冲突.所以只能在Eclipse 搭建Solr的环境,折腾了一小时终于完成了. 1. JDPA远程调试 搭建换完成Solr环境后,对${TOMCAT_HOME}/bin/startup.sh 最后一行进行修改,如下所示: 1 set JPDA_ADDRESS=7070 2 exec "$PRGDIR"

HI3518E平台ISP调试环境搭建

海思的SDK提供了ISP调试的相关工具,降低了IPC的ISP调试的难度.初次搭建ISP调试环境,记录一下. SDK版本:Hi3518_MPP_V1.0.A.0 硬件平台:HI3518E_OV9732 工具包:PQ_TOOL     (Hi3518E_V100R001C01SPC0A0\01.software\pc\PQ_TOOL) 文件说明:Hi3518_ITTB_MPP2_V1.0.A.0_B030.tgz 设备端工具 : PQTools_V3.7.5.zip PC端工具 环境搭建步骤: (1

MyBatis —— 调试环境搭建

MyBatis  —— 调试环境搭建 1. 依赖工具 Maven Git JDK IntelliJ IDEA 2. 源码拉取 从官方仓库 https://github.com/mybatis/mybatis-3 Fork 出属于自己的仓库.为什么要 Fork ?既然开始阅读.调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交. 使用 IntelliJ IDEA 从 Fork 出来的仓库拉取代码. 本文使用的 MyBatis 版本为 3.5.0-SNAPSHOT . 3. 调试 M

rocketmq那些事儿之本地调试环境搭建

上一篇文章中我们已经介绍过rocketmq的集群环境搭建,然而在源码的学习中我们还需要进行本地的调试和问题的定位查找,毕竟还是在本地方便些,今天就说一说如何进行源码的本地调试 下载编译 对于rocketmq源码部分的学习,我们当然要先去官网将源码下载到本地,这里笔者使用的是4.5.2版本,从github上官网上下载: https://github.com/apache/rocketmq rocketmq版本:4.5.2 使用clean install编译,这里最好跳过test,要不太慢了 编译完