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 CON 25/DEF CON 25 presentations/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即可及时在调试器中断下

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

  1. 《天书夜读:从汇编语言到windows内核编程》四 windows内核调试环境搭建

    1) 基础篇是讲理论的,先跳过去,看不到代码运行的效果要去记代码是一个痛苦的事情.这里先跳入探索篇.其实今天的确也很痛苦,这作者对驱动开发的编译与调试环境介绍得太模糊了,我是各种尝试,对这个环境的搭建 ...

  2. [内核编程] Windebug双机调试环境搭建

    Windebug双机调试环境搭建    开始进行内核编程/驱动编程的调试工作是非常烦人的,由于程序运行与内核层不受操作系统的管控,所以容易引起主机蓝屏和崩溃是常有的事.这也就使得内核程序的调试成了一大 ...

  3. Windebug双机调试环境搭建

    Windebug双机调试环境搭建    开始进行内核编程/驱动编程的调试工作是非常烦人的,由于程序运行与内核层不受操作系统的管控,所以容易引起主机蓝屏和崩溃是常有的事.这也就使得内核程序的调试成了一大 ...

  4. i.MX RT600之DSP调试环境搭建篇

    恩智浦的i.MX RT600是跨界处理器产品,同样也是i.MX RTxxx系列的开山之作.不同于i.MX RT1xxx系列单片机,i.MX RT600 采用了双核架构,将新一代Cortex-M33内核 ...

  5. Windows下Lua+Redis 断点调试环境搭建==Linux下类似

    Lua+Redis 断点调试环境搭建 windows环境,使用Redis,写lua脚本头疼的问题之一不能对脚本断点调试,google加上自己的摸索,终于搞定. 1.下载ZeroBraneStudio, ...

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

    Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建 由于公司里的Solr调试都是用远程jpda进行的,但是家里只有一台电脑所以不能jpda进行调试,这是因为jpda的端口冲突.所以 ...

  7. HI3518E平台ISP调试环境搭建

    海思的SDK提供了ISP调试的相关工具,降低了IPC的ISP调试的难度.初次搭建ISP调试环境,记录一下. SDK版本:Hi3518_MPP_V1.0.A.0 硬件平台:HI3518E_OV9732 ...

  8. arm64 调试环境搭建及 ROP 实战

    前言 比赛的一个 arm 64 位的 pwn 题,通过这个题实践了 arm 64 下的 rop 以及调试环境搭建的方式. 题目文件 https://gitee.com/hac425/blog_data ...

  9. 一步一步 Pwn RouterOS之调试环境搭建&&漏洞分析&&poc

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 本文分析 Vault 7 中泄露的 RouterOs 漏洞.漏洞影 ...

随机推荐

  1. 用vue写一个仿简书的轮播图

    原文地址:用vue写一个仿简书的轮播图 先展示最终效果: Vue的理念是以数据驱动视图,所以拒绝通过改变元素的margin-top来实现滚动效果.写好css样式,只需改变每张图片的class即可实现轮 ...

  2. 多实例:MySQL系列之二

    MySQL的多实例配置 ​ 在一台物理机中需要多个测试环境,那么就需要用到了搭建数据库的多个实例,多个实例的意思就是运行多份程序,实例与实例之间没有影响.要注意监听的端口需要不同. 环境:CentOS ...

  3. 洛谷P1505 [国家集训队]旅游

    题目描述 \(Ray\) 乐忠于旅游,这次他来到了\(T\) 城.\(T\) 城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,\(T ...

  4. Retina显示屏-揭秘移动端的视觉稿通常会设计为传统PC的2倍

    一.Retina显示屏简介 retina:一种具备超高像素密度的液晶屏,同样大小的屏幕上显示的像素点由1个变为多个,如在同样带下的屏幕上,苹果设备的retina显示屏中,像素点1个变为4个. reti ...

  5. DHCP原理和配置

    在大型网络中,会有大量的主机和设备需要获取ip地址和网络参数,为了解决手动配置的工作量大.ip冲突问题,因此需要使用DHCP(dynamic host configuration protocol). ...

  6. 如何理解javascript中的同步和异步

    javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流水线而已,要 ...

  7. k8s的ingress使用

    ingress 可以配置一个入口来提供k8s上service从外部来访问的url.负载平衡流量.终止SSL和提供基于名称的虚拟主机. 配置ingress的yaml: 要求域名解析无误 要求servic ...

  8. Python3基础(4)匿名函数、装饰器、生成器、迭代器、内置函数、json&pickle序列化、软件目录开发规范、不同目录间模块调用

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  9. 为什么有人会觉得IT门槛低,工资高?

    今天在高铁上,翻着逼乎,被一个话题勾住了,"为什么很多人会觉得IT门槛低?" 我一惊,还真是,身边朋友都觉得"IT赚的多","程序员工资高" ...

  10. ACdream 1216——Beautiful People——————【二维LIS,nlogn处理】

    Beautiful People Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (J ...