tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
阅读:3892回复:13

win2003下面显示dbgprint的输出内容

楼主#
更多 发布于:2004-03-30 15:22
大家都知道 driver studio 带一个 drivermonitor 的工具,能显示程序里面由 dbgprint 输出的字符串,这里说说他的工作原理,本人也是初学者,不对的地方,请指教.

先说自己的平台环境,使用 win2003 build 3790 rtm 版,这个很重要,dbgprint 的实现在各个平台上是有差异的,这里只是说以上平台的实现,因为我也没有在其他平台上试过,所有下面的程序,如果您想运行的话,请您先看完这个文章,再动手,否则遇到 bugcheck ,别怪我没有提醒.

先说 dbgprint 的实现,呼出 si , bpx ntoskrnl!dbgprint ,然后自己随便写个程序,只要能断点到 dbgprint 函数就ok,可以看到他调用了 vDbgPrintExWithPrefix 函数,f8,step into 看到这个函数把输入的字符串 vnprintf 到一个 local buffer 里面,然后调用了 DebugPrint ,调用这个 DebugPrint 函数的参数有 3 个,后两个可以不去研究,第一个参数是一个 STRING 变量的指针,这个变量构造在 kernel 栈里面,他字符串的 buffer 也是构造在 kernel 栈里面, step into DebugPrint 函数,他也是简单的调用 DebugService 函数,这个函数同样是3个参数,第一个 表示了 调用类型 1 = debugprint,还有其他的数值,比如用于 image load 等等,这里我没有详细的研究,只是了解1 = debugprint,第二个参数是 STRING 变量的实际字符串指针,第三个参数是字符串的长度.记好这几个参数,step into DebugService里面,这个函数就是真正的实现所在了,可以看到,他把 调用类型放到了 eax 里面,字符指针放入 ecx 里面,字符长度放入 edx 里面,然后执行了一个 int 2d. idt 看看 2d 这个中断指向的是 dbgmsg.sys,再看看这个文件是属于 driverstudio 的,看到这里,你应该明白了,如果我们要获取dbgprint输出字符串,只用替换掉 2d 这个中断就ok了.这个也是 dbgmsg.sys 的做法,如果没有安装 driverstuido的话,这个中断指向的是 ntoskrnl.exe 的 _KiDebugService.

总结下,我们要写一个新的中断句柄,替换掉原来的中断处理(当然要记得 jmp 到原来的处理函数里面),在这个处理函数里面,当 eax=1 的时候表示 这次是由 dbgprint 引起的,这个时候 ecx 指向了字符串的首地址,edx 为字符串的长度(这个数据基本可以不使用).这样我们就截获到了 dbgprint 的输出了.剩下的就只是实现而已.至于中断的修改,无非是 sidt 到 idtr 的值,索引 到 2d 中断的入口,保存,修改而已.

这里我们就已经获取到了输出的字符串.剩下一个问题,怎么把这个显示出来,这个也简单了,也就是一个驱动和应用程序通讯的问题,实现方式多种多样,用一个最普通的方式就行了,用 event object,每当驱动获取到了一个字符串,他就把一个 event 设置成 signaled,应用程序 wait 在这个 event 上面,如果 event 变成 signaled,应用程序就 readfile 一下驱动,驱动就返回读取到的字符串...这里的实现都是细节问题了,做成什么样子的完全看你自己的发挥.

到这里就写完了.放上源代码.

编译环境 vs.net 2003 + win2003.ifs.ddk
运行环境 windows 2003

首先用 drivermonitor 加载编译出来的 dbgview.sys 文件
然后运行 dbgmonitor就行了

代码写得很简陋...我也是初学者..难免有错的地方..请包涵..

再次声明...代码的运行环境入上...任何非以上环境的朋友请亲自跟踪 dbgprint 函数明白 传人到 int 2d 的参数以后,再修改本代码,以适合你自己的操作系统,切记....否则 bugcheck 引起的后果自负...起码在 windows 2000 下面,这个代码是不能运行的. xp 下面没有测试过...
附件名称/大小 下载次数 最后更新
2004-03-30_dbgview.rar (254KB)  266

