[C++]製作一個簡單的DHCP Server - 使用winpcap

一般我們的網卡都具備有DHCP Client功能,由DHCP Server發配IP,Router通常都具備有Server這功能的。我根據DHCP的規則,用電腦和網卡來做一個簡單的DHCP Server。

這支程式會用到以下的元件與方法:
- Grid : 表格,用來呈現IP分配與狀況
- Winpcap : 收送包API,所有收送包的過程都是透過這個API
- Thread : 把收包處理另外開個Thread,程式可以同時動作

先簡單說明一下DHCP封包,要完成DHCP協議,只需要來回4個封包就可以,分別是:
- Discover : Client發廣播Discover,問線上有哪個Server可以給我IP
- Offer : 線上Server接到之後,只要開啟DHCP功能,都會發出回應給你一個IP
- Request : Client收到Offer包,發送廣播Request包。
- ACK : Server再發給一個ACK,完成。
因此,Server和Client各處理2個包。

--流程圖--


--DHCP送包細部處理流程圖--


說明(利用抓到的DHCP封包改變幾個欄位再送出,這樣就不用去造一個完整封包):
1. 先判斷是不是來自Client端 - UDP Source Port = 68
2. 填入DA/SA,其中DA=原DHCP包的SA,SA則填入自己設定的值
3. 填入DIP/SIP,SIP是ServerIP,DIP去判斷這個IP有沒有被使用後填入
4. 計算IP checksum
5. UDP包,Port number互相對調,checksum不用算,填0就好,一般不檢查
6. 改變DHCP IP/Option值(時間,Submask,DNS,最後填入0xFF表示終結)

--程式執行圖--


--Router status頁面,可以看到剛剛設定進去的值


--完整Source Code(VC++ 2008 vaildated)
Download

--補充--
我也做了ARP和ICMP的Reply,當別人來Ping我的時候,我還可以回應(沒有驗證)。其實還有很多不完整的,不過大概就是這樣運作的了。

--延申--
假設電腦有2張網卡連接Router,一張接到WAN端,一張接到LAN端,接到WAN端的利用以上程式發配IP給Router,而接到LAN端的利用Router分配IP,那這樣就可以利用網卡去測試Router的效能(轉發率,掉包率,延遲,抖動等等)了。

1 意見:

Unknown 提到...

請更新“下載”鏈接,鏈接不可用

搜尋此網誌

總網頁瀏覽量

TK呱呱

Made with by TK