移植 lwip,在 windows 內核構建一個 TCPIP 協議棧

移植 lwip,在 windows 內核構建一個 TCPIP 協議棧

親,當你點開看這篇文章,就說明你知道我想要幹什麼事情,或者說,你知道在 Windows 的內核種繞開它的網絡協議,再獨立構建一個網絡協議棧的意義。如果你要問我有 windows 系統的網絡協議棧不用,移植 lwip 有什麼意義,那麼你可以關閉鏈接走人了,因爲這篇文章不適合你,它不是講 lwip 移植原理的。

經常關注我的博客的朋友們可能還記得,大概十年前我寫過一篇關於防火牆的文章,裏面簡單提到了在 Windows 內核構建 TCP/IP 協議棧繞過防火牆的概念的可行性。當時經過研究,確實是可行的。我將 lwip 移植到了Windows 內核,以內核驅動的形式在 NDIS 層構建了一個獨立於 Windows 的網絡協議棧。lwip(Lightweight TCP/IP stack) 是一套輕量級的 TCP/IP 協議棧,不過演化到今日,它已經不“輕”了,圍繞 lwip 已經構建了一整套的以太網網絡協議。當時是基於 Windows XP平臺做的一個演示概念,使用 NDIS Hook,移植的 lwip 版本是 1.2 。因爲 lwip 提供了一套與巴克利 socket 接口幾乎 90% 兼容的 socket API,所以當時幾乎不費吹灰之力就在內核中構建了一個 http 協議的客戶端,使得驅動能夠在內核中從指定的 URL 地址(寫在註冊表中)下載一個文件,如果是可執行文件,甚至還可以用 stackoverflow 上介紹的方法在內核中啓動這個可執行文件。當時測試的主流防火牆軟件,都感知不到這些網絡訪問,可以說成功地繞過了防火牆。

在這裏插入圖片描述

這個東西做完之後,這個演示原型已經爛在我的硬盤上十幾年了,最近突然發現 lwip 已經更新到 2.1.2 版本了,支持了包括 IPV6 在內的更多協議。我看說明文件,在 contrib 部分甚至還有一個 http server 的完整實現,我的天啊,如果在內核構建一個能繞開所有防火牆的 http server,簡直不敢想象。如果利用 lwip 提供的 socket API,將 3Proxy 也移植到內核中,我的天啊,更是不敢想啊。

那麼到底行不行呢?不試試怎麼知道?趁着最近有點時間,我決定搞一下。不過真的要搞起來,困難還是很多的,首先,從 Windows vista 開始,NDIS 已經升級到了 6.x 版本,基於 5.x 的體系已經過時了,同時 64 位的 PG 不允許 Hook NDIS層,這些都是需要修改的地方。不過好在 MS 還是爲防火牆軟件的開發人員留了條口子,那就是 NDIS Filter。不用 Hook,只用合法的 NDIS Filter 能否實現這個功能呢?我心裏還是沒底的。另外,lwip 2.x 版本的體系結構和 1.2 的差異還是很大的,這個移植的工作量有多大心裏也沒底。

整理了一下,大概要做以下幾件事情:

  • 以 DDK 中的 NDIS Filter 實例代碼爲基礎,刪除不需要的內容,構建一個空的 NDIS Filter 框架。
  • 將 lwip 1.3.2 移植到內核。爲什麼不選擇最新的 2.1.2 版本?因爲看起來移植的工作量比較大,1.3.2 的代碼結構與 1.2 的差異比較小,並且已經開始支持 IPV6 ,基本上我們需要的功能都有了,爲了減少移植的工作量和難度,我選擇 1.3.2 版本。根據 1.2 的移植經驗,這個移植應該不難。這部分移植的主要工作是將 lwip 的收發幀接口適配到 NDIS 的體系中,同時處理好定時器線程的處理,內核線程畢竟比用戶態線程有更多的約束。還有,當系統中有多個網卡的時候,以及一塊網卡有多個 IP 接口的時候,也是需要 lwip 做一些適配修改的。
  • 將 lwip 演示程序中的 http server 移植到內核,通過對 137 端口的複用,嘗試開啓一個內核中的 http server。這個東西如果成功了,應該能夠通過瀏覽器訪問:http://127.0.0.1:137 ,並看到演示的頁面。
  • 最後,終極目標是嘗試將 3Proxy 移植到內核,配合 lwip 實現一個代理服務器的功能。這個如果成功了,就可以在內核神不知鬼不覺地開啓一個代理服務,3Proxy 可是支持多種代理協議的啊。這一步的工作難度還是比較大的,畢竟 lwip 的socket API接口與真的巴克利 socket 接口還是不一樣的,我考慮做一個適配層,但是如果 3Proxy 用了太多 lwip 不支持的功能,那麼這個適配層就比較難做,有可能導致移植失敗。

根據我掌握的知識,前三步還是比較容易做到的,關鍵是看我有沒有時間,要知道,我的懶惰症還是很嚴重的。上次是因爲要測試一下防火牆,所以有了點動力,這次難道還測防火牆?不管怎麼樣,先從 NDIS Filter 開始吧。

我有一個 lwip

面朝內核,支持Proxy

從今天起,關心 NDIS Filter 和 3Proxy

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