ICMPPacket is used to construct ICMP Packets. They contain an EthHeader, an IPHeader, and a ICMPHeader.
Example
icmp_pkt.new
icmp_pkt.icmp_type = 8
icmp_pkt.icmp_code = 0
icmp_pkt.payload = "ABC, easy as 123. As simple as do-re-mi. ABC, 123, baby, you and me!"
icmp_pkt.ip_saddr="1.2.3.4"
icmp_pkt.ip_daddr="5.6.7.8"
icmp_pkt.recalc
icmp_pkt.to_f('/tmp/icmp.pcap')
Parameters
:eth A pre-generated EthHeader object. :ip A pre-generated IPHeader object. :flavor TODO: Sets the "flavor" of the ICMP packet. Pings, in particular, often betray their true OS. :config A hash of return address details, often the output of Utils.whoami?
Methods
- C
- N
- P
- R
Attributes
| [RW] | eth_header | |
| [RW] | ip_header | |
| [RW] | icmp_header |
Class Public methods
Source: show
# File lib/packetfu/protos/icmp.rb, line 125 def self.can_parse?(str) return false unless str.size >= 54 return false unless EthPacket.can_parse? str return false unless IPPacket.can_parse? str return false unless str[23,1] == "\x01" return true end
Source: show
# File lib/packetfu/protos/icmp.rb, line 144 def initialize(args={}) @eth_header = EthHeader.new(args).read(args[:eth]) @ip_header = IPHeader.new(args).read(args[:ip]) @ip_header.ip_proto = 1 @icmp_header = ICMPHeader.new(args).read(args[:icmp]) @ip_header.body = @icmp_header @eth_header.body = @ip_header @headers = [@eth_header, @ip_header, @icmp_header] super end
Instance Public methods
Peek provides summary data on packet contents.
Source: show
# File lib/packetfu/protos/icmp.rb, line 158 def peek_format peek_data = ["IC "] # I is taken by IP peek_data << "%-5d" % self.to_s.size type = case self.icmp_type.to_i when 8 "ping" when 0 "pong" else "%02x-%02x" % [self.icmp_type, self.icmp_code] end peek_data << "%-21s" % "#{self.ip_saddr}:#{type}" peek_data << "->" peek_data << "%21s" % "#{self.ip_daddr}" peek_data << "%23s" % "I:" peek_data << "%04x" % self.ip_id peek_data.join end
Source: show
# File lib/packetfu/protos/icmp.rb, line 133 def read(str=nil, args={}) raise "Cannot parse `#{str}'" unless self.class.can_parse?(str) @eth_header.read(str) @ip_header.read(str[14,str.size]) @eth_header.body = @ip_header @icmp_header.read(str[14+(@ip_header.ip_hlen),str.size]) @ip_header.body = @icmp_header super(args) self end