Wireshark에서 자체 프로토콜 분석
Wireshark에서 자체 프로토콜 분석
이사
Wireshark에서는 Lua 언어로 작성된 파일을 플러그인으로 취급 할 수 있습니다.
업무로 단말간의 통신이 이상했기 때문에, Wireshark를 사용하게 되었습니다만, 단순히 캡쳐한 것만으로 바이너리를 뇌내 해석하게 됩니다. 조금 계시라고 하는 것으로 플러그인을 만들기로 했습니다. Lua 언어는 무엇입니까? 라고 생각하지만, 독자 프로토콜을 해석할 정도라면 간단하게 만들 수 있었습니다.
이전 준비
Wireshark 설치 폴더에서 init.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"를 만듭니다.
통신 전문이나 포트 번호는 허구입니다.
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
하나의 패킷에 복수의 전문이 있는 경우는 이와 같이.
분할 패킷의 경우는 이와 같이 됩니다.
Reference
이 문제에 관하여(Wireshark에서 자체 프로토콜 분석), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kenji-yokoi/items/6ab9fbdbb3d6322c2703텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)