除錯沒有符號的驅動時如何斷在入口點處

2021-06-08 13:37:35 字數 2634 閱讀 1571

關於除錯沒有符號的驅動時如何斷在入口點處這個問題,先說乙個我聽來的很挫的方法:用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...