原始套接字偽造發包

2021-04-12 16:19:07 字數 2593 閱讀 4973

源**如下:

int tcpoptscan::send_tcp_raw( socket sd, struct in_addr *srcaddr, struct in_addr *desaddr, u16 srcport, u16 desport, u32 seq, u32 ack, u8 flags,u16 window, u8 *options, int optlen, char *data, u16 datalen)

//填寫目標位址

sock.sin_family = af_inet;

sock.sin_port = htons(desport);

sock.sin_addr.s_un.s_addr = desaddr->s_addr;

//填寫資料報

memset((char *) packet,0,sizeof(ip_header) + sizeof(tcp_header));

//填寫ip資料報頭

//填充ip首部

ip->h_lenver=(4<<4|sizeof(ip_header)/sizeof(unsigned long)); //高四位ip版本號,低四位首部長度

ip->total_len=htons(sizeof(ip_header)+sizeof(tcp_header) +optlen + datalen);//16位總長度(位元組)

ip->ident=0;//16位標識

ip->frag_and_flags=0;//3位標誌位

ip->ttl=myttl;//8位生存時間ttl

ip->proto=ipproto_tcp;//8位協議(tcp,udp…)

ip->checksum=0;//16位ip首部校驗和

ip->sourceip= srcaddr->s_addr;//32位源ip位址

ip->destip= desaddr->s_addr;//32位目的ip位址

//填寫偽報頭

pseudo->saddr = srcaddr->s_addr;

pseudo->daddr = desaddr->s_addr;

pseudo->ptcl = ipproto_tcp;

pseudo->tcpl = htons(sizeof(tcp_header) + optlen + datalen);

pseudo->mbz=0;

//填寫tcp報頭

tcp->th_sport = htons(srcport);

tcp->th_dport = htons(desport);

if (seq)

else if (flags & th_syn)

if (ack)

tcp->th_ack = htonl(ack);

tcp->th_lenres = (sizeof(tcp_header)/4<<4|0);

tcp->th_flag = flags;

if (window)

tcp->th_win = htons(window);

else

tcp->th_win = htons(1024); /* who cares */

//拷貝資料

//if (data && datalen)

// memcpy(packet + sizeof(struct ip) + sizeof(struct tcphdr) + optlen, data, datalen);

/* 拷貝選項 */

//if (optlen)

// memcpy(packet + sizeof(struct ip) + sizeof(struct tcphdr), options, optlen);

//計算tcp校驗和,計算校驗和時需要包括tcppseudoheader

unsigned short niu;

niu=ntohs(ip->total_len);

char *sendbuf = new char[128];

memcpy(sendbuf,pseudo,sizeof(psd_header));

memcpy(sendbuf+sizeof(psd_header),tcp,sizeof(tcp_header));

tcp->th_sum = checksum((ushort*)sendbuf,sizeof(psd_header)+sizeof(tcp_header)); //無tcp資料

delete sendbuf;

//debug

int m = ntohs(ip->total_len);

int pr = ip->proto;

//debug

//ip->total_len=40;

res =sendto( sd,packet,ntohs(ip->total_len),0,(struct sockaddr*)&sock, sizeof(sock));

if( res == socket_error)

delete packet;

delete pseudo;

return res;

原始套接字

資料出處 實際上,我們常用的網路程式設計都是在應用層的報文的收發操作,也就是大多數程式設計師接觸到的流式套接字 sock stream 和資料報式套接字 sock dgram 而這些資料報都是由系統提供的協議棧實現,使用者只需要填充應用層報文即可,由系統完成底層報文頭的填充並傳送。然而在某些情況下需...

原始套接字

參考1 原始套接字能幹什麼?參考2 原始套接字抓包實踐 參考3 各層頭結構 通過原始套接字,我們可以抓取所有傳送到本機的ip包 包括ip頭和tcp udp icmp包頭 也可以抓取所有本機收到的幀 包括資料鏈路層協議頭 普通的套接字無法處理icmp igmp等網路報文,而sock raw可以。利用原...

原始套接字

利用原始套接字實現乙個tcp syn flooding 程式 要求 客戶端不斷向攻擊端傳送syn連線請求 客戶端在傳送資料時,通過源位址隨機位址的方式隱藏自己的 位址 檢驗 在shell下通過 netstat tn 檢查syn recv連線數檢驗自己的程式是否成功 好像有點問題。不能偽造mac位址。...