Appearance
Appearance
有关 XML 的说明,请参阅 Wikipedia 的 XML 页面
Wireshark 通常会从多种 MIME 媒体类型中解析 XML 内容。MIME 内容由多种协议提供,包括 HTTP、JXTA、RTSP 和 SIP。你可以通过以下方式为自己的 dissector 添加 MIME 处理支持:
dissector_table_t media_type_dissector_table = find_dissector_table("media_type");gboolean media_type_recognized = dissector_try_string(media_type_dissector_table, mediatype, content_tvb, pinfo, tree);XXX - 在此处添加该协议的示例解码流量(纯文本或 Wireshark 截图)。
XML dissector 功能完整。它能够加载 XML DTD,并使用这些 DTD 来选择解析 XML 时要使用的过滤字段。
⚠️ XML dissector 不是 XML 验证器!它使用 DTD 只是为了能够为过滤引擎提取信息。
Wireshark 数据目录中有一个名为 dtds 的目录,其中包含 DTD(可以查看里面有什么)。所有以 .dtd 结尾的文件都会被处理。
关于 XML DTD 如何编写的说明,可以查看此教程
由于 dissector 只关注名称,几乎任何“看起来像”DTD 的内容都可以,你不需要真正完整的 DTD。
最小文件只包含 <? wireshark:protocol ?>XML 处理指令(XMLPI)。
以下 DTD 标签已(部分)实现,并且必须位于 <?wireshark:protocol?> XMLPI 标签之后
<! ENTITY>
<! DOCTYPE>
<! ELEMENT>
<! ATTLIST>
还有一些更复杂的 DTD 标签允许使用“参数化类型”或“模板”,但这些尚未实现。DTD 解析器目前不支持文件包含,也就是说,你需要“手动”将公共部分复制粘贴到你的 DTD 文件中。
<?wireshark:protocol proto_name="this" media="application/this"hierarchy="yes" ?><!DOCTYPE this [ <!ELEMENT that (other|another|#PCDATA) > <!-- #PCDATA is assumed to be there even it isn't --> <!ATTLIST that one CDATA #REQUIRED two CDATA #IMPLIED > <!-- we don't care of #REQUIRED, #IMPLIED or other #THINGS --> <!ELEMENT other (#PCDATA) > <!ELEMENT another (#PCDATA) >]>这会创建以下过滤字段
thisthis.thatthis.that.onethis.that.twothis.that.otherthis.that.another给定以下 xml:
<this> aaa <that one="bbb"> ccc <other>ddd</other> </that> eee</this>以下所有过滤表达式都会匹配:
this == "aaa"this == "eee"this.that == "ccc"this.that.one == "bbb"this.that.other == "ddd"this.that.other != "<other>ddd</other>"<?wireshark:protocol?> XML 处理指令用于告诉 wireshark 如何解释 DTD 文件的其余部分
该 PI 允许以下属性:
用作命名空间根的名称,即协议名称。它应该存在。
DTD 所描述协议的说明。
与此 DTD 关联的 MIME 媒体类型。具有此类型的 MIME 内容将使用该 DTD 进行解析。
root="that" 的效果是从该处开始的所有字段名都会是 "this.that"
hierarchy="yes|no" 默认为 no
NO: this this.that this.that.one this.other
YES: this this.that this.that.one this.that.other
元素中的递归会在第二次发现相同元素时突然停止,并改为使用一个“根名称”。
<!ELEMENT one (two)><!ELEMENT two (three|four)><!ELEMENT three (one|two)><!ELEMENT four (#PCDATA)>将创建:
oneone.twoone.two.threeone.two.three.oneone.two.three.twoone.two.fourone.three.oneone.three.twoone.four当前 DTD 解析器唯一接受的形式是:
<!DOCTYPE xxx [ ....]>其他形式会导致语法错误。
这些是“替换”文本。
<!ENTITY % aaa bbb CDATA #IMPLIED ccc ID #IMPLIED ><!ATTLIST other %aaa; >等价于:
<!ATTLIST other bbb CDATA #IMPLIED ccc ID #IMPLIED >🌟 注意:两种类型的实体(% 和无 %)都会由 DTD 解析器解析。在解析报文时,没有任何关于实体的信息可用。
元素是 XML 和 HTML 文档的主要构建块。
如果未通过 <?wireshark:protocol?> 给出根,则找到的第一个 ELEMENT 标签将作为默认根。如果它的名称与 proto_name 不同,则根名称将是 protoname.elemname
属性为元素提供额外信息。
ATTLIST 参数会被忽略,我们只关心名称。
XXX - 向 SampleCaptures 页面添加一个简单的示例捕获文件,并从此处链接。
完整的 XML 显示过滤字段列表可在显示过滤器参考中找到
只显示基于 XML 的流量:
xmldtds 目录中存在 DTD 的基于 XML 的协议将改用自己的协议字段。如果使用 xml 进行过滤,你不会得到 RSS(其默认 DTD 已存在),请改用
rss捕获时无法直接过滤 XML 协议。不过,如果你知道所使用的 TCP 端口(见上文),可以按该端口过滤。
只捕获使用 HTTP 默认端口(80)的 HTTP 上的 XML 流量:
tcp port 80我手头没有 RSS 捕获,但“显示过滤器”部分关于存在 DTD 时 xml 不能作为过滤器使用的说法,在我正在使用的协议上似乎并不成立……Martin Mathieson
Imported from https://wiki.wireshark.org/XML on 2020-08-11 23:27:50 UTC