如何使用windbg查看内核函数的汇编代码?

逆向工程 风袋 核心
2021-06-18 10:32:04

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

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()