ネットワークエンジニアから着物屋さんとして独立しました。ネットショップのIT面を中心にお伝えします

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モジュール全体のソースを取得したい方はこちらからダウンロードできます。
Comment(0)

コメント

コメントを投稿する