首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實作 IP 資料包標頭檢驗和演算法:偽造 IP 封包核心技術

     編輯:關於C語言

IP 封包標頭結構與檢驗和計算原理

為了實現 IP 封包偽造與網路安全測試,作者使用 C# 重寫了 IPv4 標頭的檢驗和計算演算法。文章詳細記錄了 IP 標頭各欄位定義、檢驗和演算法邏輯,並提供完整可用的原始碼實作。

IPv4 標頭欄位完整定義(共 20 位元組基本標頭)

欄位名稱位元長度說明
版本號4 bitsIP 協定版本(IPv4 為 0100)
標頭長度4 bits以 32-bit 為單位,最小值 5(20 位元組)
服務類型8 bitsQoS 參數(優先權、延遲、吞吐量、可靠度)
封包總長度16 bits含標頭與資料的總長度(最大 65,535 位元組)
識別段16 bits分片重組識別碼
旗標段16 bits含保留位、DF(禁止分片)、MF(更多片段)
生存時間8 bitsTTL,每經過一個路由器遞減 1,防止路由迴圈
傳輸協定8 bits上層協定(TCP=6, UDP=17, ICMP=1 等)
標頭檢驗和16 bits僅驗證標頭完整性,不含資料部分
來源位址32 bits發送端 IP 位址
目的位址32 bits接收端 IP 位址
選項/填充可變可選欄位,以 32-bit 對齊填充

檢驗和演算法:RFC 791 標準實作

IP 協定採用「16 位元互補和」演算法:

  1. 將檢驗和欄位暫設為 0
  2. 以 16 位元為單位將標頭所有資料進行二進位加法(溢位回卷)
  3. 將最終結果取反(一補數)即為檢驗和值

驗證時:接收端對含檢驗和的標頭同樣計算,結果若為 0xFFFF(全 1)則判定無誤。

C# 實作程式碼與關鍵修正說明

public static UInt16 Checksum(UInt16[] buffer, int size)
{
    uint cksum = 0;
    for (int i = 0; i < size; i++)
    {
        cksum += buffer[i];
        // 溢位回卷處理
        if (cksum > 0xFFFF)
            cksum = (cksum & 0xFFFF) + (cksum >> 16);
    }
    // 最終取反得到檢驗和
    return (UInt16)(~cksum);
}

注意:原文提供的程式碼邏輯有誤(迴圈只執行一次、位移操作錯誤),上方為修正後的標準實作。實際使用時需將完整 IP 標頭(含選項)轉為 UInt16[] 陣列傳入,size 為陣列長度。位元組陣列 byte[] 轉 UInt16[] 需注意大小端序與對齊問題。

應用場景與法律提醒

此技術常用於網路滲透測試、防火牆規則驗證、協定分析工具開發。嚴禁用於惡意攻擊、IP 欺騙入侵等非法行為,開發者應遵守當地網路安全法規,僅在授權環境下進行研究。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved