packetfu 1.1.8 → 1.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/README.rdoc +11 -12
  2. data/bench/octets.rb +9 -9
  3. data/examples/100kpackets.rb +13 -12
  4. data/examples/ackscan.rb +17 -16
  5. data/examples/arp.rb +36 -35
  6. data/examples/arphood.rb +37 -36
  7. data/examples/dissect_thinger.rb +7 -6
  8. data/examples/ethernet.rb +1 -0
  9. data/examples/examples.rb +1 -0
  10. data/examples/ifconfig.rb +1 -0
  11. data/examples/new-simple-stats.rb +24 -23
  12. data/examples/packetfu-shell.rb +26 -25
  13. data/examples/simple-sniffer.rb +10 -9
  14. data/examples/simple-stats.rb +24 -23
  15. data/examples/slammer.rb +4 -3
  16. data/lib/packetfu.rb +128 -127
  17. data/lib/packetfu/capture.rb +170 -169
  18. data/lib/packetfu/config.rb +53 -52
  19. data/lib/packetfu/inject.rb +57 -56
  20. data/lib/packetfu/packet.rb +529 -528
  21. data/lib/packetfu/pcap.rb +580 -579
  22. data/lib/packetfu/protos/arp.rb +91 -90
  23. data/lib/packetfu/protos/arp/header.rb +159 -158
  24. data/lib/packetfu/protos/arp/mixin.rb +37 -36
  25. data/lib/packetfu/protos/eth.rb +45 -44
  26. data/lib/packetfu/protos/eth/header.rb +244 -243
  27. data/lib/packetfu/protos/eth/mixin.rb +4 -3
  28. data/lib/packetfu/protos/hsrp.rb +70 -69
  29. data/lib/packetfu/protos/hsrp/header.rb +108 -107
  30. data/lib/packetfu/protos/hsrp/mixin.rb +30 -29
  31. data/lib/packetfu/protos/icmp.rb +72 -71
  32. data/lib/packetfu/protos/icmp/header.rb +83 -82
  33. data/lib/packetfu/protos/icmp/mixin.rb +15 -14
  34. data/lib/packetfu/protos/invalid.rb +50 -49
  35. data/lib/packetfu/protos/ip.rb +70 -69
  36. data/lib/packetfu/protos/ip/header.rb +292 -291
  37. data/lib/packetfu/protos/ip/mixin.rb +41 -40
  38. data/lib/packetfu/protos/ipv6.rb +51 -50
  39. data/lib/packetfu/protos/ipv6/header.rb +189 -188
  40. data/lib/packetfu/protos/ipv6/mixin.rb +30 -29
  41. data/lib/packetfu/protos/lldp.rb +3 -1
  42. data/lib/packetfu/protos/lldp/header.rb +1 -0
  43. data/lib/packetfu/protos/lldp/mixin.rb +1 -0
  44. data/lib/packetfu/protos/tcp.rb +177 -176
  45. data/lib/packetfu/protos/tcp/ecn.rb +36 -35
  46. data/lib/packetfu/protos/tcp/flags.rb +75 -74
  47. data/lib/packetfu/protos/tcp/header.rb +269 -268
  48. data/lib/packetfu/protos/tcp/hlen.rb +33 -32
  49. data/lib/packetfu/protos/tcp/mixin.rb +47 -46
  50. data/lib/packetfu/protos/tcp/option.rb +322 -321
  51. data/lib/packetfu/protos/tcp/options.rb +96 -95
  52. data/lib/packetfu/protos/tcp/reserved.rb +36 -35
  53. data/lib/packetfu/protos/udp.rb +117 -116
  54. data/lib/packetfu/protos/udp/header.rb +92 -91
  55. data/lib/packetfu/protos/udp/mixin.rb +4 -3
  56. data/lib/packetfu/structfu.rb +281 -280
  57. data/lib/packetfu/utils.rb +211 -208
  58. data/lib/packetfu/version.rb +42 -41
  59. data/packetfu.gemspec +1 -1
  60. data/spec/ethpacket_spec.rb +48 -48
  61. data/spec/packet_spec.rb +57 -57
  62. data/spec/packet_subclasses_spec.rb +8 -8
  63. data/spec/packetfu_spec.rb +59 -59
  64. data/spec/structfu_spec.rb +268 -268
  65. data/spec/tcp_spec.rb +75 -75
  66. data/test/all_tests.rb +13 -13
  67. data/test/func_lldp.rb +3 -3
  68. data/test/ptest.rb +2 -2
  69. data/test/test_arp.rb +116 -116
  70. data/test/test_capture.rb +45 -45
  71. data/test/test_eth.rb +68 -68
  72. data/test/test_hsrp.rb +9 -9
  73. data/test/test_icmp.rb +52 -52
  74. data/test/test_inject.rb +18 -18
  75. data/test/test_invalid.rb +16 -16
  76. data/test/test_ip.rb +36 -36
  77. data/test/test_ip6.rb +48 -48
  78. data/test/test_octets.rb +21 -21
  79. data/test/test_packet.rb +154 -154
  80. data/test/test_pcap.rb +170 -170
  81. data/test/test_structfu.rb +97 -97
  82. data/test/test_tcp.rb +320 -320
  83. data/test/test_udp.rb +76 -76
  84. metadata +2 -2
