gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:57 24 4
gpt4 key购买 nike

我正在编写一个具有教育意义的中间人应用程序(Linux 套接字)。我正在努力解决的问题是如何将来自 victim1 的 TCP/UDP 和 ICMP 数据包重新发送到 victim2?我的以下方法似乎不起作用:

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,并且在接收时也不需要发布任何关于源接收的信息,所以最后的变化就像所以:

  1. SOCK_DGRAM 更改为 SOCK_RAW
  2. 只将缓冲区传递给 recvfrom() 函数
  3. 创建时说明套接字的类型
  4. 你不必绑定(bind)

    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
    }

关于c - 重新发送所有传入的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43562071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com