浅谈dbgview工具原理

dbgview工具是微软sysinternal工具集中的一个工具,对于做系统开发的程序猿很有帮助。它能够捕捉OutputDebugString输出的日志。上篇讲Windbg输出Debug日志方法中有讲到其使用。今天来扒一扒它的原理。其实很简单,对于Vista以前的系统来说,它是Hook内核的api,之后的系统,它使用的是callback回调。在dbgview.exe的资源里有一个二进制文件,是dbgv.sys驱动,dbgview启动时会加载它注册回调,我们看下dbgv.sys的入口:

dbgv.sys的入口

我们可以看到,当系统版本大于等于6时,它取了三个函数的地址: DbgSetDebugPrintCallback,DbgSetDebugFilterState, DbgQueryDebugFilterState。最重要的是DbgSetDebugPrintCallback,它的原型是:

NTSTATUS DbgSetDebugPrintCallback(IN PDEBUGPRINT_CALLBACK_FUNCTION Function, IN BOOLEAN Mode)

第一个参数是输出调试日志(DbgPrintEx)时将被回调的函数,第二个参数是注册或卸载回调。

再来看看回调函数的原型:

void DebugPrintCallback(IN PANSI_STRING String, IN ULONG ComponentId, IN ULONG Level)

第一个参数是调试日志,第二个是输出调试的组件ID,第三个是日志级别。组件ID和日志级别的详细解释可以查看DbgPrintEx函数的说明。组件ID和日志级别声明在ntddk.h(WDK)或ntrtl.h(SDK)里。组件声明类似DPFLTR_XXXX_ID格式,而日志级别如下:

#define   DPFLTR_ERROR_LEVEL     0
#define   DPFLTR_WARNING_LEVEL   1
#define   DPFLTR_TRACE_LEVEL     2
#define   DPFLTR_INFO_LEVEL      3
#define   DPFLTR_MASK    0x8000000

上面讲到另两个函数,一个是设置日志filter状态,一个是读取日志filter状态,先看设置的,最终是调用NtSetDebugFilterState:

NtSetDebugFilterState

函数很简单,就是根据组件ID和级别设置状态,我们看到上一讲所熟悉的Kd_DEFAULT_Mask,它似乎是组件ID越界或无效时默认使用的。

再来看读取日志filter状态的,最终调用的是NtQueryDebugFilterState:

NtQueryDebugFilterState

其中可看到总的类似Kd_DEFAULT_Mask的是一个列表,其中Kd_DEFAULT_Mask是第0x65(102)个,总的列表大小是0x9c(156)个。这个列表叫KdComponentTable:

KdComponentTable

可以看到微软内核对0x9c(156)个模块都配置有日志输出标志,真是详尽。再进一步,如何设置让系统输出这些模块的日志呢,请看下图:

设置注册表输出某个模块的日志

大概理解到了吧,如下在注册表中设置即可:

注册表中设置输出某个内核定义的模块日志

其实这里也明白为什么常规输出日志要专门建一个DEFAULT(中文意思是"默认")值,而不是直接使用Debug Print Filter键下的"(默认)"值,因为DEFAULT才代表了Kd_DEFAULT_Mask嘛!

展开阅读全文

页面更新:2024-03-06

标签:微软   注册表   函数   组件   模块   级别   原理   状态   参数   工具   系统   日志

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top