0

UDP 上のプロトコル用に、C で Wireshark のディセクタを作成しています。私はヒューリスティック分析を使用していますが、私のものと同じポートの標準的な分析ツールを備えた別のプロトコルが存在するため、私のパケットはその他のプロトコルとして分析されています。ディセクタを機能させるには、「最初にヒューリスティック ディセクタを試す」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 プラグインでは、通話が機能します。

OK: 他に問題がないと仮定すると、問題はprefs_set_pref()渡された文字列を変更することだと思います。

文字列リテラル (のアドレス) が渡された場合、コードはリテラルを変更しようとしますが、これは一般的に許可されていません。これがバス エラー 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){& etc

  2. への呼び出しは関数prefs_set_prefs()内にある必要がありproto_reg_handoff_???()ます (関数内ではありませんproto_register_???)。

于 2014-06-03T14:17:22.423 に答える