2017-11-28 9 views
0

バークレーフィルタによってWinPcapセッションのフィルタを手動で設定するCプログラムがあります。今私はPcap.NetでC#でこのツールを転送したいと思います。 Pcap.Netは、引数として生バークレーフィルタを提供していませんが、高レベルのフィルタリング式(もip and tcpのような例のwireshark/tcpdumpのに使用される)バークレーパケットフィルタからハイレベルフィルタリング式

  1. 「逆コンパイル」バークレーに方法はあります
  2. がpcap.netにフィルタの生のバイトストリームを使用して、高レベルのフィルタリング発現にパケットフィルタ

生bpf_program:

struct bpf_program bpf_program; 
static struct bpf_insn bpf_insn [] = 
{ 
    { 
     BPF_LD + BPF_H + BPF_ABS, 
     0, 
     0, 
     12 
    }, 
    { 
     BPF_JMP + BPF_JEQ + BPF_K, 
     0, 
     18, 
     0 
    }, 
    { 
     BPF_LD + BPF_B + BPF_ABS, 
     0, 
     0, 
     0 
    }, 
    { 
     BPF_JMP + BPF_JEQ + BPF_K, 
     0, 
     10, 
     0 
    }, 
    { 
     BPF_LD + BPF_B + BPF_ABS, 
     0, 
     0, 
     1 
    }, 
    { 
     BPF_JMP + BPF_JEQ + BPF_K, 
     0, 
     8, 
     0 
    }, 
    { 
     BPF_LD + BPF_B + BPF_ABS, 
     0, 
     0, 
     2 
    }, 
    { 
     BPF_JMP + BPF_JEQ + BPF_K, 
     0, 
     6, 
     0 
    }, 
    { 
     BPF_LD + BPF_B + BPF_ABS, 
     0, 
     0, 
     3 
    }, 
    { 
     BPF_JMP + BPF_JEQ + BPF_K, 
     0, 
     4, 
     0 
    }, 
    { 
     BPF_LD + BPF_B + BPF_ABS, 
     0, 
     0, 
     4 
    }, 
    { 
     BPF_JMP + BPF_JEQ + BPF_K, 
     0, 
     2, 
     0 
    }, 
    { 
     BPF_LD + BPF_B + BPF_ABS, 
     0, 
     0, 
     5 
    }, 
    { 
     BPF_JMP + BPF_JEQ + BPF_K, 
     4, 
     0, 
     0 
    }, 
    { 
     BPF_LD + BPF_W + BPF_ABS, 
     0, 
     0, 
     0 
    }, 
    { 
     BPF_JMP + BPF_JEQ + BPF_K, 
     0, 
     4, 
     0xFFFFFFFF 
    }, 
    { 
     BPF_LD + BPF_H + BPF_ABS, 
     0, 
     0, 
     4 
    }, 
    { 
     BPF_JMP + BPF_JEQ + BPF_K, 
     0, 
     2, 
     0xFFFF 
    }, 
    { 
     BPF_LD + BPF_W + BPF_LEN, 
     0, 
     0, 
     0 
    }, 
    { 
     BPF_RET + BPF_A, 
     0, 
     0, 
     0 
    }, 
    { 
     BPF_RET + BPF_K, 
     0, 
     0, 
     0 
    } 
}; 
bpf_program.bf_len = sizeof (bpf_insn)/sizeof (struct bpf_insn); 
bpf_program.bf_insns = bpf_insn; 
if (channel->type == ETH_P_802_2) 
{ 
    bpf_insn [1].code = BPF_JMP + BPF_JGT + BPF_K; 
    bpf_insn [1].jt = 18; 
    bpf_insn [1].jf = 0; 
    bpf_insn [1].k = ETHERMTU; 
} 
else 
{ 
    bpf_insn [1].code = BPF_JMP + BPF_JEQ + BPF_K; 
    bpf_insn [1].jt = 0; 
    bpf_insn [1].jf = 18; 
    bpf_insn [1].k = channel->type; 
} 
bpf_insn [3].k = channel->host [0]; 
bpf_insn [5].k = channel->host [1]; 
bpf_insn [7].k = channel->host [2]; 
bpf_insn [9].k = channel->host [3]; 
bpf_insn [11].k = channel->host [4]; 
bpf_insn [13].k = channel->host [5]; 

明快に編集:Berkeley Packet Filterは、UNIXベースのシステム用のインターフェイスです。 WinPcapはこのBPFを使用し、Pcap.Netも使用します。 Pcap.Netには、BarkeleyPacketFilterとも呼ばれるBPFを処理するクラスがあります。クラスは、高レベルのフィルタリング式(tcp port 80など)のみを受け入れます。

高レベルの表現ではなく、生のフィルタ(上記のコードブロックを参照)を使用してBPFクラスにフィードする方法を検索します。

+0

'生バークレーfilter'は何を? そのリンクは役に立ちますか? https://pcapdotnet.codeplex.com/wikipage?title=Pcap.Net%20Tutorial%20-%20Filtering%20the%20traffic – netaholic

+1

[BerkeleyPacketFilter、TCPとポートによるフィルター](https://stackoverflow.com/)の可能な複製質問/ 25675476/berkeleypacketfilter-filter-by-tcp-and-port) – netaholic

答えて

0

Pcap.NetのBerkeleyPacketFilterオブジェクトは、simple wrappers around a reference to the bpf_program structureのように見えます。

それは明らかにハックですが、あなたはおそらくSystem.Reflectionを使用して、これらのオブジェクトのプライベートフィールド置き換えることができます。

using (BerkeleyPacketFilter filter = communicator.CreateFilter("ip and tcp")) 
{ 
    var prop = filter.GetType().GetField("_bpf", 
             System.Reflection.BindingFlags.NonPublic 
             | System.Reflection.BindingFlags.Instance); 
    prop.SetValue(filter, &your_bpf_program); 

    communicator.SetFilter(filter); 
} 
関連する問題