2009-12-08 17 views
0

pcap_compile() compile une chaîne dans un programme de filtrage sous la forme d'une struct bpf_program. En théorie, je pourrais enregistrer la forme compilée du programme et le fournir à pcap_setfilter() sur une interface réseau différente ou même sur une machine différente.Comment portable est la sortie de pcap_compile?

Cela fonctionnera-t-il? Le formulaire bpf_program est-il portable sur différentes interfaces? Différents processus? Différentes architectures? Ou est-il plus sûr de compiler l'expression chaque fois que je veux l'utiliser?

Basé sur l'existence de pcap_open_dead() je suppose qu'il est quelque peu portable, mais ce qui est sûr et ce qui ne semble pas être épelé partout dans la documentation.

Répondre

1

Non, ce n'est pas portable en général.

Vous pouvez les utiliser sur la même machine.

Sur des machines similaires en toute sécurité. Différentes architectures? Probablement pas. Peut-être si elles ont des types similaires. Systèmes d'exploitation différents? Non, je ne recommande pas l'un de ces.

Si vous voulez vraiment être sûr, compilez simplement l'expression lorsque vous l'utilisez. Cela prend vraiment un temps insignifiant si vous le faites rarement assez. Si vous changez rapidement d'expressions, vous pouvez en garder quelques-unes.

+0

Merci, c'est très utile. Pour clarifier: qu'en est-il des différentes interfaces/périphériques sur la même machine? – benzado

+1

Différentes interfaces sur la même machine devraient être bien, je pense. Cependant, je ne suis pas entièrement sûr de toutes les implémentations. Je suis en fait hésitant sur différents/types/d'interfaces, comme ethernet/loopback/ieee1394. J'ai un soupçon qui pourrait ne pas fonctionner, même si cela fait plus d'un an que je n'ai piraté aucun de ces codes et que ça me fuit la tête. – McPherrinM

+0

Différentes interfaces * avec le même type d'en-tête de couche liaison * peuvent exécuter le même code BPF. Différentes interfaces avec des types d'en-tête de couche de liaison * différents *, par ex. Ethernet vs. 802.11 vs. PPP, peut * PAS * exécuter le même code BPF (bien, ils peuvent exécuter le même code BPF, mais le code ne fonctionnera pas correctement comme un filtre sur les interfaces avec un type d'en-tête de couche liaison différent de celui pour lequel le code BPF a été compilé). –