TremaでTCPフラグを個々に取得する方法
»
Class: Trema::PacketInによると、“(Integer) tcp_flags”というメソッドがありますが、SYNやACKなどのフラグを 個々に取得してくれるのではなく、まとめてIntegerで返してしまいます。
ないよりはあるだけありがたいのですが、できれば「引数にSYNを入れたら、フラグが立っ ていればTrueを返す」といった実用的な方法での実装があるともっといいのではと思っています。
という動機から、ライブラリを作ってみました。Tremaではやりたいことがあっても、 まずは基礎的なライブラリ作りからするので時間がかかります……。orz
- is_tcp_flag?( message, flag ) メソッド: 引数にpacket_inイベントからのmessageと、 チェックしたいフラグの文字列を入れます。'SIN'、'ACK'、'PSH'、'FIN'、'RST'が使えま す。
- list_tcp_flag( message ) メソッド: 引数にpacket_inイベントからのmessageを入れると、 立っているフラグを一覧表示します。
module PacketInfo def is_tcp_flag?( message, flag ) if flag == 'SIN' then flag_digit = 2 elsif flag == 'ACK' then flag_digit = 5 elsif flag == 'FIN' then flag_digit = 1 elsif flag == 'PSH' then flag_digit = 4 elsif flag == 'RST' then flag_digit = 3 else return false endtcp_flags_bin = message.tcp_flags.to_s(2).to_s #info "tcp_flags_bin: " + tcp_flags_bin + ", length: " + tcp_flags_bin.length.to_s if tcp_flags_bin.length >= flag_digit then flag_bin = tcp_flags_bin.slice(tcp_flags_bin.length - flag_digit, 1) #info "flag_bin: " + flag_bin else #info "Length isn't enough" return false end if flag_bin == '1' then return true elsif flag_bin == '0' then return false else info "Error: flag_sin isn't 1 nor 0." endend def list_tcp_flag( message ) if is_tcp_flag? message, 'SIN' then print "SIN " end if is_tcp_flag? message, 'PSH' then print "PSH " end if is_tcp_flag? message, 'FIN' then print "FIN " end if is_tcp_flag? message, 'ACK' then print "ACK " end if is_tcp_flag? message, 'RST' then print "RST " end puts '' endendコメント
コメントを投稿する
SpecialPR