add snippet gui and fixes
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
module("b2ws_const")
|
||||
B2WS_PLUGIN_PATH = "plugins/b2ws-plugin/"
|
||||
B2WS_IMPORT_BLOB_FILE = "b2ws_import.lua"
|
||||
B2WS_CREATE_SNIPPET_FILE = "b2ws_snippet.lua"
|
||||
B2WS_UTIL_FILE = "b2ws_util.lua"
|
||||
B2WS_DISSECTOR_TEMPLATE_FILE = "b2ws_dissector.template"
|
||||
B2WS_DISSECTOR_EXTENSION= ".dissector.lua"
|
||||
B2WS_PLUGIN_CONFIG_FILE_NAME = "b2ws.config"
|
||||
B2WS_IMPORT_BLOB_MENU_TITLE = "b2ws/Import Blob"
|
||||
B2WS_CREATE_SNIPPET_MENU_TITLE = "b2ws/Create Snippet"
|
||||
B2WS_IMPORT_BLOB_BTN_TITLE = "Import Blob"
|
||||
B2WS_SAVE_SETTINGS_BTN_TITLE = "Save Current Settings"
|
||||
B2WS_SAVE_DISSECTOR_BTN_TITLE = "Save Dissector"
|
||||
@@ -13,13 +15,16 @@ B2WS_SHOW_DISSECTOR_BTN_TITLE = "Show Dissector"
|
||||
B2WS_SHOW_DISSECTOR_WIN_TITLE = "Created Dissector"
|
||||
B2WS_CHANGE_SETTINGS_BTN_TITLE = "Change Settings"
|
||||
B2WS_CREATE_DISSECTOR_BTN_TITLE = "Create Dissector"
|
||||
B2WS_CREATE_DISSECTOR_SNIPPET_BTN_TITLE = "Create Dissector Snippet"
|
||||
B2WS_CREATE_DISSECTOR_DLG_TITLE = "Create Dissector"
|
||||
B2WS_CREATE_DISSECTOR_DLG_NAME_LABEL = "dissector name"
|
||||
B2WS_CHANGE_SETTINGS_DLG_TITLE = "Change Settings"
|
||||
B2WS_IMPORT_BLOB_WIN_TITLE = "Import Blob"
|
||||
B2WS_CREATE_SNIPPET_WIN_TITLE = "Create Dissector Snippet"
|
||||
B2WS_RELOAD_PLUGIN_WIN_TITLE = "Please reload plugin"
|
||||
B2WS_RELOAD_PLUGIN_WIN_CONTENT = "Dissector created at {0}\nBefore using please reload plugin:\n\tAnalyze -> Reload Lua Plugin (qt version only) or restart wireshark"
|
||||
B2WS_CONFIG_LABEL_BLOB_SRC = "Blob file path"
|
||||
B2WS_CONFIG_LABEL_ETH_FAKE_HEADER_SRC = "fake eth src address"
|
||||
B2WS_CONFIG_LABEL_ETH_FAKE_HEADER_DST = "fake eth dst address"
|
||||
B2WS_CONFIG_LABEL_ETH_FAKE_HEADER_TYPE = "fake eth type"
|
||||
B2WS_SHOW_SNIPPET_WIN_TITLE = "Show Created Dissector Snippet"
|
||||
|
||||
@@ -75,7 +75,7 @@ function {field_name}_layer.dissector(buffer, packet_info, tree)
|
||||
end
|
||||
]]
|
||||
|
||||
next_proto_dissector_call = [[Dissector.get("{field_name}_layer"):call(buffer({struct_size}, buffer:len() - {struct_size}):tvb(), packet_info, tree)]]
|
||||
next_proto_dissector_call = [[Dissector.get("{field_name}_layer"):call(buffer({struct_size}, buffer:len() - {struct_size}):tvb(), packet_info, {struct_name}_layer_tree)]]
|
||||
|
||||
proto_template = [[-- {struct_name} Layer
|
||||
{struct_name}_layer = Proto("{struct_name}_layer", "{struct_name} layer")
|
||||
@@ -87,7 +87,7 @@ function {struct_name}_layer.dissector(buffer, packet_info, tree)
|
||||
{field_definitions}
|
||||
end]]
|
||||
|
||||
field_declaration_template = [===[{struct_name}_layer_fields.{field_name} = ProtoField.{field_type}("{struct_name}_layer_fields.{field_name}", "{field_name}", {base_type}, nil--[[valuestring]], {bit_mask}, {field_name} description})]===]
|
||||
field_declaration_template = [===[{struct_name}_layer_fields.{field_name} = ProtoField.{field_type}("{struct_name}_layer_fields.{field_name}", "{field_name}", {base_type}, nil--[[valuestring]], {bit_mask}, "{field_name} description")]===]
|
||||
field_definition_template = [[
|
||||
local {field_name}_value = buffer(current_offset, {field_end}):{to_method}()
|
||||
{struct_name}_layer_tree:add({struct_name}_layer_fields.{field_name}, buffer(current_offset, {field_end}), {field_name}_value)
|
||||
@@ -112,14 +112,24 @@ end
|
||||
|
||||
function b2ws_create_dissector_call_snippet(struct_object, field_object, template_string)
|
||||
local result_template = template_string:gsub("{field_name}", field_object.name)
|
||||
result_template = result_template:gsub("{struct_name}", struct_object.name)
|
||||
return result_template:gsub("{struct_size}", struct_object.size)
|
||||
end
|
||||
|
||||
function b2ws_create_dissector_fields_definition_snippet(struct_object, field_object, template_string)
|
||||
local result_template = template_string:gsub("{struct_name}", struct_object.name)
|
||||
local array_number = field_object.array_number
|
||||
if array_number== nil then
|
||||
result_template = result_template:gsub("{to_method}", "le_uint")
|
||||
else
|
||||
result_template = result_template:gsub("local {field_name}_value = buffer%(current_offset, {field_end}%):{to_method}%(%)\n","")
|
||||
result_template = result_template:gsub("local {field_name}_value = %g+\n", "")
|
||||
result_template = result_template:gsub(", {field_name}_value%)", ")")
|
||||
end
|
||||
|
||||
result_template = result_template:gsub("{field_name}", field_object.name)
|
||||
local bit_size = field_object.bit_size
|
||||
local array_number = field_object.array_number
|
||||
|
||||
if bit_size == 0 then
|
||||
result_template = result_template:gsub("{field_end}", "buffer:len() - current_offset")
|
||||
else
|
||||
@@ -130,6 +140,8 @@ function b2ws_create_dissector_fields_definition_snippet(struct_object, field_ob
|
||||
if array_number == nil or tonumber(array_number) ~= nil then
|
||||
if field_object.bit_mask ~= nil then
|
||||
byte_size = tonumber(string.match(field_object.type, "(%d+)")) / 8
|
||||
result_template = result_template:gsub("\ncurrent_offset = current_offset %+ {field_end}", "")
|
||||
result_template = result_template:gsub("local current_offset = {field_end}", "local current_offset = 0")
|
||||
end
|
||||
|
||||
result_template = result_template:gsub("{field_end}", string.match(byte_size, "(%d+)"))
|
||||
@@ -138,11 +150,6 @@ function b2ws_create_dissector_fields_definition_snippet(struct_object, field_ob
|
||||
end
|
||||
end
|
||||
|
||||
if array_number== nil then
|
||||
result_template = result_template:gsub("{to_method}", "le_uint")
|
||||
else
|
||||
result_template = result_template:gsub("{to_method}", "bytes")
|
||||
end
|
||||
|
||||
return result_template
|
||||
end
|
||||
@@ -174,6 +181,12 @@ function b2ws_create_dissector_fields_declaration_snippet(struct_object, field_o
|
||||
return result_template:gsub("{bit_mask}", bit_mask)
|
||||
end
|
||||
|
||||
function get_fields_definition_template(field_object)
|
||||
if field_object.bit_mask ~= nil then
|
||||
return value
|
||||
end
|
||||
end
|
||||
|
||||
function b2ws_create_dissector_fields_snippet(struct_object, template_string)
|
||||
local field_list = struct_object.fields
|
||||
local field_declarations_string = ""
|
||||
@@ -203,7 +216,7 @@ function b2ws_create_dissector_fields_snippet(struct_object, template_string)
|
||||
pre_template = b2ws_create_dissector_next_layer_snippet(field_object, next_proto_template) .. "\n"
|
||||
field_definitions_string = field_definitions_string .. b2ws_create_dissector_call_snippet(struct_object, field_object, next_proto_dissector_call)
|
||||
else
|
||||
field_declarations_string = field_declarations_string .. b2ws_create_dissector_fields_declaration_snippet(struct_object, field_object, field_declaration_template)
|
||||
field_declarations_string = field_declarations_string .. b2ws_create_dissector_fields_declaration_snippet(struct_object, field_object, field_declaration_template).. "\n"
|
||||
field_definitions_string = field_definitions_string .. b2ws_create_dissector_fields_definition_snippet(struct_object, field_object, last_field_definition_template)
|
||||
end
|
||||
|
||||
@@ -214,6 +227,9 @@ end
|
||||
|
||||
function b2ws_create_dissector_layer_snippet(struct_object, template_string)
|
||||
local result_template = template_string:gsub("{struct_name}", struct_object.name)
|
||||
if struct_object.fields[#struct_object.fields].bit_size == 0 then
|
||||
result_template = result_template:gsub("{struct_size}", "buffer:len()")
|
||||
end
|
||||
return result_template:gsub("{struct_size}", struct_object.size)
|
||||
end
|
||||
|
||||
|
||||
22
src/b2ws-plugin/b2ws_snippet_gui.lua
Normal file
22
src/b2ws-plugin/b2ws_snippet_gui.lua
Normal file
@@ -0,0 +1,22 @@
|
||||
if not gui_enabled() then return end
|
||||
|
||||
require "b2ws_const"
|
||||
local loaded_b2ws_snippet = assert(loadfile(b2ws_const.B2WS_PLUGIN_PATH .. b2ws_const.B2WS_CREATE_SNIPPET_FILE))
|
||||
loaded_b2ws_snippet()
|
||||
|
||||
local function b2ws_win_snippet_blob()
|
||||
local win = TextWindow.new(b2ws_const.B2WS_CREATE_SNIPPET_WIN_TITLE)
|
||||
win:set_editable()
|
||||
|
||||
local function b2ws_btn_create_snippet_dissector()
|
||||
local win_text = b2ws_trim(win:get_text())
|
||||
local structObject = b2ws_parse_struct(win_text)
|
||||
local result_template = b2ws_create_dissector_snippet(structObject)
|
||||
local info = TextWindow.new(b2ws_const.B2WS_SHOW_SNIPPET_WIN_TITLE)
|
||||
info:set(result_template)
|
||||
end
|
||||
|
||||
win:add_button(b2ws_const.B2WS_CREATE_DISSECTOR_SNIPPET_BTN_TITLE, b2ws_btn_create_snippet_dissector)
|
||||
end
|
||||
|
||||
register_menu(b2ws_const.B2WS_CREATE_SNIPPET_MENU_TITLE, b2ws_win_snippet_blob, MENU_TOOLS_UNSORTED)
|
||||
@@ -120,35 +120,31 @@ end
|
||||
foo_layer = Proto("foo_layer", "foo layer")
|
||||
|
||||
local foo_layer_fields = foo_layer.fields
|
||||
foo_layer_fields.bla_count = ProtoField.uint8("foo_layer_fields.bla_count", "bla_count", base.HEX, nil--[[valuestring]], nil, bla_count description})
|
||||
foo_layer_fields.bla = ProtoField.bytes("foo_layer_fields.bla", "bla", base.HEX, nil--[[valuestring]], nil, bla description})
|
||||
foo_layer_fields.foo = ProtoField.uint32("foo_layer_fields.foo", "foo", base.HEX, nil--[[valuestring]], 0x0000ffff, foo description})
|
||||
foo_layer_fields.bar = ProtoField.bytes("foo_layer_fields.bar", "bar", base.HEX, nil--[[valuestring]], nil, bar description})
|
||||
foo_layer_fields.bla = ProtoField.bytes("foo_layer_fields.bla", "bla", base.HEX, nil--[[valuestring]], nil, bla description})
|
||||
foo_layer_fields.bla = ProtoField.int16("foo_layer_fields.bla", "bla", base.DEC, nil--[[valuestring]], nil, bla description})
|
||||
foo_layer_fields.bla = ProtoField.int32("foo_layer_fields.bla", "bla", base.DEC, nil--[[valuestring]], nil, bla description})
|
||||
foo_layer_fields.bla_count = ProtoField.uint8("foo_layer_fields.bla_count", "bla_count", base.HEX, nil--[[valuestring]], nil, "bla_count description")
|
||||
foo_layer_fields.bla = ProtoField.bytes("foo_layer_fields.bla", "bla", base.HEX, nil--[[valuestring]], nil, "bla description")
|
||||
foo_layer_fields.foo = ProtoField.uint32("foo_layer_fields.foo", "foo", base.HEX, nil--[[valuestring]], 0x0000ffff, "foo description")
|
||||
foo_layer_fields.bar = ProtoField.bytes("foo_layer_fields.bar", "bar", base.HEX, nil--[[valuestring]], nil, "bar description")
|
||||
foo_layer_fields.bla = ProtoField.bytes("foo_layer_fields.bla", "bla", base.HEX, nil--[[valuestring]], nil, "bla description")
|
||||
foo_layer_fields.bla = ProtoField.int16("foo_layer_fields.bla", "bla", base.DEC, nil--[[valuestring]], nil, "bla description")
|
||||
foo_layer_fields.bla = ProtoField.int32("foo_layer_fields.bla", "bla", base.DEC, nil--[[valuestring]], nil, "bla description")
|
||||
|
||||
function foo_layer.dissector(buffer, packet_info, tree)
|
||||
foo_layer_tree = tree:add(foo_layer, buffer(0, 14.0))
|
||||
foo_layer_tree = tree:add(foo_layer, buffer(0, buffer:len()))
|
||||
|
||||
local bla_count_value = buffer(0, 1):le_uint()
|
||||
foo_layer_tree:add(foo_layer_fields.bla_count, buffer(0, 1), bla_count_value)
|
||||
|
||||
local current_offset = 1
|
||||
local bla_value = buffer(current_offset, 2 * bla_count_value):bytes()
|
||||
foo_layer_tree:add(foo_layer_fields.bla, buffer(current_offset, 2 * bla_count_value), bla_value)
|
||||
foo_layer_tree:add(foo_layer_fields.bla, buffer(current_offset, 2 * bla_count_value))
|
||||
|
||||
current_offset = current_offset + 2 * bla_count_value
|
||||
local foo_value = buffer(current_offset, 4):le_uint()
|
||||
foo_layer_tree:add(foo_layer_fields.foo, buffer(current_offset, 4), foo_value)
|
||||
|
||||
current_offset = current_offset + 4
|
||||
local bar_value = buffer(current_offset, buffer:len() - current_offset):bytes()
|
||||
foo_layer_tree:add(foo_layer_fields.bar, buffer(current_offset, buffer:len() - current_offset), bar_value)
|
||||
foo_layer_tree:add(foo_layer_fields.bar, buffer(current_offset, buffer:len() - current_offset))
|
||||
|
||||
current_offset = current_offset + buffer:len() - current_offset
|
||||
local bla_value = buffer(current_offset, 3):bytes()
|
||||
foo_layer_tree:add(foo_layer_fields.bla, buffer(current_offset, 3), bla_value)
|
||||
foo_layer_tree:add(foo_layer_fields.bla, buffer(current_offset, 3))
|
||||
|
||||
current_offset = current_offset + 3
|
||||
local bla_value = buffer(current_offset, 2):le_uint()
|
||||
@@ -159,11 +155,11 @@ function foo_layer.dissector(buffer, packet_info, tree)
|
||||
foo_layer_tree:add(foo_layer_fields.bla, buffer(current_offset, 4), bla_value)
|
||||
|
||||
current_offset = current_offset + 4
|
||||
Dissector.get("bar_layer"):call(buffer(14.0, buffer:len() - 14.0):tvb(), packet_info, tree)
|
||||
Dissector.get("bar_layer"):call(buffer(14.0, buffer:len() - 14.0):tvb(), packet_info, foo_layer_tree)
|
||||
end
|
||||
]===]
|
||||
lu.assertEquals(result_template:gsub("%s", ""), expected_result:gsub("%s", ""))
|
||||
-- print(result_template)
|
||||
--print(result_template)
|
||||
end
|
||||
|
||||
function TestSnippet:testCreateLayerSnippets()
|
||||
@@ -235,12 +231,12 @@ end
|
||||
fieldObject = b2ws_create_field_object("foo3", "uint16", "[ ]")
|
||||
result_string = b2ws_create_dissector_fields_definition_snippet(structObject, fieldObject, test_field_declaration_template)
|
||||
lu.assertEquals(result_string,
|
||||
"local foo3_value = buffer(0,buffer:len() - current_offset):bytes()\nbla_layer_tree:add(bla_layer_fields.foo3, buffer(0, buffer:len() - current_offset), foo3_value)")
|
||||
"bla_layer_tree:add(bla_layer_fields.foo3, buffer(0, buffer:len() - current_offset))")
|
||||
|
||||
fieldObject = b2ws_create_field_object("foo33", "uint16", "[3]")
|
||||
result_string = b2ws_create_dissector_fields_definition_snippet(structObject, fieldObject, test_field_declaration_template)
|
||||
lu.assertEquals(result_string,
|
||||
"local foo33_value = buffer(0,6):bytes()\nbla_layer_tree:add(bla_layer_fields.foo33, buffer(0, 6), foo33_value)")
|
||||
"bla_layer_tree:add(bla_layer_fields.foo33, buffer(0, 6))")
|
||||
|
||||
fieldObject = b2ws_create_field_object("foo4", "int16", "")
|
||||
local result_string = b2ws_create_dissector_fields_definition_snippet(structObject, fieldObject, test_field_declaration_template)
|
||||
@@ -250,7 +246,7 @@ end
|
||||
fieldObject = b2ws_create_field_object("foo5", "int16", "[foo]")
|
||||
result_string = b2ws_create_dissector_fields_definition_snippet(structObject, fieldObject, test_field_declaration_template)
|
||||
lu.assertEquals(result_string,
|
||||
"local foo5_value = buffer(0,2 * foo_value):bytes()\nbla_layer_tree:add(bla_layer_fields.foo5, buffer(0, 2 * foo_value), foo5_value)")
|
||||
"bla_layer_tree:add(bla_layer_fields.foo5, buffer(0, 2 * foo_value))")
|
||||
|
||||
fieldObject = b2ws_create_field_object("foo6", "uint32", ":0-15")
|
||||
result_string = b2ws_create_dissector_fields_definition_snippet(structObject, fieldObject, test_field_declaration_template)
|
||||
|
||||
Reference in New Issue
Block a user