packetgen-plugin-smb 0.2.0 → 0.3.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/packetgen-plugin-smb.rb +7 -5
  3. data/lib/packetgen/plugin/gssapi.rb +125 -0
  4. data/lib/packetgen/plugin/smb.rb +26 -32
  5. data/lib/packetgen/plugin/smb/blocks.rb +2 -2
  6. data/lib/packetgen/plugin/smb/browser.rb +3 -3
  7. data/lib/packetgen/plugin/smb/browser/domain_announcement.rb +3 -3
  8. data/lib/packetgen/plugin/smb/browser/host_announcement.rb +4 -4
  9. data/lib/packetgen/plugin/smb/browser/local_master_announcement.rb +3 -3
  10. data/lib/packetgen/plugin/smb/close.rb +9 -59
  11. data/lib/packetgen/plugin/smb/close/request.rb +45 -0
  12. data/lib/packetgen/plugin/smb/close/response.rb +36 -0
  13. data/lib/packetgen/plugin/smb/filetime.rb +10 -9
  14. data/lib/packetgen/plugin/smb/nt_create_and_x.rb +9 -264
  15. data/lib/packetgen/plugin/smb/ntcreateandx/request.rb +159 -0
  16. data/lib/packetgen/plugin/smb/ntcreateandx/response.rb +128 -0
  17. data/lib/packetgen/plugin/smb/string.rb +4 -4
  18. data/lib/packetgen/plugin/smb/trans.rb +9 -190
  19. data/lib/packetgen/plugin/smb/trans/request.rb +121 -0
  20. data/lib/packetgen/plugin/smb/trans/response.rb +94 -0
  21. data/lib/packetgen/plugin/smb2.rb +181 -0
  22. data/lib/packetgen/plugin/smb2/base.rb +31 -0
  23. data/lib/packetgen/plugin/smb2/error.rb +50 -0
  24. data/lib/packetgen/plugin/smb2/guid.rb +68 -0
  25. data/lib/packetgen/plugin/smb2/negotiate.rb +22 -0
  26. data/lib/packetgen/plugin/smb2/negotiate/context.rb +131 -0
  27. data/lib/packetgen/plugin/smb2/negotiate/request.rb +166 -0
  28. data/lib/packetgen/plugin/smb2/negotiate/response.rb +190 -0
  29. data/lib/packetgen/plugin/smb2/session_setup.rb +21 -0
  30. data/lib/packetgen/plugin/smb2/session_setup/request.rb +98 -0
  31. data/lib/packetgen/plugin/smb2/session_setup/response.rb +69 -0
  32. data/lib/packetgen/plugin/smb_version.rb +1 -1
  33. data/packetgen-plugin-smb.gemspec +2 -1
  34. metadata +42 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b854bf1526a2a21067f2a2620c5b36fcd129509bd78ed450c04caf9d6070ed6
4
- data.tar.gz: c2e0de100ede2ffc1d10e88261fc6b97a38267800d6f7a92ed73e76e4f09ac4f
3
+ metadata.gz: cc233d3dcb94925757db9c4f5dde9647f97cce4d1e73001f3bbbcb41309ed435
4
+ data.tar.gz: 50d2ebf353a37d073bae3f6f7458057e4db8a7f2b5c0932094e1820056ab2746
5
5
  SHA512:
6
- metadata.gz: b225195fc718a67bcbc0410c9cf0aa3e9f0825410270c8c8a0a3e97aed0ceb82ed36f07f50a52665f894928fefdfbd6ad6fa57466e8da5d213a545a3248504ad
7
- data.tar.gz: e4c0f6f4d4af861ce63c8cf11d9b672fc070d6ad6215dcc441662eeb7445d98710aff05330a38e640d805c82372b5ba4b1076e9edfc5ef4ab4a313839d26d5f5
6
+ metadata.gz: 5862b573e7b9bba3826f10ef8e1ac8bbb34817e49f93338223ca5fbfcd0ad19cbeb65b64428fc1832c7603fe8a5a5cfc32cb6ac31d63c2e66de4a518ab89de6d
7
+ data.tar.gz: bb9a3e27eb4c36e3b6197d6450bef4efd73af1e3a0849c07383ea32924d155e0e21f975f7c91b4092ba70cce3d03cb368f92d38311a1a6585c946b5c1462dae5
@@ -1,10 +1,12 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
7
7
 