data/README.rdoc CHANGED
@@ -12,13 +12,9 @@ PacketFu is rdoc-compatible, which means it's sdoc compatible. In the same direc
12
12
 
13
13
  PcapRub:
14
14
 
15
- $ svn co http://www.metasploit.com/svn/framework3/trunk/external/pcaprub
16
-
17
- or
18
-
19
15
  $ rvm gem install pcaprub
20
16
 
21
- Marshall Beddoe's PcapRub is required only for packet reading and writing from a network interfaces (which is a pretty big only). PcapRub itself relies on libpcap 0.9.8 or later for packet injection. PcapRub also requires root privilieges to access the interface directly.
17
+ Marshall Beddoe's PcapRub is required only for packet reading and writing from a network interfaces (which is a pretty big only). PcapRub itself relies on libpcap 0.9.8 or later for packet injection. PcapRub also requires root privileges to access the interface directly.
22
18
 
23
19
  === Platforms
24
20
 
@@ -31,6 +27,16 @@ I tend to test with the following (with bash):
31
27
  rvmsudo ./all_tests.rb >> /tmp/tests.txt; rspec . >> /tmp/tests.txt
32
28
  done
33
29
 
30
+ ==== Problem Platforms
31
+
32
+ * 1.8.6-p420 -- Has problems with pcaprub and capture/inject. Technically, these are pcaprub problems and not PacketFu problems, but PacketFu should at least fail better at them.
33
+
34
+ * 1.9.1-p431 -- Has problems with loading gems in general, see http://redmine.ruby-lang.org/issues/2404
35
+
36
+ * 2.0.0-p0 -- Has problems with binary encoding of strings that do not manifest in 1.9.x See https://github.com/todb/packetfu/issues/28
37
+
38
+
39
+
34
40
  ==== Passing Platforms
35
41
 
36
42
  * 1.9.1-p378
@@ -38,14 +44,7 @@ I tend to test with the following (with bash):
38
44
  * 1.9.2-p180 (suggested version)
39
45
  * 1.9.3-head
40
46
 
41
- ==== Problem Platforms
42
-
43
- * 1.8.6-p420 -- Has problems with pcaprub and capture/inject
44
- * 1.9.1-p431 -- Has problems with loading gems in general, see http://redmine.ruby-lang.org/issues/2404
45
-
46
- Technically, these are pcaprub problems and not PacketFu problems, but PacketFu should at least fail better at them.
47
47
 
48
- Incidentally, I suspect these Ruby problems are the crux of the Mac OSX problems that people report. Try a different Ruby build and please let me know what works for you.
49
48
 
50
49
 
51
50
  == Examples
data/bench/octets.rb CHANGED
@@ -8,15 +8,15 @@ IPV4_STR = "1.2.3.4"
8
8
 
9
9
  iters = 50_000
10
10
  Benchmark.bm do |bm|
11
- bm.report("Octets.new.read(...) ") {iters.times {PacketFu::Octets.new.read(IPV4_RAW)}}
12
- bm.report("Octets.new.read_quad(...) ") {iters.times {PacketFu::Octets.new.read_quad(IPV4_STR)}}
11
+ bm.report("Octets.new.read(...) ") {iters.times {PacketFu::Octets.new.read(IPV4_RAW)}}
12
+ bm.report("Octets.new.read_quad(...) ") {iters.times {PacketFu::Octets.new.read_quad(IPV4_STR)}}
13
13
 
14
- octets = PacketFu::Octets.new
15
- bm.report("octets#read(...) ") {iters.times {octets.read(IPV4_RAW)}}
16
- bm.report("octets#read_quad(...) ") {iters.times {octets.read_quad(IPV4_STR)}}
14
+ octets = PacketFu::Octets.new
15
+ bm.report("octets#read(...) ") {iters.times {octets.read(IPV4_RAW)}}
16
+ bm.report("octets#read_quad(...) ") {iters.times {octets.read_quad(IPV4_STR)}}
17
17
 
18
- octets.read(IPV4_RAW)
19
- bm.report("octets#to_x() ") {iters.times {octets.to_x}}
20
- bm.report("octets#to_i() ") {iters.times {octets.to_i}}
21
- bm.report("octets#to_s() ") {iters.times {octets.to_s}}
18
+ octets.read(IPV4_RAW)
19
+ bm.report("octets#to_x() ") {iters.times {octets.to_x}}
20
+ bm.report("octets#to_i() ") {iters.times {octets.to_i}}
21
+ bm.report("octets#to_s() ") {iters.times {octets.to_s}}
22
22
  end
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # -*- coding: binary -*-
2
3
 
3
4
  # Used mainly to test for memory leaks and to demo the preferred ways of
4
5
  # reading and writing packets to and from pcap files.
@@ -13,18 +14,18 @@ start_time = Time.now.utc
13
14
  count = 0
14
15
 
15
16
  100.times do
16
- @pcaps = []
17
- 1000.times do
18
- u = UDPPacket.new
19
- u.ip_src = [rand(2**32-1)].pack("N")
20
- u.ip_dst = [rand(2**32-1)].pack("N")
21
- u.recalc
22
- @pcaps << u
23
- end
24
- pfile = PcapFile.new
25
- res = pfile.array_to_file(:filename => "/tmp/out.pcap", :array => @pcaps, :append => true)
26
- count += res.last
27
- puts "Wrote #{count} packets in #{Time.now.utc - start_time} seconds"
17
+ @pcaps = []
18
+ 1000.times do
19
+ u = UDPPacket.new
20
+ u.ip_src = [rand(2**32-1)].pack("N")
21
+ u.ip_dst = [rand(2**32-1)].pack("N")
22
+ u.recalc
23
+ @pcaps << u
24
+ end
25
+ pfile = PcapFile.new
26
+ res = pfile.array_to_file(:filename => "/tmp/out.pcap", :array => @pcaps, :append => true)
27
+ count += res.last
28
+ puts "Wrote #{count} packets in #{Time.now.utc - start_time} seconds"
28
29
  end
29
30
 
30
31
  read_bytes_start = Time.now.utc
data/examples/ackscan.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # -*- coding: binary -*-
2
3
  require 'packetfu'
3
4
  # Portscanning!
4
5
  # Run this on one machine
@@ -9,25 +10,25 @@ require 'packetfu'
9
10
  #cap = Capture.new(:iface=>'wlan0') # or whatever your interface is
10
11
  # Run this on the third
11
12
  def do_scan
12
- puts "Generating packets..."
13
- pkt_array = gen_packets.sort_by {rand}
14
- puts "Dumping them on the wire..."
15
- inj = PacketFu::Inject.new(:iface => ARGV[0])
16
- inj.array_to_wire(:array=>pkt_array)
17
- puts "Done!"
13
+ puts "Generating packets..."
14
+ pkt_array = gen_packets.sort_by {rand}
15
+ puts "Dumping them on the wire..."
16
+ inj = PacketFu::Inject.new(:iface => ARGV[0])
17
+ inj.array_to_wire(:array=>pkt_array)
18
+ puts "Done!"
18
19
  end
19
20
 
20
21
  def gen_packets
21
- config = PacketFu::Utils.whoami?(:iface=>ARGV[0])
22
- pkt = PacketFu::TCPPacket.new(:config=>config, :flavor=>"Windows")
23
- pkt.payload ="all I wanna do is ACK ACK ACK and a RST and take your money"
24
- pkt.ip_daddr="209.85.165.0" # One of Google's networks
25
- pkt.tcp_flags.ack=1
26
- pkt.tcp_dst=81
27
- pkt_array = []
28
- 256.times do |i|
29
- pkt.ip_dst.o4=i
30
- pkt.tcp_src = rand(5000 - 1025) + 1025
22
+ config = PacketFu::Utils.whoami?(:iface=>ARGV[0])
23
+ pkt = PacketFu::TCPPacket.new(:config=>config, :flavor=>"Windows")
24
+ pkt.payload ="all I wanna do is ACK ACK ACK and a RST and take your money"
25
+ pkt.ip_daddr="209.85.165.0" # One of Google's networks
26
+ pkt.tcp_flags.ack=1
27
+ pkt.tcp_dst=81
28
+ pkt_array = []
29
+ 256.times do |i|
30
+ pkt.ip_dst.o4=i
31
+ pkt.tcp_src = rand(5000 - 1025) + 1025
31
32
  pkt.recalc
