2014/10/26

Lua 를 사용하여 Wireshark 에 Protocol 추가하기

hana.lua 파일 생성

추가하려는 프로토콜 명으로 lua 파일을 생성합니다.
ex. C:\Program Files\Wireshark\hana.lua

init.lua 에 hana.lua 추가

init.lua 파일은 wireshark 프로그램이 시작하면, 실행됩니다.
init.lua 파일 하단에 아래 코드를 추가합니다.

dofile(DATA_DIR.."hana.lua")

DATA_DIR 은 init.lua 파일 경로이며, hana.lua 파일이 다른 경로에 있으면 해당 경로를 적습니다.
init.lua 파일은 관리자 권한으로 실행된 프로그램으로 수정해야 합니다.

아래 내용 참고해서 hana.lua 파일을 수정합니다.
-- hana protocol example

-- declare our protocol
p_hana = Proto("hana", "HANA Protocol")

-- create a function to dissect it
function p_hana.dissector(buf, pinfo, root)

    pinfo.cols.protocol = "hana"

    i = 0
    local st = root:add(p_hana, buf(), "HANA Protocol Data")

-- Message Header
    st = st:add(buf(0,32), "Message Header")
    st:add(buf(i,8), "Session identifier: " .. buf(i,8))
    i = i + 8
    st:add(buf(i,4), "Packet sequence number in this session: " .. buf(i,4):le_int())
    i = i + 4
    st:add(buf(i,4), "Used space in packet: " .. buf(i,4):le_uint())
    i = i + 4
    st:add(buf(i,4), "Total space in packet: " .. buf(i,4):le_uint())
    i = i + 4
    st:add(buf(i,2), "Number of segments in packet: " .. buf(i,2):le_int())
    i = i + 2
    st:add(buf(i,1), "Reserved, do not use: " .. buf(i,1):int())
    i = i + 1
    st:add(buf(i,9), "Reserved, do not use: " .. buf(i,9))
    i = i + 9

-- Request Segment Header
    st = st:add(buf(i,24), "Segment Header")
    st:add(buf(i,4), "Length of the segment: " .. buf(i,4):le_int())
    i = i + 4
    st:add(buf(i,4), "Offset of the segment: " .. buf(i,4):le_int())
    i = i + 4
    part_count = buf(i,2):le_int()
    st:add(buf(i,2), "Number of contained parts: " .. buf(i,2):le_int())
    i = i + 2
    st:add(buf(i,2), "Number of segments: " .. buf(i,2):le_int())
    i = i + 2
    st:add(buf(i,1), "Segment kind: " .. buf(i,1):int())
    i = i + 1
    st:add(buf(i,1), "Message type: " .. buf(i,1):int())
    i = i + 1
    st:add(buf(i,1), "Whether the command is committed: " .. buf(i,1):int())
    i = i + 1
    st:add(buf(i,1), "Command options: " .. buf(i,1):int())
    i = i + 1
    st:add(buf(i,8), "Reserved, do not use: " .. buf(i,8))
    i = i + 8

    for j = 1, part_count, 1 do

-- Part Header
        st = st:add(buf(i,16), "Part Header")
part_kind = buf(i,1):uint()
        st:add(buf(i,1), "Part kind: " .. buf(i,1):int())
        i = i + 1
        st:add(buf(i,1), "Further attributes of part: " .. buf(i,1):int())
        i = i + 1
        st:add(buf(i,2), "Argument count: " .. buf(i,2):le_int())
        i = i + 2
        st:add(buf(i,4), "Argument count: " .. buf(i,4):le_int())
        i = i + 4
part_length = buf(i,4):le_int()
st:add(buf(i,4), "Length of part buffer in bytes: " .. buf(i,4):le_int())
        i = i + 4
st:add(buf(i,4), "Length in packet remaining without this part: " .. buf(i,4):le_int())
        i = i + 4

if part_kind == 33 then
   field_count = buf(i,2):le_uint()
   st:add(buf(i,2), "Number of fields: " .. buf(i,2):le_uint())
   i = i + 2
   for k = 1, field_count, 1 do
-- Field
                field_length = buf(i,1):int()
if field_length == 255 then
   i = i + 1
   field_length = buf(i,1):int()
   st:add(buf(i,1), "Length of data: " .. buf(i,1):int())
   i = i + 1
else
   st:add(buf(i,1), "Length of data: " .. buf(i,1):int())
               i = i + 1
end

st:add(buf(i,field_length), "Field data: " .. buf(i,field_length):string())
           i = i + field_length
   end
else
   i = i + part_length
end

if part_length % 8 ~= 0 then
   i = i + 8 - (part_length % 8)
        end
    end

end

-- load the udp.port table
tcp_table = DissectorTable.get("tcp.port")

-- register our protocol to handle tcp port 30015
tcp_table:add(30015, p_hana)


실행 화면