Networking 用pcap转发数据包

Networking 用pcap转发数据包,networking,routing,packet,portforwarding,Networking,Routing,Packet,Portforwarding,我尝试使用libpcap将嗅探到的数据包转发到真正的目的地。我使用arp欺骗来重定向流量,我可以在Win7上启用TCP/IP路由来路由流量。是否可以只使用libpcap(或者可能使用libnet)来实现这一点?我尝试了各种方法,使用libnet,我用RAW4接口重建了数据包,也尝试了链接层,将源设置为我的MAC,dest设置为广播地址 我在嗅探器中使用pcap尝试了这个简单的回调: static void ForwardCallback(byte* args, const pcap_pkthdr

我尝试使用
libpcap
将嗅探到的数据包转发到真正的目的地。我使用arp欺骗来重定向流量,我可以在Win7上启用TCP/IP路由来路由流量。是否可以只使用libpcap(或者可能使用libnet)来实现这一点?我尝试了各种方法,使用libnet,我用
RAW4
接口重建了数据包,也尝试了链接层,将源设置为我的MAC,dest设置为广播地址

我在嗅探器中使用
pcap
尝试了这个简单的回调:

static void ForwardCallback(byte* args, const pcap_pkthdr *header, const byte* packet)
{
    assert(args);
    ForwInput* input = (ForwInput*)args;
    PcapHandle* handle = input->handle;
    assert(handle);

    EthernetHeader* ethernet_header = (EthernetHeader*)packet;
    //modifying the spoofed addresses
    memcpy(ethernet_header->src_addr.data, input->my_mac.data, ETHER_ADDR_LEN); //my mac address
    memcpy(ethernet_header->dest_addr.data, ether_broadcast, ETHER_ADDR_LEN); //0xff, 0xff...

    IPv4Header* ipv4_header = (IPv4Header*)(packet + LIBNET_ETH_H);

    if (pcap_sendpacket(handle, packet, header->len) == -1)
    {
        DumpError(pcap_geterr(handle)); //no errors
    };
};
默认网关和测试笔记本电脑之间的连接被欺骗,在我的电脑上,转发被禁用(路由和远程访问)。我用手打开把手

handle = pcap_open(device.c_str(),
            0xffff,
            PCAP_OPENFLAG_PROMISCUOUS,
            100,
            nullptr,
            &error[0]
            );
没有应用过滤,我的电脑中的ARP缓存是正确的。我可以看到受害者电脑中的所有广播数据包,IP头地址也是有效的。我不确定这是不是真的,但是对于这种情况,只修改链路层(以太网报头)就足够了,因为只有它们是伪造的


有时页面加载终止,DNS服务不可用或找不到主机,但有时只是无限加载。

阅读windows RRAS和Wiki的文档后,我发现windows(我不知道其他)仅在目标IP地址为多播地址时才接受以太网广播包。因此,将代码更改为(稍后我将对其进行改进):

我正在使用
“ip或ip6”
pcap程序过滤掉ARP数据包。我已将标志设置为
PCAP\u OPENFLAG\u NOCAPTURE\u LOCAL
PCAP\u OPENFLAG\u MAX\u responsibility

这将得到改进,以便使用捕获的IP从ARP表解析MAC,并且只将数据包发送到目标MAC地址。现在它工作得很好,互联网使用它只比在Windows7中使用RRA慢一点

问题与
libnet
相同。我将数据包完全剥皮,并从第3层uwing
RAW4
RAW6
上下文中重建,但API也使用广播MAC地址作为目的地,这就是为什么受害者可以嗅到它,并且无论如何都不起作用

EthernetHeader* ethernet_header = (EthernetHeader*)packet;
memcpy(ethernet_header->src_addr, input->my_mac, ETHER_ADDR_LEN); //my mac address

memcpy(ethernet_header->dest_addr, input->mitm_target, ETHER_ADDR_LEN);
pcap_sendpacket(handle, packet, header->len);

memcpy(ethernet_header->dest_addr, input->mitm_gateway, ETHER_ADDR_LEN);
pcap_sendpacket(handle, packet, header->len);