Trema:messageのデータをアスキーで見る方法
»
PacketInクラスの「(String) data」メソッドは、パケット全体をバイナリで返します。そのため「packet_in(datapath_id, message)」イベントハンドラで取得したmessageオブジェクトから。
puts message.data
して中身を見ようとすると端末が文字化けしますw。16進数表示なら文字化けしないので、
puts message.data.unpack("H*").to_s
すると、↓のように一応文字化けせずに見られます。
005056a07e0a0000000000000800460000240000000001023ad30a000000e0000001940400001101ebfe000000000300000000000000000000000000
それでもまだ意味は不明だったりします。特にHTTPやSMTPなど、L7のアスキーなコンテンツを見たい時にこれでは困ります。そんなときのためのライブラリを作りました。
(String) data_hex_to_l7_ascii(message, data_hex):messageオブジェクトとmessage.dataを16進法にした文字列を引数に取ります。この中のL7データだけ抽出してアスキーにして返します。例えば、
data_hex = message.data.unpack("H*").to_s
put data_hex_to_l7_ascii( message, data_hex )
のようにして呼び出します。
data_hex_to_l7_asciiメソッドがconvert_hex_ascii_strメソッドを呼び出しているので、使う際には両方を同じモジュールに書いておく必要があります。ソースは下記のとおりです。
module PacketInfo def convert_hex_ascii_str( str_hex ) str_ascii = "" l7_two_char = str_hex.unpack("a2"*(str_hex.length/2)) #/ l7_two_char.each do | each |
str_ascii << sprintf("%c", each.hex) end return str_ascii end
def data_hex_to_l7_ascii message, data_hex l4_tot_len = get_l24_len message sgmt_data = data_hex.slice(l4_tot_len*2..-1) return convert_hex_ascii_str sgmt_data end
def set_ip_tot_len( message, data_hex ) l3_data_hex = data_hex.slice(((get_l2_hdr_len message)*2)..-1) new_ip_tot_len = ("%x" % (l3_data_hex.length/2)).to_s.rjust(4, '0') #/ l3_data_hex[4, 4] = new_ip_tot_len l3_data_hex[0, 0] = data_hex.slice(0, (get_l2_hdr_len message)*2) return l3_data_hex end end今までの記事でのPacketInfoモジュール全体のソースを取得したい方はこちらからダウンロードできます。
コメント
コメントを投稿する
SpecialPR