Ⅰ 數據防泄露的技術變革
透明加密技術是近年來針對企業數據保密需求應運而生的一種數據加密技術。所謂透明,是指對使用者來說是透明的,感覺不到加密存在,當使用者在打開或編輯指定文件時,系統將自動對加密的數據進行解密,讓使用者看到的是明文。保存數據的時候,系統自動對數據進行加密,保存的是密文。而沒有許可權的人,無法讀取保密數據,從而達到數據保密的效果。
自WindowsNT問世以來,微軟提出的分層的概念,使透明加密有了實現的可能。自上而下,
應用軟體,應用層APIhook(俗稱鉤子), 文件過濾驅動,卷過濾驅動,磁碟過濾驅動,另外還有網路過濾驅動,各種設備過濾驅動。其中應用軟體和應用層apihook在應用層(R3), 從文件過濾驅動開始,屬於內核層(R0).
數據透明加密技術,目前為止,發展了3代,分別為
第一代APIHOOK應用層透明加密技術;
第二代文件過濾驅動層(內核)加密技術;
第三代內核級縱深加密技術 ;
第一代:APIHOOK應用層透明加密技術
應用層透明加密技術俗稱鉤子透明加密技術。這種技術起源於win98時代,後來隨著windows2000而流行起來。就是將上述兩種技術(應用層API和Hook)組合而成的。通過windows的鉤子技術,監控應用程序對文件的打開和保存,當打開文件時,先將密文轉換後再讓程序讀入內存,保證程序讀到的是明文,而在保存時,又將內存中的明文加密後再寫入到磁碟中。應用層APIHOOK加密技術,特點是實現簡單,缺點是可靠性差,速度超級慢,因為需要臨時文件,也容易破解。但由於直接對文件加密直觀感覺非常好,對於當初空白的市場來講,這一旗號確實打動了不少企業。
第二代:文件過濾驅動加密技術
驅動加密技術是基於windows的文件系統(過濾)驅動技術,起源於WindowsNT發布之後,其工作在windows的內核層,處於應用層APIHook的下面,卷過濾和磁碟過濾的上面。設計思想是建立當應用程序(進程)和文件格式(後綴名)進行關聯,當用戶操作某種後綴文件時對該文件進行加密解密操作,從而達到加密的效果。
內核層文件過濾驅動技術,分IFS和Minifilter2類。IFS出現較早,Minfilter出現在xp以後。兩者的區別可以理解為VC++和MFC的區別,IFS很多事情需要自己處理,而Minifilter是微軟提供了很多成熟庫,直接用。由於windows文件保存的時候,存在緩存,並不是立即寫入文件,所以根據是否處理了雙緩bug,後來做了些細分,但本質還是一樣,都是問題的修正版本而已。但由於工作在受windows保護的內核層,運行速度比APIHOOK加密速度快,解決了很多問題和風險。
文件過濾驅動技術實現相對簡單,但穩定性一直不太理想。
第三代:內核級縱深沙盒加密技術
之所以叫內核級縱深沙盒加密技術,主要原因是使用了磁碟過濾驅動技術,卷過濾驅動技術,文件過濾驅動技術,網路過濾驅動(NDIS/TDI)技術等一系列內核級驅動技術,從上到下,縱深防禦加密。該技術也起源於WindowsNT之後,但由於技術復雜,開發要求高,公開資料少,而發展較慢。但隨著微軟公布了部分Windows源代碼之後,此技術開始逐漸成熟。內核級沙盒加密,是當使用者操作涉密數據的時候,對其存儲過程進行控制,對其結果進行加密保存,每個模塊只做自己最擅長的那塊,所以非常穩定。加密的沙盒是個容器,把涉密軟體,文件扔到容器中加密。而這個容器是透明的,使用者感覺不到它的存在。,
第三代透明加密技術的特點是,涉密數據使用前,先初始化涉密沙盒,沙盒加密一旦成功,之後所有的數據都是數據實體,不針對文件個體,所以無數據破損等問題。特點是速度快,穩定。
第一代,第二代本質都是採用的針對單個文件實體進行加密,如a.txt內容為1234, 加密後變成@#$%% +標記。@#$%%是把原文1234進行加密之後的密文。而標記的用途是用來區分一個a.txt文件是否是已經被加密。當系統遇到一個文件的時候,首先判斷這個標記是否存在,如果存在,表明是被系統加密過的,則走解密讀取流程,如果不是加密的,就無需解密,直接顯示給使用者,只是當保存的時候,再進行加密,使其成文密文+標記。
這就帶來一個巨大的風險 :如果是一個較大文件,加密過程中發生異常,標記沒加上,那麼下次讀這個文件的時候,因為沒有讀到表記,而採用原文讀取,然後再加密,那麼這個文件就徹底毀壞了。這個現象在第一代APIHOOK透明加密技術的產品中特別明顯,在第二代文件過濾驅動產品中,因為速度變快了,使文件破損發生概率減低了很多,但並沒有本質解決這個問題。
另外, 由於是進程和文件後綴名進行關聯,也造成了一個缺陷 :很多編程類軟體,復雜制圖軟體的編譯,曬圖等操作,都是很多進程同時操作某個文件,這個時候進行進程和文件關聯顯然太牽強了,因為進程太多了。即使進行關聯,多個進程交替訪問文件,加密解密混在一起,極容易造成異常。所以才會出現VC等環境下如不能編譯,調試等。
其他方面,版本管理無法對比,伺服器上存放的是密文(伺服器存密文,是個極大的風險,目前沒有哪家大企業敢這么做,畢竟太依賴加密軟體,持續性沒有了),大文件速度慢等,一系列問題,無法解決。
而第三代內核縱深加密技術是在前者2個基礎之上發展而來的,每個過濾層都只做自己最擅長的事情,所以特別穩定,速度快,性能可靠,不存在第一代和第二代的問題。由於內核級縱深透明加密技術要求高,涉及技術領域廣,極其復雜,開發周期長,所以國內的能做開發的廠商不多。目前, 深信達公司推出的SDC機密數據保密系統, 給人一眼前一亮的感覺,其產品是第三代透明加密保密技術的典型產品,其產品主要特點是:
1)採用了磁碟過濾,卷過濾,文件過濾,網路過濾等一系列縱深內核加密技術,採用沙盒加密,和文件類型和軟體無關,沙盒是個容器。
2)在操作涉密數據的同時,不影響上外網,QQ,MSN等。
3)保密徹底,包括網路上傳,郵件發送,另存,復制粘貼,屏幕截取等,特別是屏幕保密,做得非常炫。
4)服務上存放的是明文,客戶端存放的是密文,文件上傳伺服器自動解密,到達客戶端自動加密。伺服器上明文,減少了業務連續性對加密軟體的依賴。
5)不但可以針對普通文檔圖紙數據進行保密需求,同時更是研發性質的軟體公司( 游戲 ,通訊,嵌入式,各種BS/CS應用系統)源代碼保密首選。
Ⅱ 寒江獨釣:Windows內核安全編程的圖書目錄
第1章 內核上機指導 1
Windows內核編程的動手有點麻煩,並不是僅僅安裝一個獨立的軟體(比如VC)之後就可以安然地開始編寫代碼,然後運行了。需要下載開發包、配置開發環境、准備調試工具,可能還需要一些小工具協同工作。這一步攔住了不少的初學者。本章以詳細圖文攻略,來引導讀者完成這一麻煩的步驟。
1.1 下載和使用WDK 2
1.1.1 下載安裝WDK 2
1.1.2 編寫第一個C文件 3
1.1.3 編譯一個工程 5
1.2 安裝與運行 6
1.2.1 下載一個安裝工具 6
1.2.2 運行與查看輸出信息 7
1.2.3 在虛擬機中運行 9
1.3 調試內核模塊 9
1.3.1 下載和安裝WinDbg 9
1.3.2 設置Windows XP調試執行 10
1.3.3 設置Vista調試執行 11
1.3.4 設置VMWare的管道虛擬串口 11
1.3.5 設置Windows內核符號表 13
1.3.6 實戰調試first 14
練習題 16
第2章 內核編程環境及其特殊性 17
編寫過驅動程序的讀者可能會很熟悉這一切,但是對只從事過應用程序的讀者而言,要理解內核編程環境的特殊性,就很需要一些功夫和悟性了。在應用程序中,多線程的情況已經帶來了一定理解的困難;而內核代碼呢?幾乎無時無刻不運行在多線程之下。它從哪裡開始?從哪裡結束?它在什麼進程內運行?這些問題一言難盡。
2.1 內核編程的環境 18
2.1.1 隔離的應用程序 18
2.1.2 共享的內核空間 19
2.1.3 無處不在的內核模塊 20
2.2 數據類型 21
2.2.1 基本數據類型 21
2.2.2 返回狀態 22
2.2.3 字元串 23
2.3 重要的數據結構 23
2.3.1 驅動對象 23
2.3.2 設備對象 25
2.3.3 請求 26
2.4 函數調用 28
2.4.1 查閱幫助 28
2.4.2 幫助中有的幾類函數 30
2.4.3 幫助中沒有的函數 32
2.5 Windows的驅動開發模型 32
2.6 WDK編程中的特殊點 33
2.6.1 內核編程的主要調用源 33
2.6.2 函數的多線程安全性 34
2.6.3 代碼的中斷級 36
2.6.4 WDK中出現的特殊代碼 37
練習題 38
第3章 串口的過濾 40
在安全軟體的開發中,串口驅動的應用並不常見。但是本書以串口驅動作為第一個介紹的實例。為何?僅僅是因為串口簡單。從簡單的例子入手,可以為讀者帶來稍許輕松的感受。
3.1 過濾的概念 41
3.1.1 設備綁定的內核API之一 41
3.1.2 設備綁定的內核API之二 43
3.1.3 生成過濾設備並綁定 43
3.1.4 從名字獲得設備對象 45
3.1.5 綁定所有串口 46
3.2 獲得實際數據 47
3.2.1 請求的區分 47
3.2.2 請求的結局 48
3.2.3 寫請求的數據 49
3.3 完整的代碼 50
3.3.1 完整的分發函數 50
3.3.2 如何動態卸載 52
3.3.3 完整的代碼 53
本章的示例代碼 53
練習題 54
第4章 鍵盤的過濾 56
鍵盤是很重要的輸入設備!這是因為我們用鍵盤錄入信息、用鍵盤輸入密碼,甚至用鍵盤編程,也用鍵盤著書立說。對於黑客來說,使用龐大的計算機資源去破解那些堅不可摧的加密演算法,哪如偷偷地記下用戶用鍵盤輸入的密鑰更加簡單呢?本章專注於鍵盤的保護。
4.1 技術原理 57
4.1.1 預備知識 57
4.1.2 Windows中從擊鍵到內核 58
4.1.3 鍵盤硬體原理 60
4.2 鍵盤過濾的框架 61
4.2.1 找到所有的鍵盤設備 61
4.2.2 應用設備擴展 64
4.2.3 鍵盤過濾模塊的DriverEntry 65
4.2.4 鍵盤過濾模塊的動態卸載 66
4.3 鍵盤過濾的請求處理 68
4.3.1 通常的處理 68
4.3.2 PNP的處理 69
4.3.3 讀的處理 70
4.3.4 讀完成的處理 71
4.4 從請求中列印出按鍵信息 72
4.4.1 從緩沖區中獲得KEYBOARD_INPUT_DATA 72
4.4.2 從KEYBOARD_INPUT_DATA中得到鍵 73
4.4.3 從MakeCode到實際字元 74
4.5 Hook分發函數 75
4.5.1 獲得類驅動對象 76
4.5.2 修改類驅動的分發函數指針 77
4.5.3 類驅動之下的埠驅動 78
4.5.4 埠驅動和類驅動之間的協作機制 79
4.5.5 找到關鍵的回調函數的條件 80
4.5.6 定義常數和數據結構 80
4.5.7 打開兩種鍵盤埠驅動尋找設備 81
4.5.8 搜索在KbdClass類驅動中的地址 83
4.6 Hook鍵盤中斷反過濾 86
4.6.1 中斷:IRQ和INT 86
4.6.2 如何修改IDT 87
4.6.3 替換IDT中的跳轉地址 88
4.6.4 QQ的PS/2反過濾措施 90
4.7 利用IOAPIC重定位中斷處理函數 90
4.7.1 什麼是IOAPIC 90
4.7.2 如何訪問IOAPIC 91
4.7.3 編程修改IOAPIC重定位表 92
4.7.4 插入新的中斷處理 93
4.7.5 驅動入口和卸載的實現 95
4.8 直接用埠操作鍵盤 96
4.8.1 讀取鍵盤數據和命令埠 96
4.8.2 p2cUserFilter的最終實現 97
本章的示例代碼 98
練習題 99
第5章 磁碟的虛擬 100
CPU是計算機的核心,但是它不保存信息。如果它被竊,我們可以簡單地購買一個新的。但是如果裝滿了機密信息的硬碟被竊了,那可就不是買一個新的就能彌補得了的。本章介紹硬碟內核魔術:虛擬硬碟。虛擬硬碟可以不被盜竊者利用嗎?良好的設計可以做到這一點。
5.1 虛擬的磁碟 101
5.2 一個具體的例子 101
5.3 入口函數 102
5.3.1 入口函數的定義 102
5.3.2 Ramdisk驅動的入口函數 103
5.4 EvtDriverDeviceAdd函數 104
5.4.1 EvtDriverDeviceAdd的定義 104
5.4.2 局部變數的聲明 105
5.4.3 磁碟設備的創建 105
5.4.4 如何處理發往設備的請求 107
5.4.5 用戶配置的初始化 108
5.4.6 鏈接給應用程序 110
5.4.7 小結 111
5.5 FAT12/16磁碟卷初始化 111
5.5.1 磁碟卷結構簡介 111
5.5.2 Ramdisk對磁碟的初始化 113
5.6 驅動中的請求處理 119
5.6.1 請求的處理 119
5.6.2 讀/寫請求 120
5.6.3 DeviceIoControl請求 122
5.7 Ramdisk的編譯和安裝 124
5.7.1 編譯 124
5.7.2 安裝 125
5.7.3 對安裝的深入探究 125
練習題 126
第6章 磁碟過濾 127
很多網吧的老闆、公司的IT管理部門以及讀者自己都很厭惡硬碟總是被病毒和木馬搞得一團糟。一些簡單的還原軟體可以搞定這個問題:重啟之後,對硬碟的修改都奇跡般地消失了。這是怎麼實現的呢?本章告訴您答案。
6.1 磁碟過濾驅動的概念 128
6.1.1 設備過濾和類過濾 128
6.1.2 磁碟設備和磁碟卷設備過濾驅動 128
6.1.3 注冊表和磁碟卷設備過濾驅動 129
6.2 具有還原功能的磁碟卷過濾驅動 129
6.2.1 簡介 129
6.2.2 基本思想 130
6.3 驅動分析 130
6.3.1 DriverEntry函數 130
6.3.2 AddDevice函數 132
6.3.3 PnP請求的處理 136
6.3.4 Power請求的處理 140
6.3.5 DeviceIoControl請求的處理 140
6.3.6 bitmap的作用和分析 144
6.3.7 boot驅動完成回調函數和稀疏文件 150
6.3.8 讀/寫請求的處理 152
6.3.9 示例代碼 160
6.3.10 練習題 161
第7章 文件系統的過濾與監控 162
硬碟是硬碟,而文件系統是文件系統,可是有的人總是把它們當做一回事。其實硬碟很簡單,硬碟就是一個很簡單的保存信息的盒子;而復雜的是文件系統,它很精妙地把簡單的數據組織成復雜的文件。作為信息安全的專家,我們當然不能讓文件系統脫離我們的控制之外。
7.1 文件系統的設備對象 163
7.1.1 控制設備與卷設備 163
7.1.2 生成自己的一個控制設備 165
7.2 文件系統的分發函數 166
7.2.1 普通的分發函數 166
7.2.2 文件過濾的快速IO分發函數 167
7.2.3 快速IO分發函數的一個實現 169
7.2.4 快速IO分發函數逐個簡介 170
7.3 設備的綁定前期工作 172
7.3.1 動態地選擇綁定函數 172
7.3.2 注冊文件系統變動回調 173
7.3.3 文件系統變動回調的一個實現 175
7.3.4 文件系統識別器 176
7.4 文件系統控制設備的綁定 177
7.4.1 生成文件系統控制設備的過濾設備 177
7.4.2 綁定文件系統控制設備 178
7.4.3 利用文件系統控制請求 180
7.5 文件系統卷設備的綁定 183
7.5.1 從IRP中獲得VPB指針 183
7.5.2 設置完成函數並等待IRP完成 184
7.5.3 卷掛載IRP完成後的工作 187
7.5.4 完成函數的相應實現 190
7.5.5 綁定卷的實現 191
7.6 讀/寫操作的過濾 193
7.6.1 設置一個讀處理函數 193
7.6.2 設備對象的區分處理 194
7.6.3 解析讀請求中的文件信息 195
7.6.4 讀請求的完成 198
7.7 其他操作的過濾 202
7.7.1 文件對象的生存周期 202
7.7.2 文件的打開與關閉 203
7.7.3 文件的刪除 205
7.8 路徑過濾的實現 206
7.8.1 取得文件路徑的3種情況 206
7.8.2 打開成功後獲取路徑 207
7.8.3 在其他時刻獲得文件路徑 209
7.8.4 在打開請求完成之前獲得路徑名 209
7.8.5 把短名轉換為長名 211
7.9 把sfilter編譯成靜態庫 212
7.9.1 如何方便地使用sfilter 212
7.9.2 初始化回調、卸載回調和綁定回調 213
7.9.3 綁定與回調 215
7.9.4 插入請求回調 216
7.9.5 如何利用sfilter.lib 218
本章的示例代碼 221
練習題 221
第8章 文件系統透明加密 223
如何阻止企業的機密文件被主動泄密,但是又不用關閉網路、禁止U盤等手段重重束縛大家?很多跡象表明,文件系統透明加密是最優的選擇。既然從前一章讀者已經學會了控制文件系統,那麼現在,該是我們摩拳擦掌,用它來保護我們的機密信息的時候了。
8.1 文件透明加密的應用 224
8.1.1 防止企業信息泄密 224
8.1.2 文件透明加密防止企業信息泄密 224
8.1.3 文件透明加密軟體的例子 225
8.2 區分進程 226
8.2.1 機密進程與普通進程 226
8.2.2 找到進程名字的位置 227
8.2.3 得到當前進程的名字 228
8.3 內存映射與文件緩沖 229
8.3.1 記事本的內存映射文件 229
8.3.2 Windows的文件緩沖 230
8.3.3 文件緩沖:明文還是密文的選擇 232
8.3.4 清除文件緩沖 233
8.4 加密標識 236
8.4.1 保存在文件外、文件頭還是文件尾 236
8.4.2 隱藏文件頭的大小 237
8.4.3 隱藏文件頭的設置偏移 239
8.4.4 隱藏文件頭的讀/寫偏移 240
8.5 文件加密表 241
8.5.1 何時進行加密操作 241
8.5.2 文件控制塊與文件對象 242
8.5.3 文件加密表的數據結構與初始化 243
8.5.4 文件加密表的操作:查詢 244
8.5.5 文件加密表的操作:添加 245
8.5.6 文件加密表的操作:刪除 246
8.6 文件打開處理 248
8.6.1 直接發送IRP進行查詢與設置操作 248
8.6.2 直接發送IRP進行讀/寫操作 250
8.6.3 文件的非重入打開 252
8.6.4 文件的打開預處理 255
8.7 讀寫加密/解密 260
8.7.1 在讀取時進行解密 260
8.7.2 分配與釋放MDL 261
8.7.3 寫請求加密 262
8.8 crypt_file的組裝 265
8.8.1 crypt_file的初始化 265
8.8.2 crypt_file的IRP預處理 266
8.8.3 crypt_file的IRP後處理 269
本章的示例代碼 272
練習題 272
第9章 文件系統微過濾驅動 273
從來都不原地踏步的微軟,早就准備好了下一代的文件系統過濾的框架、文檔、代碼例子。雖然本書的前兩章的範例在Windows 7上都還可以正常運行,但是如果不學習一下最新的介面,讀者一定會覺得不自在。但是讀者可以放心,在前面學習的基礎上,了解新的介面是易如反掌的。
9.1 文件系統微過濾驅動簡介 274
9.1.1 文件系統微過濾驅動的由來 274
9.1.2 Minifilter的優點與不足 275
9.2 Minifilter的編程框架 275
9.2.1 微文件系統過濾的注冊 276
9.2.2 微過濾器的數據結構 277
9.2.3 卸載回調函數 280
9.2.4 預操作回調函數 281
9.2.5 後操作回調函數 284
9.2.6 其他回調函數 285
9.3 Minifilter如何與應用程序通信 288
9.3.1 建立通信埠的方法 288
9.3.2 在用戶態通過DLL使用通信埠的範例 290
9.4 Minifilter的安裝與載入 292
9.4.1 安裝Minifilter的INF文件 293
9.4.2 啟動安裝完成的Minifilter 294
本章的示例代碼 295
練習題 295
第10章 網路傳輸層過濾 296
筆者常常使用防火牆,它們看上去真的很神奇。如果懷疑自己的機器上有見不得人的進程打開了網路埠盜走機密信息,防火牆將提醒您,雖然防火牆並不知道它是否是一個木馬。這是怎麼做到的?本章為您揭曉謎底。
10.1 TDI概要 297
10.1.1 為何選擇TDI 297
10.1.2 從socket到Windows內核 297
10.1.3 TDI過濾的代碼例子 299
10.2 TDI的過濾框架 299
10.2.1 綁定TDI的設備 299
10.2.2 唯一的分發函數 300
10.2.3 過濾框架的實現 302
10.2.4 主要過濾的請求類型 304
10.3 生成請求:獲取地址 305
10.3.1 過濾生成請求 305
10.3.2 准備解析IP地址與埠 307
10.3.3 獲取生成的IP地址和埠 308
10.3.4 連接終端的生成與相關信息的保存 310
10.4 控制請求 311
10.4.1 TDI_ASSOCIATE_ADDRESS的過濾 311
10.4.2 TDI_CONNECT的過濾 313
10.4.3 其他的次功能號 314
10.4.4 設置事件的過濾 316
10.4.5 TDI_EVENT_CONNECT類型的設置事件的過濾 318
10.4.6 直接獲取發送函數的過濾 320
10.4.7 清理請求的過濾 322
10.5 本書例子tdifw.lib的應用 323
10.5.1 tdifw庫的回調介面 323
10.5.2 tdifw庫的使用例子 325
本章的示例代碼 326
練習題 327
第11章 NDIS協議驅動 328
網路的連接只是外表而已,實際上,最終它們變成了一個個在網線上往返的網路包。高明的黑客是不會去用Socket來生成連接的。把黑暗的信息隱藏在單個的數據包里,你還可以發現它們嗎?本章介紹的NDIS協議驅動,是Windows網路抓包工具的基礎。
11.1 乙太網包和網路驅動架構 329
11.1.1 乙太網包和協議驅動 329
11.1.2 NDIS網路驅動 330
11.2 協議驅動的DriverEntry 331
11.2.1 生成控制設備 331
11.2.2 注冊協議 333
11.3 協議與網卡的綁定 335
11.3.1 協議與網卡的綁定概念 335
11.3.2 綁定回調處理的實現 335
11.3.3 協議綁定網卡的API 338
11.3.4 解決綁定競爭問題 339
11.3.5 分配接收和發送的包池與緩沖池 340
11.3.6 OID請求的發送和請求完成回調 342
11.3.7 ndisprotCreateBinding的最終實現 345
11.4 綁定的解除 351
11.4.1 解除綁定使用的API 351
11.4.2 ndisprotShutdownBinding的實現 353
11.5 在用戶態操作協議驅動 356
11.5.1 協議的收包與發包 356
11.5.2 在用戶態編程打開設備 357
11.5.3 用DeviceIoControl發送控制請求 358
11.5.4 用WriteFile發送數據包 360
11.5.5 用ReadFile發送數據包 362
11.6 在內核態完成功能的實現 363
11.6.1 請求的分發與實現 363
11.6.2 等待設備綁定完成與指定設備名 364
11.6.3 指派設備的完成 365
11.6.4 處理讀請求 368
11.6.5 處理寫請求 370
11.7 協議驅動的接收回調 374
11.7.1 和接收包有關的回調函數 374
11.7.2 ReceiveHandler的實現 376
11.7.3 TransferDataCompleteHandler的實現 380
11.7.4 ReceivePacketHandler的實現 381
11.7.5 接收數據包的入隊 383
11.7.6 接收數據包的出隊和讀請求的完成 385
本章的示例代碼 388
練習題 389
第12章 NDIS小埠驅動 390
如果厭煩了漏洞百出的乙太網,還有什麼可以充當我的網路介面嗎?當然,一切能通信的設備,皆有替代乙太網的潛質。即使您不願意修改無數通過TCP介面編程的應用程序,我們依然可以用其他通信設備來虛擬網卡。本章介紹小埠驅動來虛擬網卡的技術。
12.1 小埠驅動的應用與概述 391
12.1.1 小埠驅動的應用 391
12.1.2 小埠驅動的實例 392
12.1.3 小埠驅動的運作與編程概述 393
12.2 小埠驅動的初始化 393
12.2.1 小埠驅動的DriverEntry 393
12.2.2 小埠驅動的適配器結構 396
12.2.3 配置信息的讀取 397
12.2.4 設置小埠適配器上下文 398
12.2.5 MPInitialize的實現 399
12.2.6 MPHalt的實現 402
12.3 打開ndisprot設備 403
12.3.1 I/O目標 403
12.3.2 給IO目標發送DeviceIoControl請求 404
12.3.3 打開ndisprot介面並完成配置設備 406
12.4 使用ndisprot發送包 409
12.4.1 小埠驅動的發包介面 409
12.4.2 發送控制塊(TCB) 409
12.4.3 遍歷包組並填寫TCB 412
12.4.4 寫請求的構建與發送 415
12.5 使用ndisprot接收包 417
12.5.1 提交數據包的內核API 417
12.5.2 從接收控制塊(RCB)提交包 418
12.5.3 對ndisprot讀請求的完成函數 420
12.5.4 讀請求的發送 422
12.5.5 用於讀包的WDF工作任務 424
12.5.6 ndisedge讀工作任務的生成與入列 426
12.6 其他的特徵回調函數的實現 428
12.6.1 包的歸還 428
12.6.2 OID查詢處理的直接完成 429
12.6.3 OID設置處理 432
本章的示例代碼 433
練習題 434
第13章 NDIS中間層驅動 435
當我們不滿足於抓包和發包,而試圖控制本機上流入和流出的所有數據包的時候,NDIS中間層驅動是最終的選擇。防火牆的功能在這里得到加強:我們不再滿足於看到連接、埠、對方IP地址,而是要看到每一個數據包的原始結構。本章介紹NDIS中間層驅動。
13.1 NDIS中間層驅動概述 436
13.1.1 Windows網路架構總結 436
13.1.2 NDIS中間層驅動簡介 437
13.1.3 NDIS中間層驅動的應用 438
13.1.4 NDIS包描述符結構深究 439
13.2 中間層驅動的入口與綁定 442
13.2.1 中間層驅動的入口函數 442
13.2.2 動態綁定NIC設備 443
13.2.3 小埠初始化(MpInitialize) 445
13.3 中間層驅動發送數據包 447
13.3.1 發送數據包原理 447
13.3.2 包描述符「重利用」 448
13.3.3 包描述符「重申請」 451
13.3.4 發送數據包的非同步完成 453
13.4 中間層驅動接收數據包 455
13.4.1 接收數據包概述 455
13.4.2 用PtReceive接收數據包 456
13.4.3 用PtReceivePacket接收 461
13.4.4 對包進行過濾 463
13.5 中間層驅動程序查詢和設置 466
13.5.1 查詢請求的處理 466
13.5.2 設置請求的處理 468
13.6 NDIS句柄 470
13.6.1 不可見的結構指針 470
13.6.2 常見的NDIS句柄 471
13.6.3 NDIS句柄誤用問題 473
13.6.4 一種解決方案 475
13.7 生成普通控制設備 476
13.7.1 在中間層驅動中添加普通設備 476
13.7.2 使用傳統方法來生成控制設備 478
本章的示例代碼 483
練習題 483
附錄A 如何使用本書的源碼光碟 485
Ⅲ 遇到流氓軟體應該怎麼解決
預防 防範流氓軟體第一步,就是要有安全的上網意識,不要輕易登陸不了解的網站,因為這樣很有可能會中網頁腳本病毒,從而使系統中上流氓軟體。不要隨便下載不熟悉的軟體,如果用戶不了解這些軟體,當這些軟體中捆綁一些流氓軟體時,用戶也無法察覺。安裝軟體時應仔細閱讀軟體附帶的用戶協議及使用說明,有些軟體在安裝的過程中會以不引起用戶注意的方式提示用戶要安裝流氓軟體,這時如果用戶不認真看提示的話,就會安裝上流氓軟體,由於這是用戶自己選擇的,因此,用戶不會受到保護。 在安裝操作系統後,應該先上網給系統打補丁,補住一些已知漏洞,這樣能夠避免利用已知漏洞的流氓軟體的駐留。如果用戶使用IE瀏覽器上網,則應該將瀏覽器的安全級別調到中高級別,或者在自定義里,將ACTIVEX控制項、腳本程序都禁止執行,這樣能夠防止一些隱藏在網頁中的流氓軟體的入侵。判斷 第二步,判斷自己是否已經中了流氓軟體。這要根據流氓軟體的中招症狀來看。一般地,瀏覽器首頁被無故修改、總是彈出廣告窗口、CPU的資源被大量佔用、系統變得很慢、瀏覽器經常崩潰、或出現找不到某個DLL文件的提示框,這些是流氓軟體最常見的現象,如果發現計算機中出現這些現象,則很有可能是中了流氓軟體,就要採取相應的措施,而如果出現CPU的資源被大量佔用,系統變得很慢這樣的情況,則很有可能是中了多種流氓軟體的原因,更應該盡快進行相應處理。 確診自己中了流氓軟體 氓軟體無論多麼復雜,它們的傳播流程幾乎是一樣的,都是會通過軟體捆綁或網頁下載先進入到計算機的一個臨時目錄里,一般是是系統的根目錄或者系統默認的臨時目錄,然後將自己激活,這時流氓軟體進入內存中正常運行。當流氓軟體正常運行時,為了下一次能夠自動運行,它們往往會修改注冊表的自啟動項,從而達到自動啟動的目的。然後流氓軟體會將自己拷貝到系統目錄隱藏起來,然後將臨時的安裝文件刪除,最後jian聽系統埠,進行各種各樣的流氓行為。 如果用戶喜歡下載安裝一些小的工具軟體,或者去一些小的網站上瀏覽網頁,雖然計算機沒有出現上述現象,但是也有可能中流氓軟體,這時也應該關注一下計算機,看是否真正中招,這時就可以按照流氓軟體的這個傳播鏈去一一排查。首先利用一些第三方的內存查看工具,看看內存中是否有一些可疑的進程或線程,這需要用戶對系統中的進程或一些常用軟體的進程有所了解,這樣才有可能看出問題。其次,用戶在查看進程的過程中應該看看這些進程的路徑,如果有一些進程的路徑不是正常的安裝目錄,而是系統的臨時目錄,那八成是流氓軟體。 另外,用戶還要看看注冊表裡(開始菜單的運行框里鍵入REGEDIT)的自啟動項(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run)里是否有一些用戶不認識的程序鍵值,這些很可能就是流氓軟體建立的。行動 確診自己中了流氓軟體,清除就相對比較簡單了。對於已知的流氓軟體,建議用戶用專門的清除工具進行清除。 在這里不建議用 戶自己手工清除流氓軟體,因為流氓軟體越來越復雜,已經不再是那種簡單的刪除多個文件就能解決的了,很多流氓軟體在進入系統之前,就對系統進行了修改和關聯,當用戶擅自刪除流氓軟體文件時,系統無法回復到最初的那個狀態,而導致流氓軟體雖然清除了,但系統也總是出現各種錯誤。而專業的清除工具往往已經考慮到這一點,能夠幫助用戶完全恢復系統。 如果在一些特殊場合用戶需要手動清除流氓軟體時,則按照流氓軟體的傳播鏈條,按照先刪除內存的進程,再刪除注冊表中的鍵值,最後再刪除流氓軟體體,將系統配置修改為默認屬性 這樣一個過程進行處理。
Ⅳ 個人防火牆的數據類型
用戶態(user-mode)和內核態(kernel-mode)。
1)用戶態(user-mode)。
在用戶態下進行網路數據包的攔截有三種方法:WinsockLayeredServiceProvider(LSP)、Windows2000包過濾介面、替換系統自帶的WINSOCK動態連接庫。在用戶態下
進行數據包攔截最致命的缺點就是只能在Winsock層次上進行,而對於網路協議棧中底層協議的數據包無法進行處理。因此,這些方法並不適合個人防火牆。
2)內核態(kernel-mode)。
a)TDI過濾驅動程序(TDIFilterDriver)。當應用程序要發送或接收網路數據包的時候,都是通過與協議驅動所提供的介面來進行的。協議驅動提供了一套系統預定義的標准介面來和應用程序之間進行交互。因此,只需要開發一個過濾驅動來截獲這些交互的介面,就可以實現網路數據包的攔截。在Windows2000/NT下,ip,tcp,udp是在一個驅動程序里實現的,叫做tcp.sys,這個驅動程序創建了5個設備:DeviceRawIp,DeviceUdp,DeviceTcp,DeviceIp,DeviceMULTICAST。應用程序所有的網路數據操作都是通過這些設備進行的。因此,我們只需要開發一個過濾驅動來截獲這些交互的介面,就可以實現網路數據包的攔截。另外,TDI層的網路數據攔截還可以得到操作網路數據包的進程詳細信息,這也是個人防火牆的一個重要功能。但是,TDI傳輸驅動程序有一個缺陷,TDIFilterdriver屬於Upperdriver,位於TcpIP.sys之上,這就意味著由TcpIP.sys接收並處理的數據包不會傳送到上層,從而無法過濾某些接收的數據包,例如ICMP包。ICMP的應答包直接由TcpIP.sys生成並回應,而上面的過濾驅動程序全然不知。另外,該方法需要在系統核心層編寫驅動程序,需要編寫人員對Windows操作核心層的工作機制非常熟悉,同時,驅動程序對代碼質量要求非常高,稍有不慎就會使系統崩潰,
b)Win2kFilter-HookDriver。這是從Windows2000開始系統所提供的一種驅動程序,該驅動程序主要是利用Ipfiltdrv.sys所提供的功能來攔截網路數據包。Filter-HookDriver的結構非常簡單,易於實現。但是正因為其結構過於簡單,並且依賴於Ipfiltdrv.sys,Microsoft並不推薦使用Filter-HookDriver。
c)NDISHookDriver。該方法在Windows2000/xp下是非公開的,因此這種方法對平台的依賴性比較大,需要在程序中判斷不同的操作系統版本而使用不同的方法。
d)NDIS中間層驅動程序(NDISIntermediateDriver)。NDIS()是Microsoft和3Com公司開發的網路驅動程序介面規范的簡稱,它支持如下三種類型的網路驅動程序:微埠驅動程序、中間層驅動程序(IntermediateDriver)和協議驅動程序。其中中間層驅動介於協議層驅動和小埠驅動之間,其功能非常強大,可以提供多種服務,能夠截獲所有的網路數據包(以太幀),過濾微埠驅動程序,實現特定的協議或其他諸如數據包加密、認證等功能。綜上所述,在NDIS中間層進行網路數據包截獲的方法結構規范,功能強大,該技術極其適合個人防火牆所採用。
中間層驅動程序(NDIS)的內部結構
NDIS支持3種驅動:微埠驅動,中間層驅動和協議驅動。
1) 微埠驅動。就是網卡驅動,它負責管理網卡,包括通
過網卡發送和接受數據,它也為上層驅動提供介面。
2) 中間層驅動。它通常位於微埠驅動和傳輸協議驅動之間,是基於鏈路層和網路層之間的驅動,由於中間層驅動在驅動層次中的中間層位置,它必須與其上層的協議和下層的微埠驅動通信,並且導出兩種協議的函數。雖然中間層驅動導出MINIPORTXX函數,但它並不真正的管理物理網卡,而是導出一個或者多個虛擬適配器,上層協議可以綁定到上面。對於協議驅動來說,中間層導出的虛擬適配器看起來像一個物理網卡,當它向這個虛擬適配器發送封包或者請求時,中間層驅動將這些封包和請求傳播到下層微埠驅動;當下層微埠驅動向上指示接收封包或者狀態時,中間層驅動向上到綁定虛擬適配器上的協議驅動。中間層驅動的主要作用就是過濾封包,其優點是能夠截獲所有的網路數據包。
3) 協議驅動,即網路協議。它位於NDIS體系的最高層,經常用作實現傳輸協議堆棧的傳輸驅動中的最底層驅動。傳輸協議驅動申請封包,從發送應用程序將數據復制到封包中,通過調用NDIS函數將這些封包發送到下層驅動。協議驅動也是提供了一個協議介面來接收來自下層驅動的封包。傳輸協議驅動將收到的封包傳遞給相應的客戶應用程序。在下層,協議驅動與中間層微埠驅動交互。協議驅動調用NDISXX函數發送封包,讀取和設置下層驅動維護的信息,使用操作系統服務。協議驅動也要導出一系列的入口點,NDIS調用它來指示封包的接受,指示下層驅動的狀態,或者是和其他協議驅動的通信。
中間層內部的工作流程
1) 中間層對數據包的管理
中間層驅動程序從高層驅動程序接收數據包描述符,並在網路上發送,該包描述符與一個或多個鏈式數據緩沖區相關聯。中間層驅動程序能夠對數據進行重新打包,並使用新的數據包描述符進行數據傳輸,也可以直接將數據包傳遞給低層驅動程序,如果驅動程序下邊界面向無連接,可調用NdisSend或NdisSendPackets函數完成該功能,如果驅動程序下邊界是面向連接的,可調用NdisCoSendPackets函數完成此項功能。中間層驅動程序也可以進行一些操作改變鏈式緩沖區的內容,或者調整內入數據包相對於其他發送任務的發送次序或發送定時。但是,即使中間層驅動程序只是向下層傳遞上層引入的數據報,例如,僅僅只是對數據包進行計數,也必須分配新的數據包描述符,並且要管理部分或者全部新的包結構。
每一個中間層驅動程序都必須分配自己的包描述符來代替高層的數據包描述符。如果中間層驅動程序要把數據包從一種格式轉化為另一種格式,也必須分配緩沖區描述符來映射用於復制轉配數據的緩沖區,該緩沖區由中間層驅動程序進行分配。如果有與復制的包描述符相關的OOB數據,那麼可以將這些數據復制到與包描述符(中間層驅動程序分配的)相關的新OOB數據塊,其過程是,首先,用NDIS_OOB_DATA_FROM_PACKET宏獲取OOB數據區的指針,然後,調用disMoveMemory將其內容移入與新包描述符相關的OOB數據區。該驅動程序也能夠用NDIS_GET_PACKET_XXX或NDIS_SET_PACKET_XXX宏從與老的包描述符相關的OOB數據區中,讀取相關的內容,並寫入與新包描述符相關的OOB數據區。
包描述符通過調用以下NDIS函數進行分配
a)調用NdisAllocatePacketPool或者NdisAllocatePacketPoolEx,為固定尺寸包描述符(由呼叫器指定數量)分配並初始化一組非可分頁池。
b)調用NdisAllocatePacket函數,從NdisAllocatePacketPool(Ex)已經分配的池中分配包描述符。根據中間層驅動程序目的的不同,驅動程序能夠對引入包描述符連接的緩沖區進行重新打包。例如,中間層驅動程序可以在接下來的情況下分配包緩沖池、對引入包數據重新打包.如果中間層驅動程序從高層協議驅動程序接收到的數據緩沖區,比低層介質能夠發送的單個緩沖區更大,那麼中間層驅動程序必須將引入的數據緩沖分割成更小的、滿足低層發送要求的數據緩沖。中間層驅動程序在將發送任務轉交低層驅動程序之前,可以通過壓縮或加密數據方式來改變內入數據包的長度。調用以下NDIS函數分配上面所要求的緩沖區:
NdisAllocateBufferPool獲取用於分配緩沖區描述符的句柄;
NdisAllocateMemory或NdisAllocateMemoryWithTag分配緩沖區;
c)調用NdisAllocateBuffer分配和設置緩沖區描述符,映射由NdisAllocateMemory(WithTag)分配的緩沖區,並鏈接到NdisAllocatePacket分配的包描述符上。驅動程序可以通過調用NdisChainBufferAtBack或NdisChainBufferAtFront函數,將緩沖區描述符和包描述符進行鏈接。調用NdisAllocateMemory(WithTag)返回的虛擬地址和緩沖區長度,將被傳遞給NdisAllocateBuffer函數來初始化其所映射的緩沖區描述符。符合典型要求的包描述符能夠在驅動程序初始化時根據要求進行分配,也可以通過ProtocolBindAdapter函數調用來實現。如果必要或者出於性能方面的考慮,中間層驅動程序開發者可以在初始化階段,分配一定數量的包描述符和由緩沖區描述符映射的緩沖區,這樣,就為ProtocolReceive復制內入數據(將向高層驅動程序指示)預先分配了資源,也為MiniportSend或MiniportSendPackets向相鄰低層驅動程序傳遞引入的發送數據包,准備了可用的描述符和緩沖區。如果在中間層驅動程序復制接收/發送數據到一個或多個緩沖區時,最末的一個緩沖的實際數據長度比緩沖區的長度小,那麼,中間層驅動程序將調用NdisAdjustBufferLength把該緩沖區描述符調節到數據的實際長度。當該包返回到中間層驅動程序時,應再次調用該函數將其長度調節到完整緩沖區的實際尺寸。
2)下邊界面向無連接的中間層驅動程序的工作流程
通過ProtocolReceivePacket函數,從低層NIC驅動程序以完整數據包形式接收內入數據,該數據包由NDIS_PACKET類型的包描述符指定,也能夠通過將內入數據指示給ProtocolReceive函數,並將數據復制到中間層驅動程序提供的數據包中。下邊界面向連接的中間層驅動程序總是用ProtocolCoReceivePacket函數,從低層NIC驅動程序接收數據作為一個完整的數據包。
在如下情況下,中間層驅動程序能夠保持對接收數據包的所有權:當下邊界面向無連接的中間層驅動程序向ProtocolReceivePacket函數指示完整數據包時,當下邊界面向連接的中間層驅動程序向ProtocolCoReceivePacket函數指示數據包時,其中DIS_PACKET_OOB_DATA的Status成員設置為除NDIS_STATUS_RESOURCES以外的任何值。在這些情況下,中間層驅動程序能夠保持對該包描述符和其所描述的資源的所有權,直到所接收數據處理完畢,並調用NdisReturnPackets函數將這些資源返還給低層驅動程序為止。如果ProtocolReceivePacket向高層驅動程序傳遞其所接收的資源,那麼至少應該用中間層驅動程序已經分配的包描述符替代引入包描述符。根據中間層驅動程序目的的不同,當其從低層驅動程序接收完整數據包時,將有幾種不同的包管理策略。例如,以下是幾種可能的包管理策略:復制緩沖區內容到中間層驅動程序分配的緩沖區中,該緩沖區被映射並鏈接到一個新的包描述符,向低層驅動程序返回該輸入包描述符,然後可以向高層驅動程序指示新的數據包;創建新的包描述符,將緩沖區(與被指示包描述符相關聯)鏈接到新的包描述符,然後將新的包描述符指示給高層驅動程序。當高層驅動程序返回包描述符時,中間層驅動程序必須拆除緩沖區與包描述符間的鏈接,並將這些緩沖區鏈接到最初從低層驅動程序接收到的包描述符,最後向低層驅動程序返還最初的包描述符及其所描述的資源。即使下邊界面向無連接的中間層驅動程序支持ProtocolReceivePacket函數,它也提供ProtocolReceive函數。當低層驅動程序不釋放包描述符所指示資源的所有權時,NDIS將調用ProtocolReceive函數,當這類情況出現時,中間層驅動程序必須復制所接收的數據到它自己的緩沖區中。對於下邊界面向連接的中間層驅動程序,當低層驅動程序不釋放包描述符所指示資源的所有權時,則將數據包的NDIS_PACKET_OOB_DATA的Status成員設為NDIS_STATUS_RESOURCES,然後驅動程序的ProtocolCoReceivePacket函數必須將接收到數據復制到自己的緩沖區中
5) 中間層驅動過濾數據包的原理
NDIS中間層驅動程序在NDIS中起著轉發上層驅動程序送來的數據包,並將其向下層驅動程序發送的介面功能。當中間層驅動程序從下層驅動程序接收到數據包時,它要麼調用NdisMXxxIndicateReceive函數,要麼調用NdisMindicateReceivePacket函數向上層指示該數據包中間層驅動程序通過調用NDIS打開和建立一個對低層NIC驅動程序或者NDIS中間層驅動程序的綁定。中間層驅動程序提供MiniportSetInformation和MiniportQueryInformation函數來處理高層驅動程序的設置和查詢請求,某些情況下,可能還要將這些請求向低層NDIS驅動程序進行傳遞,如果其下邊界是面向無連接的可通過調用NidsRequest實現這一功能,如果其下邊界是面向連接的則通過調用NidsCoRequest實現該功能。中間層驅動程序通過調用NDIS提供的函數向網路低層NDIS驅動程序發送數據包。例如,下邊界面向無連接的中間層驅動程序必須調用NdisSend或NdisSendPackets來發送數據包或者包數組,而在下邊界面向連接的情況下就必須調用NdisCoSendPackets來發送包數組數據包。如果中間層驅動程序是基於非NDISNIC驅動程序的,那麼在調用中間層驅動程序的MiniportSend或Miniport(Co)SendPackets函數之後,發送介面對NDIS將是不透明的。NDIS提供了一組隱藏低層操作系統細節的NdisXxx函數和宏。例如,中間層驅動程序可以調用NdisMInitializeTimer來創建同步時鍾,可以調用NdisInitializeListHead創建鏈表。中間層驅動程序使用符合NDIS標準的函數,來提高其在支持Win32介面的微軟操作系統上的可移植性。
在防火牆的設計中,最核心的部分應該是數據包的過濾。
其他的功能都是建立在數據包過濾的基礎之上,如:入侵檢測功能和郵件檢測功能都是建立在數據包過濾的基礎之上。數據包過濾中主要是IP包頭的分析,例如:在乙太網中,得到的數據報大致是如下結構,以太幀頭14個位元組,放在PUCHAR結構數組的第0個元素到第13個元素中,其中前六個位元組是目的MAC地址,然後六個位元組源MAC地址,然後兩個位元組是協議類型,通常的協議類型有0x080x00->IP,0x080x06->ARP,0x080x35->RARP,所以,可以通過數組的第12個元素和第13個元素來判斷協議類型。過濾規則就是在這個基礎之上建立。如果要過濾特定協議,只要在相應的位元組讀取數據,判斷是否符合要過濾的規則就可以了,當然實際的過濾規則要復雜的多的多,比如對指定的埠指定的IP的過濾。