日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

win2003下面显示dbgprint的输出内容

發(fā)布時(shí)間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 win2003下面显示dbgprint的输出内容 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
??????? 大家都知道 driver studio 帶一個(gè) drivermonitor 的工具,能顯示程序里面由 dbgprint 輸出的字符串,這里說(shuō)說(shuō)他的工作原理,本人也是初學(xué)者,不對(duì)的地方,請(qǐng)指教.

先說(shuō)自己的平臺(tái)環(huán)境,使用 win2003 build 3790 rtm 版,這個(gè)很重要,dbgprint 的實(shí)現(xiàn)在各個(gè)平臺(tái)上是有差異的,這里只是說(shuō)以上平臺(tái)的實(shí)現(xiàn),因?yàn)槲乙矝](méi)有在其他平臺(tái)上試過(guò),所有下面的程序,如果您想運(yùn)行的話,請(qǐng)您先看完這個(gè)文章,再動(dòng)手,否則遇到 bugcheck ,別怪我沒(méi)有提醒.

先說(shuō) dbgprint 的實(shí)現(xiàn),呼出 si , bpx ntoskrnl!dbgprint ,然后自己隨便寫(xiě)個(gè)程序,只要能斷點(diǎn)到 dbgprint 函數(shù)就ok,可以看到他調(diào)用了 vDbgPrintExWithPrefix 函數(shù),f8,step into 看到這個(gè)函數(shù)把輸入的字符串 vnprintf 到一個(gè) local buffer 里面,然后調(diào)用了 DebugPrint ,調(diào)用這個(gè) DebugPrint 函數(shù)的參數(shù)有 3 個(gè),后兩個(gè)可以不去研究,第一個(gè)參數(shù)是一個(gè) STRING 變量的指針,這個(gè)變量構(gòu)造在 kernel 棧里面,他字符串的 buffer 也是構(gòu)造在 kernel 棧里面, step into DebugPrint 函數(shù),他也是簡(jiǎn)單的調(diào)用 DebugService 函數(shù),這個(gè)函數(shù)同樣是3個(gè)參數(shù),第一個(gè) 表示了 調(diào)用類型 1 = debugprint,還有其他的數(shù)值,比如用于 image load 等等,這里我沒(méi)有詳細(xì)的研究,只是了解1 = debugprint,第二個(gè)參數(shù)是 STRING 變量的實(shí)際字符串指針,第三個(gè)參數(shù)是字符串的長(zhǎng)度.記好這幾個(gè)參數(shù),step into DebugService里面,這個(gè)函數(shù)就是真正的實(shí)現(xiàn)所在了,可以看到,他把 調(diào)用類型放到了 eax 里面,字符指針?lè)湃?ecx 里面,字符長(zhǎng)度放入 edx 里面,然后執(zhí)行了一個(gè) int 2d. idt 看看 2d 這個(gè)中斷指向的是 dbgmsg.sys,再看看這個(gè)文件是屬于 driverstudio 的,看到這里,你應(yīng)該明白了,如果我們要獲取dbgprint輸出字符串,只用替換掉 2d 這個(gè)中斷就ok了.這個(gè)也是 dbgmsg.sys 的做法,如果沒(méi)有安裝 driverstuido的話,這個(gè)中斷指向的是 ntoskrnl.exe 的 _KiDebugService.

總結(jié)下,我們要寫(xiě)一個(gè)新的中斷句柄,替換掉原來(lái)的中斷處理(當(dāng)然要記得 jmp 到原來(lái)的處理函數(shù)里面),在這個(gè)處理函數(shù)里面,當(dāng) eax=1 的時(shí)候表示 這次是由 dbgprint 引起的,這個(gè)時(shí)候 ecx 指向了字符串的首地址,edx 為字符串的長(zhǎng)度(這個(gè)數(shù)據(jù)基本可以不使用).這樣我們就截獲到了 dbgprint 的輸出了.剩下的就只是實(shí)現(xiàn)而已.至于中斷的修改,無(wú)非是 sidt 到 idtr 的值,索引 到 2d 中斷的入口,保存,修改而已.

這里我們就已經(jīng)獲取到了輸出的字符串.剩下一個(gè)問(wèn)題,怎么把這個(gè)顯示出來(lái),這個(gè)也簡(jiǎn)單了,也就是一個(gè)驅(qū)動(dòng)和應(yīng)用程序通訊的問(wèn)題,實(shí)現(xiàn)方式多種多樣,用一個(gè)最普通的方式就行了,用 event object,每當(dāng)驅(qū)動(dòng)獲取到了一個(gè)字符串,他就把一個(gè) event 設(shè)置成 signaled,應(yīng)用程序 wait 在這個(gè) event 上面,如果 event 變成 signaled,應(yīng)用程序就 readfile 一下驅(qū)動(dòng),驅(qū)動(dòng)就返回讀取到的字符串...這里的實(shí)現(xiàn)都是細(xì)節(jié)問(wèn)題了,做成什么樣子的完全看你自己的發(fā)揮.

到這里就寫(xiě)完了.放上源代碼.

編譯環(huán)境 vs.net 2003 + win2003.ifs.ddk
運(yùn)行環(huán)境 windows 2003

首先用 drivermonitor 加載編譯出來(lái)的 dbgview.sys 文件
然后運(yùn)行 dbgmonitor就行了

代碼寫(xiě)得很簡(jiǎn)陋...我也是初學(xué)者..難免有錯(cuò)的地方..請(qǐng)包涵..

再次聲明...代碼的運(yùn)行環(huán)境入上...任何非以上環(huán)境的朋友請(qǐng)親自跟蹤 dbgprint 函數(shù)明白 傳人到 int 2d 的參數(shù)以后,再修改本代碼,以適合你自己的操作系統(tǒng),切記....否則 bugcheck 引起的后果自負(fù)...起碼在 windows 2000 下面,這個(gè)代碼是不能運(yùn)行的. xp 下面沒(méi)有測(cè)試過(guò)...


附件: 2004-03-30_dbgview.rar (254 K)
下載次數(shù):39

總結(jié)

以上是生活随笔為你收集整理的win2003下面显示dbgprint的输出内容的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。