windbg符号链接的问题.还有KeServiceDescriptorTableShadow内存块查找时问号的情况

本文详细介绍使用Windbg进行系统级调试的过程,包括配置符号路径、加载符号文件、查看影子表等关键步骤,并分享了作者的实际调试经验和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近配置windbg比较郁闷,搞了几天才搞定,自己的经验希望能帮助大家.也方便自己以后查阅

首先介绍几个命令:

lm 列出加载模块信息 如下

0: kd> lm
start    end        module name
80800000 80a28000   nt         (export symbols)       ntkrnlmp.exe


Unloaded modules:
f58aa000 f58d5000   kmixer.sys
f7da6000 f7da7000   drmkaud.sys
f5a6d000 f5a7a000   DMusic.sys
f58d5000 f58f8000   aec.sys 
f5a8d000 f5a9b000   swmidi.sys
f7c15000 f7c17000   splitter.sys
f7853000 f785e000   imapi.sys
f7833000 f783c000   HIDCLASS.SYS
f74ef000 f74f2000   HidUsb.sys
f7ba7000 f7bab000   KbdHid.sys
f79cb000 f79d0000   usbohci.sys
f79c3000 f79c8000   Cdaudio.SYS
f7b9f000 f7ba2000   Sfloppy.SYS


!sym noisy 开启详细调试信息

0: kd> !sym noisy
noisy mode - symbol prompts on


然后配置路径加载驱动符号:

 打开文件->符号文件路径->添加你的文件路径.可以在微软网站下载符号(建议全部下载脱机情况下也能用)http://msdn.microsoft.com/enus/windows/hardware/gg463028

设置好路径加载 输入  .reload  加载符号 

bf800000 bf9c5e80   win32k   T (no symbols)        //- 妈的win32k.sys没有加载

强制运行 .reload /f win32k.sys //- /f选项强制加载也不成


搜了下往上资料设置网络自动下载路径:  

打开文件->符号文件路径->添加你的文件路径用分号和之的路径分隔开SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols 

若发现符号不能自动下载说明你的windbg版本和你现在使用的系统版本不符(http://msdn.microsoft.com/en-US/windows/hardware/hh852360)这个网站下载windbg 注意这里面不只是windbg而已,而且包括源文件和一些相关的工具

比较大。我们重新加载之.  若发现c:\MyLocalSymbols文件下多了很多文件说明下载成功.我们开下加载情况

若发现其中只加载了部分符号 其他显示为deferred  我们可以用  .reload /i

start    end        module name
80800000 80a28000   nt         (pdb symbols)          d:\symbols\exe\ntkrnlmp.pdb
80a28000 80a48d00   hal        (pdb symbols)          d:\symbols\dll\halmacpi.pdb
bf000000 bf011600   dxg        (pdb symbols)          d:\symbols\sys\dxg.pdb
bf012000 bf026b80   vmx_fb   T (no symbols)           
bf800000 bf9c5e80   win32k     (pdb symbols)          c:\mylocalsymbols\win32k.pdb\CC2837A766214B4A86F05D51DC8EC5302\win32k.pdb
f548c000 f54cca80   HTTP       (pdb symbols)          d:\symbols\sys\http.pdb
f55e5000 f563c600   srv        (pdb symbols)          c:\mylocalsymbols\srv.pdb\B71D43221C284A288535837C8BDEA3302\srv.pdb
f56dd000 f5725e80   sogounetopt   (no symbols)           
f58f8000 f590c480   wdmaud     (pdb symbols)          d:\symbols\sys\wdmaud.pdb
f59d5000 f59ec780   hgfs       (no symbols)           
f5a09000 f5a0b500   ProtectorA   (no symbols)           
f5a9d000 f5aabd80   sysaudio   (pdb symbols)          d:\symbols\sys\sysaudio.pdb
f5c81000 f5c84900   ndisuio    (pdb symbols)          d:\symbols\sys\ndisuio.pdb
f5d5d000 f5d74900   dump_atapi   (pdb symbols)          d:\symbols\sys\atapi.pdb
f5d9d000 f5dc3000   BAPIDRV    (no symbols)           
f5dc3000 f5e32c80   mrxsmb     (pdb symbols)          c:\mylocalsymbols\mrxsmb.pdb\8BBCE1B6ABFA41FBA89E2F1C45B4E0A52\mrxsmb.pdb
f5e33000 f5e65b00   qutmdrv    (no symbols)           
f5e8e000 f5eb8e80   rdbss      (pdb symbols)          d:\symbols\sys\rdbss.pdb
f5eb9000 f5edad00   afd        (pdb symbols)          c:\mylocalsymbols\afd.pdb\0975A36674EA47B7A3C42DEC1731798F2\afd.pdb

发现win32k加载成功了 


我们继续找影子表的内容:

0: kd> dd KeServiceDescriptortableShadow
8088b4e0  8080d8a0 00000000 0000011c 8083a0bc
8088b4f0  bf99ce00 00000000 0000029b bf99db10
8088b500  00000000 00000000 00000000 00000000
8088b510  00000000 00000000 00000000 00000000
8088b520  8080d8a0 00000000 0000011c 8083a0bc
8088b530  00000000 00000000 00000000 00000000
8088b540  00000000 00000000 00000000 00000000
8088b550  00000000 00000000 00000000 00000000


bf99ce00 为影子表的地址:

我们继续查看下:

0: kd> dd bf99ce00
bf99ce00  ???????? ???????? ???????? ????????
bf99ce10  ???????? ???????? ???????? ????????
bf99ce20  ???????? ???????? ???????? ????????
bf99ce30  ???????? ???????? ???????? ????????
bf99ce40  ???????? ???????? ???????? ????????
bf99ce50  ???????? ???????? ???????? ????????
bf99ce60  ???????? ???????? ???????? ????????

bf99ce70  ???????? ???????? ???????? ????????


我们在用户态下给他下个断点: bp NtUserPostMessage 

0: kd> bp NtUserPostMessage
WARNING: Software breakpoints on session addresses can cause bugchecks.
Use hardware execution breakpoints (ba e) if possible.

告诉会引起bug 有可能的话让我们用硬件断点。不你妈管了 F5跑起来 ,在虚拟机上开个我的电脑断下来继续查看


1: kd> dd bf99ce00
bf99ce00  bf939134 bf94a6a7 bf86febb bf942269
bf99ce10  bf94bcbe bf9393c8 bf93946d bf831689
bf99ce20  bf94b5e5 bf937533 bf94bbdd bf910121
bf99ce30  bf8ff4d3 bf80992d bf94baaf bf94d2ab
bf99ce40  bf8fddd0 bf876f9c bf94bb8d bf94d3de
bf99ce50  bf81c82c bf8e5895 bf8ac916 bf85a039
bf99ce60  bf91135c bf80e2e8 bf8e553d bf94d0a3
bf99ce70  bf94dfae bf813a94 bf80c889 bf8da236

终于大功告成了!








本实例由VS2008开发,在提供了一套驱动开发框架的同,又演示了如何获取Shadow SSDT表函数原始地址的办法。 主要函数:ULONG GetShadowSSDT_Function_OriAddr(ULONG index); 原理说明: 根据特征码搜索导出函数KeAddSystemServiceTable来获取Shadow SSDT基址,以及通过ZwQuerySystemInformation()函数获取win32k.sys基址,然后解析PE定位到Shadow SSDT在win32k.sys的偏移地址,并通过进一步计算来得到Shadow SSDT表函数的原始地址。 这里只测试了三个函数:(460)NtUserMessageCall、(475)NtUserPostMessage和(502)NtUserSendInput,具体使用可以举一反三,网上完整的源代码实例并不太多,希望可以帮到真正有需要的朋友。 系统环境: 在WinXP SP3系统 + 瑞星杀毒软件 打印输出: [ LemonInfo : Loading Shadow SSDT Original Address Driver... ] [ LemonInfo : 创建“设备”值为:0 ] [ LemonInfo : 创建“设备”成功... ] [ LemonInfo : 创建“符号链接”状态值为:0 ] [ LemonInfo : 创建“符号链接”成功... ] [ LemonInfo : 驱动加载成功... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 开始... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP Enter IRP_MJ_DEVICE_CONTROL... ] [ LemonInfo : 获取ShadowSSDT表 (460)NtUserMessageCall 函数的“当前地址”为:0xB83ECFC4,“起源地址”为:0xBF80EE6B ] [ LemonInfo : 获取ShadowSSDT表 (475)NtUserPostMessage 函数的“当前地址”为:0xB83ECFA3,“起源地址”为:0xBF8089B4 ] [ LemonInfo : 获取ShadowSSDT表 (502)NtUserSendInput 函数的“当前地址”为:0xBF8C31E7,“起源地址”为:0xBF8C31E7 ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP_MJ_DEVICE_CONTROL 成功执行... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 结束... ] [ LemonInfo : UnLoading Shadow SSDT Original Address Driver... ] [ LemonInfo : 删除“符号链接”成功... ] [ LemonInfo : 删除“设备”成功... ] [ LemonInfo : 驱动卸载成功... ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值