Wireshark에서 Lua Dissector를 사용하는 방법

세계 최고의 네트워크 패킷 캡처 도구 중 하나인 Wireshark를 사용하면 특정 데이터 패킷을 확보하여 오프라인 및 실시간으로 분석할 수 있습니다. 앱을 네트워크를 통해 흐르는 데이터를 면밀히 검사하여 문제와 불규칙성을 포착할 수 있는 방법으로 생각하십시오.

Wireshark에서 Lua Dissector를 사용하는 방법

패킷 데이터의 특정 부분을 분석하려는 경우 해부를 사용할 수 있습니다. 이름에서 알 수 있듯이 이 프로세스는 코드를 "해부"하여 주의가 필요한 특정 측면을 잘라낼 수 있습니다. 이 자습서에서는 Lua 스크립팅 언어를 사용하여 Wireshark에서 해부를 만들고 사용하는 방법을 설명합니다.

시작하기 전에 – 해부에 대해 알아야 할 사항

해부는 Wireshark에서 데이터 패킷의 일부를 분석하는 빠른 방법을 제공하지만 효과적으로 작동하려면 일부 프로토콜을 따라야 합니다. 이러한 프로토콜에는 다음이 포함됩니다.

  • 다른 프로토콜의 페이로드 세트 유형을 처리하려면 생성한 모든 해부를 등록해야 합니다. 이 등록을 완료하려면 아래에서 볼 수 있는 해부에 "Proto" 개체를 할당해야 합니다.
  • Wireshark를 통해 해부를 호출하면 앱에서 세 가지를 수신합니다.
    • TVB 개체 - 데이터 패킷의 TVB 버퍼입니다.
    • TreeItem 개체 – 데이터 트리의 단일 노드를 나타내는 트리 루트입니다.
    • Pinfo 개체 – 패킷 정보 레코드입니다.
  • 데이터 패킷이 "Proto" 객체로 설정한 DissectorTable과 일치하는 경우에만 해부를 호출할 수 있습니다.
    • "다음으로 디코딩" 기능을 통해 해부를 강제로 사용하여 이 요구 사항을 해결할 수 있습니다. 하지만 그런 경우에도 "Proto" 객체로 설정한 DissectorTable이 올바른 유형인 경우에만 해부를 강제할 수 있습니다.

LUA를 사용하여 해부기 설정

Wireshark는 C 프로그래밍 언어로 작성되고 C 프로그래밍 언어를 사용하므로 대부분의 해부는 C로 유사하게 작성됩니다. 그러나 Lua를 사용하고 싶을 수도 있습니다. 이 스크립팅 언어는 C보다 간단하므로 코딩 초보자나 단순히 더 가벼운 언어를 사용하여 해부를 만들고자 하는 사람들이 더 쉽게 접근할 수 있습니다.

코드가 더 간단해지더라도 Lua를 사용할 때 얻을 수 있는 해부는 일반적으로 C를 사용하여 만드는 것보다 느립니다. 그럼에도 불구하고 Lua를 사용하여 Wireshark 해부를 만들려는 경우 따라야 할 단계입니다.

1단계 – Wireshark에서 Lua 설정

이전에 Wireshark에서 Lua를 사용한 적이 없다면 Lua를 설정해야 합니다.

  1. "도움말"을 클릭한 다음 "About Wireshark"를 클릭합니다.
  2. "폴더"를 클릭합니다.
  3. 다음 중 하나를 선택하여 활성 Lua 스크립트를 생성합니다.
    • 글로벌 루아 플러그인
    • 개인 루아 플러그인
    • 개인의

일단 활성화되면 Wireshark를 시작할 때마다 스크립트가 준비됩니다. 해당 스크립트를 변경할 때마다 Wireshark를 다시 시작하여 변경 사항을 등록하거나 "Ctrl + Shift + L"을 눌러 모든 Lua 스크립트를 다시 로드하여 변경 사항을 활성화해야 합니다.

2단계 – 해부를 만들기 위한 기본 단계

Lua에 이미 익숙하다면 다음 단계를 사용하여 Wireshark에서 작동할 고유한 해부 스크립트를 만들 수 있습니다.

  • 프로토콜 트리에서 사용할 긴 이름과 해부의 표시 필터 이름 역할을 하는 짧은 이름을 모두 설정해야 하는 해부용 프로토콜을 선언합니다.
    • 적절한 유형으로 다음 세 필드를 만듭니다.
    • 질문 – 질문 유형을 표시합니다.
    • 답변 - 답변 유형을 표시합니다.
  • MessageType – 패킷이 질문 또는 답변을 요청하는지 보여줍니다.
  • Wireshark가 필드를 표시하는 방법을 알 수 있도록 필드를 등록하십시오. 등록된 필드가 없으면 일반적으로 트리 항목 ProtoField가 유효하지 않음을 알리는 "Lua 오류" 메시지가 표시됩니다.
  • 앞에서 언급한 Pinfo(패킷에 대한 데이터 포함) 및 트리 항목(하위 트리에 추가할 트리 생성)을 포함하는 해부 기능을 만듭니다. 또한 TCP 위에 있는 "버퍼"를 만들어야 합니다.
  • Wireshark가 dissector를 사용해야 하는 프로토콜과 포트를 모두 지정합니다. 예를 들어 프로토콜을 "TCP"로 설정하고 포트 번호를 사용하려는 포트 번호로 설정할 수 있습니다.

3단계 – Wireshark에 Dissector 추가

