我正在使用windbg进行本地内核调试。我想查看内核函数的反汇编(例如AuxKlibQueryModuleInformation)。我不熟悉内核调试。请帮我做。

#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