Visual studio 2010 从内核调试模式调试dll和sys
我需要中断已经加载的dll函数。我该怎么做?我试过以下的方法。 dll名称:test.dll 函数名称:allocate()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) 仍然可以
我正在使用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位处理器上运行
guestOSXP64
在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位处理器上运行
guestOSXP64
在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;