win2003下面显示dbgprint的输出内容
生活随笔
收集整理的這篇文章主要介紹了
win2003下面显示dbgprint的输出内容
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
??????? 大家都知道 driver studio 帶一個 drivermonitor 的工具,能顯示程序里面由 dbgprint 輸出的字符串,這里說說他的工作原理,本人也是初學(xué)者,不對的地方,請指教.
先說自己的平臺環(huán)境,使用 win2003 build 3790 rtm 版,這個很重要,dbgprint 的實現(xiàn)在各個平臺上是有差異的,這里只是說以上平臺的實現(xiàn),因為我也沒有在其他平臺上試過,所有下面的程序,如果您想運行的話,請您先看完這個文章,再動手,否則遇到 bugcheck ,別怪我沒有提醒.
先說 dbgprint 的實現(xiàn),呼出 si , bpx ntoskrnl!dbgprint ,然后自己隨便寫個程序,只要能斷點到 dbgprint 函數(shù)就ok,可以看到他調(diào)用了 vDbgPrintExWithPrefix 函數(shù),f8,step into 看到這個函數(shù)把輸入的字符串 vnprintf 到一個 local buffer 里面,然后調(diào)用了 DebugPrint ,調(diào)用這個 DebugPrint 函數(shù)的參數(shù)有 3 個,后兩個可以不去研究,第一個參數(shù)是一個 STRING 變量的指針,這個變量構(gòu)造在 kernel 棧里面,他字符串的 buffer 也是構(gòu)造在 kernel 棧里面, step into DebugPrint 函數(shù),他也是簡單的調(diào)用 DebugService 函數(shù),這個函數(shù)同樣是3個參數(shù),第一個 表示了 調(diào)用類型 1 = debugprint,還有其他的數(shù)值,比如用于 image load 等等,這里我沒有詳細的研究,只是了解1 = debugprint,第二個參數(shù)是 STRING 變量的實際字符串指針,第三個參數(shù)是字符串的長度.記好這幾個參數(shù),step into DebugService里面,這個函數(shù)就是真正的實現(xiàn)所在了,可以看到,他把 調(diào)用類型放到了 eax 里面,字符指針放入 ecx 里面,字符長度放入 edx 里面,然后執(zhí)行了一個 int 2d. idt 看看 2d 這個中斷指向的是 dbgmsg.sys,再看看這個文件是屬于 driverstudio 的,看到這里,你應(yīng)該明白了,如果我們要獲取dbgprint輸出字符串,只用替換掉 2d 這個中斷就ok了.這個也是 dbgmsg.sys 的做法,如果沒有安裝 driverstuido的話,這個中斷指向的是 ntoskrnl.exe 的 _KiDebugService.
總結(jié)下,我們要寫一個新的中斷句柄,替換掉原來的中斷處理(當(dāng)然要記得 jmp 到原來的處理函數(shù)里面),在這個處理函數(shù)里面,當(dāng) eax=1 的時候表示 這次是由 dbgprint 引起的,這個時候 ecx 指向了字符串的首地址,edx 為字符串的長度(這個數(shù)據(jù)基本可以不使用).這樣我們就截獲到了 dbgprint 的輸出了.剩下的就只是實現(xiàn)而已.至于中斷的修改,無非是 sidt 到 idtr 的值,索引 到 2d 中斷的入口,保存,修改而已.
這里我們就已經(jīng)獲取到了輸出的字符串.剩下一個問題,怎么把這個顯示出來,這個也簡單了,也就是一個驅(qū)動和應(yīng)用程序通訊的問題,實現(xiàn)方式多種多樣,用一個最普通的方式就行了,用 event object,每當(dāng)驅(qū)動獲取到了一個字符串,他就把一個 event 設(shè)置成 signaled,應(yīng)用程序 wait 在這個 event 上面,如果 event 變成 signaled,應(yīng)用程序就 readfile 一下驅(qū)動,驅(qū)動就返回讀取到的字符串...這里的實現(xiàn)都是細節(jié)問題了,做成什么樣子的完全看你自己的發(fā)揮.
到這里就寫完了.放上源代碼.
編譯環(huán)境 vs.net 2003 + win2003.ifs.ddk
運行環(huán)境 windows 2003
首先用 drivermonitor 加載編譯出來的 dbgview.sys 文件
然后運行 dbgmonitor就行了
代碼寫得很簡陋...我也是初學(xué)者..難免有錯的地方..請包涵..
再次聲明...代碼的運行環(huán)境入上...任何非以上環(huán)境的朋友請親自跟蹤 dbgprint 函數(shù)明白 傳人到 int 2d 的參數(shù)以后,再修改本代碼,以適合你自己的操作系統(tǒng),切記....否則 bugcheck 引起的后果自負...起碼在 windows 2000 下面,這個代碼是不能運行的. xp 下面沒有測試過...
附件: 2004-03-30_dbgview.rar (254 K)
下載次數(shù):39
先說自己的平臺環(huán)境,使用 win2003 build 3790 rtm 版,這個很重要,dbgprint 的實現(xiàn)在各個平臺上是有差異的,這里只是說以上平臺的實現(xiàn),因為我也沒有在其他平臺上試過,所有下面的程序,如果您想運行的話,請您先看完這個文章,再動手,否則遇到 bugcheck ,別怪我沒有提醒.
先說 dbgprint 的實現(xiàn),呼出 si , bpx ntoskrnl!dbgprint ,然后自己隨便寫個程序,只要能斷點到 dbgprint 函數(shù)就ok,可以看到他調(diào)用了 vDbgPrintExWithPrefix 函數(shù),f8,step into 看到這個函數(shù)把輸入的字符串 vnprintf 到一個 local buffer 里面,然后調(diào)用了 DebugPrint ,調(diào)用這個 DebugPrint 函數(shù)的參數(shù)有 3 個,后兩個可以不去研究,第一個參數(shù)是一個 STRING 變量的指針,這個變量構(gòu)造在 kernel 棧里面,他字符串的 buffer 也是構(gòu)造在 kernel 棧里面, step into DebugPrint 函數(shù),他也是簡單的調(diào)用 DebugService 函數(shù),這個函數(shù)同樣是3個參數(shù),第一個 表示了 調(diào)用類型 1 = debugprint,還有其他的數(shù)值,比如用于 image load 等等,這里我沒有詳細的研究,只是了解1 = debugprint,第二個參數(shù)是 STRING 變量的實際字符串指針,第三個參數(shù)是字符串的長度.記好這幾個參數(shù),step into DebugService里面,這個函數(shù)就是真正的實現(xiàn)所在了,可以看到,他把 調(diào)用類型放到了 eax 里面,字符指針放入 ecx 里面,字符長度放入 edx 里面,然后執(zhí)行了一個 int 2d. idt 看看 2d 這個中斷指向的是 dbgmsg.sys,再看看這個文件是屬于 driverstudio 的,看到這里,你應(yīng)該明白了,如果我們要獲取dbgprint輸出字符串,只用替換掉 2d 這個中斷就ok了.這個也是 dbgmsg.sys 的做法,如果沒有安裝 driverstuido的話,這個中斷指向的是 ntoskrnl.exe 的 _KiDebugService.
總結(jié)下,我們要寫一個新的中斷句柄,替換掉原來的中斷處理(當(dāng)然要記得 jmp 到原來的處理函數(shù)里面),在這個處理函數(shù)里面,當(dāng) eax=1 的時候表示 這次是由 dbgprint 引起的,這個時候 ecx 指向了字符串的首地址,edx 為字符串的長度(這個數(shù)據(jù)基本可以不使用).這樣我們就截獲到了 dbgprint 的輸出了.剩下的就只是實現(xiàn)而已.至于中斷的修改,無非是 sidt 到 idtr 的值,索引 到 2d 中斷的入口,保存,修改而已.
這里我們就已經(jīng)獲取到了輸出的字符串.剩下一個問題,怎么把這個顯示出來,這個也簡單了,也就是一個驅(qū)動和應(yīng)用程序通訊的問題,實現(xiàn)方式多種多樣,用一個最普通的方式就行了,用 event object,每當(dāng)驅(qū)動獲取到了一個字符串,他就把一個 event 設(shè)置成 signaled,應(yīng)用程序 wait 在這個 event 上面,如果 event 變成 signaled,應(yīng)用程序就 readfile 一下驅(qū)動,驅(qū)動就返回讀取到的字符串...這里的實現(xiàn)都是細節(jié)問題了,做成什么樣子的完全看你自己的發(fā)揮.
到這里就寫完了.放上源代碼.
編譯環(huán)境 vs.net 2003 + win2003.ifs.ddk
運行環(huán)境 windows 2003
首先用 drivermonitor 加載編譯出來的 dbgview.sys 文件
然后運行 dbgmonitor就行了
代碼寫得很簡陋...我也是初學(xué)者..難免有錯的地方..請包涵..
再次聲明...代碼的運行環(huán)境入上...任何非以上環(huán)境的朋友請親自跟蹤 dbgprint 函數(shù)明白 傳人到 int 2d 的參數(shù)以后,再修改本代碼,以適合你自己的操作系統(tǒng),切記....否則 bugcheck 引起的后果自負...起碼在 windows 2000 下面,這個代碼是不能運行的. xp 下面沒有測試過...
附件: 2004-03-30_dbgview.rar (254 K)
下載次數(shù):39
總結(jié)
以上是生活随笔為你收集整理的win2003下面显示dbgprint的输出内容的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在matlab中intcon什么意思,G
- 下一篇: php将soap返回的xml转成数组,P