运用WinDbg调试Windows内核(一)
假如能够查看操作体系的内部作业进程,那么将会是一种强壮的才能。一些先进的歹意软件都将内核作为一起的方针,许多最强壮的缝隙也体现在内核组件中。因而运用一款调试器来探求这个环境是任何研究人员武器库中必备的有力东西。
学习这种调试的进程是很艰巨的,所以我供给了一些入门WinDbg调试的比如。咱们测验从根本指令开端,逐渐转移到一些更高档的调试器的运用。本文运用了三个比如来展现WinDbg调试的才能,期望经过这种办法来证明这个东西的强壮。
0×01 设置内核形式调试环境
下面一切的比如将运用WinDbg,能够从微软官网取得这款“Windows调试东西”,供给了包创立以及多用途的调试器。
当设置为内核调试时,你需求两台机器。其间一台用于调试器和另一台用于运转被调试的程序。树立内核调试环境的最简略办法是运用虚拟机和一款叫做VirtualKD的软件。VirtualKD能够让你调试命名管道,就好像是一个串行接口,大大加快了衔接。它还供给了一个虚拟机(VM)监视器,只需你发动虚拟机调试器,它会主动发动。
VirtualKD与VMware或VirtualBox的作用很好。装置简略,指令能够在SysProgs网站找到。假如一切顺利的话你的虚拟机将会在调试器中止,就像这样:
现在一切的调试环境设置现已做好了。在任何时候,你能够运用“g”(履行)指令让虚拟机从头履行调试。相同,你能够经过运用WinDbg中的CTRL + BREAK快捷键中止一个正在运转的虚拟机。
0×02设置符号
调试的一个重要方面是树立方针体系的正确符号。符号答应调试器匹配编译的二进制程序的地址,匹配函数或变量名,源文件途径以及每个符号对应于源文件中的行号。要显现的符号的重要性能够看看这两个相同的仓库盯梢成果的差异:
没有设置符号:
设置符号:
走运的是微软供给了大部分的二进制公共符号。公共符号一般包含界说一切的函数,静态和全局变量。他们还供给了一个符号服务器,以便调试器能够查询二进制文件中正确的符号。树立符号最简略的办法是设置“_NT_SYMBOL_PATH”环境变量。这是WinDbg和其他程序,如IDA,规范的查询符号途径的环境变量。您能够运用它衔接到Microsoft符号服务器以及缓存本地符号途径:c:symbols。本地缓存加快后来的符号拜访:
srv*c:symbols*http://msdl.microsoft.com/download/symbols
一旦符号途径设置,从头发动WinDbg,将会正确地设置新的符号途径。你能够在WinDbg中键入“. sympath”承认它正在运用的符号途径。在这一点上,你能够运转指令“.reload -f”,这将迫使的方针体系下载一切的符号,并且为每个模块缓存并加载。
0×03开端运用一些根本的调试指令
WinDbg是一个强壮的东西,但关于没调试过的人来说不是特别人性化。它供给了很多的可用指令,一些常见的指令仍是值得查看的。这里是具体的指令列表,协助指令是“.hh ”。咱们将经过WinDbg调试体系调用的根本函数。下面均是在Windows 7 64位体系下完结的。
首要,让咱们来看看有哪些模块是加载在当时方针体系上。假如你的符号设置正确你就能够履行你的第一个WinDbg的指令。运用“lm”(列表模块)指令,你应该看到这是当时加载的模块列表。你应该看到模块称号,并看到被加载的地址信息。这是从我的虚拟机中的截取的列表。
上述列表中“NT”模块比较风趣。这是Windows内核履行模块的姓名。该模块是Windows内核主功用区,它担任I / O,目标办理,安全和进程办理。咱们在用另一个指令深化到内核中,查看它的导出函数。WinDbg的指令“X”(查看)查询一个给定模块的符号。它能够被调用为“模块> !符号>”,并承受通配符。一切可拜访的体系调用都是先从字母NT开端。咱们用“X NT !NT *File*指令列出进行文件操作相关的体系调用的列表。
返回值是坐落内存中的函数名。咱们用“U”(反汇编)看看其间一个内存中的函数。“U”指令需求一个内存地址,该地址是内存中函数的地址,返回值是该函数的反汇编函数。咱们能够运用内存地址反汇编NtCreateFile函数,Windbg会解析为咱们解析该处的地址:
假如你想反汇编整个函数,那么能够运用“uf”反汇编指令。现在,咱们能够测验在NtCreateFile上下一个断点,来查看一些函数。增加断点指令是“bp”,它也需求一个存储器地址(或一个有用符号)作为参数。一旦设置断点并运用“g”持续履行,不久便在断点处断下:
[1] [2] 黑客接单网