大家都知道 driver studio 帶一個 drivermonitor 的工具
能顯示程序裡面由 dbgprint 輸出的字符串
這裡說說他的工作原理
本人也是初學者
不對的地方
請指教
先說自己的平台環境
使用 win
build
rtm 版
這個很重要
dbgprint 的實現在各個平台上是有差異的
這裡只是說以上平台的實現
因為我也沒有在其他平台上試過
所有下面的程序
如果您想運行的話
請您先看完這個文章
再動手
否則遇到 bugcheck
別怪我沒有提醒
先說 dbgprint 的實現
呼出 si
bpx ntoskrnl!dbgprint
然後自己隨便寫個程序
只要能斷點到 dbgprint 函數就ok
可以看到他調用了 vDbgPrintExWithPrefix 函數
f
step into 看到這個函數把輸入的字符串 vnprintf 到一個 local buffer 裡面
然後調用了 DebugPrint
調用這個 DebugPrint 函數的參數有
個
後兩個可以不去研究
第一個參數是一個 STRING 變量的指針
這個變量構造在 kernel 棧裡面
他字符串的 buffer 也是構造在 kernel 棧裡面
step into DebugPrint 函數
他也是簡單的調用 DebugService 函數
這個函數同樣是
個參數
第一個 表示了 調用類型
= debugprint
還有其他的數值
比如用於 image load 等等
這裡我沒有詳細的研究
只是了解
= debugprint
第二個參數是 STRING 變量的實際字符串指針
第三個參數是字符串的長度
記好這幾個參數
step into DebugService裡面
這個函數就是真正的實現所在了
可以看到
他把 調用類型放到了 eax 裡面
字符指針放入 ecx 裡面
字符長度放入 edx 裡面
然後執行了一個 int
d
idt 看看
d 這個中斷指向的是 dbgmsg
sys
再看看這個文件是屬於 driverstudio 的
看到這裡
你應該明白了
如果我們要獲取dbgprint輸出字符串
只用替換掉
d 這個中斷就ok了
這個也是 dbgmsg
sys 的做法
如果沒有安裝 driverstuido的話
這個中斷指向的是 ntoskrnl
exe 的 _KiDebugService
總結下
我們要寫一個新的中斷句柄
替換掉原來的中斷處理(當然要記得 jmp 到原來的處理函數裡面)
在這個處理函數裡面
當 eax=
的時候表示 這次是由 dbgprint 引起的
這個時候 ecx 指向了字符串的首地址
edx 為字符串的長度(這個數據基本可以不使用)
這樣我們就截獲到了 dbgprint 的輸出了
剩下的就只是實現而已
至於中斷的修改
無非是 sidt 到 idtr 的值
索引 到
d 中斷的入口
保存
修改而已
這裡我們就已經獲取到了輸出的字符串
剩下一個問題
怎麼把這個顯示出來
這個也簡單了
也就是一個驅動和應用程序通訊的問題
實現方式多種多樣
用一個最普通的方式就行了
用 event object
每當驅動獲取到了一個字符串
他就把一個 event 設置成 signaled
應用程序 wait 在這個 event 上面
如果 event 變成 signaled
應用程序就 readfile 一下驅動
驅動就返回讀取到的字符串
這裡的實現都是細節問題了
做成什麼樣子的完全看你自己的發揮
到這裡就寫完了
放上源代碼
編譯環境
+ win
ifs
ddk
運行環境 windows
首先用 drivermonitor 加載編譯出來的 dbgview
sys 文件
然後運行 dbgmonitor就行了
代碼寫得很簡陋
我也是初學者
難免有錯的地方
請包涵
再次聲明
代碼的運行環境入上
任何非以上環境的朋友請親自跟蹤 dbgprint 函數明白 傳人到 int
d 的參數以後
再修改本代碼
以適合你自己的操作系統
切記
否則 bugcheck 引起的後果自負
起碼在 windows
下面
這個代碼是不能運行的
xp 下面沒有測試過
From:http://tw.wingwit.com/Article/program/net/201311/13300.html