Wireshark에서 자체 프로토콜 분석

17634 단어 Wireshark루아

Wireshark에서 자체 프로토콜 분석



이사



Wireshark에서는 Lua 언어로 작성된 파일을 플러그인으로 취급 할 수 있습니다.
업무로 단말간의 통신이 이상했기 때문에, Wireshark를 사용하게 되었습니다만, 단순히 캡쳐한 것만으로 바이너리를 뇌내 해석하게 됩니다. 조금 계시라고 하는 것으로 플러그인을 만들기로 했습니다. Lua 언어는 무엇입니까? 라고 생각하지만, 독자 프로토콜을 해석할 정도라면 간단하게 만들 수 있었습니다.

이전 준비



Wireshark 설치 폴더에서 init.lua 설정을 변경합니다.
  • disable_lua를 false로 설정
  • run_user_scripts_when_superuser를 true로 설정
  • 파일의 마지막 행에 "dofile(DATA_DIR.."foo_protcol.lua")"를 추가

  • init.lua
    -- Set disable_lua to true to disable Lua support.
    disable_lua = false
    
    if disable_lua then
        return
    end
    
    -- If set and we are running with special privileges this setting
    -- tells whether scripts other than this one are to be run.
    run_user_scripts_when_superuser = true
    
     
     
     
    
    dofile(DATA_DIR.."console.lua")
    --dofile(DATA_DIR.."dtd_gen.lua")
    dofile(DATA_DIR.."foo_protcol.lua")
    

    lua 파일 만들기



    Wireshark 설치 폴더에서 "foo_protcol.lua"를 만듭니다.
    통신 전문이나 포트 번호는 허구입니다.
  • le_uint() 는 리틀 엔디안으로 확장됩니다.
  • uint() 는 빅 엔디안으로 확장합니다.

  • foo_protcol.lua
    -- foo protocol example
    -- プロトコルの定義
    foo_proto = Proto("foo","Foo","Foo protocol")
    -- パース用の関数定義
    function foo_proto.dissector(buffer,pinfo,tree)
        pinfo.cols.protocol = "Foo"
        local subtree = tree:add(foo_proto,buffer(),"Foo Protocol Data")
        subtree:add(buffer(0,1),"cmd_id: " .. buffer(0,1):le_uint())
        subtree:add(buffer(1,1),"req_id: " .. buffer(1,1):le_uint())
        subtree:add(buffer(2,6),"date: " .. buffer(2,1):le_uint() .. "/" .. buffer(3,1):le_uint() .. "/"  .. buffer(4,1):le_uint() .. " "  .. buffer(5,1):le_uint() .. ":"  .. buffer(6,1):le_uint() .. ":"  .. buffer(7,1):le_uint())
        subtree:add(buffer(8,2),"seq_no: " .. buffer(8,2):le_uint())
        subtree:add(buffer(10,1),"rty_cnt: " .. buffer(10,1):le_uint())
    end
    -- tcp.portテーブルのロード
    tcp_table = DissectorTable.get("tcp.port")
    -- ポート9999番とプロトコルの紐付けをする
    tcp_table:add(9999,foo_proto)
    

    Wireshark에서 자체 프로토콜이 표시됨



    Wireshark를 시작하고 원하는 통신 내역의 세부 정보를 보면 자체 프로토콜 분석이 표시됩니다. (이미지는 쟈칸 가공하고 있습니다)



    전문 크기가 부족하거나 분할 패킷의 경우



    TCP의 패킷은, 하나의 패킷으로 복수의 전문이 들어가 있거나, 1회로 모든 전문이 도달하지 않거나 합니다. 위의 foo_proto.dissector 에서는, 그 근처의 고려를 더합니다.

    우선 전문 분석 자체의 논리를 나눕니다.
    function disp_foo(buffer,pinfo,tree)
        pinfo.cols.protocol = "Foo"
        local subtree = tree:add(foo_proto,buffer(),"Foo Protocol Data")
        subtree:add(buffer(0,1),"cmd_id: " .. buffer(0,1):le_uint())
        subtree:add(buffer(1,1),"req_id: " .. buffer(1,1):le_uint())
        subtree:add(buffer(2,6),"date: " .. buffer(2,1):le_uint() .. "/" .. buffer(3,1):le_uint() .. "/"  .. buffer(4,1):le_uint() .. " "  .. buffer(5,1):le_uint() .. ":"  .. buffer(6,1):le_uint() .. ":"  .. buffer(7,1):le_uint())
        subtree:add(buffer(8,2),"seq_no: " .. buffer(8,2):le_uint())
        subtree:add(buffer(10,1),"rty_cnt: " .. buffer(10,1):le_uint())
    end
    

    dissector 자체에서는, 받은 버퍼의 사이즈를 보고, 후속의 패킷과 어펜드 하거나, 복수전문을 처리하기 위한 루프를 실시하도록 합니다.
    function foo_proto.dissector(buffer,pinfo,tree)
        local HEADDER_LENGTH = 17
        if buffer:len() < HEADDER_LENGTH then
            -- ヘッダ部に必要なデータ長が無いので、後続のパケットにアペンドする.
            pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
            return buffer:len() - HEADDER_LENGTH
        end
    
        while buffer:len() > 0 do
            local length = buffer(13,2):le_uint()
            if (buffer:len() - HEADDER_LENGTH) < length then
                -- データ部に必要なデータ長が無いので、後続のパケットにアペンドする.
                pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
                return buffer:len() - length + HEADDER_LENGTH
            end
    
            disp_foo(buffer,pinfo,tree)
            if (buffer:len() - (HEADDER_LENGTH + length)) == 0 then
                break
            end
            buffer = buffer:range(HEADDER_LENGTH + length)
        end
    end
    

    하나의 패킷에 복수의 전문이 있는 경우는 이와 같이.



    분할 패킷의 경우는 이와 같이 됩니다.

    좋은 웹페이지 즐겨찾기