From 2b6f8ed69f83c1126ab5cbcb6215573ee48e301d Mon Sep 17 00:00:00 2001 From: stubbfel Date: Thu, 22 Jun 2017 01:43:15 +0200 Subject: [PATCH] add snippet gui and fixes --- src/b2ws-plugin/b2ws_const.lua | 5 ++++ src/b2ws-plugin/b2ws_snippet.lua | 34 +++++++++++++++++++------- src/b2ws-plugin/b2ws_snippet_gui.lua | 22 +++++++++++++++++ tests/src/test_b2ws_snippet.lua | 36 +++++++++++++--------------- 4 files changed, 68 insertions(+), 29 deletions(-) create mode 100644 src/b2ws-plugin/b2ws_snippet_gui.lua diff --git a/src/b2ws-plugin/b2ws_const.lua b/src/b2ws-plugin/b2ws_const.lua index aca8e0c..d664162 100644 --- a/src/b2ws-plugin/b2ws_const.lua +++ b/src/b2ws-plugin/b2ws_const.lua @@ -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" diff --git a/src/b2ws-plugin/b2ws_snippet.lua b/src/b2ws-plugin/b2ws_snippet.lua index e30a91b..b18ec39 100644 --- a/src/b2ws-plugin/b2ws_snippet.lua +++ b/src/b2ws-plugin/b2ws_snippet.lua @@ -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 diff --git a/src/b2ws-plugin/b2ws_snippet_gui.lua b/src/b2ws-plugin/b2ws_snippet_gui.lua new file mode 100644 index 0000000..b678e0c --- /dev/null +++ b/src/b2ws-plugin/b2ws_snippet_gui.lua @@ -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) diff --git a/tests/src/test_b2ws_snippet.lua b/tests/src/test_b2ws_snippet.lua index aa390b1..a46f7c5 100644 --- a/tests/src/test_b2ws_snippet.lua +++ b/tests/src/test_b2ws_snippet.lua @@ -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)