7

我正在尝试编写一个用户空间应用程序,它可以连接到操作系统的网络堆栈,嗅探飞过的数据包并编辑它感兴趣的数据包。

经过多次谷歌搜索,在我看来,最简单(但相当健壮)的方法(在任何平台上)是 Linux 的libnetfilter_queue项目。但是,除了有限的官方文档之外,我很难找到该项目的任何合理文档。它的主要特点(如第一个链接所述)

  • 从内核 nfnetlink_queue 子系统接收排队的数据包
  • 向内核 nfnetlink_queue 子系统发布判决和/或重新注入更改的数据包

重点是我自己的。我到底是什么意思?我试过修改提供的示例代码,但也许我误解了一些东西。代码在NFQNL_COPY_PACKET模式下运行,所以我收到了整个数据包——但我对它的修改似乎仅限于我自己的应用程序——正如人们所期望的那样,考虑到“复制”语义。

我的感觉是我注定要以NF_QUEUE某种方式利用它,但我还没有完全理解它。任何指针?

(如果有更简单的机制可以做到这一点,它也是跨平台的,我很想听听!)

4

2 回答 2

13

我不敢相信我以前错过了这个。尽管我不愿在 SO 上发布问题,但我认为我自己永远不会解决这个问题。:)

我没有正确查看函数原型。事实证明,在“判决”功能(如下所述)中,

int nfq_set_verdict(struct nfq_q_handle *qh,
    u_int32_t id,
    u_int32_t verdict,
    u_int32_t data_len,
    const unsigned char *buf     
)

最后两个参数用于将数据返回到网络堆栈。事后看来很明显,但我完全错过了它,因为该print_pkt函数不将数据包数据作为参数,而是从struct nfq_data.

关键是NF_ACCEPT数据包并将适当修改的数据包传递回内核。

于 2010-11-26T07:22:01.880 回答
0

只是从源代码中挖掘出来的一个疯狂的猜测:尝试使用显式添加损坏的有效负载nfnl_addattr_l(…, NFQA_PAYLOAD, …)

于 2010-11-26T06:54:46.207 回答