
рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд╡рд╛рдпрд░рдЯреИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбрд╢рд╛рд░реНрдХ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ
1 рд╡рд┐рдШрдЯрдирдХрд░реНрддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдкреИрдХреЗрдЬреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдиреЙрд░реНрдЯреЗрд▓ рдХреЗ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдбрд┐рд╕реЗрдХреНрдЯрд░ рдХреА рдХрдореА рдорд╣рд╕реВрд╕ рд╣реБрдИред рдФрд░ рдЙрд╕реЗ рд╣рд╡рд╛ рдХреА рддрд░рд╣ рдЬрд░реВрд░рдд рдереАред рдмрд╛рд╣рд░ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╕реНрдкрд╖реНрдЯ рдерд╛ - рдЕрдкрдирд╛ рд▓рд┐рдЦреЛред рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, Wireshark рдХреЗ рддрд╣рдд "рдПрдирд╛рдЯреЛрдорд┐рдХрд▓" рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдмрд╣реБрдд рдХрдо рдЕрдиреБрднрд╡ рд╣реЛрдиреЗ рдкрд░, рдореИрдВрдиреЗ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдФрд░ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдареАрдХ рд╣реИ, рдЕрдкрдиреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВ, рдЕрдЧрд░ рдЖрдкрдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред
рд╡рд┐рдЪреНрдЫреЗрджрди - latред рд╡рд┐рджрд╛рд░рдХ, рд╡рд┐рджрд╛рд░рдХ рд╕реЗ, рд╡рд┐рдЪреНрдЫреЗрдж
рдиреЛрдЯ 1: рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдкрд╛рдардХ Wireshark рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдФрд░ рдпрд╣ рднреА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПредрдиреЛрдЯ 2: рдЪреВрдВрдХрд┐ рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдиреЗ рдЗрд╕ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рднреА рд▓рд┐рдЦрд╛ред рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд, рдореЗрд░рд╛ рдкреНрд▓рдЧрдЗрди рднреА рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорддрднреЗрдж рдХреЗрд╡рд▓ рдореЗрдХрдлрд╛рдЗрд▓реНрд╕ рдореЗрдВ рд╣реЛрдВрдЧреЗредрдиреЛрдЯ 3: рдЪреВрдВрдХрд┐ рдореИрдВ рдЬрд┐рд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдФрд░ рдмрдВрдж рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рд▓рд╛рдЦ рдЧреИрд░-рдкреНрд░рдХрдЯреАрдХрд░рдг рд╕рдордЭреМрддреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдирд╛, рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реБрдЖ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдорд╛рдирддрд╛ рд╣реВрдВредрдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВ рд╕реАрдзрд╛ рдирд╛рдо
рдлреВ рдХрд╣реВрдВрдЧрд╛ред рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ UDP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдКрдкрд░ рд╣реЛрдиреЗ рджреЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реЛ:
- 1 рдмрд╛рдЗрдЯ - рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг
- 1 рдмрд╛рдЗрдЯ - рдкреИрдХреЗрдЯ рдкреНрд░рдХрд╛рд░
- 1 рдмрд╛рдЗрдЯ - рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЭрдВрдбреЗ
- 1 рдмрд╛рдЗрдЯ - рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░
- 4 рдмрд╛рдЗрдЯреНрд╕ - рдкреЗрд▓реЛрдб рд▓рдВрдмрд╛рдИ
- 0 рд╕реЗ 200 рдмрд╛рдЗрдЯреНрд╕ - рдкреЗрд▓реЛрдб
рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рдбрд╛рд▓рдиреЗ, рдХреБрдЫ рдмрдирд╛рдиреЗ, рдХрд╣реАрдВ рдХреБрдЫ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ Wireshark рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ:
- рдЕрдЬрдЧрд░ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ 2 рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 3 рдирд╣реАрдВ)
- cmake
- рдмрд┐рдЬреЛрди
- рдлреНрд▓реЗрдХреНрд╕
рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА
рдпрд╣рд╛рдВ рд╣реИ ред
рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЙрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП Wireshark рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦреЗрдВрдЧреЗред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдерд┐рд░ рд╢рд╛рдЦрд╛ рдХреЗ рд╕реНрд░реЛрдд 1.6:
$ cd $HOME $ svn co http://buildbot.wireshark.org/trunk-1.6/ wireshark
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдВрдХрд▓рди рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд▓рд╛рдПрдВ:
$ cd wireshark $ ./autogen.sh $ ./configure
рдпрджрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рддреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╡рд╣рд╛рдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ:
$ cd $HOME/wireshark/plugins $ mkdir foo $ cd foo $ touch packet-foo.c
рдврд╛рдВрдЪрд╛
рдпрд╣рд╛рдВ, рдореИрдВ рдкреНрд▓рдЧрдЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ, рдЬреЛ рд╡рд┐рдВрдбрд╕рд░рдХ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХреЛ "рдкрд┐рдХ рдЕрдк" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдкреИрдХреЗрдЯ foo.c
#ifdef HAVE_CONFIG_H # include "config.h" #endif #include <epan/packet.h> #define FOO_PORT 35000 /* UDP , FOO . */ static int proto_foo = -1; /* . */ void proto_register_foo(void) { proto_foo = proto_register_protocol ( "FOO Protocol", /* */ "FOO", /* */ "foo" /* */ ); }
рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо
proto_register_protocol () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдореЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "FOO рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдФрд░ "FOO" рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ Wireshark рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо "foo" рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред)
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдкрдХрдбрд╝реЗ рдЧрдП рдлреВ рдкреИрдХреЗрдЬ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣
create_dissector_handle () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
void proto_reg_handoff_foo(void) { static dissector_handle_t foo_handle; foo_handle = create_dissector_handle(dissect_foo, proto_foo); dissector_add_uint("udp.port", FOO_PORT, foo_handle); }
рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдЕрд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЧрдВрджрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ
рдкреНрд░реЛрдЯреЛ_рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдмрд╛рдВрдзрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ UDP рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЯреНрд░реИрдлрд╝рд┐рдХ рдЬрд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬрдм рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ (35000) рдкрд░ рдХреБрдЫ рдЧрддрд┐рд╡рд┐рдзрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рд╡рд┐рдВрдбрд╕рд░реНрдХ рд╣рдореЗрдВ "рдХреЙрд▓" рдХрд░реЗрдЧрд╛ред
рдПрдХ рдПрдЧреНрд░реАрдореЗрдВрдЯ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрдВрдХреНрд╢рдВрд╕
proto_register_foo () рдФрд░
proto_reg_handoff_foo () рд╣рдорд╛рд░реЗ рд╕реЛрд░реНрд╕ рдлрд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред
рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдмрдиреА рд╣реБрдИ рд╣реИ - рд╡рд┐рдШрдЯрди рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред
static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { col_set_str(pinfo->cinfo, COL_PROTOCOL, "FOO"); col_clear(pinfo->cinfo, COL_INFO); }
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕ рдкреИрдХреЗрдЬ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреИрдХреЗрдЯ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмрдлрд░ -
рдЯреАрд╡реАрдмреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Pinfo рдореЗрдВ рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдФрд░
рдкреЗрдбрд╝ рдореЗрдВ , рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди рддрдм рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╡рд┐рдВрдбрд╕рд░ рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдо
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЙрд▓рдо рдореЗрдВ рдорд╛рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рдореЗрдВ, рд╣рдо
рдЗрдиреНрдлреЛ рдХреЙрд▓рдо рдХреЛ рдХреНрд▓рд┐рдпрд░ рдХрд░рддреЗ рд╣реИрдВред (рджреЛрдиреЛрдВ рдХреЙрд▓рдо рдЖрдорддреМрд░ рдкрд░ рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рджрд┐рдЦрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред)
рд╕рдм рдХреБрдЫ, рдЗрд╕ рд╕рдордп рдПрдХ рдиреНрдпреВрдирддрдо рдХреЛрдб рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдЗрд╕реЗ Wireshark рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХреЗрдВред
рдкреНрд▓рдЧрдЗрди рд╡рд┐рдзрд╛рдирд╕рднрд╛
рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП) рд╣рдореЗрдВ рдЕрдкрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: Makefile.am, Makefile.common рдФрд░ modininfo.hред
- Makefile.am - UNIX / Linux рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ
- Makefile.common - UNIX / рд▓рд┐рдирдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
- Makefile.nmake - рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВ
- modinfo.h - рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ
- modinfo.nmake - рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП DLL рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ
- рдкреИрдХреЗрдЯ- foo.c - рд╡рд┐рдЪреНрдЫреЗрджрдХ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рд╕реНрд░реЛрдд рдХреЛрдб
рд╡реИрд╕реЗ, рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдореЗрдХрдлрд╛рдЗрд▓реНрд╕ рдореЗрдВ рдЦреБрдж рдХреЛ рджрдлрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдВрдбрд╢рд╛рд░реНрдХ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рд╕реАрдореЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
CMakeLists.txt рдмрдирд╛рдПрдВ:
set(DISSECTOR_SRC packet-foo.c ) set(PLUGIN_FILES plugin.c ${DISSECTOR_SRC} ) set(CLEAN_FILES ${PLUGIN_FILES} ) if (WERROR) set_source_files_properties( ${CLEAN_FILES} PROPERTIES COMPILE_FLAGS -Werror ) endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}) register_dissector_files(plugin.c plugin ${DISSECTOR_SRC} ) add_library(foo ${LINK_MODE_MODULE} ${PLUGIN_FILES} ) set_target_properties(foo PROPERTIES PREFIX "") set_target_properties(foo PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}") target_link_libraries(foo epan) install(TARGETS foo LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION} NAMELINK_SKIP RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION} )
рдиреЛрдЯ: рдЖрдк рд╣рд░ рдмрд╛рд░ рдпрд╛рдж рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рдХрд┐ CMakeLists.txt рдлрд╛рдЗрд▓ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдкреНрд▓рдЧрдЗрди рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдХреЙрдкреА рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯрд░рд▓рд┐рдВрдХред рдФрд░ рдлрд┐рд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрдЯрд░рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ foo рд╕реЗ рдмрджрд▓реЗрдВредрдлрд┐рд░ рд╣рдореЗрдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧ-рдЗрди рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдВред
$ cd $HOME/wireshark/ $ vim CMakeLists.txt
рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рджрд┐рдП рдЧрдП рд▓рд╛рдЗрди "рдкреНрд▓рдЧ рдЗрди / рдлреВ" рдХреЛ рдЬреЛрдбрд╝реЗрдВ:
....... if(ENABLE_PLUGINS) set(HAVE_PLUGINS 1) set(PLUGIN_DIR="${DATAFILE_DIR}/plugins/${CPACK_PACKAGE_VERSION}") set(PLUGIN_SRC_DIRS plugins/foo plugins/asn1 plugins/docsis .......
рдЕрдм рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдХрд▓рди рдФрд░ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдЪрд▓рд╛рдПрдБред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо
$ рдШрд░ / рд╡рд╛рдпрд░рд╢рд░реНрдХ / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
$ mkdir build $ cd build $ cmake .. $ make foo
рд╕рдлрд▓ рд╕рдВрдХрд▓рди рд╣реЛрдиреЗ рдкрд░, рд╣рдо
$ рд╣реЛрдо / рд╡рд╛рдпрд░рд╢рд░реНрдХ / рдмрд┐рд▓реНрдб / рд▓рд┐рдм / рдлреЛрд▓реНрдбрд░ рдореЗрдВ
foo.so рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдЯреЗрд╕реНрдЯ рд░рди
рдлрд╝рд╛рдЗрд▓
foo.so рдХреЛ
/usr/lib/wireshark/plugins/1.6.0/ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ Wireshark рдЪрд▓рд╛рдПрдВред "рд╕рд╣рд╛рдпрддрд╛ ->
рддрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ" рдкрд░ рдЬрд╛рдПрдВ,
рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╕реВрдЪреА рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдкреНрд▓рдЧрдЗрди рдЦреЛрдЬреЗрдВ -
foo .so.рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреНрд▓рдЧрдЗрди рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рд╣рдо рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЯ рднреЗрдЬрддреЗ рд╣реИрдВред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ UDP рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ FOO рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╡реНрд╣рд┐рдк рдХрд┐рдпрд╛ред рдЗрд╕рдХрд╛ рдХреЛрдб
рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)
рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдврдВрдЧ
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд▓рдЧрдЗрди рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЕрднреА рддрдХ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ "рд▓рд┐рдЦреЗрдВрдЧреЗ"ред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмрд╛рдд рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рдкреЗрдбрд╝ (
рдкреЗрдбрд╝ ) рдкрд░ рдПрдХ рд╢рд╛рдЦрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдбрд╛рд▓реЗрдВрдЧреЗред рд╡рд┐рдЪреНрдЫреЗрджрдХ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рд░рд╛рдВрд╢ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐
рдкреЗрдбрд╝ рдХрд╛ рд╕реВрдЪрдХ NULL рд╣реИ, рддреЛ рд╣рдорд╕реЗ рдХреЗрд╡рд▓ рд╕рд╛рд░рд╛рдВрд╢ рдЬрд╛рдирдХрд╛рд░реА рдорд╛рдВрдЧреА рдЬрд╛рддреА рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ
рдкреЗрдбрд╝ рдХреЛ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ
рд╕рд╛рде рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ Wireshark рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣рдорд╛рд░рд╛ рд╡рд┐рдЪреНрдЫреЗрджрдХ рд░реВрдк рд▓реЗрддрд╛ рд╣реИ:
static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { col_set_str(pinfo->cinfo, COL_PROTOCOL, "FOO"); col_clear(pinfo->cinfo, COL_INFO); if (tree) { proto_item *ti = NULL; ti = proto_tree_add_item(tree, proto_foo, tvb, 0, -1, FALSE); } }
рдпрд╣рд╛рдБ рд╣рдордиреЗ рдкреЗрдбрд╝ рдкрд░ рдПрдХ рд╢рд╛рдЦрд╛ рдХреЛ
proto_tree_add_item () рдХрд╣рдХрд░
рдЬреЛрдбрд╝рд╛ ред рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╣рдорд╛рд░реЗ
рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рд╡рд┐рд╡рд░рдг рд╣реЛрдВрдЧреЗред рд╣рдо рдЙрд╕ рдкреИрдХреЗрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЛ рднреА рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдпреВрдбреАрдкреА рдкреИрдХреЗрдЯ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рд╕реЗ рдкрд░реЗ рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдПрдХ рдФрд░ рд╣реЛрддрд╛ рд╣реИред
Proto_tree_add_item () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░:
- рдкреЗрдбрд╝ - рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкреВрд░рд╛ рдкреЗрдбрд╝
- рдкреНрд░реЛрдЯреЛ_рдлреВ - рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
- tvb - рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ (рдбреЗрдЯрд╛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд)
- 0 - рдЯреАрд╡реАрдмреА рдмреНрд▓реЙрдХ рдореЗрдВ рдбреЗрдЯрд╛ рд╣рдорд╛рд░реЗ рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдбреЗрдЯрд╛ рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ
- -1 - рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рдорд╛рдирд┐рдд рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ ("-1" рдХрд╛ рдЕрд░реНрде рд╣реИ "рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрдд рддрдХ")
- FALSE - рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ (TRUE - рдпрджрд┐ рдмрд╛рдЗрдЯреНрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдСрд░реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред)
рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж, Wireshark рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рджрд╛рдпрд░рд╛ рдХрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ "FOO рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рдХрджрдо рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЗрд╕ рдЪрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдВрдЧреЗред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдП рдЧрдП
рдкреНрд░реЛрдЯреЛ_рдЧреНрд░реАрд╕реНрдЯрд░_рдлреВ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред
Proto_register_foo () рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЛ рд╕реНрдерд┐рд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред рдлрд┐рд░
proto_register_protocol () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрди рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред
void proto_register_foo(void) { static hf_register_info hf[] = { { &hf_foo_hdr_version, { "FOO Header Version", "foo.hdr.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_foo_hdr_type, { "FOO Header Type", "foo.hdr.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } } }; static gint *ett[] = { &ett_foo }; proto_foo = proto_register_protocol ( "FOO Protocol", "FOO", "foo" ); proto_register_field_array(proto_foo, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); }
рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░
рдкреНрд░реЛрдЯреЛ_рдлреВ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдареАрдХ рдмрд╛рдж
, 3 рдФрд░ рдШреЛрд╖рдгрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:
static gint ett_foo = -1; static int hf_foo_hdr_version = -1; static int hf_foo_hdr_type = -1;
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
if (tree) { proto_item *ti = NULL; proto_tree *foo_tree = NULL; ti = proto_tree_add_item(tree, proto_foo, tvb, 0, -1, FALSE); foo_tree = proto_item_add_subtree(ti, ett_foo); proto_tree_add_item(foo_tree, hf_foo_hdr_version, tvb, 0, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_hdr_type, tvb, 1, 1, FALSE); }
рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд░реНрд╕рд╛рд░реНрдХ рдХрд╛ рдЬреНрдЮрд╛рди рдЕрдм рдФрд░ рд╡рд┐рд╕реНрддреГрдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЕрдм рддрдХ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкрд╣рд▓реЗ 2 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рджреА рд╣реИ, рдЬреЛ рдХреНрд░рдорд╢рдГ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреИрдХреЗрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред
Proto_item_add_subtree () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдиреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд╛рдЦрд╛ (
foo_tree ) рдЬреЛрдбрд╝ рджреА рдЬрд┐рд╕рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреВрд░реЗ рдкреИрдХреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП foo рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рд╣реИред
Foo_tree рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред
Wthark рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реВрдЪрдирд╛ рдЯреНрд░реА рдХреЗ "рд╡рд┐рд╕реНрддрд╛рд░" рдХреЛ
ett_foo рд╡реЗрд░рд┐рдПрдмрд▓ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЪрд░ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред
proto_tree_add_item () рдЗрд╕ рд╕рдордп рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
hf_foo_hdr_version рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
hdr_version -
tvb рд╕реЗ 1 рдмрд╛рдЗрдЯ, рд╕реНрдерд┐рддрд┐ 0 рд╕реЗ рд╢реБрд░реВред
hdr_type - 1 рдмрд╛рдЗрдЯ
tvb рд╕реЗ , рд╕реНрдерд┐рддрд┐ 1 рд╕реЗ рд╢реБрд░реВред
рдпрджрд┐ рд╣рдо
hf_foo_hdr_version рдХреЛ рд╕реНрдерд┐рд░ рд╕рд░рдгреА рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╡рд┐рд╕реНрддреГрдд
рдЯреНрд░реИрдХ рджреЗрдЦреЗрдВрдЧреЗ, рдЬрд╣рд╛рдБ
- hf_foo_hdr_version - рд╢рд╛рдЦрд╛ рд╕реВрдЪрдХрд╛рдВрдХ
- FOO рд╣реИрдбрд░ рд╕рдВрд╕реНрдХрд░рдг - рдлрд╝реАрд▓реНрдб рдирд╛рдордХрд░рдг
- foo.hdr.version рдкреИрдХреЗрдЬ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрди рд╣реИ (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд╛рдЗрди рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╣реЛрдЧреА)
- FT_UNIT8 - рдЙрд╕ рддрддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЖрдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЯреАрд╡реАрдмреА рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рд╕реЗ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг" рдлрд╝реАрд▓реНрдб 1 рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИред (рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рд╡рд╛рдпрд░рд╢рд░реНрдХ / рдИрдкрди / рдлреАрдЯрд┐рдкреНрд╕ / рдлреАрдЯрд┐рдкреНрд╕.рдПрдЪ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)
- BASE_DEC - рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВред (рдпрд╣ BASE_HEX рдпрд╛ BASE_OCT рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЧреИрд░-рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, BASE_NONE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред)
рдмрд╛рдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ - рдиреАрдЪреЗ рджреЗрдЦреЗрдВред
рдЕрдм рдЖрдк рдлрд┐рд░ рд╕реЗ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ Wireshark рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡рд┐рдВрдбрд╢рд╛рд░реНрдХ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдЦрддреНрдо рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
... static int hf_foo_hdr_flags = -1; static int hf_foo_hdr_bool = -1; static int hf_foo_pl_len = -1; static int hf_foo_payload = -1; ... void proto_register_foo(void) { ... { &hf_foo_hdr_flags, { "FOO Header Flags", "foo.hdr.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_foo_hdr_bool, { "FOO Header Boolean", "foo.hdr.bool", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_foo_pl_len, { "FOO Payload Length", "foo.pl_len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_foo_payload, { "FOO Payload", "foo.payload", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } } ... } static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { ... if (tree) { gint offset = 0; proto_item *ti = NULL; proto_tree *foo_tree = NULL; ti = proto_tree_add_item(tree, proto_foo, tvb, 0, -1, FALSE); foo_tree = proto_item_add_subtree(ti, ett_foo); proto_tree_add_item(foo_tree, hf_foo_hdr_version, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_type, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_flags, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_bool, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_pl_len, tvb, offset, 4, TRUE); offset += 4; proto_tree_add_item(foo_tree, hf_foo_payload, tvb, offset, -1, FALSE); } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рднреА рдмрд┐рдЯреНрд╕ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ред
рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╣рдордиреЗ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛: FT_BOOLEAN, FT_STRING рдФрд░ FT_UINT8ред рдФрд░ рд╕рд╛рде рд╣реА, рдЧреИрд░-рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, BASE_NONE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЕрдм Wireshark рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдФрд░ рдЗрд╕ рдХрджрдо рдкрд░ рдХреЛрдИ рднреА рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╡рд░рдг рд╣рдореЗрд╢рд╛ рдкрд░реНрдпрд╛рдкреНрдд рдереЗред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА
рдЭрдВрдбреЗ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдЬрд┐рд╕реЗ рдереЛрдбрд╝рд╛-рдереЛрдбрд╝рд╛ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣ рднреА, рдпрджрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрдЬреНрдЮрд╛рдд рд╣реИ, рддреЛ рдХреНрдпрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдЦреИрд░, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ - рдпрджрд┐ рдкреИрдХреЗрдЯ
рдкреЗрд▓реЛрдб рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд┐рдирд╛ рдЖрддрд╛ рд╣реИ рдФрд░
рд╢реВрдиреНрдп рдХреЗ рдПрдХ
pl_len рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рддреЛ
рдбрд┐рд╕реЗрдХреНрдЯрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛ред рддреЛ, рдкреНрд▓рдЧрдЗрди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рд╣реИред рдЪрд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ ...
рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рднрд╛рдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ
рдкреВрд░реНрдгрддрд╛ рдХреА рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ! рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред рдЖрдЗрдП рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╛рдо рджреЗрдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреЛ рдкреИрдХреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╕рдордп рд╣рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
static const value_string packetversions[] = { { 1, "Version 1" }, { 0, NULL } }; static const value_string packettypes[] = { { 1, "Ping request" }, { 2, "Ping acknowledgment" }, { 3, "Print payload" }, { 0, NULL } };
рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - "рдореВрд▓реНрдп, рдореВрд▓реНрдп рдХрд╛ рдирд╛рдо"ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдПрдХ рдкреИрдХреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреИрдХреЗрдЬ рдХреЗ рдирдВрдЧреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВред рдЗрди рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрд╡рдпрдВ Wireshark рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП VALS рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
{ &hf_foo_hdr_version, { "FOO Header Version", "foo.hdr.version", FT_UINT8, BASE_DEC, VALS(packetversions), 0x0, NULL, HFILL } }, { &hf_foo_hdr_type, { "FOO Header Type", "foo.hdr.type", FT_UINT8, BASE_DEC, VALS(packettypes), 0x0, NULL, HFILL } }
рд╣рдордиреЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреИрдХреЗрдЬ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЕрдм рд╣рдо рдЭрдВрдбреЗ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред
#define FOO_FIRST_FLAG 0x01 #define FOO_SECOND_FLAG 0x02 #define FOO_ONEMORE_FLAG 0x04 static int hf_foo_flags_first = -1; static int hf_foo_flags_second = -1; static int hf_foo_flags_onemore = -1; void proto_register_foo(void) { ... { &hf_foo_flags_first, { "FOO first flag", "foo.hdr.flags.first", FT_BOOLEAN, FT_INT8, NULL, FOO_FIRST_FLAG, NULL, HFILL } }, { &hf_foo_flags_second, { "FOO second flag", "foo.hdr.flags.second", FT_BOOLEAN, FT_INT8, NULL, FOO_SECOND_FLAG, NULL, HFILL } }, { &hf_foo_flags_onemore, { "FOO onemore flag", "foo.hdr.flags.onemore", FT_BOOLEAN, FT_INT8, NULL, FOO_ONEMORE_FLAG, NULL, HFILL } } ... } static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { ... proto_tree_add_item(foo_tree, hf_foo_hdr_flags, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_first, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_second, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_onemore, tvb, offset, 1, FALSE); offset += 1; ... }
рдЪреВрдВрдХрд┐ рдзреНрд╡рдЬ "1" рдпрд╛ "0" рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо
FT_BOOLEAN рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЫрдареЗ рдкреИрд░рд╛рдореАрдЯрд░ (FOO_FIRST_FLAG, FOO_SECOND_FLAG, FOO_ONEMORE_FLAG) рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреМрдЯрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯ рд╕реЗ рдХрд┐рд╕ рдмрд┐рдЯ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рдПред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╕рднреА рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА
рдСрдлрд╕реЗрдЯ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖ рдЕрдм рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдирд╣реАрдВ рд░реБрдХреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдФрд░ рднреА рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдмрдирд╛ рджреЗрдВрдЧреЗред рдиреЛрдЯ: рд╡рд┐рдВрдбрд╕рд░ рдкреИрдХреЗрдЬ рдХреЛ "FOO рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджрд░реНрдЬ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред Wireshark рдЗрд╕ рдирд╛рдо рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
tvb_get_guint8 () 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХрд╛рд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╛рдо рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдФрд░
рдЬрд╛рдирдХрд╛рд░реА рдХреЙрд▓рдо рдореЗрдВред
static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint8 packet_version = tvb_get_guint8(tvb, 0); guint8 packet_type = tvb_get_guint8(tvb, 1); guint32 packet_pl_len = 0; col_set_str(pinfo->cinfo, COL_PROTOCOL, "FOO"); col_clear(pinfo->cinfo, COL_INFO); if (tree) { gint offset = 0; proto_item *ti = NULL; proto_tree *foo_tree = NULL; ti = proto_tree_add_item(tree, proto_foo, tvb, 0, -1, FALSE); foo_tree = proto_item_add_subtree(ti, ett_foo); proto_tree_add_item(foo_tree, hf_foo_hdr_version, tvb, offset, 1, FALSE); offset += 1; switch ( packet_version ) { case 1: col_add_fstr(pinfo->cinfo, COL_INFO, "Type: %s", val_to_str(packet_type, packettypes, "Unknown (0x%02x)")); proto_item_append_text(ti, ", Type: %s", val_to_str(packet_type, packettypes, "Unknown (0x%02x)")); proto_tree_add_item(foo_tree, hf_foo_hdr_type, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_flags, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_first, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_second, tvb, offset, 1, FALSE); proto_tree_add_item(foo_tree, hf_foo_flags_onemore, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_hdr_bool, tvb, offset, 1, FALSE); offset += 1; proto_tree_add_item(foo_tree, hf_foo_pl_len, tvb, offset, 4, TRUE); packet_pl_len = tvb_get_ntohl(tvb, offset); offset += 4; if ( packet_pl_len ) proto_tree_add_item(foo_tree, hf_foo_payload, tvb, offset, -1, FALSE); break; default: col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown version of Foo protocol (0x%02x)", packet_version); } } }
рд╣рдо рдкреНрд░рд╛рдкреНрдд рдорд╛рдиреЛрдВ рдХреЛ рдореИрдХреНрд░реЛ
val_to_str () рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ рджрд┐рдП рдЧрдП рдорд╛рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╛ рд╡рд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛ рд╣рдордиреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рд╣реИ рдпрджрд┐ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
рдЬрдм рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рд╣рдордиреЗ рдЕрдиреБрдЪрд┐рдд
рдкреЗрд▓реЛрдб рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рднреА рддрдп рдХреА рдереАред
рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛
рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╡рд┐рдЪреНрдЫреЗрджрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

tvb_get_guint8 ()
Tvb_get_guint8 () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рдЕрдиреНрдп рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рд╡рд░рдг рдлрд╛рдЗрд▓
рд╡рд╛рдпрд░рд╢рд░реНрдХ / рдИрдкрди / tvbuff.h рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреБрд░рд╛рд▓реЗрдЦ
рдкреБрд░рд╛рд▓реЗрдЦ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рдеред рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдкреИрдХреЗрдЯ- foo.c - рд╡рд┐рдЪреНрдЫреЗрджрди рдкреНрд▓рдЧрдЗрди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
- CMakeLists.txt - рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП cmake рдлрд╝рд╛рдЗрд▓
- send-foo-packet.c - рдлреВ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб
35000 рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреВ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕реВрдЪреА *
#include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #define FOO_PORT 35000 #define BUFFER_SIZE 210 struct _message { unsigned char pck_version; // = argv[1] unsigned char pck_type; // = 1 | 3 unsigned char pck_flags; // = rand unsigned char pck_boolean; // = rand unsigned int pck_payload_len; // = strlen(argv[2]) }; int main(int argc, char ** argv) { if ( argc != 3 ) { printf("Usage: %s <version> <ping|\"text\">\n", argv[0]); return 1; } struct sockaddr_in cli_addr; int s, cli_len = sizeof(cli_addr); char buf[BUFFER_SIZE]; struct _message msg; msg.pck_version = atoi(argv[1]); msg.pck_payload_len = 0; unsigned int randomData = open("/dev/urandom", O_RDONLY); unsigned int myRandomInteger; read(randomData, &myRandomInteger, sizeof(myRandomInteger)); msg.pck_flags |= myRandomInteger%8; read(randomData, &myRandomInteger, sizeof(myRandomInteger)); msg.pck_boolean = myRandomInteger%2; close(randomData); if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1 ) { perror("socket"); exit(1); } memset((char*)&cli_addr, 0, sizeof(cli_addr)); cli_addr.sin_family = AF_INET; cli_addr.sin_port = htons(FOO_PORT); cli_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); memset(buf, 0, BUFFER_SIZE); if ( ! strcmp(argv[2], "ping") ) { msg.pck_type = 1; } else { msg.pck_type = 3; msg.pck_payload_len = (strlen(argv[2])<200)?strlen(argv[2]):200; strncpy(buf+sizeof(struct _message), argv[2], (strlen(argv[2])<200)?strlen(argv[2]):199); } memcpy(buf, (char*)&msg, sizeof(struct _message)); if ( sendto(s, buf, sizeof(struct _message)+msg.pck_payload_len, 0, (struct sockaddr*)&cli_addr, cli_len) == -1 ) { perror("sendto"); exit(1); } exit(0); }
* рдореВрд░реНрдЦ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо