미친해커

[Wireshark] Dissector로 프로토콜 만들기 본문

Wireshark/Lua Script

[Wireshark] Dissector로 프로토콜 만들기

미친해커 2022. 7. 28. 03:51
반응형

Create a Protocol use Wireshark API

우선 Wireshark(와이어샤크)에서 제공하는 API를 활용해 직접 프로토콜을 정의한다.

MyProto = Proto.new("MyProto", "My Custom Protocol")

Define Dissector of MyProto

새롭게 생성한 프로토콜의 대한 dissector를 정의해준다.

function MyProto.dissector(buf, pinfo, root)
    pinfo.cols.protocol = "MY_PROTOCOL"
    root:add(MyProto, "MY PROTOCOL DATA", buf(0))
end

dissector 함수의 인자는 총 3개 이며 각각 패킷 데이터, 패킷 정보, 패킷 프레임?이다.

Parameter buf

dissector의 buf는 와이어샤크에서 실질적인 데이터를 버퍼를 가리킨다. (Tvb object)

buf에 해당되는 부분

하지만 이더넷 헤더와 같은 정보들은 포함되어 있지 않다. buf에 들어오는 데이터는 payload만 들어오게 된다.

buf에 들어오는 데이터

Parameter pinfo

dissector의 pinfo는 와이어샤크의 패킷의 정보를 표시하는 테이블을 가리킨다. (Pinfo object)

pinfo에는 Number, Time, Protocol 등의 Column의 정보를 수정할 수 있고 또 새로운 Column을 추가할 수 있다. 다음 코드는 Protocol Column의 데이터를 수정한다.

pinfo.cols.protocol = "MY_PROTOCOL"

Protocol 컬럼이 변경된 모습

Parameter root

dissector의 root는 와이어샤크의 패킷의 데이터를 표시하는 트리를 가리킨다. (TreeItem object)

와이어샤크의 중앙에 있는 이 트리는 해당 패킷의 프로토콜에 맞춰서 패킷의 데이터를 보기 편하게 구분하여 보여준다. 우리가 만든 커스텀 프로토콜은 이러한 트리 구조가 등록되어 있지 않기 때문에 아무런 트리가 생성되지 않게 된다. root는  이 트리들이 모여있는 곳을 말한다. 다음 코드는 새로운 트리를 생성하는 코드이다.

root:add(MyProto, "MY PROTOCOL DATA", buf(0))

MY PROTOCOL DATA 트리가 생성된 모습

Set the MyProto

이제는 저 수 많은 패킷중 어떤 패킷이 MyProto에 속하는 패킷인지 설정해야 한다. 해당 방법은 와이어샤크의 필터를 사용하는 방법과 유사하다.

DissectorTable.get("tcp.port"):add(8080, MyProto)

위 코드는 TCP 프로토콜의 포트가 8080일 경우 MyProto로 설정한다는 말이다. 이렇게 설정하게 된다면 8080 포트로 통신하는 모든 TCP 패킷들이 MyProto.dissector 함수를 거치게 된다.

최종 코드

MyProto = Proto.new("MyProto", "My Custom Protocol")

function MyProto.dissector(buf, pinfo, root)
    pinfo.cols.protocol = "MY_PROTOCOL"
    root:add(MyProto, "MY PROTOCOL DATA", buf(0, buf:len()))
end

DissectorTable.get("tcp.port"):add(8080, MyProto)

마무리

여기까지 Lua 스크립트를 이용해 와이어샤크에 커스텀 프로토콜을 추가해 하위 트리를 생성 그리고 프로토콜의 이름을 수정하는 방법을 알아보았다.

 

다음 포스팅에서는 우리가 생성했던 하위 트리(MY PROTOCOL DATA)에 Item을 생성하여 데이터를 분류하여 표시하는 방법을 알아보려고 한다.

반응형
Comments