[英]Resend all incoming packets
我在中间应用程序(Linux套接字)中写了一个有教养的人。 我正在努力的是如何重新发送从受害者1到受害者2的TCP / UDP和ICMP数据包? 我下面的方法似乎不起作用:
unsigned char buffer[BUF_SZ];
struct ethhdr *eth_head = (struct ethhdr *)(buffer);
struct sockaddr_ll sock_adr_resnd = {0};
sock_adr_resnd.sll_family = AF_PACKET;
sock_adr_resnd.sll_ifindex = interface_i;
sock_adr_resnd.sll_protocol = htons(ETH_P_ALL);
sock_adr_resnd.sll_halen = MAC_LEN;
memcpy(sock_adr_resnd.sll_addr, source_mac, MAC_LEN); // my MAC
if ((sct = socket(AF_PACKET, SOCK_DGRAM, 0)) < 0) { //recieve all
perror("Socket open error ");
exit (EXIT_FAILURE);
}
if (bind(sct, (struct sockaddr *) &sock_adr_resnd, sizeof(sock_adr_resnd)) < 0) {
printf("Failed to bind socket \n");
}
int res_len = sizeof(sock_adr_resnd);
if (recvfrom(sct, buffer, BUF_SZ, 0, (struct sockaddr*)&sock_adr_resnd, (socklen_t *)&res_len) < 0)
{
process = 0; // nothing accepted
}
// change mac address to actual destination
memcpy(sock_adr.sll_addr, vic_mac1, MAC_LEN);
memcpy(eth_head->h_source, vic_mac1, MAC_LEN);
if (process) {
if (sendto(sct, buffer, BUF_SZ, 0, (struct sockaddr *)&sock_adr_resnd, sizeof(sock_adr_resnd)) < 0)
{
close(sct);
perror("sendto: ");
exit (EXIT_FAILURE);
}
}
我感到困惑的是应该如何设置套接字。 不应该是SOCK_RAW
吗? 数据包是否必须根据类型(UDP,TCP,ICMP)进行不同的处理?
问题在于最好使用RAW数据包-这样您就可以获取目标/源IP,并且在接收时也无需发布任何有关源接收的信息,因此最终更改如下:
SOCK_DGRAM
更改为SOCK_RAW
recvfrom()
函数 您不必绑定
if ((sct = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) { perror("Socket open error "); exit (EXIT_FAILURE); } if (recvfrom(sct, buffer, BUF_SZ, 0, NULL, NULL) < 0) { process = 0; // nothing accepted }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.