在 netfilter 模块中重新注入修改后的数据包
Reinjecting modified packets in netfilter module
我已经使用 netfiler_queue 为 iptables
创建了一个 NFQUEUE
模块来处理所有传出的 UDP
数据包。
我想修改所有匹配特定模式的 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 校验和将存在于数据包的 0x1A
和 0x1B
字节中,因此这会将它们清零:
pktData[0x1a] = 0;
pktData[0x1b] = 0;
然后你的数据包就会通过。
我已经使用 netfiler_queue 为 iptables
创建了一个 NFQUEUE
模块来处理所有传出的 UDP
数据包。
我想修改所有匹配特定模式的 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 校验和将存在于数据包的 0x1A
和 0x1B
字节中,因此这会将它们清零:
pktData[0x1a] = 0;
pktData[0x1b] = 0;
然后你的数据包就会通过。