packetgen 3.3.3 → 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.
- checksums.yaml +4 -4
- data/README.md +38 -22
- data/lib/packetgen/capture.rb +2 -2
- data/lib/packetgen/config.rb +0 -1
- data/lib/packetgen/deprecation.rb +14 -8
- data/lib/packetgen/header/arp.rb +17 -18
- data/lib/packetgen/header/asn1_base.rb +2 -1
- data/lib/packetgen/header/base.rb +42 -40
- data/lib/packetgen/header/bootp.rb +35 -37
- data/lib/packetgen/header/dhcp/option.rb +21 -21
- data/lib/packetgen/header/dhcp/options.rb +3 -3
- data/lib/packetgen/header/dhcp.rb +8 -9
- data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
- data/lib/packetgen/header/dhcpv6/option.rb +83 -61
- data/lib/packetgen/header/dhcpv6/options.rb +4 -4
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -5
- data/lib/packetgen/header/dhcpv6.rb +17 -18
- data/lib/packetgen/header/dns/name.rb +21 -16
- data/lib/packetgen/header/dns/opt.rb +5 -2
- data/lib/packetgen/header/dns/option.rb +14 -14
- data/lib/packetgen/header/dns/qdsection.rb +3 -3
- data/lib/packetgen/header/dns/question.rb +7 -8
- data/lib/packetgen/header/dns/rr.rb +56 -43
- data/lib/packetgen/header/dns/rrsection.rb +6 -6
- data/lib/packetgen/header/dns.rb +103 -90
- data/lib/packetgen/header/dot11/control.rb +12 -12
- data/lib/packetgen/header/dot11/data.rb +25 -24
- data/lib/packetgen/header/dot11/element.rb +4 -4
- data/lib/packetgen/header/dot11/management.rb +21 -18
- data/lib/packetgen/header/dot11/sub_mngt.rb +40 -53
- data/lib/packetgen/header/dot11.rb +117 -122
- data/lib/packetgen/header/dot1q.rb +12 -13
- data/lib/packetgen/header/dot1x.rb +13 -13
- data/lib/packetgen/header/eap/fast.rb +4 -4
- data/lib/packetgen/header/eap/md5.rb +16 -8
- data/lib/packetgen/header/eap/tls.rb +18 -19
- data/lib/packetgen/header/eap/ttls.rb +22 -21
- data/lib/packetgen/header/eap.rb +73 -48
- data/lib/packetgen/header/eth.rb +41 -27
- data/lib/packetgen/header/gre.rb +33 -11
- data/lib/packetgen/header/http/headers.rb +7 -6
- data/lib/packetgen/header/http/request.rb +38 -29
- data/lib/packetgen/header/http/response.rb +35 -27
- data/lib/packetgen/header/http/verbs.rb +1 -3
- data/lib/packetgen/header/icmp.rb +14 -14
- data/lib/packetgen/header/icmpv6.rb +10 -9
- data/lib/packetgen/header/igmp.rb +26 -15
- data/lib/packetgen/header/igmpv3/group_record.rb +18 -13
- data/lib/packetgen/header/igmpv3/mq.rb +16 -18
- data/lib/packetgen/header/igmpv3/mr.rb +5 -5
- data/lib/packetgen/header/igmpv3.rb +12 -11
- data/lib/packetgen/header/ip/addr.rb +19 -15
- data/lib/packetgen/header/ip/option.rb +47 -36
- data/lib/packetgen/header/ip/options.rb +1 -1
- data/lib/packetgen/header/ip.rb +77 -95
- data/lib/packetgen/header/ipv6/addr.rb +28 -27
- data/lib/packetgen/header/ipv6/extension.rb +13 -11
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +32 -13
- data/lib/packetgen/header/ipv6.rb +42 -35
- data/lib/packetgen/header/llc.rb +28 -21
- data/lib/packetgen/header/mdns.rb +10 -3
- data/lib/packetgen/header/mld.rb +15 -13
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +17 -12
- data/lib/packetgen/header/mldv2/mlq.rb +22 -24
- data/lib/packetgen/header/mldv2/mlr.rb +8 -8
- data/lib/packetgen/header/mldv2.rb +1 -1
- data/lib/packetgen/header/ospfv2/db_description.rb +17 -18
- data/lib/packetgen/header/ospfv2/hello.rb +18 -17
- data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
- data/lib/packetgen/header/ospfv2/ls_request.rb +14 -13
- data/lib/packetgen/header/ospfv2/ls_update.rb +9 -9
- data/lib/packetgen/header/ospfv2/lsa.rb +79 -60
- data/lib/packetgen/header/ospfv2/lsa_header.rb +12 -11
- data/lib/packetgen/header/ospfv2.rb +49 -46
- data/lib/packetgen/header/ospfv3/db_description.rb +20 -22
- data/lib/packetgen/header/ospfv3/hello.rb +17 -16
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +22 -20
- data/lib/packetgen/header/ospfv3/ls_ack.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_request.rb +18 -18
- data/lib/packetgen/header/ospfv3/ls_update.rb +10 -10
- data/lib/packetgen/header/ospfv3/lsa.rb +62 -51
- data/lib/packetgen/header/ospfv3/lsa_header.rb +12 -11
- data/lib/packetgen/header/ospfv3.rb +54 -52
- data/lib/packetgen/header/sctp/chunk.rb +80 -56
- data/lib/packetgen/header/sctp/error.rb +174 -202
- data/lib/packetgen/header/sctp/padded32.rb +3 -3
- data/lib/packetgen/header/sctp/parameter.rb +89 -136
- data/lib/packetgen/header/sctp.rb +19 -8
- data/lib/packetgen/header/snmp.rb +108 -7
- data/lib/packetgen/header/tcp/option.rb +52 -39
- data/lib/packetgen/header/tcp/options.rb +13 -5
- data/lib/packetgen/header/tcp.rb +83 -65
- data/lib/packetgen/header/tftp.rb +31 -25
- data/lib/packetgen/header/udp.rb +21 -19
- data/lib/packetgen/header.rb +23 -18
- data/lib/packetgen/headerable.rb +21 -5
- data/lib/packetgen/inspect.rb +3 -8
- data/lib/packetgen/packet.rb +146 -71
- data/lib/packetgen/pcap.rb +15 -4
- data/lib/packetgen/pcapng/block.rb +20 -18
- data/lib/packetgen/pcapng/epb.rb +13 -15
- data/lib/packetgen/pcapng/file.rb +44 -111
- data/lib/packetgen/pcapng/idb.rb +11 -12
- data/lib/packetgen/pcapng/shb.rb +15 -16
- data/lib/packetgen/pcapng/spb.rb +9 -11
- data/lib/packetgen/pcapng/unknown_block.rb +6 -17
- data/lib/packetgen/pcapng.rb +6 -4
- data/lib/packetgen/pcaprub_wrapper.rb +17 -1
- data/lib/packetgen/proto.rb +5 -1
- data/lib/packetgen/unknown_packet.rb +5 -5
- data/lib/packetgen/utils/arp_spoofer.rb +18 -19
- data/lib/packetgen/utils.rb +4 -3
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +12 -5
- metadata +29 -38
- data/lib/packetgen/types/abstract_tlv.rb +0 -278
- data/lib/packetgen/types/array.rb +0 -287
- data/lib/packetgen/types/cstring.rb +0 -109
- data/lib/packetgen/types/enum.rb +0 -171
- data/lib/packetgen/types/fieldable.rb +0 -66
- data/lib/packetgen/types/fields.rb +0 -622
- data/lib/packetgen/types/int.rb +0 -473
- data/lib/packetgen/types/int_string.rb +0 -102
- data/lib/packetgen/types/length_from.rb +0 -54
- data/lib/packetgen/types/oui.rb +0 -52
- data/lib/packetgen/types/string.rb +0 -97
- data/lib/packetgen/types/tlv.rb +0 -161
- data/lib/packetgen/types.rb +0 -26
data/lib/packetgen/header/udp.rb
CHANGED
@@ -17,28 +17,30 @@ module PacketGen
|
|
17
17
|
# | Length | Checksum |
|
18
18
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
19
19
|
# A UDP header consists of:
|
20
|
-
# * a source port field ({#sport},
|
21
|
-
# * a destination port field ({#dport}, +Int16+ type),
|
22
|
-
# * a UDP length field ({#length}, +Int16+ type),
|
23
|
-
# * a {#checksum} field (+Int16+ type),
|
20
|
+
# * a source port field ({#sport}, +BinStruct::Int16+ type),
|
21
|
+
# * a destination port field ({#dport}, +BinStruct:Int16+ type),
|
22
|
+
# * a UDP length field ({#length}, +BinStruct:Int16+ type),
|
23
|
+
# * a {#checksum} field (+BinStruct:Int16+ type),
|
24
24
|
# * and a {#body}.
|
25
25
|
#
|
26
|
-
#
|
26
|
+
# @example Create a UDP header
|
27
27
|
# # standalone
|
28
28
|
# udp = PacketGen::Header::UDP.new
|
29
29
|
# # in a packet
|
30
|
-
# pkt =
|
30
|
+
# pkt = PacketGen.gen('IP').add('UDP')
|
31
31
|
# # access to IP header
|
32
|
-
# pkt.udp # => PacketGen::Header::UDP
|
32
|
+
# pkt.udp.class # => PacketGen::Header::UDP
|
33
33
|
#
|
34
|
-
#
|
34
|
+
# @example UDP attributes
|
35
|
+
# udp = PacketGen::Header::UDP.new
|
35
36
|
# udp.sport = 65432
|
36
37
|
# udp.dport = 53
|
37
38
|
# udp.length = 43
|
38
39
|
# udp.checksum = 0xffff
|
39
|
-
# udp.body
|
40
|
+
# udp.body = 'this is a UDP body'
|
40
41
|
#
|
41
42
|
# @author Sylvain Daubert
|
43
|
+
# @author LemonTree55
|
42
44
|
class UDP < Base
|
43
45
|
# IP protocol number for UDP
|
44
46
|
IP_PROTOCOL = 17
|
@@ -46,22 +48,23 @@ module PacketGen
|
|
46
48
|
# @!attribute sport
|
47
49
|
# 16-bit UDP source port
|
48
50
|
# @return [Integer]
|
49
|
-
|
51
|
+
define_attr :sport, BinStruct::Int16
|
50
52
|
# @!attribute dport
|
51
53
|
# 16-bit UDP destination port
|
52
54
|
# @return [Integer]
|
53
|
-
|
55
|
+
define_attr :dport, BinStruct::Int16
|
54
56
|
# @!attribute length
|
55
57
|
# 16-bit UDP length
|
56
58
|
# @return [Integer]
|
57
|
-
|
59
|
+
define_attr :length, BinStruct::Int16, default: 8
|
58
60
|
# @!attribute checksum
|
59
61
|
# 16-bit UDP checksum
|
60
62
|
# @return [Integer]
|
61
|
-
|
63
|
+
define_attr :checksum, BinStruct::Int16
|
62
64
|
# @!attribute body
|
63
|
-
#
|
64
|
-
|
65
|
+
# UDP body
|
66
|
+
# @return [BinStruct::String,Headerable]
|
67
|
+
define_attr :body, BinStruct::String
|
65
68
|
|
66
69
|
alias source_port sport
|
67
70
|
alias source_port= sport=
|
@@ -75,7 +78,7 @@ module PacketGen
|
|
75
78
|
self.length += self[:body].sz if self[:body].sz.positive?
|
76
79
|
end
|
77
80
|
|
78
|
-
# Compute checksum and set
|
81
|
+
# Compute checksum and set {#checksum} field
|
79
82
|
# @return [Integer]
|
80
83
|
def calc_checksum
|
81
84
|
ip = ip_header(self)
|
@@ -86,10 +89,10 @@ module PacketGen
|
|
86
89
|
self.checksum = IP.reduce_checksum(sum)
|
87
90
|
end
|
88
91
|
|
89
|
-
# Compute length and set
|
92
|
+
# Compute length and set {#length} field
|
90
93
|
# @return [Integer]
|
91
94
|
def calc_length
|
92
|
-
Base.calculate_and_set_length
|
95
|
+
Base.calculate_and_set_length(self)
|
93
96
|
end
|
94
97
|
|
95
98
|
# Invert source and destination port numbers
|
@@ -100,7 +103,6 @@ module PacketGen
|
|
100
103
|
self
|
101
104
|
end
|
102
105
|
end
|
103
|
-
|
104
106
|
self.add_class UDP
|
105
107
|
|
106
108
|
IP.bind UDP, protocol: UDP::IP_PROTOCOL
|
data/lib/packetgen/header.rb
CHANGED
@@ -13,23 +13,28 @@ module PacketGen
|
|
13
13
|
# This namespace handles all buitlin headers, such as {IP} or {TCP}.
|
14
14
|
#
|
15
15
|
# == Add a foreign header class
|
16
|
-
# PacketGen permits adding
|
17
|
-
# First, define the new header class.
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
16
|
+
# PacketGen permits adding your own header classes.
|
17
|
+
# First, define the new header class. Then, this class must be declared to PacketGen using {Header.add_class}.
|
18
|
+
# Finally, bindings must be declared.
|
19
|
+
#
|
20
|
+
# @example Foreign header class
|
21
|
+
# # Define a new header
|
22
|
+
# module MyModule
|
23
|
+
# class MyHeader < PacketGen::Header::Base
|
24
|
+
# define_attr :field1, BinStruct::Int32
|
25
|
+
# define_attr :field2, BinStruct::Int32
|
26
|
+
# end
|
23
27
|
# end
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
28
|
+
#
|
29
|
+
# # Declare the new header to PacketGen
|
30
|
+
# PacketGen::Header.add_class(MyModule::MyHeader)
|
31
|
+
# # bind it as IP protocol number 254 (needed by Packet#parse and Packet#add)
|
32
|
+
# PacketGen::Header::IP.bind(MyModule::MyHeader, protocol: 254)
|
33
|
+
#
|
34
|
+
# # Use it
|
35
|
+
# pkt = PacketGen.gen('IP').add('MyModule::MyHeader', field1: 0x12345678, field3: 0x87654321)
|
32
36
|
# @author Sylvain Daubert
|
37
|
+
# @author LemonTree55
|
33
38
|
module Header
|
34
39
|
@added_header_classes = {}
|
35
40
|
|
@@ -54,7 +59,7 @@ module PacketGen
|
|
54
59
|
@header_classes = nil
|
55
60
|
end
|
56
61
|
|
57
|
-
# Remove a foreign header
|
62
|
+
# Remove a foreign header previously added by {.add_class}
|
58
63
|
# from known header classes.
|
59
64
|
# @param [Class] klass
|
60
65
|
# @return [void]
|
@@ -70,8 +75,8 @@ module PacketGen
|
|
70
75
|
# @return [Class,nil]
|
71
76
|
# @since 1.1.0
|
72
77
|
def get_header_class_by_name(name)
|
73
|
-
if Header.const_defined?
|
74
|
-
Header.const_get
|
78
|
+
if Header.const_defined?(name)
|
79
|
+
Header.const_get(name)
|
75
80
|
else
|
76
81
|
@added_header_classes[name]
|
77
82
|
end
|
data/lib/packetgen/headerable.rb
CHANGED
@@ -9,7 +9,13 @@
|
|
9
9
|
module PacketGen
|
10
10
|
# This mixin module defines minimal API for a class to act as a header
|
11
11
|
# in {Packet}.
|
12
|
+
#
|
13
|
+
# Some others methods may optionally be defined by a {Headerable} object:
|
14
|
+
# * +#calc_length+ to calculate length from content. It should be defined if header as a length attribute.
|
15
|
+
# * +#calc_checksum+ to calculate checksum. It should be defined if header as a checksum attriibute.
|
16
|
+
# * +#reply+ to invert fields in header for a reply.
|
12
17
|
# @author Sylvain Daubert
|
18
|
+
# @author LemonTree55
|
13
19
|
# @since 3.0.2
|
14
20
|
module Headerable
|
15
21
|
# This modules handles class methods for {Headerable headerable classes}.
|
@@ -33,7 +39,7 @@ module PacketGen
|
|
33
39
|
# @param [Class] klass
|
34
40
|
# @return [void]
|
35
41
|
def self.included(klass)
|
36
|
-
klass.extend
|
42
|
+
klass.extend(ClassMethods)
|
37
43
|
end
|
38
44
|
|
39
45
|
# Return header protocol name
|
@@ -51,7 +57,7 @@ module PacketGen
|
|
51
57
|
end
|
52
58
|
|
53
59
|
# @abstract Should be redefined by subclasses. This method should check invariant
|
54
|
-
#
|
60
|
+
# attributes from header.
|
55
61
|
# Called by {Packet#parse} when guessing first header to check if header is correct
|
56
62
|
# @return [Boolean]
|
57
63
|
def parse?
|
@@ -65,7 +71,7 @@ module PacketGen
|
|
65
71
|
end
|
66
72
|
|
67
73
|
# @api private
|
68
|
-
# Set packet to which this header belongs
|
74
|
+
# Set packet to which this header belongs to
|
69
75
|
# @param [Packet] packet
|
70
76
|
# @return [Packet] packet
|
71
77
|
def packet=(packet)
|
@@ -74,8 +80,8 @@ module PacketGen
|
|
74
80
|
@packet
|
75
81
|
end
|
76
82
|
|
77
|
-
# @abstract This method
|
78
|
-
#
|
83
|
+
# @abstract This base method does nothing but may be overriden by subclasses.
|
84
|
+
# This method is called when a header is added to a packet.
|
79
85
|
# @param [Packet] packet packet to which self is added
|
80
86
|
# @return [void]
|
81
87
|
def added_to_packet(packet) end
|
@@ -91,5 +97,15 @@ module PacketGen
|
|
91
97
|
|
92
98
|
super
|
93
99
|
end
|
100
|
+
|
101
|
+
# @abstract This method MUST be redefined by subclasses.
|
102
|
+
# Generate binary string from header
|
103
|
+
# @return [String]
|
104
|
+
# @raise [NotImplementedError]
|
105
|
+
def to_s
|
106
|
+
raise NotImplementedError, "#{self.class} should implement #to_s" if method(:to_s).super_method.nil?
|
107
|
+
|
108
|
+
super
|
109
|
+
end
|
94
110
|
end
|
95
111
|
end
|
data/lib/packetgen/inspect.rb
CHANGED
@@ -61,24 +61,19 @@ module PacketGen
|
|
61
61
|
str << Inspect::FMT_ATTR % [type, attr, value]
|
62
62
|
end
|
63
63
|
|
64
|
-
# Format an attribute for +#inspect+.
|
65
|
-
# 3 cases are handled:
|
66
|
-
# * attribute value is a {Types::Int}: show value as integer and in
|
67
|
-
# hexdecimal format,
|
68
|
-
# * attribute value responds to +#to_human+: call it,
|
69
|
-
# * else, +#to_s+ is used to format attribute value.
|
64
|
+
# Format an attribute for +#inspect+. Call +#format_inspect} on +value+.
|
70
65
|
# @param [Symbol] attr attribute name
|
71
66
|
# @param [Object] value attribute value
|
72
67
|
# @param [Integer] level
|
73
68
|
# @return [String]
|
74
69
|
def self.inspect_attribute(attr, value, level=1)
|
75
|
-
type = value.
|
70
|
+
type = value.type_name
|
76
71
|
self.format(type, attr, value.format_inspect, level)
|
77
72
|
end
|
78
73
|
|
79
74
|
# Format a ASN.1 attribute for +#inspect+.
|
80
75
|
# 4 cases are handled:
|
81
|
-
# * attribute value is a =RANS1::
|
76
|
+
# * attribute value is a =RANS1::BinStruct::Enumerated+: show named value and
|
82
77
|
# its integer value as hexdecimal format,
|
83
78
|
# * attribute value is a +RASN1::Types::Integer+: show value as integer and in
|
84
79
|
# hexdecimal format,
|