7

OSのネットワークスタックにフックして、通過するパケットをスニッフィングし、関心のあるパケットを編集できるユーザースペースアプリケーションを作成しようとしています。

多くのグーグルの後、(どのプラットフォームでも)そうするための最も簡単な(しかしかなり堅牢な)方法は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     
)

最後の2つのパラメーターは、データがネットワークスタックに返されるためのものです。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 に答える