Ethereal

Re: [Ethereal-dev] Packet misdetection
Google
 
Web Ethereal.com

Home | Introduction | Documentation | Lists | FAQ | Development | Wiki | Bugs

Ethereal-dev: April 2004


On Wed, Apr 07, 2004 at 08:59:36PM +0200, metatech wrote:
> This is a problem that I have also encountered as well.
> - The WebSphere MQ dissector heuristics should be very reliable, but the 
> likelihood that another protocol uses the port 1414 is very high since 
> usely machines start outgoing TCP connections from port 1025 onwards. But 
> the problem is that the heuristics does not apply to every packet in a 
> conversation, although only one (for instance the first one) is enough to 
> mark it as "MQ" for the rest of the conversation.  So the heuristics cannot 
> be checked easily on every packet.
> Or if there was a "likelihood" value for each protocol, I would register as 
> "lowest possible" so that only the heuristics would call it.  In a general 
> sense I think it would make sense to define a "likelihood" for each 
> protocol so that we could put HTTP, FTP and POP3 on top priorities and 
> mitigate false detections (statistically speaking).

We've discussed the notion of allowing heuristic dissectors to register
as "strong" (i.e., a heuristic unlikely to get false positives) or
"weak" (one more likely to get false positives); a "likelihood" might
also be useful.

> - I tried to remove the registration of the 1414 port, but in that case it 
> is impossible to do a "Decode as..." with MQ... (for instance
> if another dissector stole the packet).  Is there any trick (like creating 
> two protocol handles, one is dummy and the other one is real) ?

There's a "dissector_add_handle()" call, which takes a dissector table
name and a handle; it indicates that there's no port number in that
dissector table to which the protocol in question should be permanently
assigned, but that doing a "Decode as..." on that dissector table should
be allowed.

> - Also I haven't found a way to "NAK" a packet once it is passed to a 
> dissector through a port match, is there a way to pass it to another 
> dissector ? (like the return boolean for the heuristic method).

No, but there is a way to NAK the packet; the API isn't documented as I
haven't yet decided whether it's the right way to handle it.

You can declare a dissector that returns an "int" rather than a "void";
if it returns 0, it means it rejects the packet, otherwise it means that
it accepted the packet *and* dissected the specified number of bytes in
the tvbuff handed to it as being for that protocol (most dissectors
would just return "tvb_length(tvb)").  You create a dissector handle for
that type of dissector with "new_register_dissector()"; you can use
those handles the same way you use handles created with
"register_dissector()".

One problem with the API is that there are, as I remember, some places
(I forget where) where 0 is a legitimate number of bytes for the
dissector to say it's dissected, but that's indistinguishable from
rejecting the packet.

The other possibilities for the API would be:

	1) return a Boolean, but there are some places where we
	   currently use the length information;

	2) have dissector handles include pointers to *two* functions, a
	   "test" function that checks whether the packet is for that
	   protocol or not and returns a Boolean and a "dissect"
	   function that returns "void".  The "test" function pointer
	   could be null, meaning "accept all packets.

	   This might simplify some other things (e.g., dissectors that
	   use "tcp_dissect_pdus()" wouldn't have to worry about testing
	   whether the packet is for them).

Both of those would let heuristic dissectors use the same type of handle
as other dissectors.


Powered by MHonArc 2.6.10