Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

可扩展标记语言(XML)

有关 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 截图)。

Wireshark

XML dissector 功能完整。它能够加载 XML DTD,并使用这些 DTD 来选择解析 XML 时要使用的过滤字段。

⚠️ XML dissector 不是 XML 验证器!它使用 DTD 只是为了能够为过滤引擎提取信息。

首选项设置

  • Use Heuristics。尝试识别未知的 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 文件中。

示例 DTD

&lt;?wireshark:protocol proto_name="this" media="application/this"hierarchy="yes" ?&gt;&lt;!DOCTYPE this [ &lt;!ELEMENT that (other|another|#PCDATA) &gt; &lt;!-- #PCDATA is assumed to be there even it isn't --&gt; &lt;!ATTLIST that  one CDATA #REQUIRED two CDATA #IMPLIED &gt; &lt;!-- we don't care of #REQUIRED, #IMPLIED or other #THINGS --&gt; &lt;!ELEMENT other (#PCDATA) &gt; &lt;!ELEMENT another (#PCDATA) &gt;]&gt;

这会创建以下过滤字段

thisthis.thatthis.that.onethis.that.twothis.that.otherthis.that.another

给定以下 xml:

&lt;this&gt; aaa &lt;that one="bbb"&gt; ccc &lt;other&gt;ddd&lt;/other&gt; &lt;/that&gt; eee&lt;/this&gt;

以下所有过滤表达式都会匹配:

this == "aaa"this == "eee"this.that == "ccc"this.that.one == "bbb"this.that.other == "ddd"this.that.other != "&lt;other&gt;ddd&lt;/other&gt;"

<? wireshark:protocol ?>

<?wireshark:protocol?> XML 处理指令用于告诉 wireshark 如何解释 DTD 文件的其余部分

该 PI 允许以下属性:

proto_name

用作命名空间根的名称,即协议名称。它应该存在。

description

DTD 所描述协议的说明。

media

与此 DTD 关联的 MIME 媒体类型。具有此类型的 MIME 内容将使用该 DTD 进行解析。

root

root="that" 的效果是从该处开始的所有字段名都会是 "this.that"

hierarchy

  • hierarchy="yes|no" 默认为 no

  • NO: this this.that this.that.one this.other

  • YES: this this.that this.that.one this.that.other

元素中的递归会在第二次发现相同元素时突然停止,并改为使用一个“根名称”。

&lt;!ELEMENT one (two)&gt;&lt;!ELEMENT two (three|four)&gt;&lt;!ELEMENT three (one|two)&gt;&lt;!ELEMENT four (#PCDATA)&gt;

将创建:

oneone.twoone.two.threeone.two.three.oneone.two.three.twoone.two.fourone.three.oneone.three.twoone.four

<! DOCTYPE >

当前 DTD 解析器唯一接受的形式是:

&lt;!DOCTYPE xxx [ ....]&gt;

其他形式会导致语法错误。

<! ENTITY >

这些是“替换”文本。

&lt;!ENTITY % aaa bbb CDATA #IMPLIED ccc ID #IMPLIED &gt;&lt;!ATTLIST other %aaa; &gt;

等价于:

&lt;!ATTLIST other  bbb CDATA #IMPLIED ccc ID #IMPLIED &gt;

🌟 注意:两种类型的实体(% 和无 %)都会由 DTD 解析器解析。在解析报文时,没有任何关于实体的信息可用。

<! ELEMENT >

元素是 XML 和 HTML 文档的主要构建块。

如果未通过 <?wireshark:protocol?> 给出根,则找到的第一个 ELEMENT 标签将作为默认根。如果它的名称与 proto_name 不同,则根名称将是 protoname.elemname

<! ATTLIST >

属性为元素提供额外信息。

ATTLIST 参数会被忽略,我们只关心名称。

示例捕获文件

XXX - 向 SampleCaptures 页面添加一个简单的示例捕获文件,并从此处链接。

显示过滤器

完整的 XML 显示过滤字段列表可在显示过滤器参考中找到

只显示基于 XML 的流量:

 xml

dtds 目录中存在 DTD 的基于 XML 的协议将改用自己的协议字段。如果使用 xml 进行过滤,你不会得到 RSS(其默认 DTD 已存在),请改用

 rss

捕获过滤器

捕获时无法直接过滤 XML 协议。不过,如果你知道所使用的 TCP 端口(见上文),可以按该端口过滤。

只捕获使用 HTTP 默认端口(80)的 HTTP 上的 XML 流量:

 tcp port 80

外部链接

  • W3C 的 XML 页面 World-Wide-Web Consortium 的 XML 页面。

讨论

我手头没有 RSS 捕获,但“显示过滤器”部分关于存在 DTD 时 xml 不能作为过滤器使用的说法,在我正在使用的协议上似乎并不成立……Martin Mathieson

Imported from https://wiki.wireshark.org/XML on 2020-08-11 23:27:50 UTC

相关 Wireshark Wiki 页面

网络分析技术档案