8
- require "packetgen"
9
- require_relative "packetgen/plugin/smb_version"
10
- require_relative "packetgen/plugin/smb"
8
+ require 'packetgen'
9
+ require_relative 'packetgen/plugin/smb_version'
10
+ require_relative 'packetgen/plugin/gssapi'
11
+ require_relative 'packetgen/plugin/smb'
12
+ require_relative 'packetgen/plugin/smb2'
@@ -0,0 +1,125 @@
1
+ # This file is part of packetgen-plugin-smb.
2
+ # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ require 'rasn1'
9
+
10
+ module PacketGen::Plugin
11
+ # GSS API, from RFC 4178
12
+ #
13
+ # GSSAPI ::= CHOICE {
14
+ # init InitialContextToken,
15
+ # token_resp NegTokenResp
16
+ # }
17
+ #
18
+ # InitialContextToken ::= [APPLICATION 0] IMPLICIT SEQUENCE {
19
+ # oid OBJECT IDENTIFIER,
20
+ # token_init NegTokenInit
21
+ # }
22
+ #
23
+ # NegTokenInit ::= [0] EXPLICIT SEQUENCE {
24
+ # mechTypes [0] MechTypeList,
25
+ # reqFlags [1] BIT STRING OPTIONAL, -- No more used
26
+ # mechToken [2] OCTET STRING OPTIONAL,
27
+ # mechListMIC [3] OCTET STRING OPTIONAL,
28
+ # }
29
+ #
30
+ # NegTokenResp ::= [1] EXPLICIT SEQUENCE {
31
+ # negState [0] ENUMERATED {
32
+ # accept-completed (0),
33
+ # accept-incomplete (1),
34
+ # reject (2),
35
+ # request-mic (3)
36
+ # } OPTIONAL,
37
+ # supportedMech [1] MechType OPTIONAL,
38
+ # responseToken [2] OCTET STRING OPTIONAL,
39
+ # mechListMIC [3] OCTET STRING OPTIONAL,
40
+ # }
41
+ #
42
+ # @example initial context
43
+ # gssapi.chosen #=> 0
44
+ # # Access to oid of initial context
45
+ # gssapi[:oid] #=> RASN1::Types::ObjectId
46
+ # gssapi[:oid].value #=> "1.3.6.1.5.5.2"
47
+ # # Access to token_init
48
+ # gssapi[:token_init] #=> PacketGen::Plugin::GSSAPI::NegTokenInit
49
+ # gssapi[:token_init][:mech_types] #=> RASN1::Types::SequenceOf
50
+ # # Get mech_types as an array of OID strings
51
+ # gssapi[:token_init][:mech_types].value.map(&:value)
52
+ # # Get mech_token value
53
+ # gssapi[:token_init][:mech_token].value
54
+ #
55
+ # @example response token
56
+ # gssapi.chosen #=> 1
57
+ # gssapi[:token_resp][:negstate] #=> RASN1::Types::Enumerated
58
+ # gssapi[:token_resp][:negstate].value #=> String
59
+ # gssapi[:token_resp][:supported_mech] #=> RASN1::Types::ObjectId
60
+ # gssapi[:token_resp][:supported_mech].value #=> String
61
+ # gssapi[:token_resp][:response] #=> RASN1::Types::OctetString
62
+ # @author Sylvain Daubert
63
+ class GSSAPI < RASN1::Model
64
+ # GSS API Negotiation Token Init
65
+ #
66
+ # A GSSAPI Negotiation Token Init is a ASN.1 SEQUENCE, explicitly tagged 0,
67
+ # containing from 1 up to 4 elements:
68
+ # * +mech_types+ is a mandatory SEQUENCE OF OBJECT ID. This SEQUENCE OF
69
+ # is explicitly tagged 0.
70
+ # * +req_flags+ is an optional BIT STRING, explicitly tagged 1.
71
+ # * +mech_token+ is an optional OCTET STRING, explicitly tagged 2.
72
+ # * +mech_list_mic+ is an optional OCTET STRING, explicitly tagged 3.
73
+ class NegTokenInit < RASN1::Model
74
+ sequence :token, explicit: 0, class: :context, constructed: true,
75
+ content: [sequence_of(:mech_types, RASN1::Types::ObjectId, explicit: 0, class: :context),
76
+ bit_string(:req_flags, explicit: 1, class: :context, constructed: true, optional: true),
77
+ octet_string(:mech_token, explicit: 2, class: :context, constructed: true, optional: true),
78
+ octet_string(:mech_list_mic, explicit: 3, class: :context, constructed: true, optional: true)]
79
+ end
80
+
81
+ # GSS API Negotiation Token Response
82
+ class NegTokenResp < RASN1::Model
83
+ # Negotiation states
84
+ NEG_STATES = {
85
+ 'accept-completed' => 0,
86
+ 'accept-incomplete' => 1,
87
+ 'reject' => 2,
88
+ 'request-mic' => 3
89
+ }
90
+ sequence :token, explicit: 1, class: :context, constructed: true,
91
+ content: [enumerated(:negstate, enum: NEG_STATES, explicit: 0, class: :context, constructed: true, optional: true),
92
+ objectid(:supported_mech, explicit: 1, class: :context, constructed: true, optional: true),
93
+ octet_string(:response, explicit: 2, class: :context, constructed: true, optional: true),
94
+ octet_string(:mech_list_mic, explicit: 3, class: :context, constructed: true, optional: true)]
95
+ end
96
+
97
+ choice :gssapi,
98
+ content: [sequence(:init, implicit: 0, class: :application,
99
+ content: [objectid(:oid, value: '1.3.6.1.5.5.2'),
100
+ model(:token_init, NegTokenInit)]),
101
+ model(:token_resp, NegTokenResp)]
102
+
103
+ # @param [Hash] args
104
+ # @param [Symbol] :type +:init+ or +:response+ to force selection of
105
+ # token CHOICE.
106
+ def initialize(args={})
107
+ token = args.delete(:token)
108
+ super
109
+ self[:gssapi].chosen = (token == :init) ? 0 : 1
110
+ end
111
+ # Populate Object from +str+
112
+ # @param [String] str
113
+ # @return [self]
114
+ def read(str)
115
+ parse!(str, ber: true)
116
+ self
117
+ end
118
+
119
+ # Get size of GSSAPI DER string, in bytes
120
+ # @return [Integer]
121
+ def sz
122
+ to_der.size
123
+ end
124
+ end
125
+ end
@@ -1,6 +1,6 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
@@ -86,24 +86,24 @@ module PacketGen::Plugin
86
86
  # @!attribute body
