C UDP原始套接字集消息
所以,我用一些CopyIta设置了原始套接字,它发送数据,这部分工作正常。但是如何设置通过套接字发送的数据?我正在寻找一个DNS请求,如果这有帮助的话。代码如下C UDP原始套接字集消息,c,linux,sockets,C,Linux,Sockets,所以,我用一些CopyIta设置了原始套接字,它发送数据,这部分工作正常。但是如何设置通过套接字发送的数据?我正在寻找一个DNS请求,如果这有帮助的话。代码如下 int main(int argc, char *argv[]) { if (!argv[1]) { printf("Target not specified!\nUsage: "); printf(argv[0]); printf(" <target>\n")
int main(int argc, char *argv[])
{
if (!argv[1])
{
printf("Target not specified!\nUsage: ");
printf(argv[0]);
printf(" <target>\n");
exit(1);
}
struct ip ip;
struct udphdr udp;
int sd;
const int on = 1;
struct sockaddr_in sin;
//char msg[] = "\x03\xF0\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01";
u_char *packet;
packet = (u_char *)malloc(120);
ip.ip_hl = 0x5;
ip.ip_v = 0x4;
ip.ip_tos = 0x0;
ip.ip_len = 60;
ip.ip_id = htons(12830);
ip.ip_off = 0x0;
ip.ip_ttl = 64;
ip.ip_p = IPPROTO_UDP;
ip.ip_sum = 0x0;
ip.ip_src.s_addr = inet_addr(argv[1]);
ip.ip_dst.s_addr = inet_addr("67.228.44.4");
ip.ip_sum = in_cksum((unsigned short *)&ip, sizeof(ip));
memcpy(packet, &ip, sizeof(ip));
udp.source = htons(80);
udp.dest = htons(53);
udp.len = htons(22);
udp.check = 0;
udp.check = in_cksum_udp(ip.ip_src.s_addr, ip.ip_dst.s_addr, (unsigned short *)&udp, sizeof(udp));
memcpy(packet + 20, &udp, sizeof(udp));
if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
perror("raw socket");
exit(1);
}
if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
perror("setsockopt");
exit(1);
}
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = ip.ip_dst.s_addr;
if (sendto(sd, packet, 120, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0)
{
perror("sendto");
exit(1);
}
}
intmain(intargc,char*argv[])
{
如果(!argv[1])
{
printf(“未指定目标!\n用法:);
printf(argv[0]);
printf(“\n”);
出口(1);
}
结构ip;
结构udphdr udp;
国际标准差;
const int on=1;
sin中的结构sockaddr_;
//char msg[]=“\x03\xF0\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01”;
u_char*数据包;
数据包=(u_char*)malloc(120);
ip.ip_hl=0x5;
ip.ip_v=0x4;
ip.ip_tos=0x0;
ip.ip_len=60;
ip.ip_id=htons(12830);
ip.ip_off=0x0;
ip.ip_ttl=64;
ip.ip_p=IPPROTO_UDP;
ip.ip_和=0x0;
ip.ip_src.s_addr=inet_addr(argv[1]);
ip.ip_dst.s_addr=inet_addr(“67.228.44.4”);
ip.ip_sum=in_cksum((无符号短*)&ip,sizeof(ip));
memcpy(数据包、ip、sizeof(ip));
udp.source=htons(80);
udp.dest=htons(53);
udp.len=htons(22);
udp.check=0;
udp.check=in_cksum_udp(ip.ip_src.s_addr,ip.ip_dst.s_addr,(无符号短*)&udp,sizeof(udp));
memcpy(数据包+20,&udp,sizeof(udp));
如果((sd=插槽(AF_INET、SOCK_RAW、IPPROTO_RAW))<0){
perror(“原始插座”);
出口(1);
}
如果(设置锁定选项(sd、IPPROTO_IP、IP_HDRINCL和on、sizeof(on))<0){
perror(“setsockopt”);
出口(1);
}
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=ip.ip_dst.s_addr;
if(sendto(sd,packet,120,0,(struct sockaddr*)和sin,sizeof(struct sockaddr))<0
{
perror(“sendto”);
出口(1);
}
}
嗯……我想你想知道如何在邮件中设置有效负载?基本上,您希望从IP和UDP头开始偏移,并在该点开始写入有效负载数据
这是一个匆忙拼凑的例子:
int offset = packet + sizeof(struct ip) + sizeof(struct udphdr);
然后,您可以按如下方式写入有效负载:
strcpy(offset, "1234");
以下是一些有效地通过原始IP套接字写入数据的ICMP代码:
struct icmphdr *icmp_hdr;
char *datapart;
icmp_hdr = (struct icmphdr *) icmp_data;
icmp_hdr->i_type = ICMP_ECHO;
icmp_hdr->i_code = 0;
icmp_hdr->i_id = (unsigned short) getpid();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;
datapart = icmp_data + sizeof(struct icmphdr);
memset(datapart, 'E', datasize - sizeof(struct icmphdr));
嗯…我想你想知道如何在你的信息中设置有效载荷?基本上,您希望从IP和UDP头开始偏移,并在该点开始写入有效负载数据 这是一个匆忙拼凑的例子:
int offset = packet + sizeof(struct ip) + sizeof(struct udphdr);
然后,您可以按如下方式写入有效负载:
strcpy(offset, "1234");
以下是一些有效地通过原始IP套接字写入数据的ICMP代码:
struct icmphdr *icmp_hdr;
char *datapart;
icmp_hdr = (struct icmphdr *) icmp_data;
icmp_hdr->i_type = ICMP_ECHO;
icmp_hdr->i_code = 0;
icmp_hdr->i_id = (unsigned short) getpid();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;
datapart = icmp_data + sizeof(struct icmphdr);
memset(datapart, 'E', datasize - sizeof(struct icmphdr));
sendto
的最后一个参数不应该是sizeof(struct sockaddr\u in)
?虽然这可能是真的,但它与我的问题并不相关,而且它的工作方式也很好,我只是想知道如何设置消息。为什么使用原始套接字而不是UDP套接字?我不清楚你在问什么。。。你说发送的部分正在工作,那么“设置消息”是什么意思呢?sendto
的最后一个参数不应该是sizeof(struct sockaddr_in)
?虽然这可能是真的,但它与我的问题并没有真正的关系,而且按照我的方式工作得很好,我只是想知道如何设置消息。为什么使用原始套接字而不是UDP套接字?我不清楚你在问什么。。。你说发送的部分是有效的,那么“设置消息”是什么意思?是的,这就是我要找的。谢谢是的,这就是我要找的。谢谢