Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

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

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

2017-01-13 12:37:32
来源:vvalien1.wordpress.com 作者:shan66

阅读:90次
点赞(0)
收藏





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

翻译: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将根据这个路径来查找符号。确保你已经设置好了C\Symbols目录。

_NT_SYMBOL_PATH=srv*C:\Symbols*http://msdl.microsoft.com/download/symbols
【技术分享】内核调试入门教程

修改windbb的ida配置

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

Win7

DBGTOOLS=“C:\\ProgramFiles\\DebuggingToolsforWindows(x86)\\”;

Win8+

DBGTOOLS=“C:\\ProgramFiles(x86)\\WindowsKits\\10\\Debuggers\\x86\\”;

它工作吗?

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

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

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

bcdedit.exe/debugon bcdedit.exe/dbgsettingsNETHOSTIP:192.168.1.101PORT: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=\\.\pipe\mypipe\,pipe,reconnect

我的设置如下所示。


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

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

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


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

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


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

这说明设置成功了!


接下来应该干啥?

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

DebugUniversalDrivers–StepbyStepLab(EchoKernel-Mode)https://msdn.microsoft.com/en-us/library/windows/hardware/mt269367(v=vs.85).aspx

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

HackingzZeKomputerz–ExploitingCAPCOM.SYShttps://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,并让它一直处于运行状态。之后,选中调试器路径,并单击(运行调试器)。


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

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

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

该软件的安装目录为:

C:\ProgramFiles\DebuggingToolsforWindows(x86)\

IDA与 VirtualKD

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

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

IDA主题

加载您的主题

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

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

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

http://pastebin.com/hyM5P0ZN

载入皮肤插件

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

C:\ProgramFiles(x86)\IDA6.8\plugins\

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

C:\ProgramFiles(x86)\IDA6.8\

https://github.com/zyantific/IDASkins

加载HexRaysCodeXplorer

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

https://github.com/REhints/HexRaysCodeXplorer

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

C:\ProgramFiles(x86)\IDA6.8\plugins\

让windbg和IDA双剑合璧

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

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

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

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

为windbg编译.dll文件

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

ret-sync\ext_windbg\sync\sync.sln

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

将插件/.dll安装到windbg

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

C:\ProgramFiles(x86)\WindowsKits\10\Debuggers\x86\winext

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

C:\ProgramFiles(x86)\DebuggingToolsforWindows(x86)\winext

为IDA安装插件

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

C:\ProgramFiles(x86)\IDA6.8\plugins\ [警告]如果当前运行的是IDA 6.8的话,那么需要修改相应的python插件后才能正常工作!

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

删除下面的文件

C:\ProgramFiles(x86)\IDA6.8\plugins\ext_ida\ext_ida\SyncPlugin.py

用下面这个进行替换:

C:\ProgramFiles(x86)\IDA6.8\plugins\ext_ida\compat_pyside\SyncPlugin.py

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

在ida中打开驱动程序

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

加载ret-sync插件

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

C:\ProgramFiles(x86)\IDA6.8\plugins\ext_ida\SyncPlugin.py

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

[*]<<broker<<dispatchernotfound,tryingtorunit [*]<<broker<<dispatchernowrunswithpid:3132 [*]<<broker<<connectedtodispatcher [*]<<broker<<listeningonport50370

将windbg设为内核调试模式

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

bpsmb!SmbOpenTcpConnection g

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

[PIC]

载入windbg插件

kd>.loadsync kd>!sync [sync]Noargumentfound,usingdefaulthost(127.0.0.1:9100) [sync]syncsuccess,sock0x9c8 [sync]probingsync [sync]syncisnowenabledwithhost127.0.0.1 #帮助信息 !synchelp

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

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

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

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

COL_CURLINE=0x800000

小结

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

最后,祝您阅读愉快!


【技术分享】内核调试入门教程
【技术分享】内核调试入门教程
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://vvalien1.wordpress.com/2016/12/26/kernel-debugging-101/

Viewing all articles
Browse latest Browse all 12749

Trending Articles