一款好用的macOS内核调试专用工具——LLDBagility

它是Francesco Cagnin相关macOS内核调试的第二篇文章内容。在上一篇文章中,创作者界定了这篇文章内容中应用的大部分专业术语,叙述了怎样为macOS内核执行内核调试,并探讨了能用专用工具的局限...

它是Francesco Cagnin相关macOS内核调试的第二篇文章内容。在上一篇文章中,创作者界定了这篇文章内容中应用的大部分专业术语,叙述了怎样为macOS内核执行内核调试,并探讨了能用专用工具的局限。这篇文章内容中,大家就详细介绍LLDBagility,它是上原文中为macOS内核执行内核调试的解决方法,可出示更轻轻松松,更好用的macOS调试感受。

在当前状况下,调试macOS内核(XNU)不太好用,尤其是充分考虑例如务必安裝调试内核搭建及其没法设定监控点或中止实行的内核调试器的麻烦之处。为了更好地改进这类状况,创作者开发设计了LLDBagility ,它是一种依靠迅速调试协议书(FDP,在文中后边开展详细介绍)调试macOSvm虚拟机的专用工具。最重要的是,LLDBagility完成了一组新的LLDB命令,这种命令容许调试器实行下列实际操作:

1.联接到运作中的macOS VirtualBoxvm虚拟机并密秘地调试其内核,而不用变更顾客电脑操作系统(比如,不用开发设计或调试内核, boot-args改动或禁止使用SIP),而且只需对vm虚拟机的配备开展最少的变更;

2.随时随地终断(随后修复)顾客内核的实行;

3.即便 在运行全过程逐渐时,还可以在内核编码中的一切部位设定硬件配置断点;

4.设定在特定储存部位的载入或载入浏览时开启的硬件配置切入点;

5.储存并在几秒内修复vm虚拟机的情况。

这种命令致力于与LLDB中早已能用的命令一起应用,比如运行内存/存储器读/写、断点(手机软件),流程等。除此之外,假如调试后的内核附加了其内核调试工具箱(乃至很有可能沒有,后边会探讨),那麼绝大部分lldbmacros都能够一切正常工作中。

下边,大家最先简略详细介绍什么叫FDP,及其它怎样提高VirtualBox来完成vm虚拟机反省。随后,大家科学研究LLDBagility怎样运用这种新作用全透明地将LLDB联接到macOSvm虚拟机,并演试一个简易的内核调试对话。最终,大家明确提出了一些在欠缺调试工具箱的内核搭建中应用目前lldbmacros的念头。

根据迅速调试协议书对vm虚拟机开展反省

迅速调试协议书是一个轻量、迅速和高效率的调试API,用以vm虚拟机的反省性检查,应用C语言撰写,现阶段仅做为VirtualBox源码[FDP]的补丁下载公布。该API的功效以下:

1.载入和载入vm虚拟机存储器和运行内存;

2.设定和撤消设定硬件配置/手机软件断点和切入点;

3.中止、修复和单步实行vm虚拟机;

4.储存并修复vm虚拟机情况;

FDP的隐藏性来源于对vm虚拟机拓展网页页面表的实际操作(从顾客系统软件中难以检验到的实际操作),而速率是FDP和vm虚拟机中间应用共享内存的結果(在一些状况下做到一百万每秒钟的运行内存载入频次)。

除开最底层C插口以外,该API还出示了Python关联(PyFDP),可用以定义的迅速证实和LLDBagility等工程项目。下边是一个实例脚本制作,下边的脚本制作在每一次系统进程时都是会终断:

#!/usr/bin/env python2

from PyFDP.FDP import FDP

# Open the debuggee VM by its name

fdp=FDP("18E226")

# Pause the VM to install a breakpoint

fdp.Pause()

# Install a hardware breakpoint (very fast and stealth)

UnixSyscall64=0xffffff80115bae84

fdp.dr0=UnixSyscall64

fdp.dr7=0x403

# Resume the execution after the breakpoint installation

fdp.Resume()

while True:

# Wait for a breakpoint hit

fdp.WaitForStateChanged()

print "%x" % (fdp.rax)

# Jump over the breakpoint

fdp.SingleStep()

# Resume the debuggee

fdp.Resume()

大量有关FDP的关键点能够在Winbagility[WinbagilitySSTIC2016]的初始文章内容中寻找,它是LLDBagility在Windows和WinDbg上的老版本。

将LLDB额外到vm虚拟机

如前一篇文章中详解的那般,在基本的两部机器设备调试期内,LLDB根据向其內部KDP存根推送命令来与被调试目标的macOS内核开展互动,该存根自身是内核的一部分,随后能够定期检查变更依据规定明确机器设备的情况,并传递結果。 LLDBagility身后的重要观念是应用vm虚拟机管理流程等级的FDP出示的(虚似)机器设备反省和改动的相近作用来拷贝该类代理商出示的作用,便于可以用内核外界的等效电路取代项更换内核的调试存根来调试机器设备。除此之外,根据维持与KDP协议书的兼容模式,这一新的存根能够运用LLDB对macOS内核的目前适用,而不用在一切层面改动调试器,由于与内核中的KDP网络服务器通讯沒有差别。在这些方面,Ian Beer为他的iOS内核调试器应用了相近的解决方法。

这类方式具备2个明显的优势:清除了在内核中开启KDP开展调试的重要性,及其应用别的作用拓展LLDBagility的存根的概率,这代表着在第一篇文章内容中叙述的經典调试方式的全部局限都能够处理。最先,因为已不必须设定XNU开展调试,因而不用改动NVRAM并很有可能禁止使用SIP。一样,也不用安裝DEBUG或DEVELOPMENT版本号。次之,与KDP编码相关的全部系统软件范畴的不良反应都消失了,这代表着,比如,rootkit对调试器的检验更为艰难。第三,现在可以在内核正确引导全过程中在KDP存根复位以前逐渐调试。最终,依靠FDP对机器设备开展良好控制,能够轻轻松松完成硬件配置断点,切入点及其用以在调试器的命令下中止内核的体制。

LLDBagility专用工具的详尽简述

如上所述,LLDBagility的前端开发是一组新的LLDB命令,这种命令在lldbagility.py中完成(来源于[LLDBagility100]):

1.fdp-attach或通称为fa,用以将调试器联接到已经运作的macOS VirtualBoxvm虚拟机;

2.fdp-hbreakpoint或fh,用以设定和撤消设定读/写/实行硬件配置断点;

3.fdp-interrupt或fi,以中止vm虚拟机的实行并将决策权回到给调试器(等同于已经知道的sudo dtrace -w -n"BEGIN{ breakpoint(); }");

4.fdp-save或fs,储存vm虚拟机当今情况;

5.fdp-restore或fr,将vm虚拟机复原到上一次储存的情况。

另一方面,后端开发由下列一部分构成:

1.kdpserver.py,LLDB联接到的新KDP网络服务器(XNU的代替品),其工作中是将调试器接到的KDP要求变换为vm虚拟机的命令高并发送到回应和出现异常通告(比如断点击中);

2. stubvm.py,用以抽象性普遍的vm虚拟机实际操作并根据FDP完成。

  • 发表于 2021-02-24 06:01
  • 阅读 ( 243 )
  • 分类:互联网

0 条评论

请先 登录 后评论
甘旭红
甘旭红

698 篇文章

你可能感兴趣的文章

相关问题