修改IP TCP UDP校驗碼

2021-09-25 11:38:46 字數 2187 閱讀 9061

ipv4資料報文中修改的**ip或目的ip後,一般需要修改對應的校驗碼。首先ip校驗碼是最基礎的,然後因為tcp/udp對應的校驗碼會根據偽報文頭檢查(其中包含src ip 和 dst ip),所以也需要修改tcp/udp報文的校驗碼。這裡修復了一些其他文章中的bug,例如快取溢位、構造tcp/udp偽報文採用的引數等,通過實驗能夠正常執行。

unsigned int checksum(unsigned int cksum, void *pbuffer, unsigned int size)

while (size > 1)

if (size > 0)

while (cksum >> 16)

return cksum;

}unsigned short changeipv4checksum(char *ipheader)

執行修改當前資料報tcp或udp校驗碼

//獲取tcp/udp報文首位址指標,ethpkt表示ipv4報文首位址,0x45 00 .....

unsigned char *header = ðpkt[ipheadlen];

//計算ipv4報文中tcp/udp報文長度

unsigned short len = ntohs(*(unsigned short*)(ðpkt[2])) - ipheadlen;

//根據修改的源ip或目的ip來計算校驗碼,ethpkt[9]表示tcp或協議型別

changetcpudpchecksum(header, source_ip.to_uint(), target_ip.to_uint(), ethpkt[9], len);

計算tcp或udp校驗碼函式,其中構造tcp/udp偽報頭中採用長度為tcp/udp段之後報文長度,ptc表示採用哪種協議。

checksum函式和ip一樣,都是計算校驗和求反。

struct psd_header;/*

* header tcp/udp header,

* len is tcp/udp packet length ,contains data segement 這裡重點,計算偽報文頭的傳遞長度中包含資料段長度

* ptc is tcp/udp protocol code ,0x06 to tcp or 0x11 to udp

* */

void changetcpudpchecksum(unsigned char *header, unsigned int ui_source_ip, unsigned int ui_target_ip, char ptc, unsigned short len)

; unsigned short header_len = (header[12] & 0xff) >> 2;

header[16]=0;

header[17]=0;

struct psd_header *p_psd = null;

p_psd = (struct psd_header *)malloc(sizeof(struct psd_header));

p_psd->saddr = (unsigned int)htonl(ui_source_ip);

p_psd->daddr = (unsigned int)htonl(ui_target_ip);

p_psd->mbz = (char)0x00;

p_psd->ptcl = ptc;

p_psd->tcpl = (unsigned short)htons(len);

//copy and compute checksum

memcpy(sendbuf,p_psd,sizeof(struct psd_header));

memcpy(sendbuf+sizeof(struct psd_header),header,len);

unsigned int tcp_sum=checksum(0,(void *)&sendbuf,sizeof(struct psd_header)+len);

unsigned int tcp_tmp = ~tcp_sum;

header[16]=(unsigned char)(tcp_tmp >> 8);

header[17]=(unsigned char)(tcp_tmp);

free(p_psd);

return ;

}

校驗碼 奇偶校驗碼

1.奇偶校驗碼 通過在編碼中增加一位校驗位來使編碼中1的個數為奇數或者偶數,校驗位可以在原編碼的前面或者後面加。通過加入校驗位後的1個數是奇數還是偶數,可分為兩種 奇校驗 1的個數為奇數 偶校驗 1的個數為偶數 下圖為奇校驗和偶校驗的設定方法。例如 m的ascii碼77,二進位制表示為0100110...

校驗碼 迴圈冗餘校驗碼

迴圈冗餘校驗碼,又稱crc碼。它利用生成多項式來為k個資料位產生r個校驗位來進行編碼。其編碼長度為k r。迴圈冗餘校驗碼由兩部分組成,左邊為資訊碼 資料 右邊為校驗碼,如下圖 若資訊碼佔k位,則校驗碼就佔n k位,其中,n為crc碼的字長,所以又稱為 n,k 碼。校驗碼位數越多,校驗能力越強。crc...

常用校驗碼(奇偶校驗碼 海明校驗碼 CRC校驗碼)

一 奇偶校驗碼 二 海明校驗碼 三 crc校驗碼 計算機系統執行時,各個部之間要進行資料交換.交換的過程中,會有發生誤碼的可能 即0變成1或1變成0 由於計算機的儲存是通過二進位制 來實現的的,誤碼會導致儲存的內容發生改變。為確保資料在傳送過程正確無誤,常使用檢驗碼.我們常使用的檢驗碼有三種.分別是...