87
87
  # @return [String]
88
88
  define_field :body, PacketGen::Types::String
89
- # @!attribute flags_reply
89
+ # @!attribute flags_reply?
90
90
  # When set, the message is a reply from server to client.
91
91
  # @return [Boolean]
92
- # @!attribute flags_opbatch
92
+ # @!attribute flags_opbatch?
93
93
  # Obsolescent.
94
94
  # @return [Boolean]
95
- # @!attribute flags_oplock
95
+ # @!attribute flags_oplock?
96
96
  # Obsolescent.
97
97
  # @return [Boolean]
98
- # @!attribute flags_canon_paths
98
+ # @!attribute flags_canon_paths?
99
99
  # Obsolescent.
100
100
  # @return [Boolean]
101
- # @!attribute flags_case_insensitive
101
+ # @!attribute flags_case_insensitive?
102
102
  # Obsolete.
103
103
  # @return [Boolean]
104
- # @!attribute flags_reserved
104
+ # @!attribute flags_reserved?
105
105
  # @return [Boolean]
106
- # @!attribute flags_rbuf_avail
106
+ # @!attribute flags_rbuf_avail?
107
107
  # Obsolete.
108
108
  # @return [Boolean]
109
109
  # @!attribute flags_locknread
@@ -113,42 +113,42 @@ module PacketGen::Plugin
113
113
  define_bit_fields_on :flags, :flags_reply, :flags_opbatch, :flags_oplock,
114
114
  :flags_canon_paths, :flags_case_insensitive,
115
115
  :flags_reserved, :flags_buf_avail, :flags_locknread
116
- # @!attribute flags2_unicode
116
+ # @!attribute flags2_unicode?
117
117
  # If set, each field that contains a string in this message is encoded
118
118
  # as UTF-16.
119
119
  # @return [Boolean]
120
- # @!attribute flags2_ntstatus
120
+ # @!attribute flags2_ntstatus?
121
121
  # If set in a client request, server must return errors as NTSTATUS, else
122
122
  # as SMBSTATUS.
123
123
  # @return [Boolean]
124
- # @!attribute flags2_paging_io
124
+ # @!attribute flags2_paging_io?
125
125
  # Client may read a file if it does not have read permission but have
126
126
  # execute one.
127
127
  # @return [Boolean]
128
- # @!attribute flags2_dfs
128
+ # @!attribute flags2_dfs?
129
129
  # If set, any pathnames should be resolved in the Distributed File System
130
130
  # (DFS).
