重新发送所有传入的数据包

时间:2017-04-22 17:04:17

标签: c linux sockets packet-sniffers

我正在编写一个中级应用程序(Linux套接字)中的教育人员。我正在努力的是如何重新发送来自victim1到victim2的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?

)对数据包进行不同的处理

1 个答案:

答案 0 :(得分:0)

问题在于最好使用RAW数据包 - 所以你可以获得目标/源IP,并且在接收时,不需要发布任何关于源重新发送的信息,所以最后变化就像这样:

  1. #landslide-modal更改为SOCK_DGRAM
  2. 只将缓冲区传递给SOCK_RAW函数
  3. 在创建套接字时说明套接字的类型
  4. 您不必绑定

    recvfrom()