我正在組合一個端口掃描程序作爲學習練習。我的問題是我試圖在TCP頭中設置最大段大小選項(MSS)。我看了一下tcp.h,但是我很難弄清楚如何設置它。我希望會有這樣一個選項:在tcp頭文件中設置最大段大小
tcp_header->mss(32000);
類似的東西上面是tcp.h中而不是在正確的結構。不可否認,我對於讀取結構定義仍然相當陌生,而且我從tcp.h中得不到多少意義,所以最後我試圖在TCP標頭末尾加上必要的字節:
struct tcphdr *CreateTcpHeader()
{
struct tcphdr *tcp_header;
tcp_header = (struct tcphdr *)malloc(sizeof(struct tcphdr)+4*sizeof(int));
tcp_header->source = htons(SRC_PORT);
tcp_header->dest = htons(DST_PORT);
tcp_header->seq = htonl(0);
tcp_header->ack_seq = htonl(0);
tcp_header->res1 = 0;
tcp_header->doff = (sizeof(struct tcphdr))/4;
tcp_header->syn = 1;
tcp_header->window = htons(4096);
tcp_header->check = 0; /* Will calculate the checksum with pseudo-header later */
tcp_header->urg_ptr = 0;
/*memcpy the mss data onto the end of the tcp header. */
int mssCode = 2;
int mssLength = 4;
uint16_t mss = htonl(32000);
int offset = sizeof(struct tcphdr);
memcpy((tcp_header+offset), &mssCode, 1);
memcpy((tcp_header+offset+1), &mssLength, 1);
memcpy((tcp_header+offset+2), &mss, 2);
return (tcp_header);
}
但是在我寫完之後很明顯這不是一個真正的解決方案,再加上它仍然不起作用:P那麼還有更好的方法嗎?
你如何使用這個頭?你使用libnet發送它嗎? – Jonathan 2009-08-18 20:30:39
我只是使用原始套接字。雖然即使使用新的mss選項,儘管它與nmap的實際相同,但我的數據包仍然被忽略。任何想法的人? – CalumMcCall 2009-08-18 22:38:26
根據你正在學習的東西 - C或網絡,你可能想看看http://www.secdev.org/projects/scapy/ – 2009-08-19 15:17:32