原創 shadow ssdt學習筆記 二

2021-06-08 13:08:31 字數 2088 閱讀 5860

三。如何hook

似乎這個問題並不大,shadow ssdt和ssdt本質上都是1個位址表,最為簡單的方法是把你的函式替換位址表的對應項,具體hook**甚至可以完全照抄ssdt的,這裡只說1下幾個偶遇到的小問題

1。win32k.sys不是常在記憶體的,如果不是gui執行緒,shadow ssdt位址無效

解決辦法:

1。在driverdispatch中hokk

driverdispatch是位於執行driveriocontrol的執行緒上下文的

我們使用1個gui執行緒去driveriocontrol

2。attachtoprocess

通常 我們使用cerss.exe

copy code

handle getcsrpid()

}zwclose(hobject);

}zwclose(process);}}

}exfreepool(handles);

return csrid;

}然後我們keattachprocess

copy code

ntstatus = pslookupprocessbyprocessid(getcsrpid(), &eprocess);

if (!nt_success( ntstatus ))

keattachprocess(eprocess);

3.使用mdl對映一塊不分頁記憶體,設定成可以寫入

不分頁記憶體  exallocatepool(nonpagedpool

即為不會被切換到pagefile的記憶體,是常駐在物理記憶體的,比較希缺,使用完畢以後記住釋放掉

參考regmon的**

copy code

pvoid *

regmonmapservicetable(

service_hook_descriptor **serviceishooked)}

return null;

};看起來shadowssdt何hook本身並沒有什麼難度

只要正確定位了位址,hook起來和ssdt完全一樣

unhook不在重複 完全抄ssdt的**即可

四。checkhook

hook用的人多了 難免出現重複hook的情況 為了實現和別人的東西和平共處,最好hook之前做個檢測

hook的方法是固定的,就那麼2種 改位址表 或者inline hook,我們分別來對待

1。修改位址表的hook

這個對付起來幾乎不用特別對待,只是你儲存的oldfunc是其他的程式hook函式所在的位址,判斷方法很簡單,看看這個位址在不在win32k的模組裡面,和平共處的辦法是你的myfunc裡面call別人的hook函式,當然 如果你不想要別人的hook了,直接搜尋到原始位址call之也是可行的

另外說1下 在別人的函式裡面搜尋原始位址 用mmisaddressvalid+ismodulewin32k

可以判斷(這個辦法好像是在mj文章裡面看到的 記不清了)

2。inlinehook

這個比較麻煩了 如果是修改前面5個位元組還好,直接替換處理都可以不改變

麻煩是函式中間地方被hook,盲目修改可能直接bsod了,這個需要1個反彙編引擎來幫助分析**位元組長度,海風大大的hooklib很不錯 可以完成這個功能

五,簡單說1下restore

copy code

pwin32k = getmodulehandle("win32k.sys");

sdtrva = &keservicedescriptortable->win32k.servicetable - pwin32k ;

w32kcopy = loadpefile("win32k.sys");

processrelocs(w32kcopy, pwin32k);

memcpy(&keservicedescriptortable->win32k.servicetable, w32kcopy + sdtrva, sdtsize);

不過 其實可以不用processrelocs處理

因為你可以使用lordpe檢視1下 win32k.sys的預設基址就是系統載入的基址

可以不需要processrelocs,不過為了更加方便和通用,這麼做也可以的

休息去咯---

C Primer Chapter One學習筆記

筆記 1.流 從io裝置上讀入或寫出的字串行,用來說明字元隨時間順序生成或消耗。2.輸入輸出符可連用原因 operator 或operator 返回stream物件。3.要測試程式那個語句出錯,使用cout 4.新建乙個內建型別,如int i 0 最好先初始化,不然用到的時候沒初始化會產生奇怪的錯誤...

BroadcastReceiver學習筆記

需要注意 的是,不要在 onreceive 方法中新增過多的邏輯或者進行任何的耗時操作,因為在廣播接收 器中是不允許開啟執行緒的,當 onreceive 方法執行了較長時間而沒有結束時,程式就會報錯。有序broadcast,sendorderedbroadcast intent,null abort...

CDISC SDTM SE domain 學習筆記

整理翻譯自 sdtm ig 3.2 www.cdisc.org sdtm se subject elements 鞏固每個subject的epochs和elements的起止時間點.se對於有多個 時期的試驗有著重要的用處 如crossover試驗 se包含乙個subject從乙個element進入...