2

Input::add_table 関数を使用して IP とそれに対応するホスト名を検索し、それらを conn_id レコードに挿入する bro スクリプトを作成したので、すべてのログ ファイルに id.source_name と id.destination_name が含まれます。これは、トンネル イベントがある場合を除いて正常に機能し、セグメンテーション エラーでクラッシュします。これはカプセル化IDと関係があると思われますが、よくわかりません。各タイプの Info レコードに src と dest の名前を追加できることはわかっていますが、それはすべてのタイプを変更することを意味します。私がやろうとしていることは根本的に間違っているのでしょうか、それともクラッシュの原因となっているトンネル コードにバグがありますか? または、これを行うより良い方法はありますか

export {
global host_table: table[addr] of Val = table();
}

redef record conn_id += {
    src_name: string &optional &log;
    dest_name: string &optional &log;
};

const host_file = “hosts.txt”

event bro_init() &priority=20
{
    Input::add_table([$source=host_file, $name =“host_stream”, $idx=Idx, $val=Val, $destination=host_table]);
    Input::remove(“host_stream”);
}

event new_connection( c: connection ) {
    if( c$id$orig_h in host_table ) {
        c$id$src_name = host_table[c$id$orig_h]$host;
    }
    if( c$id$resp_h in host_table ) {
        c$id$dest_name = host_table[c$id$resp_h]$host;
    }
}
4

1 に答える 1

3

conn_id残念ながら、レコードを拡張したくありません。これは、この変更が影響を与えるさまざまな方法で内部的に使用されます。レコードを拡張し、Conn::Infoそこにデータを追加します。

あなたのスクリプトにはいくつかの部分が欠けていたので、将来人々にとって答えをより使いやすくしたかったので、欠けている領域を埋めました:

@load base/protocols/conn

module MyHostNames;

export {
    ## File to load hostnames from.
    const host_file = "hosts.txt" &redef;
}

type Idx: record {
    host: addr;
};

type Val: record {
    hostname: string;
};

global host_table: table[addr] of Val = table();

redef record Conn::Info += {
    orig_name: string &optional &log;
    resp_name: string &optional &log;
};

event bro_init() &priority=5
    {
    Input::add_table([$source=host_file,
                      $name="myhostnames_stream",
                      $idx=Idx,
                      $val=Val,
                      $destination=host_table]);
    Input::remove("myhostnames_stream");
    }

event connection_state_remove(c: connection)
    {
    if ( c$id$orig_h in host_table )
        {
        c$conn$orig_name = host_table[c$id$orig_h]$hostname;
        }

    if ( c$id$resp_h in host_table )
        {
        c$conn$resp_name = host_table[c$id$resp_h]$hostname;
        }
    }

次のような入力ファイルを使用しました (このデータの列間のリテラル タブに注意してください!):

#fields host    hostname
#types  addr    string
1.2.3.4 special-host
于 2016-07-06T20:47:55.253 に答える