Windows内核调试初探

本文将对Windows平台下的内核调试进行简单探讨

1. 准备和设置虚拟机

为了进行内核调试,我们准备一个虚拟机(此处为Win7 x64)。
在 VMVare 中进入该虚拟机的设置,在硬件中添加 串行端口(选择使用命名的管道 “\.\pipe\com_1”)
此处必须确保硬件下有 “串行端口” 项,而不是 “串行端口 2” (若为 “串行端口 2”,将打印机和该端口删除,重新添加 串行端口)

2. 命令行调起Windbg连接虚拟机进行调试

进入windbg.exe目录
C:\Program Files (x86)\Debugging Tools for Windows (x86)>
C:\Program Files (x86)\Debugging Tools for Windows (x86)>windbg -k com:pipe,port=\.\pipe\com_1
当调起windbg.exe并且出现 Kernel Debugger connection established. 提示时,可以按Ctrl+Break,此时可以暂且认为是Windows系统的最早的内核调试起点,有兴趣可以解 Phare One 过程(http://www.theitcareer.com/site/?p=28)

3.1 查看记事本信息

在虚拟机上打开记事本(notepad.exe),点击 帮助->关于记事本

3.2 在 windbg 中观察这一过程

在 Windbg 中 Break(Ctrl+Break)
此时要加载microsoft的符号(详见之前的介绍文章 WinDbg工具)
Ctrl+S
srvf:\mysymbolshttp://msdl.microsoft.com/download/symbols;cache*f:\mysymbols

3.2.1 找出记事本进程

枚举所有进程,在 windbg 中输入以下语句

!process 0 0

结果截取一部分如下:

PROCESS fffffa801a8b1b30
SessionId: 1 Cid: 025c Peb: fffdf000 ParentCid: 0b28
DirBase: 47098000 ObjectTable: 00000000 HandleCount: 0.
Image: et.exe
PROCESS fffffa801abaf130
SessionId: 1 Cid: 062c Peb: 7efdf000 ParentCid: 025c
DirBase: 3eeb3000 ObjectTable: fffff8a001fd62c0 HandleCount: 6.
Image: kcrashdumper.exe
PROCESS fffffa801abf5530
SessionId: 1 Cid: 0980 Peb: 7efdf000 ParentCid: 04d0
DirBase: 39fb5000 ObjectTable: fffff8a0025eca40 HandleCount: 68.
Image: notepad.exe
PROCESS fffffa8018e3c890
SessionId: 1 Cid: 08d0 Peb: 7fffffdc000 ParentCid: 03b8
DirBase: 385e7000 ObjectTable: fffff8a002d1e2e0 HandleCount: 82.
Image: taskeng.exe

找出记事本进程的地址,这里我们看到是 0xfffffa801abf5530(注意前面的0x也是需要的),此处为方便,该地址记为

AOTP(address_of_target_process)

(内核里的地址要比之前我们看到的长很多呢,内核这边地址均高于 fffff800 00000000)

3.2.2 将记事本进程放到内存中

因为操作系统会将不常用的东西放在虚拟内存中,而将常用的部分放在内存,CPU无法对虚拟内存的东西进行直接访问

输入以下命令将进程内容放回到内存中(AOTP见上文):

.process /p AOTP

结果如下:

Implicit process is now fffffa80`1abf5530
.cache forcedecodeuser done

查看记事本进程的堆栈及其它信息
输入以下命令:

!process AOTP

结果如下:

PROCESS fffffa801abf5530
SessionId: 1 Cid: 0980 Peb: 7efdf000 ParentCid: 04d0
DirBase: 39fb5000 ObjectTable: fffff8a0025eca40 HandleCount: 68.
Image: notepad.exe
VadRoot fffffa801a8418f0 Vads 75 Clone 0 Private 277. Modified 2. Locked 0.
DeviceMap fffff8a0038661e0
Token fffff8a002536060
ElapsedTime 02:57:21.333
UserTime 00:00:00.000
KernelTime 00:00:00.000
QuotaPoolUsage[PagedPool] 0
QuotaPoolUsage[NonPagedPool] 0
Working Set Sizes (now,min,max) (2292, 50, 345) (9168KB, 200KB, 1380KB)
PeakWorkingSetSize 2293
VirtualSize 83 Mb
PeakVirtualSize 83 Mb
PageFaultCount 2473
MemoryPriority BACKGROUND
BasePriority 8
CommitCharge 352
.
THREAD fffffa801abf17a0 Cid 0980.0520 Teb: 000000007efdb000 Win32Thread: fffff900c2c8dc30 WAIT: (WrUserRequest) UserMode Non-Alertable
fffffa801a8442e0 SynchronizationEvent
Not impersonating
DeviceMap fffff8a0038661e0
Owning Process fffffa801abf5530 Image: notepad.exe
Attached Process N/A Image: N/A
Wait Start TickCount 82166 Ticks: 2 (0:00:00:00.031)
Context Switch Count 17053 LargeStack
UserTime 00:00:00.000
KernelTime 00:00:00.156
Win32 Start Address 0x0000000000c73689
Stack Init fffff88003912c70 Current fffff88003912730
Base fffff88003913000 Limit fffff88003909000 Call 0
Priority 12 BasePriority 8 UnusualBoost 0 ForegroundBoost 2 IoPriority 2 PagePriority 5
Child-SP RetAddr : Args to Child : Call Site
fffff88003912770 fffff80003eea992 : fffff900c0842f30 fffffa801abf17a0 0000000000001101 0000000000000008 : nt!KiSwapContext+0x7a
fffff880039128b0 fffff80003eed1af : 0000000000000000 000000007efdb000 fffff88000000000 0000000000000000 : nt!KiCommitThreadWait+0x1d2
fffff88003912940 fffff960000db837 : fffff900c2c8dc00 000000000000000d 0000000001040001 fffff96000066500 : nt!KeWaitForSingleObject+0x19f
fffff880039129e0 fffff960000db8d1 : 0000000000000000 0000000000000000 0000000000000001 0000000000000000 : win32k!xxxRealSleepThread+0x257
fffff88003912a80 fffff960000ee4d2 : 0000000075f6f5be fffff88003912b60 fffff960000ee48c fffff960000ee48c : win32k!xxxSleepThread+0x59
fffff88003912ab0 fffff80003ee48d3 : fffffa801abf17a0 0000000000000000 000000000033fb90 0000000000000020 : win32k!NtUserWaitMessage+0x46
fffff88003912ae0 0000000074e52e09 : 0000000074e52dbf 0000000075f50735 0000000074ec0023 0000000000000246 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffff88003912ae0) 000000000022e4a8 0000000074e52dbf : 0000000075f50735 0000000074ec0023 0000000000000246 000000000012f980 : 0x74e52e09 000000000022e4b0 0000000075f50735 : 0000000074ec0023 0000000000000246 000000000012f980 000000000022002b : 0x74e52dbf 000000000022e4b8 0000000074ec0023 : 0000000000000246 000000000012f980 000000000022002b 0000000000390008 : 0x75f50735 000000000022e4c0 0000000000000246 : 000000000012f980 000000000022002b 0000000000390008 0000000000000000 : 0x74ec0023 000000000022e4c8 000000000012f980 : 000000000022002b 0000000000390008 0000000000000000 0000000000000000 : 0x246 000000000022e4d0 000000000022002b : 0000000000390008 0000000000000000 0000000000000000 000000000012fa68 : 0x12f980 000000000022e4d8 0000000000390008 : 0000000000000000 0000000000000000 000000000012fa68 0000000000000030 : 0x22002b 000000000022e4e0 0000000000000000 : 0000000000000000 000000000012fa68 0000000000000030 00000000`00000000 : 0x390008

注意观察以下两行

fffff88003912ae0 0000000074e52e09 : 0000000074e52dbf 0000000075f50735 0000000074ec0023 0000000000000246 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffff88003912ae0) 000000000022e4a8 0000000074e52dbf : 0000000075f50735 0000000074ec0023 0000000000000246 00000000`0012f980 : 0x74e52e09

这里是从用户态的代码转至内核态的代码,这里用户态的看不到是因为我们没有加载记事本的 pdb。

4. 结语

至此,我们只是简单的看了一下记事本的部分堆栈,算是内核调试的一个小开端。若我们有记事本的pdb,就可以很自然地下断点,开始内核模式下的用户态调试了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值