簡體   English   中英

這個校驗和計算有什么問題嗎?

[英]Is there anythign wrong with this checksum calculation?

來自這個網站: http//www.enderunix.org/docs/en/rawipspoof/

我提取了以下功能

unsigned short in_cksum(unsigned short *addr, int len)
{
    int nleft = len;
    int sum = 0;
    unsigned short *w = addr;
    unsigned short answer = 0;

    while (nleft > 1) {
        sum += *w++;
        nleft -= 2;
    }

    if (nleft == 1) {
        *(unsigned char *) (&answer) = *(unsigned char *) w;
        sum += answer;
    }

    sum = (sum >> 16) + (sum & 0xFFFF);
    sum += (sum >> 16);
    answer = ~sum;
    return (answer);
}

unsigned short in_cksum_tcp(int src, int dst, unsigned short *addr, int len)
{
    struct psd_tcp buf;
    u_short ans;

    memset(&buf, 0, sizeof(buf));
    buf.src.s_addr = src;
    buf.dst.s_addr = dst;
    buf.pad = 0;
    buf.proto = IPPROTO_TCP;
    buf.tcp_len = htons(len);
    memcpy(&(buf.tcp), addr, len);
    ans = in_cksum((unsigned short *)&buf, 12 + len);
    return (ans);
}

但是,當我針對我看到的傳入TCP數據包運行此命令時,我得不到與它們當前具有相同的校驗和結果(我保存傳入的TCP校驗和並在嘗試運行校驗和函數之前將數據包上的那個設置為零)

現在,當我對IP標題運行“in_cksum”時,我得到了正確的答案。

以下是該站點的TCP偽標題:

struct psd_tcp {
    struct in_addr src;
    struct in_addr dst;
    unsigned char pad;
    unsigned char proto;
    unsigned short tcp_len;
    struct tcphdr tcp;
};

是否缺少使這項工作的東西?

好吧,你的主要錯誤是忘記在校驗和計算中包含TCP有效負載,只是標題(oops)。 有關此內容的說明,請參閱RFC 793,第3.1節(http://www.ietf.org/rfc/rfc793.txt):

校驗和字段是標題和文本中所有16位字的一個補碼和的16位補碼。

當然這是我假設'len'參數是TCP頭的長度; 如果它包含有效負載,那么你有不同的問題(memcpy到緩沖區小於源...)。

請注意,當您對有效負載進行校驗和時,RFC中的另一件小事很容易錯過:

如果一個段包含要校驗和的奇數個頭和文本八位字節,則最后一個八位字節用零填充在右邊,形成一個16位字用於校驗和。

只需記住在計算校驗和之前必要時用零填充有效負載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM