【技术分享】内核调试入门教程

阅读量264812

|

发布时间 : 2017-01-13 12:37:32

x
译文声明

本文是翻译文章,文章来源:vvalien1.wordpress.com

原文地址:https://vvalien1.wordpress.com/2016/12/26/kernel-debugging-101/

译文仅供参考,具体内容表达以及含义原文为准。

http://p8.qhimg.com/t01fe97be6108a6e9b8.png

翻译:shan66

预估稿费:260RMB(不服你也来投稿啊!)

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


前言

对于内核调试来说,无论是环境的搭设,还是调试工作本身都是相当困难的——从前我就是这么认为的,但是事实证明,实际上它比我们想象的要更容易一些。

需要准备的软件

IDAPro 6.8+

在本文中,我们将使用IDA作为我们的调试器。

VisualStudio 2015 + Windows10 SDK + WDK (Windows Driver Kit)

当我们需要编译一些东西的时候,它们会变得非常有用。

WinDBG for Win7

当我们在一些较旧的系统上面进行调试时,如果使用了较新的windbg的话,就会遇到一个小问题,主要是无法正确显示寄存器。所以,如果你打算使用Win7 VM,那么可以安装这个软件。

http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi

Symbols文件

由于我的网速较慢,所以就从这里一次性下载好了所需的symbols文件,并将它们安装到了C:Symbols目录下面。

https://developer.microsoft.com/en-us/windows/hardware/download-symbols

符号文件有两种,一种是Checked Build或Debug Build,另外一种是Retail Symbols。至于两者之间的区别,请参考下面的文章: 

whats-the-difference-between-retail-symbols-and-checked-symbols


安装和配置 

Symbol路径

在开始之前,首先需要设置相应的符号路径。Windbg将根据这个路径来查找符号。确保你已经设置好了CSymbols目录。

_NT_SYMBOL_PATH = srv*C:Symbols*http://msdl.microsoft.com/download/symbols

http://p1.qhimg.com/t0122dc937af2a338ed.png

修改windbb的ida配置 

现在,我们需要修改位于“C: Program Files(x86) IDA 6.8 cfg”中的ida.cfg文件。找到与DBGTOOLS有关的行,该注释掉的全部注释掉(特别提醒:即使你要调试x64内核代码,也要使用x86路径!)。

Win7

DBGTOOLS = “C:\Program Files\Debugging Tools for Windows (x86)\”;

Win8+

DBGTOOLS = “C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\”;


它工作吗? 

好了,现在进行一个简单的测试,以检查系统能否一切正常工作。这里,我们将使用Windows10 x64 VM进行测试,因为它比较易于设置。

修改bcdedit 设置以便进行网络调试

以管理员身份执行下列命令,并将相关参数记录下来,因为后面会用到。

bcdedit.exe /debug on
bcdedit.exe /dbgsettings NET HOSTIP:192.168.1.101 PORT:50000

加载windbg并连接到内核 

现在加载windbg,然后选择File- > >Kernel Debug(ctrl + k)选项,并输入相应的参数。现在,可以通过暂停命令将虚拟机挂起。

加载驱动程序的符号文件 

在给所有已经加载的驱动程序强制载入驱动程序符号的时候,请务必注意内核和用户模式之间的区别 

.reload /f

转换为用户模式 

.process /i [addy_of_user_proc]
g
.reload /f /user

转换为内核模式

.process /i [addy_of_kernel_proc]
g
.reload /f


检查IDA是否可以进行内核调试 

现在,我们必须确保IDA的设置正确,确保windbg已经关闭,然后重新启动VM。现在以管理员身份打开IDAx64,然后进入Debugger-> Attach-> Widbg Debugger(警告:如果你没有设置dbgtools选项,就会出现连接错误消息)选项下面。

Win8+

net:port=50000,key=YOUR.KEY.GOES.HERE

Win7

com:port=\.pipemypipe,pipe,reconnect

我的设置如下所示。

http://p5.qhimg.com/t01bc0c4535bace25e8.png

http://p2.qhimg.com/t01ba6909f3f96afd11.png

如果已经能够工作的话,你可能会得到这样的错误消息。

http://p6.qhimg.com/t01220e0a66bb9dd704.png

一旦加载完毕,就会看到类似下面的内容… 

http://p0.qhimg.com/t0127c318a88b66ab26.png

这说明设置成功了!


接下来应该干啥?

现在,我们已经可以做很多事情了,不过我建议你最好通读本系列的文章。或者,首先仔细学习下面的文章。

Debug Universal Drivers – Step by Step Lab (Echo Kernel-Mode) https://msdn.microsoft.com/en-us/library/windows/hardware/mt269367(v=vs.85).aspx

此外,你也可以跟随@TheColonial学习利用capcom.sys的漏洞 

Hackingz Ze Komputerz – Exploiting CAPCOM.SYS https://www.youtube.com/watch?v=pJZjWXxUEl4

除此之外,只要你愿意,也可以自己随便鼓捣一番,有时候这样也能学到很多东西。


VirtualKD与Windows7 

相对于Windows 10而言,在Windows 7上进行内核调试要更容易一些,但问题在于,Win7不支持网络连接,所以必须设置管道。此外,它的速度也慢得吓人,为了解决这个问题可以安装virtualKD,但效果也不是非常理想。所以,下面我们假设你在windows10 x64上面进行调试工作,我们的调试目标是Windows7(32位)系统。

一款免费的Microsoft VM

https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

是的,这是来自微软的免费VM,经实验效果不错。我们使用的虚拟机镜像是IE11 on Win7,虽然微软没有直接说明,但它实际上是x86版本。在下载安装好虚拟机之后,下面我们开始介绍VirtualKD。

安装VirtualKD

下面我们要做的是安装virtualKD,虽然它的安装程序存在一个问题,但是我们可以通过VisualStudio编译自己的版本来解决这个难题。

我们只需要重新编译VirtualBoxIntegration目录下面的代码。

https://github.com/sysprogs/VirtualKD

然后,可以通过下面的地址下载这个安装程序的其他部分: 

http://virtualkd.sysprogs.org/download/

接下来,将下载的VirtualBoxIntegration.exe程序替换为刚才自己编译的那个。

然后,安装程序的其余部分不必改动,只需按照下面的说明进行操作即可完成安装工作。

http://virtualkd.sysprogs.org/tutorials/install

(YOU DONT NEED THE (你不需要使用vmpatch.exe) )

现在启动VM,然后以管理员身份运行vmmon64.exe,并让它一直处于运行状态。之后,选中调试器路径,并单击(运行调试器)。

http://p8.qhimg.com/t012f9ca727107c0dec.png

在你开始之前,务必记住使用新版本的windbg时,无法对老版本的VM进行调试。本文使用的版本的下载地址为: 

http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi

该软件的安装目录为:

C:Program FilesDebugging Tools for Windows (x86)

IDA与 VirtualKD

现在,如果你加载IDA,并为windbg输入正确的路径,那么只需要输入下列命令就能让IDA工作了: 

com:port=\.pipekd_IE11_-_Win7,pipe,reconnect

IDA主题 

加载您的主题 

要想加载自己的主题,其实不是什么难事。首先提供一个主题文件,然后依次选择Options->Colors->Import选项即可。

https://github.com/eugeii/ida-consonance

我对我的主题进行了一些小的改动,因为我不喜欢原来的颜色。你可以从这里下载它。

http://pastebin.com/hyM5P0ZN

载入皮肤插件 

将IDASkins.plX放入IDA安装目录下的plugins目录中。

C:Program Files (x86)IDA 6.8plugins

然后将skin目录复制到IDA安装根目录下面。

C:Program Files (x86)IDA 6.8

https://github.com/zyantific/IDASkins

加载HexRaysCodeXplorer

HexRaysCodeXplorer的确能提高伪代码的生成质量(F5),下载地址: 

https://github.com/REhints/HexRaysCodeXplorer

通过下面的地址下载HexRaysCodeXplorer.p64 / HexRaysCodeXplorer.plw,然后将它们放入plugins文件夹即可。

C:Program Files (x86)IDA 6.8plugins


让windbg和IDA双剑合璧 

一般来说,所有的调试工作基本上归结为静态和动态分析。

对于IDA来说,它可以将一个二进制文件与符号文件进行比较,同时还可以所有函数进行命名。除此之外,你还可以通过tilib.exe给参数进行命名,但是在进行内核调试的时候却无法这样做。