131
131
  # @return [Boolean]
132
- # @!attribute flags2_extended_security
132
+ # @!attribute flags2_extended_security?
133
133
  # @return [Boolean]
134
- # @!attribute flags2_reparse_path
134
+ # @!attribute flags2_reparse_path?
135
135
  # @return [Boolean]
136
136
  # @!attribute flags2_reserved
137
137
  # 3-bit reserved field
138
138
  # @return [Integer]
139
- # @!attribute flags2_is_long_name
139
+ # @!attribute flags2_is_long_name?
140
140
  # @return [Boolean]
141
- # @!attribute flags2_rsv
141
+ # @!attribute flags2_rsv?
142
142
  # @return [Boolean]
143
- # @!attribute flags2_security_signature_required
143
+ # @!attribute flags2_security_signature_required?
144
144
  # @return [Boolean]
145
- # @!attribute flags2_compressed
145
+ # @!attribute flags2_compressed?
146
146
  # @return [Boolean]
147
- # @!attribute flags2_signature
147
+ # @!attribute flags2_signature?
148
148
  # @return [Boolean]
149
- # @!attribute flags2_eas
149
+ # @!attribute flags2_eas?
150
150
  # @return [Boolean]
151
- # @!attribute flags2_long_names
151
+ # @!attribute flags2_long_names?
152
152
  # If unset, file names must adhere to the 8.3 naming convention.
153
153
  # @return [Boolean]
154
154
  define_bit_fields_on :flags2, :flags2_unicode, :flags2_ntstatus,
@@ -163,8 +163,8 @@ module PacketGen::Plugin
163
163
  # @return [void]
164
164
  def self.bind_command(command)
165
165
  contantized = command.capitalize.gsub(/_(\w)/) { $1.upcase }
166
- krequest = self.const_get("#{contantized}Request")
167
- kresponse = self.const_get("#{contantized}Response")
166
+ krequest = self.const_get("#{contantized}::Request")
167
+ kresponse = self.const_get("#{contantized}::Response")
168
168
  PacketGen::Header.add_class krequest
169
169
  self.bind krequest, command: SMB::COMMANDS[command], flags: ->(v) { v.nil? ? 0 : (v & 0x80).zero? }
170
170
  PacketGen::Header.add_class kresponse
@@ -172,10 +172,7 @@ module PacketGen::Plugin
172
172
  end
173
173
 
174
174
  def inspect
175
- str = PacketGen::Inspect.dashed_line(self.class, 1)
176
- fields.each do |attr|
177
- next if attr == :body
178
-
175
+ super do |attr|
179
176
  case attr
180
177
  when :flags, :flags2
181
178
  value = bits_on(attr).reject { |_, v| v > 1 }
@@ -185,14 +182,11 @@ module PacketGen::Plugin
185
182
  .join(',')
