Windows內核安全 —— 第四章 鍵盤的過濾

       本章講了幾種過濾鍵盤的方法,說實話越往後越深,寫的很全,後面我沒看懂,下面是我看懂的部分記錄了下來。

       文章開頭講了幾個知識點:

       1) 符號鏈接,用一個不同的明智代表一個設備對象,上層可以通過該名稱訪問相應的設備對象。
       2) ZwCreateFile,在內核中用於打開文件(設備對象)的函數,是應用層的Createfile在內核層的實現
       3) PDO(物理設備對象, physical device object),PDO是設備佔最下面的設備對象,所以相比較於PDO和FDO(function device object),PDO肯定是處於FDO的下方,可以認爲PDO是物理設備在系統中的對應對象
       4) 函數IoGetAttachDevice可以獲得一個設備所在設備棧最頂端的那個對象

       這些知識點在文中都有使用,而且在編寫驅動的過程中也是經常需要使用的。

       本文講了這樣一句話,感覺很正確,過濾與反過濾的過程中,關鍵在於“誰將第一個得到信息”,所以我們要分析鍵盤的整體結構來一步一步考慮該如果在對應的位置去過濾該設備。如下圖所示鍵盤的整體架構:

                    

       可以看出可以再圖中紅色區域添加過濾驅動程序,分別對應類驅動的上層過濾、類驅動的下層過濾、端口驅動的上層過濾、端口驅動的下層過濾。所以最開始的例子就講述如何在對應的位置綁定過濾設備的。

       其流程如下:

       1) 調用函數ObReferenceObjectByName通過驅動名(KdbClass)獲取對象指針
       2) 通過該對象指針獲取設備鏈中的第一個設備
       3) 創建與該設備對象類型一樣的過濾設備
       4) 調用函數IoAttachDeviceToDeviceStack將過濾設備綁定到原始的設備對象上,生成新的設備對象
       5) 繼續枚舉設備鏈中的下一個設備。

       OK,綁定完過濾驅動之後,按照串口過濾驅動的處理方式,在相應的讀寫例程中就可以處理鍵盤的相關信息了。

       以上將的方法都是可以讓人很容易理解的,後面書中又介紹了HOOK的方式來過濾鍵盤設備,所謂的HOOK簡單來說就是找到待HOOK的函數指針,將我們自己的函數指針替換上去,達到獲取數據的目的。

        1) 將對應類驅動對象的分發函數指針進行置換,調用函數InterLockedExchangePointer
        2) Hook端口完成上層輸入的回調函數,也可以處理響應的過濾信息
        該函數指針的位置信息:1)存在於i8042prt的設備擴展中; 2)開始地址在kbclass中; 3)kbclass生成的一個設備對象也保存在設備擴展中,且在要找的函數之前
        3) 通過獲取IDT(中斷描述符),替換0x93的中斷處理函數
        IDT(中斷描述符)用於存放每個中斷號對應的中斷處理函數地址。在多核CPU上,每一個核心都有自己的IDT。
        4) 利用IOAPIC重定位中斷處理函數

              IOAPIC是用於多個核心CPU的信息中斷控制器。通過IOAPIC可以將IRQ的處理對應到CPU的某個核心上。所以通過修改IOAPIC可以修改IRQ1對應的中斷號,這樣可以           達到過濾的功能。

操作IOAPIC寄存器的方法:
(1)IOREGSEL(I/O寄存器選擇寄存器)
在Windows下可以通過物理地址0xfec00000直接訪問,可讀寫,其中只有低8位有效,其它位被保護,它的作用是選擇一個要操作的IOAPIC寄存器。
(2)IOWIN(I/O窗口寄存器)
在Windows下對應的物理地址是0Xfec00010,作用是讀/寫由IOREGSEL指定的IOAPIC寄存器。
相當於IOREGSEL用來設置地址,IOWIN用於讀寫數據。


回頭看一下這次寫的東西,感覺很亂很亂,剛開始寫讀書筆記,希望見諒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章