最新喜欢:

TOMG2004TOMG20...
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
沙发#
发布于:2004-03-31 14:35


第一次写这种东西

bug 多多...

不好意思唉..
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2004-03-31 15:46
真的不错,有时间帮你修改成通用的版本
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
地板#
发布于:2004-03-31 17:36
谢谢楼上的

不好意思

bug 多多

关中断开中断的操作不应该那么写,应该用KexxxIrql函数

在多处理器平台上也不对,只是设置了单个cpu的idt,另外的cpu的idt没有被修改到,应该用KeSetAffinityThread函数遍历每个cpu

非常不好意思...
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-03-31 17:43
CLI,STI本来就是设置IF标志的,为什么你还要直接再设置他??
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
5楼#
发布于:2004-04-01 11:12
因为

比如现在的状态中断是关着的
那么执行了我的安装中断以后
中断必须也是关着的

那么就要保存当前中断的状态
这个就是"关中断"函数的功能

而我的"开中断"函数并不是开中断
而是恢复以前的中断状态

当然你可以用
cmp byte ptr[esp+4],0
jz not_sti
   sti
not_sti:
   ret
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2004-04-01 13:34
还有有必要拦截INT 2D吗??直接HOOK vDbgPrintExWithPrefix 函数即可,这样也可以通用于所有的OS了??
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
7楼#
发布于:2004-04-01 15:23
hook这个好不了多少

同样少不了要作多个跨平台的版本出来

而且hook函数比修改中断来得麻烦.....
你要定位到这个函数,保存代码开头的5个字节
修改函数开始的代码jmp自己的代码
在自己的代码里面恢复原来代码
修改返回堆栈指针到自己的函数
返回的时候再修改hook函数的开头5字节....

相对还是要麻烦一点的吧.....



[编辑 -  4/1/04 by  tiamo]
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
8楼#
发布于:2004-04-06 17:42


失败

才发现原来早就有人作过相同的工作了....链接如下..

http://www.windevnet.com/documents/s=7277/wdj0002a/0002a.htm
ftaohu
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2009-02-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-20 11:23
挺好的,我用你的这个文章分析解决了一个大BUG  感谢 感谢。
敬畏耶和华时智慧的开端,承认至圣者才是悟性。 耶稣说:“我赐给你们一条新命令,乃是要你们彼此相爱,我怎样爱你们,你们也要怎样相爱,你们若有彼此相爱的心,众人就因此认出你们是我的门徒了!”
Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-05-28 10:29
我一直用DebugView这个非常好的tool,在sysinternals可以下载。

Under Windows 9x/Me DebugView can capture output from the following sources:

Win32 OutputDebugString

Win16 OutputDebugString

Kernel-mode Out_Debug_String

Kernel-mode _Debug_Printf_Service

Under Windows NT and Win2k DebugView can capture:

Win32 OutputDebugString

Kernel-mode DbgPrint

All kernel-mode variants of DbgPrint implemented in Windows XP and .NET Server

DebugView also extracts kernel-mode debug output generated at the time of a crash from crash dump files if DebugView was capturing output at the time of the crash.


[编辑 -  5/28/04 by  Leonsoft]
I will do the best with what the God gave me.
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
11楼#
发布于:2004-06-08 16:55
要说最好用的debug输出的tools呢...

自然是用soft-ice+drivermonitor了...
呵呵
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-05-22 11:19
为portal_zhb顶上来
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
nobounded
驱动小牛
驱动小牛
  • 注册日期2003-08-14
  • 最后登录2011-07-07
  • 粉丝0
  • 关注0
  • 积分360分
  • 威望258点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-08-02 15:25
我的DDK版本5109,什么时候有空试试。
游客

返回顶部