概述
本文将对Windows平台下的内核调试进行简单探讨
1. 准备和设置虚拟机
为了进行内核调试,我们准备一个虚拟机(此处为Win7 x64)。
在 VMVare 中进入该虚拟机的设置,在硬件中添加 串行端口(选择使用命名的管道 “.pipecom_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=.pipecom_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 fffff800
03eea992 : fffff900c0842f30 fffffa80
1abf17a0 0000000000001101 00000000
00000008 : nt!KiSwapContext+0x7a
fffff880039128b0 fffff800
03eed1af : 0000000000000000 00000000
7efdb000 fffff88000000000 00000000
00000000 : nt!KiCommitThreadWait+0x1d2
fffff88003912940 fffff960
000db837 : fffff900c2c8dc00 00000000
0000000d 0000000001040001 fffff960
00066500 : nt!KeWaitForSingleObject+0x19f
fffff880039129e0 fffff960
000db8d1 : 0000000000000000 00000000
00000000 0000000000000001 00000000
00000000 : win32k!xxxRealSleepThread+0x257
fffff88003912a80 fffff960
000ee4d2 : 0000000075f6f5be fffff880
03912b60 fffff960000ee48c fffff960
000ee48c : win32k!xxxSleepThread+0x59
fffff88003912ab0 fffff800
03ee48d3 : fffffa801abf17a0 00000000
00000000 000000000033fb90 00000000
00000020 : win32k!NtUserWaitMessage+0x46
fffff88003912ae0 00000000
74e52e09 : 0000000074e52dbf 00000000
75f50735 0000000074ec0023 00000000
00000246 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffff88003912ae0) 00000000
0022e4a8 0000000074e52dbf : 00000000
75f50735 0000000074ec0023 00000000
00000246 000000000012f980 : 0x74e52e09 00000000
0022e4b0 0000000075f50735 : 00000000
74ec0023 0000000000000246 00000000
0012f980 000000000022002b : 0x74e52dbf 00000000
0022e4b8 0000000074ec0023 : 00000000
00000246 000000000012f980 00000000
0022002b 0000000000390008 : 0x75f50735 00000000
0022e4c0 0000000000000246 : 00000000
0012f980 000000000022002b 00000000
00390008 0000000000000000 : 0x74ec0023 00000000
0022e4c8 000000000012f980 : 00000000
0022002b 0000000000390008 00000000
00000000 0000000000000000 : 0x246 00000000
0022e4d0 000000000022002b : 00000000
00390008 0000000000000000 00000000
00000000 000000000012fa68 : 0x12f980 00000000
0022e4d8 0000000000390008 : 00000000
00000000 0000000000000000 00000000
0012fa68 0000000000000030 : 0x22002b 00000000
0022e4e0 0000000000000000 : 00000000
00000000 000000000012fa68 00000000
00000030 00000000`00000000 : 0x390008
注意观察以下两行
fffff880
03912ae0 00000000
74e52e09 : 0000000074e52dbf 00000000
75f50735 0000000074ec0023 00000000
00000246 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffff88003912ae0) 00000000
0022e4a8 0000000074e52dbf : 00000000
75f50735 0000000074ec0023 00000000
00000246 00000000`0012f980 : 0x74e52e09
这里是从用户态的代码转至内核态的代码,这里用户态的看不到是因为我们没有加载记事本的 pdb。
4. 结语
至此,我们只是简单的看了一下记事本的部分堆栈,算是内核调试的一个小开端。若我们有记事本的pdb,就可以很自然地下断点,开始内核模式下的用户态调试了。
最后
以上就是如意夏天为你收集整理的Windows内核调试初探的全部内容,希望文章能够帮你解决Windows内核调试初探所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复