packetgen 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/packetgen/deprecation.rb +7 -1
  4. data/lib/packetgen/header/arp.rb +6 -7
  5. data/lib/packetgen/header/asn1_base.rb +2 -1
  6. data/lib/packetgen/header/base.rb +27 -24
  7. data/lib/packetgen/header/bootp.rb +14 -14
  8. data/lib/packetgen/header/dhcp/option.rb +8 -8
  9. data/lib/packetgen/header/dhcp/options.rb +2 -2
  10. data/lib/packetgen/header/dhcp.rb +6 -7
  11. data/lib/packetgen/header/dhcpv6/duid.rb +1 -1
  12. data/lib/packetgen/header/dhcpv6/option.rb +37 -15
  13. data/lib/packetgen/header/dhcpv6/options.rb +3 -3
  14. data/lib/packetgen/header/dhcpv6/relay.rb +1 -0
  15. data/lib/packetgen/header/dhcpv6.rb +13 -14
  16. data/lib/packetgen/header/dns/name.rb +9 -8
  17. data/lib/packetgen/header/dns/opt.rb +3 -0
  18. data/lib/packetgen/header/dns/option.rb +7 -7
  19. data/lib/packetgen/header/dns/qdsection.rb +2 -2
  20. data/lib/packetgen/header/dns/question.rb +1 -0
  21. data/lib/packetgen/header/dns/rrsection.rb +2 -2
  22. data/lib/packetgen/header/dns.rb +76 -60
  23. data/lib/packetgen/header/dot11/control.rb +5 -5
  24. data/lib/packetgen/header/dot11/data.rb +11 -10
  25. data/lib/packetgen/header/dot11/element.rb +1 -1
  26. data/lib/packetgen/header/dot11/management.rb +18 -15
  27. data/lib/packetgen/header/dot11/sub_mngt.rb +22 -21
  28. data/lib/packetgen/header/dot11.rb +38 -38
  29. data/lib/packetgen/header/dot1q.rb +5 -4
  30. data/lib/packetgen/header/dot1x.rb +8 -8
  31. data/lib/packetgen/header/eap/fast.rb +3 -3
  32. data/lib/packetgen/header/eap/md5.rb +11 -3
  33. data/lib/packetgen/header/eap/tls.rb +9 -8
  34. data/lib/packetgen/header/eap/ttls.rb +13 -10
  35. data/lib/packetgen/header/eap.rb +58 -33
  36. data/lib/packetgen/header/eth.rb +26 -12
  37. data/lib/packetgen/header/gre.rb +26 -2
  38. data/lib/packetgen/header/http/headers.rb +6 -5
  39. data/lib/packetgen/header/http/request.rb +24 -16
  40. data/lib/packetgen/header/http/response.rb +22 -15
  41. data/lib/packetgen/header/icmp.rb +10 -10
  42. data/lib/packetgen/header/icmpv6.rb +10 -9
  43. data/lib/packetgen/header/igmp.rb +21 -10
  44. data/lib/packetgen/header/igmpv3/group_record.rb +7 -2
  45. data/lib/packetgen/header/igmpv3/mq.rb +1 -1
  46. data/lib/packetgen/header/igmpv3/mr.rb +1 -1
  47. data/lib/packetgen/header/igmpv3.rb +11 -10
  48. data/lib/packetgen/header/ip/addr.rb +6 -2
  49. data/lib/packetgen/header/ip/option.rb +18 -5
  50. data/lib/packetgen/header/ip.rb +52 -35
  51. data/lib/packetgen/header/ipv6/addr.rb +14 -13
  52. data/lib/packetgen/header/ipv6/extension.rb +9 -7
  53. data/lib/packetgen/header/ipv6/hop_by_hop.rb +26 -7
  54. data/lib/packetgen/header/ipv6.rb +31 -22
  55. data/lib/packetgen/header/llc.rb +20 -13
  56. data/lib/packetgen/header/mdns.rb +9 -2
  57. data/lib/packetgen/header/mld.rb +11 -9
  58. data/lib/packetgen/header/mldv2/mcast_address_record.rb +6 -1
  59. data/lib/packetgen/header/mldv2/mlq.rb +8 -8
  60. data/lib/packetgen/header/mldv2/mlr.rb +4 -4
  61. data/lib/packetgen/header/mldv2.rb +1 -1
  62. data/lib/packetgen/header/ospfv2/db_description.rb +10 -10
  63. data/lib/packetgen/header/ospfv2/hello.rb +11 -10
  64. data/lib/packetgen/header/ospfv2/ls_ack.rb +5 -6
  65. data/lib/packetgen/header/ospfv2/ls_request.rb +7 -6
  66. data/lib/packetgen/header/ospfv2/ls_update.rb +7 -7
  67. data/lib/packetgen/header/ospfv2/lsa.rb +33 -10
  68. data/lib/packetgen/header/ospfv2/lsa_header.rb +3 -2
  69. data/lib/packetgen/header/ospfv2.rb +31 -26
  70. data/lib/packetgen/header/ospfv3/db_description.rb +12 -13
  71. data/lib/packetgen/header/ospfv3/hello.rb +10 -9
  72. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +6 -2
  73. data/lib/packetgen/header/ospfv3/ls_ack.rb +5 -6
  74. data/lib/packetgen/header/ospfv3/ls_request.rb +10 -10
  75. data/lib/packetgen/header/ospfv3/ls_update.rb +7 -7
  76. data/lib/packetgen/header/ospfv3/lsa.rb +23 -9
  77. data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -2
  78. data/lib/packetgen/header/ospfv3.rb +38 -34
  79. data/lib/packetgen/header/sctp/chunk.rb +38 -17
  80. data/lib/packetgen/header/sctp/error.rb +169 -197
  81. data/lib/packetgen/header/sctp/padded32.rb +3 -3
  82. data/lib/packetgen/header/sctp/parameter.rb +85 -132
  83. data/lib/packetgen/header/sctp.rb +14 -3
  84. data/lib/packetgen/header/snmp.rb +108 -7
  85. data/lib/packetgen/header/tcp/option.rb +7 -0
  86. data/lib/packetgen/header/tcp/options.rb +11 -3
  87. data/lib/packetgen/header/tcp.rb +33 -26
  88. data/lib/packetgen/header/tftp.rb +16 -10
  89. data/lib/packetgen/header/udp.rb +15 -13
  90. data/lib/packetgen/header.rb +19 -13
  91. data/lib/packetgen/headerable.rb +9 -3
  92. data/lib/packetgen/inspect.rb +2 -7
  93. data/lib/packetgen/packet.rb +94 -36
  94. data/lib/packetgen/pcapng/block.rb +2 -1
  95. data/lib/packetgen/pcapng/file.rb +41 -14
  96. data/lib/packetgen/pcapng/idb.rb +2 -1
  97. data/lib/packetgen/pcapng/shb.rb +2 -1
  98. data/lib/packetgen/pcapng/spb.rb +1 -1
  99. data/lib/packetgen/pcapng.rb +2 -0
  100. data/lib/packetgen/proto.rb +4 -0
  101. data/lib/packetgen/unknown_packet.rb +3 -3
  102. data/lib/packetgen/utils.rb +2 -1
  103. data/lib/packetgen/version.rb +1 -1
  104. data/lib/packetgen.rb +8 -2
  105. metadata +4 -4
@@ -8,9 +8,24 @@
8
8
 
9
9
  module PacketGen
10
10
  module PcapNG
11
- # PcapNG::File is a complete Pcap-NG file handler.
11
+ # PcapNG::File is a complete Pcap-NG file handler. It provides methods to:
12
+ # * read and write PcapNG files,
13
+ # * process packets from such files.
14
+ #
15
+ # @example Writing a file
16
+ # pkt1 = PacketGen.gen('IP', id: 1).add('TCP')
17
+ # pkt2 = PacketGen.gen('IP', id: 2).add('UDP')
18
+ # file = PacketGen::PcapNG::File.new
19
+ # file.read_array([pkt1, pkt2])
20
+ # file.write('/tmp/file.pcapng')
21
+ #
22
+ # @example Reading a file
23
+ # file = PacketGen::PcapNG::File.new
24
+ # pkts = file.read_packets('/tmp/file.pcapng')
25
+ #
12
26
  # @author Sylvain Daubert
13
- class File # rubocop:disable Metrics/ClassLength
27
+ # @author LemonTree55
28
+ class File
14
29
  # Known link types
15
30
  KNOWN_LINK_TYPES = {
16
31
  LINKTYPE_ETHERNET => 'Eth',
@@ -29,19 +44,19 @@ module PacketGen
29
44
  end.freeze
30
45
 
31
46
  # Get file sections
32
- # @return [Array]
47
+ # @return [Array<SHB>]
33
48
  attr_accessor :sections
34
49
 
35
50
  def initialize
36
51
  @sections = []
37
52
  end
38
53
 
39
- # Read a string to populate the object. Note that this appends new blocks to
54
+ # Read a binary string to populate the object. Note that this appends new blocks to
40
55
  # the Pcapng::File object.
41
56
  # @param [String] str
42
57
  # @return [self]
43
58
  def read(str)
44
- PacketGen.force_binary(str)
59
+ str = str.b unless str.encoding == Encoding::BINARY
45
60
  io = StringIO.new(str)
46
61
  parse_section(io)
47
62
  self
@@ -59,11 +74,19 @@ module PacketGen
59
74
 
60
75
  # Read a given file and analyze it.
61
76
  # If given a block, it will yield PcapNG::EPB or PcapNG::SPB objects.
62
- # This is the only way to get packet timestamps.
77
+ # This is the only way to get packet timestamps (via {EPB#timestamp}).
63
78
  # @param [String] fname pcapng file name
64
79
  # @yieldparam [EPB,SPB] block
65
80
  # @return [Integer] return number of yielded blocks (only if a block is given)
66
81
  # @raise [ArgumentError] cannot read +fname+
82
+ # @example Parse packets and get their timestamp
83
+ # hsh = {}
84
+ # file = PacketGen::PcapNG::File.new
85
+ # file.readfile('/tmp/file.pcapng') do |xpb|
86
+ # ts = xpb.is_a?(PacketGen::PcapNG::EPB) ? xpb.timestamp : nil
87
+ # pkt = PacketGen.parse(xpb.data)
88
+ # hsh[pkt] = ts
89
+ # end
67
90
  def readfile(fname, &blk)
68
91
  raise ArgumentError, "cannot read file #{fname}" unless ::File.readable?(fname)
69
92
 
@@ -168,13 +191,15 @@ module PacketGen
168
191
  end
169
192
 
170
193
  # Writes the {File} to a file.
171
- # @param [Hash] options
172
- # @option options [Boolean] :append (default: +false+) if set to +true+,
194
+ # @param [String] filename file name to write
195
+ # @param [Boolean] append if set to +true+,
173
196
  # the packets are appended to the file, rather than overwriting it
174
- # @return [Array] array of 2 elements: filename and size written
175
- # @todo for 4.0, replace +options+ by +append+ kwarg
176
- def to_file(filename, options={})
177
- mode = options[:append] && ::File.exist?(filename) ? 'ab' : 'wb'
197
+ # @return [Array(String, Integer)] array of 2 elements: filename and size written
198
+ # @since 4.1.0 Options hash with single +:append+ option is replaced by +append+ keyword argument.
199
+ # @see #append
200
+ # @see #write
201
+ def to_file(filename, append: false)
202
+ mode = append && ::File.exist?(filename) ? 'ab' : 'wb'
178
203
  ::File.open(filename, mode) { |f| f.write(self.to_s) }
179
204
  [filename, self.to_s.size]
180
205
  end
@@ -182,14 +207,16 @@ module PacketGen
182
207
 
183
208
  # Shorthand method for writing to a file.
184
209
  # @param [#to_s] filename
185
- # @return [Array] see return value from {#to_file}
210
+ # @return [Array(String, Integer)]
211
+ # @see #to_file
186
212
  def write(filename='out.pcapng')
187
213
  self.to_file(filename.to_s, append: false)
188
214
  end
189
215
 
190
216
  # Shorthand method for appending to a file.
191
217
  # @param [#to_s] filename
192
- # @return [Array] see return value from {#to_file}
218
+ # @return [Array(String, Integer)]
219
+ # @see #to_file
193
220
  def append(filename='out.pcapng')
194
221
  self.to_file(filename.to_s, append: true)
195
222
  end
@@ -8,7 +8,8 @@
8
8
 
9
9
  module PacketGen
10
10
  module PcapNG
11
- # {IDB} represents a Interface Description Block (IDB) of a pcapng file.
11
+ # {IDB} represents an Interface Description Block (IDB) of a pcapng file. It is associated to a network interfaces.
12
+ # It contains packet data as {EPB} and/or {SPB}.
12
13
  #
13
14
  # == IDB Definition
14
15
  # Int32 :type Default: 0x00000001
@@ -8,7 +8,8 @@
8
8
 
9
9
  module PacketGen
10
10
  module PcapNG
11
- # {SHB} represents a Section Header Block (SHB) of a pcapng file.
11
+ # {SHB} represents a Section Header Block (SHB) of a pcapng file. A SHB contains {IDB}, which contain
12
+ # {EPB} and/or {SPB}.
12
13
  #
13
14
  # == SHB Definition
14
15
  # Int32 :type Default: 0x0A0D0D0A
@@ -8,7 +8,7 @@
8
8
 
9
9
  module PacketGen
10
10
  module PcapNG
11
- # {SPB} represents a Section Simple Packet Block (SPB) of a pcapng file.
11
+ # {SPB} represents a Simple Packet Block (SPB) of a pcapng file.
12
12
  #
13
13
  # == Pcapng::SPB Definition
14
14
  # Int32 :type Default: 0x00000003
@@ -11,6 +11,8 @@ require 'stringio'
11
11
  module PacketGen
12
12
  # Module to handle PCAP-NG file format.
13
13
  # See http://xml2rfc.tools.ietf.org/cgi-bin/xml2rfc.cgi?url=https://raw.githubusercontent.com/pcapng/pcapng/master/draft-tuexen-opsawg-pcapng.xml&modeAsFormat=html/ascii&type=ascii
14
+ #
15
+ # See {PcapNG::File} to handle Pcap-NG files.
14
16
  # @author Sylvain Daubert
15
17
  module PcapNG
16
18
  # Section Header Block type number
@@ -30,6 +30,8 @@ module PacketGen
30
30
  # Get protocol number from its name
31
31
  # @param [String] name
32
32
  # @return [Integer,nil] return nil for unknown protocol names
33
+ # @example
34
+ # PacketGen::Proto.getprotobyname('tcp') #=> 6
33
35
  def self.getprotobyname(name)
34
36
  @cache[name]
35
37
  end
@@ -37,6 +39,8 @@ module PacketGen
37
39
  # Get protocol name from its number
38
40
  # @param [Integer] num
39
41
  # @return [String,nil] return nil for unknown protocol numbers
42
+ # @example
43
+ # PacketGen::Proto.getprotobynumber(6) #=> 'tcp'
40
44
  def self.getprotobynumber(num)
41
45
  @cache.key(num)
42
46
  end
@@ -20,7 +20,7 @@ module PacketGen
20
20
 
21
21
  def initialize
22
22
  @headers = [].freeze
23
- @binary_str = PacketGen.force_binary('')
23
+ @binary_str = ::String.new # Return empty string with encoding ASCII-8BIT, so BINARY
24
24
  end
25
25
 
26
26
  # Unknown packet, so unknown protocol.
@@ -40,7 +40,7 @@ module PacketGen
40
40
  # @param [String] str
41
41
  # @return [void]
42
42
  def body=(str)
43
- @binary_str = PacketGen.force_binary(str)
43
+ @binary_str = str.b
44
44
  end
45
45
 
46
46
  # Write packet to a PCapNG file on disk.
@@ -56,7 +56,7 @@ module PacketGen
56
56
  # @param [String] binary_str
57
57
  # @return [self]
58
58
  def parse(binary_str, _first_header: nil)
59
- @binary_str = PacketGen.force_binary(binary_str)
59
+ @binary_str = binary_str.b
60
60
  self
61
61
  end
62
62
 
@@ -168,7 +168,8 @@ module PacketGen
168
168
  def self.mitm(target1, target2, options={}, &block)
169
169
  options = { iface: PacketGen.default_iface }.merge(options)
170
170
 
171
- spoofer = Utils::ARPSpoofer.new(options)
171
+ spoofer_options = options.slice(:timeout, :interval, :iface)
172
+ spoofer = Utils::ARPSpoofer.new(**spoofer_options.compact)
172
173
  spoofer.add target1, target2, options
173
174
  spoofer.add target2, target1, options
174
175
 
@@ -11,5 +11,5 @@
11
11
  # @author Sylvain Daubert
12
12
  module PacketGen
13
13
  # PacketGen version
14
- VERSION = '4.0.0'
14
+ VERSION = '4.1.0'
15
15
  end
data/lib/packetgen.rb CHANGED
@@ -13,6 +13,7 @@ require 'interfacez'
13
13
 
14
14
  # PacketGen is a network packet generator and analyzor.
15
15
  # @author Sylvain Daubert
16
+ # @author LemonTree
16
17
  module PacketGen
17
18
  # Base exception class for PacketGen exceptions
18
19
  class Error < StandardError; end
@@ -33,12 +34,15 @@ module PacketGen
33
34
  # @return [Headerable]
34
35
  attr_reader :hdr
35
36
 
37
+ # @param [Headerable] prev_hdr
38
+ # @param [Headerable] hdr
36
39
  def initialize(prev_hdr, hdr)
37
40
  super()
38
41
  @prev_hdr = prev_hdr
39
42
  @hdr = hdr
40
43
  end
41
44
 
45
+ # @return [String]
42
46
  def message
43
47
  "#{prev_hdr.class} knowns no layer association with #{hdr.protocol_name}. " \
44
48
  "Try #{prev_hdr.class}.bind_layer(#{hdr.class}, " \
@@ -92,8 +96,10 @@ module PacketGen
92
96
  # Force binary encoding for +str+
93
97
  # @param [String] str
94
98
  # @return [String] binary encoded string
99
+ # @deprecated Use +String#b+ instead.
95
100
  def self.force_binary(str)
96
- str.dup.force_encoding(Encoding::BINARY)
101
+ Deprecation.deprecated(self, :force_binary, 'String#b')
102
+ str.b
97
103
  end
98
104
 
99
105
  # Get default network interface (ie. first non-loopback declared interface)
@@ -120,7 +126,7 @@ module PacketGen
120
126
  # Shortcut to get a header class
121
127
  # @example builtin class
122
128
  # # same as PacketGen::Header::Dot11:Data.new(id: 0xfedc)
123
- # dot11 = PacketGen.header('Dot11::Data', id: 0xfedc) #=> PacketGen::Header::Dot11:Data
129
+ # dot11 = PacketGen.header('Dot11::Data', id: 0xfedc)
124
130
  # @example plugin class
125
131
  # require 'packet-plugin-smb'
126
132
  # # same as PacketGen::Plugin::SMB::CloseRequest.new(fid: 0x1234)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packetgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - LemonTree55
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2024-12-28 00:00:00.000000000 Z
10
+ date: 2025-03-08 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: bin_struct
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.3.0
18
+ version: 0.5.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 0.3.0
25
+ version: 0.5.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: digest-crc
28
28
  requirement: !ruby/object:Gem::Requirement