不过,我们可以通过联合使用windbg和IDA来解决这个问题,为此,我们需要用到ret-sync插件,其下载地址为: 

https://github.com/bootleg/ret-sync

为windbg编译.dll文件 

您将需要复制repo,并从下面位置将.sln加载到Visual Studio中 

ret-syncext_windbgsyncsync.sln

现在选择ReleaseWin32选项,并右键单击解决方案,选择构建,这样就会在Release文件夹中生成一个sync.dll文件。

将插件/.dll安装到windbg

现在,我们只需要将sync.dll复制到winext文件夹即可: 

C:Program Files (x86)Windows Kits10Debuggersx86winext

或者,如果您使用的是旧版本的话,可以使用下列文件夹。

C:Program Files (x86)Debugging Tools for Windows (x86)winext

为IDA安装插件

现在,我们还需要将文件夹ext_ida从repo复制到我们的IDA的plugins目录中: 

C:Program Files (x86)IDA 6.8plugins

[警告]如果当前运行的是IDA 6.8的话,那么需要修改相应的python插件后才能正常工作!

从IDA 6.9开始,它的插件需要用到PyQt5。IDA 6.8(我使用的版本)使用的是PySide,这就是一些较新的脚本无法运行的原因。这对我们来说不是一个大问题,只需执行下面的操作就可以了。

删除下面的文件 

C:Program Files (x86)IDA 6.8pluginsext_idaext_idaSyncPlugin.py

用下面这个进行替换: 

C:Program Files (x86)IDA 6.8pluginsext_idacompat_pysideSyncPlugin.py

具体哪些地方发生了变化,请参考这里。

在ida中打开驱动程序

以正常方式在IDA中加载驱动程序文件。

加载ret-sync插件

通过File- >script file菜单项,找到下列插件 

C:Program Files (x86)IDA 6.8pluginsext_idaSyncPlugin.py

一旦加载,您应该在输出窗口中看到结果,端口会随之改变,同时还会弹出一个ret-sync窗口。

[*] << broker << dispatcher not found, trying to run it
[*] << broker << dispatcher now runs with pid: 3132
[*] << broker << connected to dispatcher
[*] << broker << listening on port 50370

将windbg设为内核调试模式

具体做法跟之前的一样,并确保被加载的模块(lm)在目标驱动程序的函数中设置了相应的BP 

bp smb!SmbOpenTcpConnection
g

现在,虚拟机中的函数一旦被击中,windbg就会中断: 

[PIC]

载入windbg插件 

kd> .load sync
kd> !sync
[sync] No argument found, using default host (127.0.0.1:9100)
[sync] sync success, sock 0x9c8
[sync] probing sync
[sync] sync is now enabled with host 127.0.0.1
#帮助信息 
!synchelp

加载IDA(连同驱动程序),然后以内核调试器方式加载windbg,在目标驱动程序上设置BP。在IDA中加载python脚本,当BP击中时,会启动一个“windbg”窗口。

如果让windbg运行在wine中并且在linux中使用ida的话,这个插件也应该能够正常工作。

如果你加载IDA并且将它作为内核调试器连接的话,也不会有问题,因为它将运行windbg。所以,你可以将两个IDA链接在一起,来处理你的二进制文件。

在脚本中,修改下面这一行的值,就能够改变主题的颜色 

COL_CURLINE = 0x800000

小结

在本文中,我首先介绍了内核调试环境的搭建,然后讲解了主题的修改,以及一些非常有用的插件,最后讨论了联合使用windbg和IDA的方法。

最后,祝您阅读愉快! 

本文翻译自vvalien1.wordpress.com 原文链接。如若转载请注明出处。
分享到:微信
+10赞
收藏
shan66
分享到:微信

发表评论

内容需知
  • 投稿须知
  • 转载须知
  • 官网QQ群8:819797106
  • 官网QQ群3:830462644(已满)
  • 官网QQ群2:814450983(已满)
  • 官网QQ群1:702511263(已满)
合作单位
  • 安全客
  • 安全客
Copyright © 北京奇虎科技有限公司 360网络攻防实验室 安全客 All Rights Reserved 京ICP备08010314号-66