重新注射NetFilter模块中的修改后数据包
Reinjecting modified packets in netfilter module
我使用netfiler_queue为iptables
创建一个处理所有传出UDP
数据包的NFQUEUE
模块。
我想修改所有匹配特定模式的UDP
数据包,并将其重新注射到网络中。
这是一些示例代码:
...
static int Callback( nfq_q_handle *myQueue, struct nfgenmsg *msg, nfq_data *pkt, void *cbData) {
uint32_t id = 0;
nfqnl_msg_packet_hdr *header;
if ((header = nfq_get_msg_packet_hdr(pkt))) {
id = ntohl(header->packet_id);
}
// Get the packet payload
unsigned char *pktData;
int len = nfq_get_payload(pkt, &pktData);
// The following is an example.
// In reality, it involves more parsing of the packet payload.
if (len && pktData[40] == 'X') {
// Modify byte 40
pktData[40] = 'Y';
}
// Pass through the (modified) packet.
return nfq_set_verdict(myQueue, id, NF_ACCEPT, 0, NULL);
}
...
int main(){
...
struct nfq_handle nfqHandle;
nfq_create_queue(nfqHandle, 0, &Callback, NULL)
...
return 0;
}
修改后的数据包不会被重新注射到流中。我将如何注入数据包的修改版本?
两件事。第一:
return nfq_set_verdict(myQueue, id, NF_ACCEPT, 0, NULL);
应该是:
return nfq_set_verdict(myQueue, id, NF_ACCEPT, len, pktData);
告诉它您要发送一个修改的数据包。(您可能需要某种类型的铸造)
第二,您只是修改了数据包。此时IP堆栈没有其他帮助,因此您需要重新计算该数据包的UDP校验和零,以便其他端都不会检查它。
UDP校验和将生活在您的数据包的Bytes 0x1A
和0x1B
中,因此将它们归零:
pktData[0x1a] = 0;
pktData[0x1b] = 0;
然后您的数据包将通过。
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- Windivert-修改数据包数据/有效载荷内容
- DPDK:修改捕获的数据包标头的最有效方法
- 插座上的数据包大小修改
- 重新注射NetFilter模块中的修改后数据包
- 在 Linux 原始套接字中接收完全修改的 icmp 数据包