Appearance
Appearance
sharkd 是一个程序,它通过程序化接口提供 Wireshark 强大的解析和分析能力。程序可以向 sharkd 发送简单的 JSON 格式请求,以加载、分析和操作网络数据包文件。
我们在标准 Wireshark 用户界面中看到的许多功能都可以通过 sharkd 使用,包括数据包协议树、数据包字节和显示过滤器。
简介
安装
运行 sharkd
Classic
Gold
sharkd 请求
请求语法
请求类型
Bug
未加载文件时的异常
反斜杠未转义时的异常
意外结果
研究和调试 sharkd
使用 Putty 测试
简单 Python 代码示例
致谢
wiki 页面 sharkd Request Syntax 提供了请求类型及其参数的完整详细信息。
标准 Wireshark 二进制包(Windows MSI 等)中不包含 sharkd 可执行文件,因此必须从源代码构建。在 Windows 下构建 sharkd 会生成 sharkd.exe 可执行文件。
sharkd 不能只靠 sharkd.exe 文件工作;它使用 Wireshark DLL 和偏好设置文件。因此,我们需要安装 sharkd 构建所产生的一切内容。
我们可以用两种模式运行 sharkd:
多个会话可以连接到以 Daemon Mode 运行的 sharkd。每个连接都会启动一个专用的 sharkd.exe 进程。因此,当没有连接时,有一个 sharkd 进程;当有一个活动会话时,有两个 sharkd 进程;当建立第二个连接时,将有三个 sharkd 进程,依此类推。
有两种命令行选项格式:Classic(原始格式)和 POSIX。POSIX 格式尝试遵循 POSIX 命令行标准,并提供更多选项。我们将 POSIX 扩展范围的选项称为 Gold 选项。
要以 Console Mode 启动 sharkd,请使用命令:
sharkd -注意:默认编译在 Windows 上仅支持 tcp 端口。 请参见 Which package contains sharkd? 和 Add sharkd - daemon variant
Peter Wu | Jan 24, 2017 | Patch Set 8: Code-Review+1Should be a good start. (Disabling the TCP socket also removes my concern about remote attacks.)要以 Daemon Mode 在 TCP 端口上运行 sharkd,请使用命令:
sharkd tcp:127.0.0.1:4446这会使 sharkd 监听到 localhost TCP 端口 4446 的 TCP 连接。必要时可以更改 TCP 端口号。
UNIX sockets 也受支持:
sharkd unix:/tmp/sharkd.sock在这种情况下,sharkd 始终使用 Default profile 中设置的偏好设置。sharkd 也遵守 Default profile 的其他方面,例如 disabled_protos、enabled_protos 等。
Gold (gold_options): -a <socket>, --api <socket> listen on this socket -h, --help show this help information -v, --version show version information -C <config profile>, --config-profile <config profile> start with specified configuration profile Examples: sharkd -C myprofile sharkd -a tcp:127.0.0.1:4446 -C myprofile如果你更改了所选 profile 中的任何偏好设置(通过编辑 preferences 文件或使用 Wireshark Edit -> Preferences),这些更改不会在任何当前 sharkd 会话中生效。你需要启动一个新会话。
sharkd 遵守所选 profile 的其他方面,例如 disabled_protos、enabled_protos 等。
sharkd 服务请求具有以下通用格式:
{"req":"command","_option_":"_value_","_option_":"_value_",...}请求处理器使用一个简单的 gets(...) 函数来读取传入请求。这意味着:
请求只能包含可打印字符
特殊字符必须转义
数值可以加引号,也可以不加引号——通常不加引号,并且响应中的数值不加引号
例如
例如
例如 response -
整个请求必须位于单行
请求必须以换行符结束
命令必须采用如下所示的小写形式。key 和 value 周围的引号必须是双引号——单引号会产生 JSON 错误。另请注意使用的是英国英语拼写 analyse;analyze 不会工作。
如果你在连接上发送无效 JSON,sharkd 会写入 stdout 消息:
invalid JSON -> closing然后 sharkd 会话终止。
请求类型包括:
analyse - 列出数据包文件中发现的协议及其开始和结束时间
例如
bye - 结束一个 startd 会话
例如
check - 用于检查字段或过滤器的有效性
例如
例如
complete - 基于部分或完整引用返回字段或偏好设置的属性
例如
例如
download - 获取已解码对象(导出的对象、SSL secrets 或 rtp data);某些下载的数据经过 base64 编码
例如
参见 tshark --export-objects 和 Wireshark 中的 Export Objects 功能
dumpconf - 列出一个、一些或全部配置参数
例如
follow - 获取特定协议或 stream 的客户端和服务器信息,以及为容纳二进制内容而进行 JSON-Base64 编码的数据 payload。
例如
例如
frame - 获取有关某个 frame 的完整信息,包括协议树
例如
frames - 获取某一范围数据包的 Packet List 信息
例如 {"req":"frames","filter":"frame.number<=20"}
info - 获取 sharkd clients 可用的格式和统计信息类型列表
例如
等同于 tshark -G 选项
intervals - 按请求的时间间隔生成基本捕获统计信息(总帧数和总字节数)(默认按秒)
例如
iograph - 创建用于绘图的按时间排序的值列表;默认逐秒
例如
load - 加载 packet trace 文件以进行分析
例如 {"req":"load","file":"c:\traces\example.pcapng"}
例如
setcomment - 在已加载 trace 中设置某个 frame 的注释——不会保存到 trace 文件
例如
setconf - 设置配置参数
例如
status - 获取已加载文件的基本信息(名称、大小、frame 数量等)
例如
tap - 设置最多 16 个统计 tap 并从中获取统计信息;tap 类型包括 stats、nstat、conv、host、rtp-streams、rtp-analyse、eo、expert、rtd、srt 和 flow
例如
例如
通过 Console Interface 输入 JSON 请求有时会在 JSON 响应之外生成额外的 stdout 消息,例如:
{"req":"load","file":"c:/traces/Contoso_01/web01/web01_00001_20161012151754.pcapng"}load: filename=c:/traces/Contoso_01/web01/web01_00001_20161012151754.pcapng{"err":0}wiki 页面 sharkd Request Syntax 提供了请求类型及其参数的完整详细信息。
在对 sharkd 进行实验期间,发现了一些值得注意的 bug。
在加载任何文件之前发出命令来查询或修改数据包文件,通常会导致程序异常。
Windows 文件路径反斜杠(\)分隔符必须转义,如果没有转义,也会导致程序异常。或者,可以使用正斜杠,如上面的 load 请求示例所示。
sharkd 有时会产生意外结果:
许多人会想使用 Visual Studio 来研究 sharkd 的工作方式或进行调试。请记住,在 Daemon Mode 下运行时,JSON 请求将由专用的 sharkd 进程处理,而不是由你在 Visual Studio 中启动执行的那个进程处理。避免这种情况的最简单方法是在 Console Mode 下运行时进行研究或调试。
当文件加载到 Wireshark 中时,会对 PCAPNG 文件中的每个数据包调用一次协议解析器,然后在显示数据包时至少再调用一次。sharkd 也是如此:
合适的 putty 设置为:
成功连接后,daemon 会写入一条 stdout 消息:
Hello in child.此程序连接到以 Daemon mode 运行的 sharkd,发送两个命令,显示每个命令的响应,然后关闭连接。
importsocketdefget_json_bytes(json_string):returnbytes((json_string+'\n'),'utf-8')defjson_send_recv(s,json)->str:s.sendall(get_json_bytes(json))data=s.recv(1024)returndata[:-4].decode('utf-8')host=socket.gethostbyname('localhost')port=4446# The port used by sharkds=socket.socket(socket.AF_INET,socket.SOCK_STREAM)print('c: Connecting to '+host+':'+str(port))s.connect((host,port))json_string='{"req":"load","file":"c:/traces/Contoso_01/web01/web01_00001_20161012151754.pcapng"}'print('s: '+json_string)recv_json=json_send_recv(s,json_string)print('r: '+recv_json)json_string='{"req":"status"}'print('s: '+json_string)rx_json=json_send_recv(s,json_string)print('r: '+rx_json)print('c: Closing connection to '+host+':'+str(port))s.close()输出如下所示:
c: Connecting to 127.0.0.1:4446s: {"req":"load","file":"c:/traces/Contoso_01/web01/web01_00001_20161012151754.pcapng"}r: {"err":0}s: {"req":"status"}r: {"frames":53882,"duration":1841.532335000,"filename":"web01_00001_20161012151754.pcapng","filesize":36433896}c: Closing connection to 127.0.0.1:4446编写像 sharkd 这样的功能是一项艰巨任务,因此我们必须感谢 Jakub Zawadzki 的工作,他编写了这些代码。