hookport.sys模塊作用
Hookport.sys是360安全衛(wèi)士對(duì)系統(tǒng)進(jìn)行掛鉤操作的核心模塊。其中主要方 式對(duì)SSDT和shadowSSDT安裝鉤子函數(shù)。但其使用了一種較為特 殊的實(shí)現(xiàn)方法,使眾多常規(guī)ARK軟件很難檢測(cè)出360安全衛(wèi)士所的鉤子。由于此方法對(duì)系統(tǒng)表操作很少,比較穩(wěn)定。 Hookport.sys只提供了最為基本的過(guò)濾操作和樁 函數(shù),本身并沒(méi)有實(shí)現(xiàn)策略部分。策略部分由360SelfProtection.sys實(shí)現(xiàn),并通過(guò)設(shè)備擴(kuò)展進(jìn)行溝通。 本報(bào)告簡(jiǎn)要解釋了360安全衛(wèi)士所使用的掛鉤方法,給出了其中的一些關(guān)鍵數(shù)據(jù)結(jié)構(gòu)和 使用方法。
SSDT內(nèi)存位置的確定由于SSDT是內(nèi)核的導(dǎo)出表,所以確定較為方便。可以直接使用 MmGetSystemRoutineAddress 函數(shù)。但由于系統(tǒng)中其它安全軟件可能對(duì)此函數(shù)進(jìn)行掛鉤,所以360采用了更加穩(wěn)妥的方式。 首先,向ZwQuerySystemInformation傳遞0x0B號(hào)參數(shù),獲得SYSTEM_MODULE_INFORMATION結(jié)構(gòu) 數(shù)組。數(shù)組的第一個(gè)元素就是內(nèi)核模塊,取得內(nèi)核模塊的imageBase和imageSize。
按照PE格式解析映射入內(nèi)存的系統(tǒng)內(nèi)核,從導(dǎo)出表中找到KeServiceDescriptorTable的地 址,進(jìn)行重定位后得到SSDT表在內(nèi)存中的真實(shí)地址。
上述這個(gè)過(guò)程被360封裝在MyGetFuncAddrFromKrnl 函數(shù)中,并在以后被多次調(diào)用。 函數(shù)原型如下: int __stdcall MyGetFuncAddrFromKrnl(PUNICODE_STRING funcName) funcName為內(nèi)核導(dǎo)出函數(shù)的名稱 返回值為函數(shù)地址或NULL。(詳細(xì)分析請(qǐng)參考IDB文件) shadowSSDT內(nèi)存位置的確定1. 使用MyGetFuncAddrFromKrnl獲得 KeAddSystemServiceTable函數(shù)地址。 其反匯編代碼如下:
2. 搜索8D 88 指令,并去除后4字節(jié): 注意紅色代碼:這里出現(xiàn)了KeServiceDescriptorTableShadow的地址,對(duì)應(yīng)的機(jī)器碼為 8D 88 40 31 55 80 ,從KeAddSystemServiceTable開始搜索8D 88,緊接著的4字節(jié)數(shù)據(jù)就是shadowSSDT在內(nèi)存中的地址。 |
|