1,738
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/if_ether.h>
#include <net/if_arp.h>
#include <netpacket/packet.h>
#include <net/if.h>
#include <net/ethernet.h>
#include <linux/tcp.h>
#define BUFLEN 54
//CRC校验和的计算
unsigned short check_sum(unsigned short *addr,int len){
register int nleft=len;
register int sum=0;
register short *w=addr;
short answer=0;
while(nleft>1)
{
sum+=*w++;
nleft-=2;
}
if(nleft==1)
{
*(unsigned char *)(&answer)=*(unsigned char *)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return(answer);
}
int main(int argc,char** argv)
{
int skfd,n;
char buf[BUFLEN]={0};
struct ether_header *eth;
struct sockaddr_ll toaddr;
struct in_addr targetIP,srcIP;
struct ip *ip;
struct tcphdr *tcp;
struct ifreq ifr;
unsigned char src_mac[ETH_ALEN]={0};
unsigned char dst_mac[ETH_ALEN]={0};
unsigned char src_ip[15]={0};
unsigned char dst_ip[15]={0};
unsigned srcport, dstport;
printf("源MAC:");
scanf("%x:%x:%x:%x:%x:%x",
&src_mac[0],&src_mac[1],&src_mac[2],
&src_mac[3],&src_mac[4],&src_mac[5]);
printf("目标MAC:");
scanf("%x:%x:%x:%x:%x:%x",
&dst_mac[0],&dst_mac[1],&dst_mac[2],
&dst_mac[3],&dst_mac[4],&dst_mac[5]);
printf("源IP:");
scanf("%s",&src_ip);
printf("目标IP:");
scanf("%s", &dst_ip);
printf("目标端口:");
scanf("%d", &dstport);
printf("源端口:");
scanf("%d", &srcport);
if((skfd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL)))<0)
{
perror("Create Error");
exit(1);
}
bzero(&toaddr,sizeof(toaddr));
bzero(&ifr,sizeof(ifr));
strcpy(ifr.ifr_name,argv[1]);
//获取接口索引
if(-1 == ioctl(skfd,SIOCGIFINDEX,&ifr)){
perror("get dev index error:");
exit(1);
}
toaddr.sll_ifindex = ifr.ifr_ifindex;
printf("interface Index:%d\n",ifr.ifr_ifindex);
//开始填充,构造以太头部
eth=(struct ether_header*)buf;
memcpy(eth->ether_dhost,dst_mac,ETH_ALEN);
memcpy(eth->ether_shost,src_mac,ETH_ALEN);
eth->ether_type = htons(ETHERTYPE_IP);
//开始填充IP首部
ip=(struct ip*)(buf+sizeof(struct ether_header));
ip->ip_v = IPVERSION;
ip->ip_hl = sizeof(struct ip)>>2;
ip->ip_tos = 0;
ip->ip_len = htons(sizeof(struct ip)+sizeof(struct tcphdr));
ip->ip_id=0;
ip->ip_off=0;
ip->ip_ttl=MAXTTL;
ip->ip_p=IPPROTO_TCP;
// ip->ip_sum=check_sum((unsigned short*)ip,sizeof(struct ip));
ip->ip_sum = 0;
inet_pton(AF_INET,dst_ip,&targetIP);
ip->ip_dst = targetIP;
inet_pton(AF_INET,src_ip,&srcIP);
ip->ip_src = srcIP;
//开始填充TCP首部
tcp = (struct tcphdr*)(buf+sizeof(struct ip)+sizeof(struct ether_header));
tcp->source = htons(srcport);
tcp->dest = htons(dstport);
tcp->seq = 0;
tcp->ack = 0;
tcp->window = htons(8192);
tcp->doff = 5;
tcp->syn = 1;
tcp->check = 0;
toaddr.sll_family = PF_PACKET;
tcp->check=check_sum((unsigned short*)tcp,sizeof(struct tcphdr));
ip->ip_sum=check_sum((unsigned short*)ip,sizeof(struct ip));
n=sendto(skfd,buf,BUFLEN,0,(struct sockaddr*)&toaddr,sizeof(toaddr));
close(skfd);
return 0;
}