[英]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.