win2003下面显示dbgprint的输出内容
生活随笔
收集整理的這篇文章主要介紹了
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
先說(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)題。
- 上一篇: 在matlab中intcon什么意思,G
- 下一篇: 15个设计得最糟糕最变态的CAPTCHA