關於除錯沒有符號的驅動時如何斷在入口點處這個問題,先說乙個我聽來的很挫的方法:用c32asm修改driverentry處為0xcc,就是int 3,修正校驗和後載入,執行到driverentry時產生int 3異常自然就會中斷在偵錯程式了,這時再把原來的指令改回去繼續跑就行了.改來改去的,確實比較挫~~.
那麼怎麼做比較好一點呢?
我們都知道有符號時直接bu drivername!driverentry就可以了,載入時就會停在入口點.但是沒有符號時,偵錯程式不知道driverentry到底指向哪個位置,但是誰知道呢?誰呼叫誰知道啊~~沒錯,就是ioploaddriver()啦~~(關於該函式的具體實現,請自行參考wrk).
下面我就直接在ioploaddriver函式中找呼叫driverentry的地方.
找啊找啊,終於找到了,在我的xp sp2上如下:
lkd>
nt!ioploaddriver+0x65a:
805a9787 83e103 and
ecx,3
805a978a f3a4 rep movs byte
ptres:[edi],byte
ptr [esi]
805a978c 8b7d80 mov
edi,dword
ptr [ebp-80h]
805a978f ffb570ffffff push
dword
ptr [ebp-90h] //指向registrypath
805a9795 57 push
edi //edi指向driverobject
805a9796 ff572c call
dword
ptr [edi+2ch] //edi+2c,指向driverobject->driverinit,即入口點driverentry
805a9799 3bc3 cmp
eax,ebx
805a979b 8b8d68ffffff mov
ecx,dword
ptr [ebp-98h]
順便貼個driver_object的結構,這樣兩個放一起看起來比較容易理解
lkd> dt _driver_object 8a884e30
nt!_driver_object
+0x000 type : 4
+0x002 size : 168
+0x004 deviceobject : 0x898ef450 _device_object
+0x008 flags : 0x92
+0x00c driverstart : 0xf7b52000
+0x010 driversize : 0x8c480
+0x014 driversection : 0x8a960ae8
+0x018 driverextension : 0x8a884ed8 _driver_extension
+0x01c drivername : _unicode_string "\filesystem\ntfs"
+0x024 hardwaredatabase : 0x80696810 _unicode_string "\registry\machine\hardware\description\system"
+0x028 fastiodispatch : 0xf7b71820 _fast_io_dispatch
+0x02c driverinit : 0xf7bd7204 long +fffffffff7bd7204
//這就是入口點了,**中的edi+2c處
+0x030 driverstartio : (null)
+0x034 driverunload : (null)
+0x038 majorfunction : [28] 0xf7b77e37 long +fffffffff7b77e37
這個call特徵很明顯的.就是:
push reg
call dword ptr [reg+2ch]
不同的核心版本這裡使用的暫存器可能是不一樣的,找到後把這個偏移記下來
只要我們把斷點下在這個call之前,比如我直接下bp nt!ioploaddriver+0x65a
然後單步幾下到805a9796,這個call dword ptr [reg+2ch]單步進去,就是driverentry了,很簡單!
如果你跟我一樣使用winxp sp2,那麼直接下斷點bp nt!ioploaddriver+0x65a就可以了
vista系統下直接下斷點 bp nt!ioploaddriver+0x801
我提供的偏移可能不適用於你的系統,請自行查詢適合你自己的偏移量,只需查詢一次,以後就可以隨便用了.
此法在win2000/winxp/win2003/winvista上均適用,對softice,syser當然也是可以用的.
不過softice好像有專用的命令,而syser有沒有符號都可以自動斷在入口點處,所以使用windbg但仍不會這個方法的可以記錄一下.
iOS UI控制項沒有顯示時的除錯技巧
1.遇到ui控制項沒有顯示的問題,可以給這個控制項設定背景色 假設這個控制項是uibutton 如果背景色能顯示,那問題就出在image和title值為空 如果背景色不能顯示,重寫控制項的description方法,把控制項的frame列印出來分析 2.以下是列印uiview的frame的分類 im...
Linux驅動除錯時的一些技巧
1 假如現在有乙個待測試的驅動模組button和乙個用於測試驅動模組功能的應用程式button test 首先,使用insmod button載入模組 不用時使用rmmod button解除安裝模組 其次,測試驅動模組,執行.button test,當需要檢視該程序消耗cpu資源的情況時,可以設定 ...
關於Logcat在真機除錯時沒有輸出的問題
普遍是這種回答!首先我不知道怎麼操作,還是做了,然而在cmd中久久不能平靜 太坑人了吧 但是應該是有效的方法,不然怎麼會成為某個問題前篇一律的回答。下面的方法不是正文,雖然篇幅上很 搶鏡,但博主想說的在最後,果然廢話太多了嗎 1.需要root許可權 部分rom不需要 2.開啟logcat,並設定le...