본문 바로가기

Networking

초간단 dissector 등록을 위한 과정

아래의 레퍼런스를 참고하였다.

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     */
        );
}

예제에서는 UDP와 FOO_PORT 에 해당하는 패킷을 분석하는 dissector를 구성할 예정이다.

dissector를 등록하는데 호출하는 첫번째 함수는 proto_register_protocol 함수이다. 세가지 인자를 받아 dissector의 구분자를 반환한다.  인자로 받아들이는 문자열의 사용은 아래와 같다.
  • Full Name, Short Name는 "Preferences"와 "Enabled protocols"의 다이얼로그에 사용됨.
  • Abbreviation Name는 wireshark 필터에 사용됨.
Example 2) Dissector Handoff

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
}


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);
}


컴파일을 위해 필요한 준비물
  • 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

로 빌드하면 된다.