아래의 레퍼런스를 참고하였다.
dissector를 built-in으로 구성할지 plugin으로 구성할지 선택을 할 수가 있으나, 이곳에서는 plugin형식으로 구성하는 방법에 대하여 알아보도록 한다.
Example 1) Dissector 초기화
dissector를 초기화를 수행한다.(위의 과정에서는 프로토콜을 등록하였었다.) 등록한 프로토콜와 처리를 위한 dissector 핸들러를 연계하여 dissector 핸들을 생성한다.(1) 그 후 생성된 핸들에 UDP 포트 넘버와 관련지어 wireshark로 하여금 해당하는 패킷을 처리할 수 있도록 등록한다.(2)
패킷을 분석하기 위한 dissector 핸들러 함수는 아래와 같이 구성된다.
Example 3) Dissection
컴파일을 위해 필요한 준비물
그 이후엔 해당 폴더에서(윈도우의 경우)
로 빌드하면 된다.
dissector를 built-in으로 구성할지 plugin으로 구성할지 선택을 할 수가 있으나, 이곳에서는 plugin형식으로 구성하는 방법에 대하여 알아보도록 한다.
Example 1) Dissector 초기화
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <epan/packet.h>
#define FOO_PORT 1234
static int proto_foo = -1;
void
proto_register_foo(void)
{
proto_foo = proto_register_protocol (
"FOO Protocol", /* name */
"FOO", /* short name */
"foo" /* abbrev */
);
}
# include "config.h"
#endif
#include <epan/packet.h>
#define FOO_PORT 1234
static int proto_foo = -1;
void
proto_register_foo(void)
{
proto_foo = proto_register_protocol (
"FOO Protocol", /* name */
"FOO", /* short name */
"foo" /* abbrev */
);
}
예제에서는 UDP와 FOO_PORT 에 해당하는 패킷을 분석하는 dissector를 구성할 예정이다.
dissector를 등록하는데 호출하는 첫번째 함수는 proto_register_protocol 함수이다. 세가지 인자를 받아 dissector의 구분자를 반환한다. 인자로 받아들이는 문자열의 사용은 아래와 같다.
dissector를 등록하는데 호출하는 첫번째 함수는 proto_register_protocol 함수이다. 세가지 인자를 받아 dissector의 구분자를 반환한다. 인자로 받아들이는 문자열의 사용은 아래와 같다.
- Full Name, Short Name는 "Preferences"와 "Enabled protocols"의 다이얼로그에 사용됨.
- Abbreviation Name는 wireshark 필터에 사용됨.
void
proto_reg_handoff_foo(void)
{
static dissector_handle_t foo_handle;
foo_handle = create_dissector_handle(dissect_foo, proto_foo); //< 1
dissector_add("udp.port", FOO_PORT, foo_handle); //< 2
}
proto_reg_handoff_foo(void)
{
static dissector_handle_t foo_handle;
foo_handle = create_dissector_handle(dissect_foo, proto_foo); //< 1
dissector_add("udp.port", FOO_PORT, foo_handle); //< 2
}
dissector를 초기화를 수행한다.(위의 과정에서는 프로토콜을 등록하였었다.) 등록한 프로토콜와 처리를 위한 dissector 핸들러를 연계하여 dissector 핸들을 생성한다.(1) 그 후 생성된 핸들에 UDP 포트 넘버와 관련지어 wireshark로 하여금 해당하는 패킷을 처리할 수 있도록 등록한다.(2)
패킷을 분석하기 위한 dissector 핸들러 함수는 아래와 같이 구성된다.
Example 3) Dissection
static void
dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
col_set_str(pinfo->cinfo, COL_PROTOCOL, "FOO");
/* Clear out stuff in the info column */
col_clear(pinfo->cinfo,COL_INFO);
}
dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
col_set_str(pinfo->cinfo, COL_PROTOCOL, "FOO");
/* Clear out stuff in the info column */
col_clear(pinfo->cinfo,COL_INFO);
}
컴파일을 위해 필요한 준비물
- Makefile.am - This is the UNIX/Linux makefile template
- Makefile.common - This contains the file names of this plugin
- Makefile.nmake - This contains the Wireshark plugin makefile for Windows
- moduleinfo.h - This contains plugin version info
- moduleinfo.nmake - This contains DLL version info for Windows
- packet-foo.c - This is your dissector source
- plugin.rc.in - This contains the DLL resource template for Windows
그 이후엔 해당 폴더에서(윈도우의 경우)
nmake -f Makefile.nmake distclean
nmake -f Makefile.nmake all
nmake -f Makefile.nmake all
로 빌드하면 된다.