32
33
  pkt_array << pkt.to_s
33
34
  end
data/examples/arp.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- coding: binary -*-
1
2
  # This is a somewhat contrived and verbose demonstration of how to implement ARP manually.
2
3
  #
3
4
  # It's contrived because this is really how PacketFu::Utils got born; something similiar
@@ -8,11 +9,11 @@ require './examples' # For path setting slight-of-hand
8
9
  require 'packetfu'
9
10
 
10
11
  def usage
11
- if ARGV[0].nil?
12
- raise ArgumentError, "You need an IP address to start with."
13
- elsif !Process.euid.zero?
14
- raise SecurityError, "You need to be root to run this."
15
- end
12
+ if ARGV[0].nil?
13
+ raise ArgumentError, "You need an IP address to start with."
14
+ elsif !Process.euid.zero?
15
+ raise SecurityError, "You need to be root to run this."
16
+ end
16
17
  end
17
18
 
18
19
  usage unless target_ip = ARGV[0] # Need a target IP.
@@ -23,36 +24,36 @@ $packetfu_default = PacketFu::Config.new(PacketFu::Utils.whoami?).config
23
24
 
24
25
  def arp(target_ip)
25
26
 
26
- arp_pkt = PacketFu::ARPPacket.new(:flavor => "Windows")
27
- arp_pkt.eth_saddr = arp_pkt.arp_saddr_mac = $packetfu_default[:eth_saddr]
28
- arp_pkt.eth_daddr = "ff:ff:ff:ff:ff:ff"
29
- arp_pkt.arp_daddr_mac = "00:00:00:00:00:00"
30
-
31
- arp_pkt.arp_saddr_ip = $packetfu_default[:ip_saddr]
32
- arp_pkt.arp_daddr_ip = target_ip
33
-
34
- # Stick the Capture object in its own thread.
35
-
36
- cap_thread = Thread.new do
37
- cap = PacketFu::Capture.new(:start => true,
38
- :filter => "arp src #{target_ip} and ether dst #{arp_pkt.eth_saddr}")
39
- arp_pkt.to_w # Shorthand for sending single packets to the default interface.
40
- target_mac = nil
41
- while target_mac.nil?
42
- if cap.save > 0
43
- arp_response = PacketFu::Packet.parse(cap.array[0])
44
- target_mac = arp_response.arp_saddr_mac if arp_response.arp_saddr_ip = target_ip
45
- end
46
- sleep 0.1 # Check for a response ten times per second.
47
- end
48
- puts "#{target_ip} is-at #{target_mac}"
49
- # That's all we need.
50
- exit 0
51
- end
52
-
53
- # Timeout for cap_thread
54
- sleep 3; puts "Oh noes! Couldn't get an arp out of #{target_ip}. Maybe it's not here."
55
- exit 1
27
+ arp_pkt = PacketFu::ARPPacket.new(:flavor => "Windows")
28
+ arp_pkt.eth_saddr = arp_pkt.arp_saddr_mac = $packetfu_default[:eth_saddr]
29
+ arp_pkt.eth_daddr = "ff:ff:ff:ff:ff:ff"
30
+ arp_pkt.arp_daddr_mac = "00:00:00:00:00:00"
31
+
32
+ arp_pkt.arp_saddr_ip = $packetfu_default[:ip_saddr]
33
+ arp_pkt.arp_daddr_ip = target_ip
34
+
35
+ # Stick the Capture object in its own thread.
36
+
37
+ cap_thread = Thread.new do
38
+ cap = PacketFu::Capture.new(:start => true,
39
+ :filter => "arp src #{target_ip} and ether dst #{arp_pkt.eth_saddr}")
40
+ arp_pkt.to_w # Shorthand for sending single packets to the default interface.
41
+ target_mac = nil
42
+ while target_mac.nil?
43
+ if cap.save > 0
44
+ arp_response = PacketFu::Packet.parse(cap.array[0])
45
+ target_mac = arp_response.arp_saddr_mac if arp_response.arp_saddr_ip = target_ip
46
+ end
47
+ sleep 0.1 # Check for a response ten times per second.
48
+ end
49
+ puts "#{target_ip} is-at #{target_mac}"
50
+ # That's all we need.
51
+ exit 0
52
+ end
53
+
54
+ # Timeout for cap_thread
55
+ sleep 3; puts "Oh noes! Couldn't get an arp out of #{target_ip}. Maybe it's not here."
56
+ exit 1
56
57
  end
57
58
 
58
59
  arp(target_ip)
data/examples/arphood.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # -*- coding: binary -*-
2
3
 
3
4
  # A simple local network fingerprinter. Uses the OUI list.
4
5
  # Usage: rvmsudo ./arphood.rb [iface] [network] <oui.txt>
@@ -10,20 +11,20 @@ require 'open-uri'
10
11
  $oui_prefixes = {}
11
12
  $arp_results = []
12
13
  def build_oui_list
13
- if ARGV[2].nil?
14
- puts "Fetching the oui.txt from IEEE, it'll be a second. Avoid this with #{$0} [iface] [network] <filename>."
15
- oui_file = open("http://standards.ieee.org/regauth/oui/oui.txt")
16
- else
17
- oui_file = File.open(ARGV[2], "rb")
18
- end
19
- oui_file.each do |oui_line|
20
- maybe_oui = oui_line.scan(/^[0-9a-f]{2}\-[0-9a-f]{2}\-[0-9a-f]{2}/i)[0]
21
- unless maybe_oui.nil?
22
- oui_value = maybe_oui
23
- oui_vendor = oui_line.split(/\(hex\)\s*/n)[1] || "PRIVATE"
24
- $oui_prefixes[oui_value] = oui_vendor.chomp
25
- end
26
- end
14
+ if ARGV[2].nil?
15
+ puts "Fetching the oui.txt from IEEE, it'll be a second. Avoid this with #{$0} [iface] [network] <filename>."
16
+ oui_file = open("http://standards.ieee.org/regauth/oui/oui.txt")
17
+ else
18
+ oui_file = File.open(ARGV[2], "rb")
19
+ end
20
+ oui_file.each do |oui_line|
21
+ maybe_oui = oui_line.scan(/^[0-9a-f]{2}\-[0-9a-f]{2}\-[0-9a-f]{2}/i)[0]
22
+ unless maybe_oui.nil?
23
+ oui_value = maybe_oui
24
+ oui_vendor = oui_line.split(/\(hex\)\s*/n)[1] || "PRIVATE"
25
+ $oui_prefixes[oui_value] = oui_vendor.chomp
26
+ end
27
+ end
27
28
  end
28
29
 
29
30
  build_oui_list
@@ -31,30 +32,30 @@ build_oui_list
31
32
  $root_ok = true if Process.euid.zero?
32
33
 
33
34
  def arp_everyone
34
- my_net = PacketFu::Config.new(PacketFu::Utils.whoami?(:iface =>(ARGV[0] || 'wlan0')))
35
- threads = []
36
- network = ARGV[1] || "192.168.2"
37
- print "Arping around..."
38
- 253.times do |i|
39
- threads[i] = Thread.new do
40
- this_host = network + ".#{i+1}"
41
- print "."
42
- colon_mac = PacketFu::Utils.arp(this_host,my_net.config)
43
- unless colon_mac.nil?
44
- hyphen_mac = colon_mac.tr(':','-').upcase[0,8]
45
- else
46
- hyphen_mac = colon_mac = "NOTHERE"
47
- end
48
- $arp_results << "%s : %s / %s" % [this_host,colon_mac,$oui_prefixes[hyphen_mac]]
49
- end
50
- end
51
- threads.each {|thr| thr.join}
35
+ my_net = PacketFu::Config.new(PacketFu::Utils.whoami?(:iface =>(ARGV[0] || 'wlan0')))
36
+ threads = []
37
+ network = ARGV[1] || "192.168.2"
38
+ print "Arping around..."
39
+ 253.times do |i|
40
+ threads[i] = Thread.new do
41
+ this_host = network + ".#{i+1}"
42
+ print "."
43
+ colon_mac = PacketFu::Utils.arp(this_host,my_net.config)
44
+ unless colon_mac.nil?
45
+ hyphen_mac = colon_mac.tr(':','-').upcase[0,8]
46
+ else
47
+ hyphen_mac = colon_mac = "NOTHERE"
48
+ end
49
+ $arp_results << "%s : %s / %s" % [this_host,colon_mac,$oui_prefixes[hyphen_mac]]
50
+ end
51
+ end
52
+ threads.each {|thr| thr.join}
52
53
  end