지금 당신의 해부는 전기가 없는 전구와 같습니다. 그것은 존재하지만 당신이 그것을 통해 어떤 힘을 발휘할 수 있을 때까지는 당신에게 아무 소용이 없습니다. 즉, 해부가 아직 Wireshark에 추가되지 않았으므로 다음 단계를 사용하여 실행하려면 수동으로 추가해야 합니다.

  1. "도움말"을 클릭하고 "About Wireshark" 메뉴로 이동합니다.
  2. Lua 파일의 경로 목록을 찾으려면 "폴더" 탭을 선택하십시오.
  3. "개인 Lua 플러그인"을 선택합니다. 필요한 경우 디렉터리를 만듭니다.
  4. 생성한 Lua 파일을 복사하여 "Personal Lua Plugins" 디렉토리에 붙여넣습니다. Wireshark를 다시 로드하여 해부를 켭니다.

캡처한 패킷 중 일부를 열어 새 해부기에서 테스트를 실행하는 것이 좋습니다. Wireshark는 메시지 유형(질문 또는 답변) 및 확인 결과에 대한 정보와 함께 해부에 대해 선택한 긴 이름을 보여주는 메시지를 전달해야 합니다.

일부 샘플 코드

이전에 해부를 만든 적이 없다면(또는 Lua를 처음 사용하는 경우), 와이어샤크 시도해 볼 수 있는 편리한 예제 해부를 제공합니다.

local p_multi = Proto("multi", "MultiProto"); local vs_protos = { [2] = "mtp2", [3] = "mtp3", [4] = "alcap", [5] = "h248", [6] = "ranap", [7] = "rnsap", [8] = "nbap"
}
local f_proto = ProtoField.uint8("multi.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("multi.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("multi.text", "Text")
p_multi.fields = { f_proto, f_dir, f_text }
local data_dis = Dissector.get("data")
local protos = { [2] = Dissector.get("mtp2"), [3] = Dissector.get("mtp3"), [4] = Dissector.get("alcap"), [5] = Dissector.get("h248"), [6] = Dissector.get("ranap"), [7] = Dissector.get("rnsap"), [8] = Dissector.get("nbap"), [9] = Dissector.get("rrc"), [10] = DissectorTable.get("sctp.ppi"):get_dissector(3), -- m3ua [11] = DissectorTable.get("ip.proto"):get_dissector(132), -- sctp. }
function p_multi.dissector(buf, pkt, tree) local subtree = tree: add(p_multi, buf(0,2)) subtree: add(f_proto, buf(0,1)) subtree: add(f_dir, buf(1,1)) local proto_id = buf(0,1):uint() local dissector = protos[proto_id] if dissector ~= nil then -- Dissector was found, invoke subdissector with a new Tvb, -- created from the current buffer (skipping first two bytes). dissector: call(buf(2):tvb(), pkt, tree) elseif proto_id < 2 then subtree: add(f_text, buf(2)) -- pkt.cols.info: set(buf(2, buf: len() - 3):string()) else -- fallback dissector that just shows the raw data. data_dis: call(buf(2):tvb(), pkt, tree) end. end. local wtap_encap_table = DissectorTable.get("wtap_encap")
local udp_encap_table = DissectorTable.get("udp.port")
wtap_encap_table: add(wtap.USER15, p_multi)
wtap_encap_table: add(wtap.USER12, p_multi)
udp_encap_table: add(7555, p_multi)

Postdissectors 및 Chained Dissectors

Lua에서 해부기 생성을 마스터한 후에는 해부기 사용법에 대해 좀 더 자세히 알아보고 싶을 수 있습니다. Wireshark는 더 많은 기능을 제공하는 두 가지 추가 유형의 해부를 제공합니다. 사후 해부 및 연결된 해부입니다.

Postdissector는 패킷에 대해 실행한 모든 dissector의 최종 확인과 매우 유사합니다. Wireshark가 사용하려는 다른 모든 해부를 호출하면 알림을 받도록 등록하고 "Protocol" 및 "Info" 열을 필터링하는 데 사용할 수 있습니다. 이 기능은 데이터 세트 사이에 긴 간격이 있어 각 패킷을 개별적으로 불러올 수 없는 세션에서 여러 패킷을 필터링하려는 경우에 특히 유용합니다.

해부를 연결하면 단일 해부의 데이터에 대한 액세스를 제공하여 유사한 기능(적어도 이전에 사용된 해부자를 통한 필터링 측면에서)을 제공합니다. 여기서 주요 이점은 연결된 해부가 모든 패킷을 다시 실행할 필요가 없기 때문에 원래 해부가 다시 실행될 때까지 기다리지 않고도 결과를 얻을 수 있다는 것입니다.

루아에서 해부

Wireshark가 이미 C(자연어)로 분해자를 생성할 수 있는 기능을 제공하므로 Lua에서도 생성할 필요가 없을 수 있습니다. 그럼에도 불구하고 C에 익숙하지 않은 사용자와 이미 Lua를 마스터한 사용자는 Lua의 가벼운 스크립팅을 통해 해부를 쉽게 만들 수 있습니다. 물론 C 기반 해부기와 비교하여 프로세스를 실행할 때 더 긴 로딩 시간을 희생해야 하지만 상관없이 옵션을 갖는 것이 도움이 됩니다.

그렇게 말하면 우리는 당신의 의견을 듣고 싶습니다. Wireshark에서 해부를 얼마나 자주 사용합니까? 이전에 C로 그것들을 만들어 본 적이 있습니까? 그리고 Lua로 해부를 만들면 어떤 이점이 있다고 생각하십니까? 아래 의견란에 알려주십시오.