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.HEREWin7
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,reconnectIDA主题
加载您的主题要想加载自己的主题,其实不是什么难事。首先提供一个主题文件,然后依次选择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/