Visual studio 2010 从内核调试模式调试dll和sys

Visual studio 2010 从内核调试模式调试dll和sys,visual-studio-2010,windbg,windows-kernel,Visual Studio 2010,Windbg,Windows Kernel,我需要中断已经加载的dll函数。我该怎么做?我试过以下的方法。 dll名称:test.dll 函数名称:allocate() 我正在使用windbg,试图调试内核驱动程序。在进行内核调试时,我还需要分解一些用户空间的dll函数,我有这些函数的代码。如何才能做到这一点?在设备驱动程序代码(.sys)中设置断点很容易,因为加载的驱动程序总是映射到系统内存空间。进程用户空间中的断点是另一回事,因为用户空间中的特定内存范围可能会被调出,或者可能会映射到多个进程的用户空间(例如,共享系统DLL) 仍然可以

我需要中断已经加载的dll函数。我该怎么做?我试过以下的方法。 dll名称:test.dll 函数名称:allocate()


我正在使用windbg,试图调试内核驱动程序。在进行内核调试时,我还需要分解一些用户空间的dll函数,我有这些函数的代码。如何才能做到这一点?

在设备驱动程序代码(.sys)中设置断点很容易,因为加载的驱动程序总是映射到系统内存空间。进程用户空间中的断点是另一回事,因为用户空间中的特定内存范围可能会被调出,或者可能会映射到多个进程的用户空间(例如,共享系统DLL)

仍然可以在用户空间中设置断点。您必须使用
.process
命令的侵入式调试(/i)选项,如中所述。完成后,命令
bp/p
将开始工作,允许您在流程用户空间中设置断点:

.process /i My_EPROCESS_block_address
g  $ <-- this command will break in few seconds
bp /p My_EPROCESS_block_address MyDll!MyFunction
.process/i我的\u e进程\u块\u地址
g$
位于内核调试器内部,可以执行用户模式调试器命令)
  • 要从用户模式调试器切换到内核模式调试器,请键入
    。breakin
  • 要返回到用户模式调试器,请在内核模式提示符下键入
    g

  • 这工作起来容易得多,所有调试器扩展都按预期工作。

    在设备驱动程序代码(.sys)中设置断点很容易,因为加载的驱动程序总是映射到系统内存空间。进程用户空间中的断点是另一回事,因为用户空间中的特定内存范围可能会被调出,或者可能会映射到多个进程的用户空间(例如,共享系统DLL)

    仍然可以在用户空间中设置断点。您必须使用
    .process
    命令的侵入式调试(/i)选项,如中所述。完成后,命令
    bp/p
    将开始工作,允许您在流程用户空间中设置断点:

    .process /i My_EPROCESS_block_address
    g  $ <-- this command will break in few seconds
    bp /p My_EPROCESS_block_address MyDll!MyFunction
    
    .process/i我的\u e进程\u块\u地址
    g$
    位于内核调试器内部,可以执行用户模式调试器命令)
  • 要从用户模式调试器切换到内核模式调试器,请键入
    。breakin
  • 要返回到用户模式调试器,请在内核模式提示符下键入
    g

  • 这工作起来容易得多,并且所有调试器扩展都能按预期工作。

    如果代码中有代码喷洒,那么u debugbreak()将使代码在正确的位置中断

    主机
    OS xpsp3
    32位处理器上运行

    guest
    OSXP64
    在QEMU内部运行
    
    主机上的调试器
    32位windbg

    使用vs2k10express和7.1 psdk工具集编译为
    x64

    预编译目录内容

    :dir /b
    compile.bat
    dbgbrk.cpp
    
    来源

    :type dbgbrk.cpp
    #include <stdio.h>
    #include <intrin.h>
    #include <windows.h>
    #define DBGBRK //comment this out to remove dbgspew
    #ifdef DBGBRK
    //using .ocommand mycommand in usermode windbg stacktrace will be printed out on break
    #define DBRK  OutputDebugString("mycommand kb;"); __debugbreak();
    #else
    #define DBRK
    #endif
    
    int main (void)
    {
        printf("hello we are debugging\n");
        DBRK
        printf("we broke in kd above\n");
        DBRK
        return 0;
    }
    
    执行可执行文件会立即中断kd

    kd> .lastevent
    Last event: Break instruction exception - code 80000003 (first chance)
      debugger time: Wed Jan 14 17:36:00.937 2015 
    kd> lsa .
        10: 
        11: int main (void)
        12: {
        13:     printf("hello we are debugging\n");
    >   14:     DBRK
        15:     printf("we broke in kd above\n");
        16:     DBRK
        17:     return 0;
        18: }
    
    kd> uf @rip
    dbgbrk!main+0x1d [dbgbrk.cpp @ 14]:
       14 00000001`4000101d cc              int     3
       15 00000001`4000101e 488d0df3120100  lea     rcx,[dbgbrk!__xt_z+0x50 (00000001`40012318)]
       15 00000001`40001025 e816000000      call    dbgbrk!printf (00000001`40001040)
       16 00000001`4000102a 488d0dff120100  lea     rcx,[dbgbrk!__xt_z+0x68 (00000001`40012330)]
       16 00000001`40001031 ff15c90f0100    call    qword ptr [dbgbrk!_imp_OutputDebugStringA (00000001`40012000)]
       16 00000001`40001037 cc              int     3
       17 00000001`40001038 33c0            xor     eax,eax
       18 00000001`4000103a 4883c428        add     rsp,28h
       18 00000001`4000103e c3              ret
    kd> !dbgprint
    
    mycommand kb;mycommand kb;
    

    如果您有代码喷洒,代码中的_debugbreak()将使您的代码在正确的位置插入kd

    主机
    OS xpsp3
    32位处理器上运行

    guest
    OSXP64
    在QEMU内部运行
    
    主机上的调试器
    32位windbg

    使用vs2k10express和7.1 psdk工具集编译为
    x64

    预编译目录内容

    :dir /b
    compile.bat
    dbgbrk.cpp
    
    来源

    :type dbgbrk.cpp
    #include <stdio.h>
    #include <intrin.h>
    #include <windows.h>
    #define DBGBRK //comment this out to remove dbgspew
    #ifdef DBGBRK
    //using .ocommand mycommand in usermode windbg stacktrace will be printed out on break
    #define DBRK  OutputDebugString("mycommand kb;"); __debugbreak();
    #else
    #define DBRK
    #endif
    
    int main (void)
    {
        printf("hello we are debugging\n");
        DBRK
        printf("we broke in kd above\n");
        DBRK
        return 0;
    }
    
    执行可执行文件会立即中断kd

    kd> .lastevent
    Last event: Break instruction exception - code 80000003 (first chance)
      debugger time: Wed Jan 14 17:36:00.937 2015 
    kd> lsa .
        10: 
        11: int main (void)
        12: {
        13:     printf("hello we are debugging\n");
    >   14:     DBRK
        15:     printf("we broke in kd above\n");
        16:     DBRK
        17:     return 0;
        18: }
    
    kd> uf @rip
    dbgbrk!main+0x1d [dbgbrk.cpp @ 14]:
       14 00000001`4000101d cc              int     3
       15 00000001`4000101e 488d0df3120100  lea     rcx,[dbgbrk!__xt_z+0x50 (00000001`40012318)]
       15 00000001`40001025 e816000000      call    dbgbrk!printf (00000001`40001040)
       16 00000001`4000102a 488d0dff120100  lea     rcx,[dbgbrk!__xt_z+0x68 (00000001`40012330)]
       16 00000001`40001031 ff15c90f0100    call    qword ptr [dbgbrk!_imp_OutputDebugStringA (00000001`40012000)]
       16 00000001`40001037 cc              int     3
       17 00000001`40001038 33c0            xor     eax,eax
       18 00000001`4000103a 4883c428        add     rsp,28h
       18 00000001`4000103e c3              ret
    kd> !dbgprint
    
    mycommand kb;mycommand kb;