最近想學驅動開發,參考別人的**,但是遇到了一些問題,昨晚調了乙個晚上都找不到原因,快12點半
的時候才找
到原因,是指標沒寫好,
其實根本原因是自己基礎不紮實。ssdt的結構如下:
typedef struct _servicedescriptortable *pservicedescriptortable;
想要實現的功能是根據匯出函式索引獲取函式的位址,如ntopenprocess,具體的做法就是先找到描述符表結構體
keservice
descriptortable的位置,然後由keservicedescriptortable->
servicetablebase
找到基址的位置,在基址位 置
的基礎上加上
函式的偏移,去該位址的內容就是目
long *ssdt_adr,ssdt_ntopenprocess_cur_addr,t_addr;
//讀取ssdt表中索引值為0x7a的函式
t_addr=(long)keservicedescriptortable->servicetablebase; //基址
kdprint(("當前servicetablebase位址為%x \n",t_addr));
ssdt_adr=(plong)(t_addr+0x7a*4); //基址+偏移,乘4是因為每個項佔4個位元組
kdprint(("當前t_addr+0x7a*4=%x \n",ssdt_adr));
ssdt_ntopenprocess_cur_addr=*ssdt_adr;//取ssdt_adr 指向的內容
kdprint(("當前ssdt_ntopenprocess_cur_addr位址為%x \n",ssdt_ntopenprocess_cur_addr));
我的**:
plong ptaddr;
ulong ssdtntopenprocess;
ptaddr=(plong)keservicedescriptortable->servicetablebase;
kdprint(("current servicestablebase addr is %x\n",ptaddr));
ptaddr=ptaddr+0x7a*4; //錯在這裡,改為ptaddr=ptaddr+0x7a才正確
kdprint(("當前t_addr+0x7a*4=%x \n",ptaddr));
ssdtntopenprocess=*ptaddr;
kdprint(("當前ssdt_ntopenprocess_cur_addr位址為%x \n",ssdtntopenprocess));
一開始我照貓畫虎的寫了一遍,包括乘4的做法,後來除錯的過程中發現老是得不出正確的位址,百思不得其解,後來細 心
發現,得出的基址是
正確的,
得出的基址+偏移確實錯誤的,原來我用的是指標,原作者用的是long型的整數運算,
ptaddr+1,其內容是第乙個目標函式所在的內
存位址,等價於
(plong)((long)
keservicedescriptortable->servicetablebase+1*4);
乙個是指標的運算,乙個是把指標的值(不是所指的
指,是指標的值)先取
出來,相當於取到基址,然後加上偏移,才得 出
正確結果,加0x7a同理。
初學python遇到的乙個小問題
python中的乙個小問題 問題是這樣的 old 1,2,3,4,5 new old old 6 print new 求輸出結果,第一眼我以為答案是 6 但是當我上機實驗才發現答案是 1,2,3,4,5 為什麼會是這個答案呢?我 檢視old 和 new 的位址 old 1,2 3,4 new old...
初學Spring遇到的第乙個問題 bean xml
問 題 exception in thread main org.springframework.beans.factory.beandefinitionstoreexception line 2 in xml document from file e lihui j2ee 學習資料 spring框...
乙個有趣的指標問題
是從網上看到的乙個例子 struct s int i int p void main struct s s int p s.i p 0 4 p 1 3 s.p p s.p 1 1 s.p 0 2 問程式會在哪一行死掉 解答 程式執行到最後一行就會報出異常,死掉.具體解答為 首先需要說明的是結構體s,...