186
183
  .gsub!(/#{attr}_/, '')
187
184
  value = '%-16s (0x%02x)' % [value, self[attr].to_i]
188
- str << PacketGen::Inspect.shift_level(1)
185
+ str = PacketGen::Inspect.shift_level
189
186
  str << PacketGen::Inspect::FMT_ATTR % [self[attr].class.to_s.sub(/.*::/, ''),
190
187
  attr, value]
191
- else
192
- str << PacketGen::Inspect.inspect_attribute(attr, self[attr], 1)
193
188
  end
194
189
  end
195
- str
196
190
  end
197
191
  end
198
192
  PacketGen::Header.add_class SMB
@@ -1,6 +1,6 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
@@ -1,6 +1,6 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
@@ -81,7 +81,7 @@ module PacketGen::Plugin
81
81
  end
82
82
  end
83
83
  PacketGen::Header.add_class Browser
84
- SMB::TransRequest.bind Browser, name: '\\MAILSLOT\\BROWSE'
84
+ Trans::Request.bind Browser, name: '\\MAILSLOT\\BROWSE'
85
85
  end
86
86
  end
87
87
 
@@ -1,6 +1,6 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
@@ -27,7 +27,7 @@ module PacketGen::Plugin
27
27
  end
28
28
  end
29
29
  PacketGen::Header.add_class DomainAnnouncement
30
- SMB::TransRequest.bind DomainAnnouncement, name: '\\MAILSLOT\\BROWSE', body: ->(v) { v[0] == OPCODES['DomainAnnouncement'] }
30
+ SMB::Trans::Request.bind DomainAnnouncement, name: '\\MAILSLOT\\BROWSE', body: ->(v) { v[0] == OPCODES['DomainAnnouncement'] }
31
31
  end
32
32
  end
33
33
  end
@@ -1,6 +1,6 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
@@ -14,7 +14,7 @@ module PacketGen::Plugin
14
14
  # specify the types of resources and services it supports.
15
15
  # @author Sylvain Daubert
16
16
  class HostAnnouncement < Browser
17
- delete_field :body
17
+ remove_field :body
18
18
  update_field :opcode, default: 1
19
19
  # @!attribute update_count
20
20
  # 8-bit integer. Not used. Should be 0
@@ -65,7 +65,7 @@ module PacketGen::Plugin
65
65
  end
66
66
  end
67
67
  PacketGen::Header.add_class HostAnnouncement
68
- SMB::TransRequest.bind HostAnnouncement, name: '\\MAILSLOT\\BROWSE', body: ->(v) { v[0] == OPCODES['HostAnnouncement'] }
68
+ SMB::Trans::Request.bind HostAnnouncement, name: '\\MAILSLOT\\BROWSE', body: ->(v) { v[0] == OPCODES['HostAnnouncement'] }
69
69
  end
70
70
  end
71
71
  end
@@ -1,6 +1,6 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
@@ -22,7 +22,7 @@ module PacketGen::Plugin
22
22
  end
23
23
  end
24
24
  PacketGen::Header.add_class LocalMasterAnnouncement
25
- SMB::TransRequest.bind LocalMasterAnnouncement, name: '\\MAILSLOT\\BROWSE', body: ->(v) { v[0] == OPCODES['LocalMasterAnnouncement'] }
25
+ SMB::Trans::Request.bind LocalMasterAnnouncement, name: '\\MAILSLOT\\BROWSE', body: ->(v) { v[0] == OPCODES['LocalMasterAnnouncement'] }
26
26
  end
27
27
  end
28
28
  end
@@ -1,68 +1,18 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
7
7
 
8
8
  module PacketGen::Plugin
9
9
  class SMB
10
- # Close Request.
11
- # @author Sylvain Daubert
12
- class CloseRequest < PacketGen::Header::Base
13
- # @!attribute word_count
14
- # The size, in 2-byte words, of the SMB command parameters. It should
15
- # be +3+.
16
- # @return [Integer]
17
- define_field :word_count, PacketGen::Types::Int8, default: 3
18
- # @!attribute fid
19
- # 16-bit FID of the object to close
20
- # @return [Integer]
21
- define_field :fid, PacketGen::Types::Int16le, default: 3
22
- # @!attribute last_modified
23
- # 32-bit time value encoded as the number of seconds since January
24
- # 1, 1970 00:00:00.0. The client can request that the last modification
25
- # time for the file be updated to this time value. A value of +0x00000000+
26
- # or +0xFFFFFFFF+ results in the server not updating the last modification
27
- # time.
28
- # @return [Integer]
29
- define_field :last_modified, PacketGen::Types::Int32le
30
- # @!attribute byte_count
31
- # Should be 0.
32
- # @return [Integer]
33
- define_field :byte_count, PacketGen::Types::Int16le, default: 0
34
-
35
- # Give protocol name for this class
36
- # @return [String]
37
- def protocol_name
38
- 'SMB::CloseRequest'
39
- end
40
- end
41
-
42
- # Close Response.
43
- #
44
- # This is a void container. {#word_count} and {#byte_count} should be 0.
45
- # @author Sylvain Daubert
46
- # @since 0.1.0
47
- class CloseResponse < PacketGen::Header::Base
48
- # @!attribute word_count
49
- # The size, in 2-byte words, of the SMB command parameters. It should
50
- # be +0+.
51
- # @return [Integer]
52
- define_field :word_count, PacketGen::Types::Int8, default: 3
53
- define_field :last_modified, PacketGen::Types::Int32le
54
- # @!attribute byte_count
55
- # Should be 0.
56
- # @return [Integer]
57
- define_field :byte_count, PacketGen::Types::Int16le, default: 0
58
-
59
- # Give protocol name for this class
60
- # @return [String]
61
- def protocol_name
62
- 'SMB::CloseResponse'
63
- end
64
- end
65
-
66
- self.bind_command 'close'
10
+ # Namespace for CLOSE related classes
11
+ module Close; end
67
12
  end
68
13
  end
14
+
15
+ require_relative 'close/request'
16
+ require_relative 'close/response'
17
+
18
+ PacketGen::Plugin::SMB.bind_command 'close'