0

我正在为 C 中的 Wireshark 创建一个解析器,用于 UDP 之上的协议。由于我使用的是启发式剖析,但存在与我的相同端口具有标准剖析器的另一种协议,因此我的数据包被剖析为其他协议。为了让我的解析器工作,我需要启用“首先尝试启发式解析器”UDP 首选项,但我希望在注册插件时更改该属性(在代码中),因此用户不需要手动更改它。我注意到在 epan/prefs.h 上,函数prefs_set_pref存在!但是当我在我的插件上使用它时,Wireshark 在启动时崩溃并出现总线错误 10。我想做的事情可能/正确吗?

所以我试过这个:

G_MODULE_EXPORT void plugin_register(void){ prefs_set_pref("udp.try_heuristic_first:true"); // My proto_register goes here }

由于 epan/prefs.h 有:

/*
 * Given a string of the form "<pref name>:<pref value>", as might appear
 * as an argument to a "-o" option, parse it and set the preference in
 * question.  Return an indication of whether it succeeded or failed
 * in some fashion.
 *
 * XXX - should supply, for syntax errors, a detailed explanation of
 * the syntax error.
 */

WS_DLL_PUBLIC prefs_set_pref_e prefs_set_pref(char *prefarg);

谢谢

4

1 回答 1

1

prefs_set_pref("udp.try_heuristic_first:true");在测试 Wireshark 插件中调用对我有用。

好的:假设没有其他问题,我希望问题是prefs_set_pref()修改了传递给它的字符串。

如果传递了字符串文字(的地址),则代码将尝试修改通常不允许的文字。我怀疑这是您的 Bus Error 10 的原因。

(我必须更深入地了解为什么我在 Windows 上的测试确实有效)。

所以:我建议尝试类似:

char foo[] = {"udp.try_heuristic_first:true"};
...
prefs_set_pref(foo);

看看这是否有效;或者:对本地数组执行 strcpy 文字。

===============

(较早的原始评论)

一些意见/问题:

  1. 是怎么回事G_MODULE_EXPORT?现有的 Wireshark 插件解析器都没有使用它。(请参阅plugins解析器 Wireshark 源代码树中的任何解析器)。

    插件注册功能需要命名, 插件解析器的名称proto_register_???在哪里。???

    所以:我不明白整个G_MODULE_EXPORT void plugin_register(void){& 等等

  2. 调用prefs_set_prefs()应该在proto_reg_handoff_???()函数中(而不是在proto_register_???函数中)。

于 2014-06-03T14:17:22.423 回答