Wireshark-dev: [Wireshark-dev] A Wireshark dissector generator for both C and Lua
From: Richard Sharpe <realrichardsharpe@xxxxxxxxx>
Date: Sat, 27 Oct 2018 20:36:13 -0700
Hi folks,
I have updated my dissector generator and it can now generate
dissectors in C and Lua.
I also now include a jar file of all the class files so you do not
have to build the dissector generator, you can simply type:
java -jar WiresharkGenerator.jar -l some-proto-file
and it will spit out a Lua dissector for your protocol.
You do need to install the Antlr4 runtime, however.
You can find it at: https://gitlab.com/realrichardsharpe/wireshark-generator.git
This is example protocol file was developed for Graham Bloice's little
protocol (but uses Ethernet frames not TCP/IP):
-----------grahams.proto-----------------------
endian = big; # Default
enum funcs_enum:uint8 {
20 = CONNECT: "connect",
21 = CONNECT_ACK: "connect_ack",
40 = REQUEST_DATA: "request_data",
41 = REQUEST_REPLY: "request_reply",
60 = DISCONNECT: "disconnect",
61 = DISCONNECT_ACK: "disconnect_ack",
default = "Reserved"
};
enum data_enum:uint8 {
0 = READ_SHORT: "read short",
1 = READ_LONG: "read long",
2 = READ_STRING: "read string",
default = "Reserved"
};
struct request_reply_data {
data_enum "Data id";
switch ("Data id") {
case READ_SHORT:
uint16_le "Data Short"; # Handles le and be entries explicitly
case READ_LONG:
uint32_le "Data Long";
case READ_STRING:
string "Data String"[15];
default:
# REMAINING is a special variable meaning the rest of the tvb
byte "Unknown request data"[REMAINING];
};
};
struct header {
funcs_enum Function;
uint16 Length;
};
struct grahams_proto_pdu {
header Header;
switch (Header/Function) { # Reach into the struct for this
case CONNECT:
uint32 id;
case CONNECT_ACK:
uint32 id;
case DISCONNECT:
uint32 id;
case DISCONNECT_ACK:
uint32 id;
case REQUEST_DATA:
data_enum "Data id";
case REQUEST_REPLY:
request_reply_data Data;
default:
byte "Unknown function data"[REMAINING];
};
# If there is any rubbish at the end, insert an unknown data entry
switch (REMAINING) {
case 0:
void;
default:
byte "Unknown data at end"[REMAINING];
};
};
protoDetails = { "Graham's Protocol", "grahams_proto", "grahamp" };
dissectorEntry grahams_proto = grahams_proto_pdu;
dissectorTable["ethertype", "0x893C"] = grahams_proto;
---------------------------------------------------
Things I would like to improve:
1. I need to add a way for users to insert things into the Info field.
2. I want to allow switch statements to contain switch statements.
3. I want to also generate code to generate packets conforming to the spec.
The reason for item 2 is that users could then specify things like:
switch (Header/Function) {
case CONNECT:
switch (Header/Length) {
case 7:
void;
default:
exception("error", "A CONNECT request length must be 7");
};
};
And this would allow the user to easily insert protocol verification code.
I will be giving a presentation about this at SharkFest Europe.
--
Regards,
Richard Sharpe
(何以解憂?唯有杜康。--曹操)(传说杜康是酒的发明者)
- Prev by Date: [Wireshark-dev] Decrypt encrypted eapol key data (in 802.11 4-way handshake)
- Next by Date: [Wireshark-dev] Anyone at the Hotel?
- Previous by thread: [Wireshark-dev] Decrypt encrypted eapol key data (in 802.11 4-way handshake)
- Next by thread: [Wireshark-dev] Anyone at the Hotel?
- Index(es):