#1 楼
1)您应该知道本地内核调试不是实际的内核调试2)我希望您在使用本地内核调试功能之前已在bcdecdit的switch上启用了/ debug <3 />我希望您知道可以使用不需要在开关上设置/ debug的第三方应用程序
sysinternals livekd
我希望您已使用推荐的方法之一正确设置了用于下载符号的符号路径就像设置环境变量_NT_SYMBOL_PATH
一样简单,只需运行windbg-> file->内核调试-> local
或从命令行运行windbg -kl
issue .reload / f,以便windbg将所需的符号文件aka pdbs下载到您已在_NT_SYMBOL_PATH中设置的目录中。
现在您可以使用
x
命令检查所需的符号了。 /> x *!*aux*
其中x是命令
*之前的*! (在windbg中称为bang)是模块名称
后加*的通配符! (在windbg中称为bang)是部分符号名称匹配项的通配符
,并且windbg将为您显示部分查找的符号的所有匹配项,如下所示
kd> x *!*auxklib*
81f35962 hidusb!AuxKlibGetBugCheckData (<no parameter info>)
81f38dfe hidusb!AuxKlibQueryModuleInformation (<no parameter info>)
81f38dac hidusb!AuxKlibInitialize (<no parameter info>)
81f45bc0 HIDCLASS!AuxKlibGetBugCheckData (<no parameter info>)
81f4ace6 HIDCLASS!AuxKlibQueryModuleInformation (<no parameter info>) <<<<<<<<<<<<<
81f4ac94 HIDCLASS!AuxKlibInitialize (<no parameter info>)
81f5a696 kbdhid!AuxKlibGetBugCheckData (<no parameter info>)
81f5dfcc kbdhid!AuxKlibQueryModuleInformation (<no parameter info>) <<<<<<<<<<<<<
81f5df7a kbdhid!AuxKlibInitialize (<no parameter info>)
81f66612 mouhid!AuxKlibGetBugCheckData (<no parameter info>)
81f69e52 mouhid!AuxKlibQueryModuleInformation (<no parameter info>) <<<<<<<<<<<<<<<<<
81f69e00 mouhid!AuxKlibInitialize (<no parameter info>)
88c66ff6 Wdf01000!AuxKlibGetBugCheckData (<no parameter info>)
88c79686 Wdf01000!AuxKlibQueryModuleInformation (<no parameter info>) <<<<<<<<<<<<<<<<<<
88c79634 Wdf01000!AuxKlibInitialize (<no parameter info>)
88c8b418 WDFLDR!AuxKlibQueryModuleInformation (<no parameter info>) <<<<<<<<<<<<<
88c8b3c6 WDFLDR!AuxKlibInitialize (<no parameter info>)
8957e926 cdrom!AuxKlibGetBugCheckData (<no parameter info>)
8958949c cdrom!AuxKlibQueryModuleInformation (<no parameter info>)
<<<<<
8958944b cdrom!AuxKlibInitialize (<no parameter info>)
8f5af972 i8042prt!AuxKlibGetBugCheckData (<no parameter info>)
8f5b51ae i8042prt!AuxKlibQueryModuleInformation (<no parameter info>)
8f5b515d i8042prt!AuxKlibInitialize (<no parameter info>)
8f5c291c kbdclass!AuxKlibGetBugCheckData (<no parameter info>)
8f5c701a kbdclass!AuxKlibQueryModuleInformation (<no parameter info>)
8f5c6fc8 kbdclass!AuxKlibInitialize (<no parameter info>)
8f5d46b0 mouclass!AuxKlibGetBugCheckData (<no parameter info>)
8f5d8da4 mouclass!AuxKlibQueryModuleInformation (<no parameter info>)
8f5d8d52 mouclass!AuxKlibInitialize (<no parameter info>)
903f4420 igdkmd32!AuxKlibGetImageExportDirectory (<no parameter info>)
903f43ca igdkmd32!AuxKlibGetBugCheckData (<no parameter info>)
907169cc igdkmd32!AuxKlibQueryModuleInformation (<no parameter info>)
90716980 igdkmd32!AuxKlibInitialize (<no parameter info>)
9aafd0df srv2!AuxKlibQueryModuleInformation (<no parameter info>)
9aafd08e srv2!AuxKlibInitialize (<no parameter info>)
kd>
由于AuxKlibQueryModuleInformation是在许多模块中实现的,因此它必须是某种函数的包装,需要通过反汇编每个函数(可能是系统调用)来确定该函数。uf / c命令可以反汇编一个完整的函数,并显示哪些子函数称为
如果您使用的是最新的windbg,则可以编写JavaScript来反汇编每个函数,并在所有函数中使用grep进行通用调用
这是一个示例Javascript,您可以即兴使用
function exec ( cmdstr ) {
return host.namespace.Debugger.Utility.Control.ExecuteCommand( cmdstr );
}
function log( instr ){
host.diagnostics.debugLog( instr + "\n" );
}
function auximpl() {
var auxkqmi = exec( "x /0 *!*auxklibquerymod*" )
for ( var line of auxkqmi ) {
disfun = exec( "uf /c " + line )
curline = ""
for ( var a of disfun ) {
if( ! ( a.includes( "Zw" ) ) ) {
curline = a
}
else {
log( a + "\t@\t" + curline )
var pstart = (curline.lastIndexOf("(") + 1 )
var pend = pstart + 8
var prevstr = "ub " + curline.substring( pstart,pend ) + " l1"
var nextstr = "u " + curline.substring( pstart,pend ) + " l1"
var previnst = exec ( prevstr )
var nextinst = exec ( nextstr )
for ( var [b,c] of [previnst , nextinst] ) {
log ( b )
log ( c )
}
}
}
}
}
结果将如下所示
kd> dx @$scriptContents.auximpl()
call to nt!ZwQuerySystemInformation (8286623c) @ Wdf01000!AuxKlibQueryModuleInformation+0x8c (87218712):
Wdf01000!AuxKlibQueryModuleInformation+0x8a:
87218710 6a0b push 0Bh
Wdf01000!AuxKlibQueryModuleInformation+0x8c:
87218712 ff15b8722087 call dword ptr [Wdf01000!_imp__ZwQuerySystemInformation (872072b8)]
call to nt!ZwQuerySystemInformation (8286623c) @ WDFLDR!AuxKlibQueryModuleInformation+0x8c (8722a4a4):
WDFLDR!AuxKlibQueryModuleInformation+0x8a:
8722a4a2 6a0b push 0Bh
WDFLDR!AuxKlibQueryModuleInformation+0x8c:
8722a4a4 ff157c802287 call dword ptr [WDFLDR!_imp__ZwQuerySystemInformation (8722807c)]
call to nt!ZwQuerySystemInformation (8286623c) @ cdrom!AuxKlibQueryModuleInformation+0x8c (87ad1528):
cdrom!AuxKlibQueryModuleInformation+0x8a:
87ad1526 6a0b push 0Bh
cdrom!AuxKlibQueryModuleInformation+0x8c:
87ad1528 ff150871ac87 call dword ptr [cdrom!_imp__ZwQuerySystemInformation (87ac7108)]
call to nt!ZwQuerySystemInformation (8286623c) @ i8042prt!AuxKlibQueryModuleInformation+0x8c (8d4d323a):
i8042prt!AuxKlibQueryModuleInformation+0x8a:
8d4d3238 6a0b push 0Bh
i8042prt!AuxKlibQueryModuleInformation+0x8c:
8d4d323a ff1574e14c8d call dword ptr [i8042prt!_imp__ZwQuerySystemInformation (8d4ce174)]
call to nt!ZwQuerySystemInformation (8286623c) @ kbdclass!AuxKlibQueryModuleInformation+0x8c (8d4e50a6):
kbdclass!AuxKlibQueryModuleInformation+0x8a:
8d4e50a4 6a0b push 0Bh
kbdclass!AuxKlibQueryModuleInformation+0x8c:
8d4e50a6 ff152c114e8d call dword ptr [kbdclass!_imp__ZwQuerySystemInformation (8d4e112c)]
call to nt!ZwQuerySystemInformation (8286623c) @ mouclass!AuxKlibQueryModuleInformation+0x8c (8d4f1e30):
mouclass!AuxKlibQueryModuleInformation+0x8a:
8d4f1e2e 6a0b push 0Bh
mouclass!AuxKlibQueryModuleInformation+0x8c:
8d4f1e30 ff1524e14e8d call dword ptr [mouclass!_imp__ZwQuerySystemInformation (8d4ee124)]
call to nt!ZwQuerySystemInformation (8286623c) @ srv2!AuxKlibQueryModuleInformation+0x8c (90d1c16b):
srv2!AuxKlibQueryModuleInformation+0x8a:
90d1c169 6a0b push 0Bh
srv2!AuxKlibQueryModuleInformation+0x8c:
90d1c16b ff150c63d190 call dword ptr [srv2!_imp__ZwQuerySystemInformation (90d1630c)]
@$scriptContents.auximpl()
评论
也许您可以解释有关“实时”内核调试与内存转储的第一点。
– Biswapriyo
19 Mar 7 '19 at 6:03
调试物理机需要两台计算机或一台物理机以及一台具有实时内核调试的vm(两台计算机),您可以逐步调试,设置断点,编辑内存等,而使用本地内核调试则要检查本地计算机的状态它不需要两台计算机,如果您有一个5个小时前开始的会话,并且同时在本地计算机上创建了十个其他进程,则数据可能是过时的,而本地内核调试不会显示启动后创建的进程本地内核调试等等等
– blabb
19 Mar 7 '19 at 6:40
考虑到Winternals(该公司)于2006年被Microsoft收购,而Mark Russinovich是Microsoft的技术研究员,因此不会将livekd称为第三方应用程序。
– 0xC0000022L♦
19年8月8日在21:53
子公司,姐妹/女儿关系,附属公司,无论要点是什么,仍然作为sysinternals产品而不是©Microsoft®Corporation
– blabb
19 Mar 9 '19 at 6:50