53
54
 
54
55
  if $root_ok
55
- arp_everyone
56
- puts "\n"
57
- sleep 3
58
- $arp_results.sort.each {|a| puts a unless a =~ /NOTHERE/}
56
+ arp_everyone
57
+ puts "\n"
58
+ sleep 3
59
+ $arp_results.sort.each {|a| puts a unless a =~ /NOTHERE/}
59
60
  end
60
61
 
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # -*- coding: binary -*-
2
3
  # This just allows you to eyeball the dissection stuff to make sure it's all right.
3
4
  # Some day, there will be a proper test for it.
4
5
 
@@ -13,10 +14,10 @@ include PacketFu
13
14
 
14
15
  packets = PcapFile.file_to_array fname
15
16
  packets.each do |packet|
16
- puts "_" * 75
17
- puts packet.inspect
18
- puts "_" * 75
19
- pkt = Packet.parse(packet)
20
- puts pkt.dissect
21
- sleep sleep_interval
17
+ puts "_" * 75
18
+ puts packet.inspect
19
+ puts "_" * 75
20
+ pkt = Packet.parse(packet)
21
+ puts pkt.dissect
22
+ sleep sleep_interval
22
23
  end
data/examples/ethernet.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- coding: binary -*-
1
2
 
2
3
  require './examples' # For path setting slight-of-hand
3
4
  require 'packetfu'
data/examples/examples.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- coding: binary -*-
1
2
  # Sets the path appropriately when examples is adjacent to the real lib.
2
3
 
3
4
  $:.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib/"))
data/examples/ifconfig.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- coding: binary -*-
1
2
  $:.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib/"))
2
3
  require 'packetfu'
3
4
 
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # -*- coding: binary -*-
2
3
 
3
4
  # new-simple-stats.rb demonstrates the performance difference
4
5
  # between the old and busted way to parse pcap files and the
@@ -12,38 +13,38 @@ require './examples' # For path setting slight-of-hand
12
13
  require 'packetfu'
13
14
 
14
15
  def print_results(stats)
15
- stats.each_pair { |k,v| puts "%-12s: %10d" % [k,v] }
16
+ stats.each_pair { |k,v| puts "%-12s: %10d" % [k,v] }
16
17
  end
17
18
 
18
19
  # Takes a file name, parses the packets, and records the packet
19
20
  # type based on its PacketFu class.
20
21
  def count_packet_types(file)
21
- stats = {}
22
- count = 0
23
- elapsed = 0
24
- start_time = Time.now
25
- PacketFu::PcapFile.read_packets(file) do |pkt|
26
- kind = pkt.proto.last.to_sym
27
- stats[kind] ? stats[kind] += 1 : stats[kind] = 1
28
- count += 1
29
- elapsed = (Time.now - start_time).to_i
30
- if count % 5_000 == 0
31
- puts "After #{count} packets (#{elapsed} seconds elapsed):"
32
- print_results(stats)
33
- end
34
- end
35
- puts "Final results for #{count} packets (#{elapsed} seconds elapsed):"
36
- print_results(stats)
22
+ stats = {}
23
+ count = 0
24
+ elapsed = 0
25
+ start_time = Time.now
26
+ PacketFu::PcapFile.read_packets(file) do |pkt|
27
+ kind = pkt.proto.last.to_sym
28
+ stats[kind] ? stats[kind] += 1 : stats[kind] = 1
29
+ count += 1
30
+ elapsed = (Time.now - start_time).to_i
31
+ if count % 5_000 == 0
32
+ puts "After #{count} packets (#{elapsed} seconds elapsed):"
33
+ print_results(stats)
34
+ end
35
+ end
36
+ puts "Final results for #{count} packets (#{elapsed} seconds elapsed):"
37
+ print_results(stats)
37
38
  end
38
39
 
39
40
  if File.readable?(infile = (ARGV[0] || 'in.pcap'))
40
- title = "Packets by packet type in '#{infile}'"
41
- puts "-" * title.size
42
- puts title
43
- puts "-" * title.size
44
- count_packet_types(infile)
41
+ title = "Packets by packet type in '#{infile}'"
42
+ puts "-" * title.size
43
+ puts title
44
+ puts "-" * title.size
45
+ count_packet_types(infile)
45
46
  else
46
- raise RuntimeError, "Need an infile, like so: #{$0} in.pcap"
47
+ raise RuntimeError, "Need an infile, like so: #{$0} in.pcap"
47
48
  end
48
49
 
49
50