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 由於計算機的儲存是通過二進位制 來實現的的,誤碼會導致儲存的內容發生改變。為確保資料在傳送過程正確無誤,常使用檢驗碼.我們常使用的檢驗碼有三種.分別是...