我正在使用 windbg 进行本地内核调试。我想查看内核函数的反汇编(例如 AuxKlibQueryModuleInformation)。我对内核调试不熟悉。请帮我做这件事。
如何使用windbg查看内核函数的汇编代码?
逆向工程
风袋
核心
2021-06-18 10:32:04
1个回答
1) 您应该知道本地内核调试不是实际的内核调试
2) 我希望您在使用本地内核调试功能之前已在 bcdcdit 中启用 /debug 开关
3) 我希望您知道第三方应用程序可用但不需要在开关上设置/调试
系统内部livekd
我希望您使用推荐的方法之一正确设置了用于下载符号的符号路径,例如设置环境变量 _NT_SYMBOL_PATH
用法很简单只要运行windbg ->file->kernel debugging-> local
或从命令行 windbg -kl
发出.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()
其它你可能感兴趣的问题