熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

win2003下面顯示dbgprint的輸出內容

2013-11-13 10:20:34  來源: .NET編程 

   大家都知道 driver studio 帶一個 drivermonitor 的工具能顯示程序裡面由 dbgprint 輸出的字符串這裡說說他的工作原理本人也是初學者不對的地方請指教
  
  先說自己的平台環境使用 win build rtm 版這個很重要dbgprint 的實現在各個平台上是有差異的這裡只是說以上平台的實現因為我也沒有在其他平台上試過所有下面的程序如果您想運行的話請您先看完這個文章再動手否則遇到 bugcheck 別怪我沒有提醒
  
  先說 dbgprint 的實現呼出 si bpx ntoskrnl!dbgprint 然後自己隨便寫個程序只要能斷點到 dbgprint 函數就ok可以看到他調用了 vDbgPrintExWithPrefix 函數fstep 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 這個中斷指向的是 dbgmsgsys再看看這個文件是屬於 driverstudio 的看到這裡你應該明白了如果我們要獲取dbgprint輸出字符串只用替換掉 d 這個中斷就ok了這個也是 dbgmsgsys 的做法如果沒有安裝 driverstuido的話這個中斷指向的是 ntoskrnlexe 的 _KiDebugService
  
  總結下我們要寫一個新的中斷句柄替換掉原來的中斷處理(當然要記得 jmp 到原來的處理函數裡面)在這個處理函數裡面當 eax= 的時候表示 這次是由 dbgprint 引起的這個時候 ecx 指向了字符串的首地址edx 為字符串的長度(這個數據基本可以不使用)這樣我們就截獲到了 dbgprint 的輸出了剩下的就只是實現而已至於中斷的修改無非是 sidt 到 idtr 的值索引 到 d 中斷的入口保存修改而已
  
  這裡我們就已經獲取到了輸出的字符串剩下一個問題怎麼把這個顯示出來這個也簡單了也就是一個驅動和應用程序通訊的問題實現方式多種多樣用一個最普通的方式就行了用 event object每當驅動獲取到了一個字符串他就把一個 event 設置成 signaled應用程序 wait 在這個 event 上面如果 event 變成 signaled應用程序就 readfile 一下驅動驅動就返回讀取到的字符串這裡的實現都是細節問題了做成什麼樣子的完全看你自己的發揮
  
  到這裡就寫完了放上源代碼
  
  編譯環境 + winifsddk
  
  運行環境 windows
  
  首先用 drivermonitor 加載編譯出來的 dbgviewsys 文件
  
  然後運行 dbgmonitor就行了
  
  代碼寫得很簡陋我也是初學者難免有錯的地方請包涵
  
  再次聲明代碼的運行環境入上任何非以上環境的朋友請親自跟蹤 dbgprint 函數明白 傳人到 int d 的參數以後再修改本代碼以適合你自己的操作系統切記否則 bugcheck 引起的後果自負起碼在 windows 下面這個代碼是不能運行的 xp 下面沒有測試過
From:http://tw.wingwit.com/Article/program/net/201311/13300.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.