gpt4 book ai didi

c - 修改抓包包头

转载 作者:IT王子 更新时间:2023-10-29 01:22:39 24 4
gpt4 key购买 nike

我正在尝试使用 libnetfiletr_queue 修改 IP header 以包含更多 IP 选项。到目前为止,我已经成功地获得了如下所示的数据包。

if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) {
fprintf(stderr, "Unable to set nfq_set_mode\n");
exit(1);
}

然后我设法做到了如下所示,

static int my_callBack(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,struct nfq_data *tb)
{
int id = 0;
int packet_len;
unsigned char *data;
struct nfqnl_msg_packet_hdr *packet_hdr;
unsigned char *data;

packet_hdr = nfq_get_msg_packet_hdr(tb);

if (packet_hdr) {
id = ntohl(packet_hdr->packet_id);
}

packet_len = nfq_get_payload(tb, &data);

if (packet_len >= 0) {
//print payload length
printf("payload_length = %d ", packet_len);
//modify packet ip header
}

return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);
}

但从这里开始,我对如何在 //modify packet ip header comment.Example 上修改捕获数据包的 IP header 感到有点困惑修改 IP header (例如流量类别(IPV6)/IP 选项/版本/标志/目标地址)是可以的,因为我只需要了解修改的工作原理:)。

我已经尝试了很多资源,但无法继续进行下去。非常感谢您对此查询的专家建议和帮助。 :)

非常感谢:)

最佳答案

要修改 IP header 的值,首先要定义一个结构来表示您的 header 。您可以通过阅读您尝试访问的协议(protocol)的 RFC 规范来了解结构应该是什么。

这是 IPv6 的 RFC 链接:https://www.rfc-editor.org/rfc/rfc2460#section-3

IPv6 header 的第一行有点棘手,因为它们没有使用字节对齐的字段。 Version 字段为 4 位宽,Traffic Class 为 8 位宽,Flow Label 为 20 位宽。整个 header 为 320 位(40 字节),其中 256 位是源地址和目标地址。其他字段仅使用 64 位,因此像这样定义结构可能是最简单的:

struct ipv6_hdr {
uint32_t row1;
uint16_t payload_length;
uint8_t next_header;
uint8_t hop_limit;
uint16_t src[8];
uint16_t dest[8];
};

要提取第一行的值,您可以使用一些掩码:

#define VERSION_MASK 0xF0000000
#define TRAFFIC_CLASS_MASK 0x0FF00000
#define FLOW_LABEL_MASK 0x000FFFFF

struct ipv6_hdr foo;

...

nfq_get_payload(tb, &foo); // Just an example; don't overflow your buffer!

// bit-wise AND gets masked field from row1
uint8_t version = (uint8_t) ((foo->row1 & VERSION_MASK) >> 28); // shift (32-4) bits

一旦您将结构指向数据负载,假设您的字节数组匹配此格式,修改 header 值就变得简单赋值:

version = 6;

// bit-wise OR puts our value in the right place in row1
foo->row1 &= ~(VERSION_MASK) // clear out the old value first
foo->row1 = ((uint32_t) version << 28) | foo->row1;

我选择将结构中的源地址和目标地址设为一个 16 位值数组,因为 IPv6 地址是一系列 8 位、16 位值。这应该可以很容易地隔离任何给定的字节对。

在对其应用正确的结构之前,您必须确定数据负载的格式。

有关如何创建 IPv4 header 的信息,请查看其 RFC:https://www.rfc-editor.org/rfc/rfc791#section-3.1

希望这对您有所帮助(您可能需要修改我的代码示例才能使语法正确,已经几个月了)。


根据评论中的要求使用有关校验和的信息进行编辑

按照此 RFC 在修改 header 后生成校验和:https://www.rfc-editor.org/rfc/rfc1071

关键要点是在生成新校验和之前将 header 中的校验和字段归零。

关于c - 修改抓包包头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22267497/

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