[翻譯]LSP程式的分類

狂斬一條龍發表於2016-09-30

翻譯的太垃圾,不建議其它人閱讀本文。 

 

 

Note:LSP現在已經不推薦使用。自windows8和windows Server2012開始,使用Windows Filtering Platform。

Winsock2 允許一種分層協議。分層協議是實現一種更高層級的通訊函式,根據下層的傳輸棧來實現資料的遠端交換。一個LSP使用的例子可能是為了安全,他增加一層協議到連線建立處理,以執行認證,並建立在加密方式的相互同意的安全層。這種安全協議通常會需要一個下層的傳輸協議,類似TCP或SPX的服務。由基提供商實現的術語基礎協議是指實現的協議如TCP或SPX,其能夠與遠端端點進行資料通訊的Winsock提供。這個分層協議術語被用來描述不可以單獨存在的協議。這些分層協議已經被安裝,稱為Winsock Layerd Service Provider。

一個LPS使用的例子是 客戶端安裝在Internet Secutity And Authentication Server中一部分的windows Firewall Client Service Provider。Microsoft Firewall Client Service Provider安裝在windows基礎協議TCP和UDP之上。一個在ISA FireWall Client軟體的 DLL變成一個winsock 的一個分層協議提供者,這樣所有winsock程式通訊都將經過他。這樣,ISA Firewall Client LSP可以攔截從客戶端到目標底層服務的 Winsock 函式的呼叫,然後去請求一個原始底層的服務。一個相似的LPS使用例子是Mrcrosoft Frefront Firewall Service和Theat Management Gateway的一部分,被安裝在客戶端上。

在LSP初始化的時候,LSP必須提供一系列SPI函式指標。這些函式將被在一般的分層處理中呼叫(其它的 LSP 或者ws2_32.dll)。

根據一個SPI函式的子集定義一個LSP類別。一個LSP實現和實際處理被這些函式執行。通過LSP的分類,和使用win socket的程式分類類似,他使得你可以在程式執行時有選擇的確定一個LSP是否被請求。

在windows vista之後,一個winsock lsp和程式分類的新的方法被提供,所以只有一定的lSP將會被載入。這就是增加這些特性的原因。

一個主要原因是, 一些關鍵的系統程式如:winlogon和lsass建立socket,但是這些程式不使用這些socket去在網路上傳輸。所有大部分的LSP不可以被這些程式載入。一些文件已經說明LSP會導致lsass.exe程式崩潰。如果lsass崩潰,系統就會強制關機。另個載入LSP的影響是一些程式從來不退出,當一個LSP安裝或移除,如果重啟電腦。

還有一些原因就是一些程程式不需要載入指定的LSP。例如,一些程式不需要載入含有加密功能的LSP,這樣會導致程式從這個系統到達另一個沒有安裝LSP的系統時出現問題。

最後,LSP分類可被用於另一些lSP去決定把自己的LSP安裝在哪裡。一些年,一些LSP開發者已經需要一個方法去知道一個LSP的行為是到底是怎樣。例如一個資料流想要在另一個LSP的上層來加密資料。當然,這種LSP分類方法不是十分安全,原因是他依賴於另一個與他相關的第三方LSP分類。

windows vista之後的LSP分類和其它安全機制被設計用來幫助保護使用者非故意 的安裝惡意的LSP。

LSP 分類:

在windows vista之後,一個LSP是根據與windows socket呼叫如何配合來分類的。一個LSP是一個唯一標識的一組winsock SPI函式呼叫。例如 一個http內容過濾的LSP應該被定義為一個資料篩查器(data inspector)(LSP_INSPECTOR 分類)。一個LSP_INSPECTOR分類的LSP將會檢測資料引數,但是之後不會修改這些資料。一個程式可以通過查詢一個LPS的分類和去選擇不載入指定LSP。

下面的表列出了LSP可用的分類

LSP_CRYPTO_COMPRESS 這種LSP是用於資料加密和可壓縮的

LSP_FIREWALL這種LSP是用於做防火牆的

LSP_LOCAL_CACHE 這種LSP是做本地快取的

LSP_INBOUND_MODIFY 這種LSP是用於修改進入資料的

LSP_INSPECTOR 這個程式LSP是用於檢查和過濾資料的

LSP_OUTBOUND_MODIFY 這種LSP是用於修改出站資料的

LSP_PROXY  這種LSP做為一種代理來重定向發包

LSP_REDIRECTOR 這LSP是用於網路重定向

LSP_SYSTEM 這類LSP可以被用於系統服務程式

 

一個LSP可以有多個分類,例如一個安全防火牆LSP可能包含LSP_INSPECTOR和LSP_FIREWALL兩種分類。

如果一個LSP沒有包含任意一個類別,則他被認為是所有其它類別的。這個lSP分類將不會被用於服務和系統程式。

 

Categorizing LSPs

下面是一些被用於 Categorrizing LSP的一些函式

為了categorize 一個lsp,WSCSetProviderInfo和WSCSetProviderinfo32被呼叫,他的引數是一個GUID標識這個lSP的隱藏入口 ,這些資訊類被設定用於LSP Protocol  entry,設定標識用於修改這些函式的行為。

WCSGetProviderInfo和WSCGetProviderInfo32函式經常被用於提取一個LSP相關的資料類和資訊。

Categorizing Applications

下面的函式被用於categerizing 一個程式。

為了Categorize an application,WCSSetApplicationCategory function 被呼叫。他的引數有可執行檔案目錄,和程式命令列,這標識這個LSP是被被作用於這個程式例項。

判斷哪個 LSP被載入

LSP Categorization最後的部分是決定哪引LSP被會載入入哪個程式。當一個程式WINSOCK時,載入LSP時差將會作Application categories和LSP categories的比較。

如果一個程式沒有被categorized,允許所有LSP載入入這個程式

如果程式和LSP都被categorized,則必須具備以下條件:

在程式中至少有一個LSP Categories被指定。

Only categories specified in the application`s specified categories are specified in the LSPs categories. For example, if the application specifies a category it 

If the LSP_SYSTEM category is present in the application`s category, it must be present in the LSP`s categories.

考慮如下例子:

foo.exe這個程式cateorized為LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS。這個程式bar.exe 的 categorize為LSP_FIREWALL + LSP_CRYPTO_COMPRESS。下面的4個LSP

  • LSP1 has set a category of LSP_SYSTEM.
  • LSP2 is not categories set, so its category is zero.
  • LSP3 has set a category of LSP_FIREWALL.
  • LSP4 has set categories of LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS + LSP_INSPECTOR

在這個例子中foo.exe將會只載入LSP2,bar.exe將會載入LSP3。

檢測Winsock配置是否被安裝

sdk包含一個winsock的程式例項,他演示瞭如何判定winsock transpot provider是否被安裝在當前電腦上。

C:Program FilesMicrosoft SDKsWindowsv7.0SamplesNetDswinsockLSP

這個例子顯示了安裝一個測試 的LSP。但是他可以被用於程式設計通訊winsock 的詳細資訊。可以列出所有當前包含winsock providers和layer service provider。用以下命令列執行這個例子

instlsp -p

 

會輸出安裝在本地計算機上的winsock provider和layerd service provider。輸出的catalog ID和字串名稱。

可以用如下命令列來收集winsock provider的詳細資訊。

instlsp -p -v

這個輸出將會列出一個 WSAPROTOCOL_INFO的結構資訊

可以下如下命令列列出本地的layerd service provider

instlsp -l

為了對應LSP結構執行以下命令列

instlsp -m


相關文章