ruby_smb 0.0.20 → 0.0.21

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 (39) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -3
  4. data/examples/pipes.rb +45 -0
  5. data/lib/ruby_smb/client.rb +25 -3
  6. data/lib/ruby_smb/client/negotiation.rb +10 -3
  7. data/lib/ruby_smb/nbss/session_header.rb +3 -3
  8. data/lib/ruby_smb/smb1.rb +1 -0
  9. data/lib/ruby_smb/smb1/bit_field.rb +1 -0
  10. data/lib/ruby_smb/smb1/bit_field/trans_flags.rb +15 -0
  11. data/lib/ruby_smb/smb1/commands.rb +1 -0
  12. data/lib/ruby_smb/smb1/packet.rb +1 -0
  13. data/lib/ruby_smb/smb1/packet/trans.rb +16 -0
  14. data/lib/ruby_smb/smb1/packet/trans/data_block.rb +49 -0
  15. data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request.rb +24 -0
  16. data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response.rb +59 -0
  17. data/lib/ruby_smb/smb1/packet/trans/request.rb +50 -0
  18. data/lib/ruby_smb/smb1/packet/trans/response.rb +46 -0
  19. data/lib/ruby_smb/smb1/packet/trans/subcommands.rb +11 -0
  20. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +1 -1
  21. data/lib/ruby_smb/smb1/pipe.rb +65 -0
  22. data/lib/ruby_smb/smb1/tree.rb +8 -1
  23. data/lib/ruby_smb/smb2.rb +1 -0
  24. data/lib/ruby_smb/smb2/file.rb +6 -6
  25. data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +1 -0
  26. data/lib/ruby_smb/smb2/pipe.rb +69 -0
  27. data/lib/ruby_smb/smb2/tree.rb +11 -1
  28. data/lib/ruby_smb/version.rb +1 -1
  29. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -4
  30. data/spec/lib/ruby_smb/smb1/bit_field/trans_flags_spec.rb +26 -0
  31. data/spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request_spec.rb +47 -0
  32. data/spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response_spec.rb +31 -0
  33. data/spec/lib/ruby_smb/smb1/packet/trans/request_spec.rb +94 -0
  34. data/spec/lib/ruby_smb/smb1/packet/trans/response_spec.rb +85 -0
  35. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +1 -1
  36. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +65 -0
  37. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +64 -0
  38. metadata +27 -2
  39. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4dff3ea0843193837a2e7ca9f8f0ab4a7fd2eea
4
- data.tar.gz: 7b8e7321255ff7da69f8aba3658c3f5f6769325e
3
+ metadata.gz: 816022485d644911d10d8001578a7eb49206edc3
4
+ data.tar.gz: bcf4688f01257ffd062adbd8fa2cb94843365687
5
5
  SHA512:
6
- metadata.gz: 129e91974e7487ed551eb69506ecd7c7adb92a1b528b135a3bece8387fcb45acde5abde401475c03d469732a94dfd38aaa1f30b810acf641796e7860797b0b3c
7
- data.tar.gz: 1233ed26721566ce8f86ea7e8eea3572b959251ae9db1faa6d1f84b324fc9c06a392c823b2551d2161972aaebb190920b465869e6bd97046ca67ec6dc4fb96db
6
+ metadata.gz: b53ba46aac705524d9c60b27b4c02f9dc9be9f58c5b516596b05780c962eb527f57a5537bcc17882c016d3e63baff4ea4357360faa7fb7c8004687a4d3fc8e16
7
+ data.tar.gz: e442a5af8c2e22740f2d1f137677b55953548d30b86d4a32895cb600833c4624ec2895056610e3f3a9f0fa1afae6799907ba98b2d4c168f6b2e6c8cb20239848
Binary file
data.tar.gz.sig CHANGED
@@ -1,3 +1,2 @@
1
- �m\Y��ӐLE��|ٰ�
2
- }��,l^��)�1���!�;#���bk��&(�J�A
3
- ���>)b�f�Ժ���r�̫-����9�>�i1�qM��I,�mD�$bZOp�OC7��E0�m8��$���y����K��>�\�~�{��/���;t�Ќ�5=W��z:�����y������o~x�����T?����/�e���l
1
+ ��S&��3K��O��y�>�!�T�a5IoX`6m�[��Ŝ'��׸���^ׯ;/�l�
2
+ ��.��}9����P$
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/ruby
2
+
3
+ #
4
+ # Example script for connecting to a named pipe and performing a peek operation.
5
+ # This is used to demonstrate pipe operations.
6
+ #
7
+ # Usage: ruby pipes.rb ADDRESS PIPENAME USER PASS 1|2
8
+ #
9
+
10
+ require 'bundler/setup'
11
+ require 'ruby_smb'
12
+
13
+ address = ARGV[0]
14
+ pipename = ARGV[1]
15
+ username = ARGV[2]
16
+ password = ARGV[3]
17
+ smbver = ARGV[4].to_i
18
+
19
+ sock = TCPSocket.new(address, 445)
20
+ dispatcher = RubySMB::Dispatcher::Socket.new(sock)
21
+
22
+ if smbver == 2
23
+ client = RubySMB::Client.new(dispatcher, smb1: false, username: username, password: password)
24
+ client.negotiate
25
+ puts "ServerMaxRead: #{client.server_max_read_size}"
26
+ puts "ServerMaxWrite: #{client.server_max_write_size}"
27
+ puts "ServerMaxTrans: #{client.server_max_transact_size}"
28
+ elsif smbver == 1
29
+ client = RubySMB::Client.new(dispatcher, smb2: false, username: username, password: password)
30
+ client.negotiate
31
+ puts "ServerMaxBuffer: #{client.server_max_buffer_size}"
32
+ end
33
+
34
+ client.authenticate
35
+ client.tree_connect("\\\\#{address}\\IPC$")
36
+ pipe = client.create_pipe(pipename, nil)
37
+
38
+ puts "Available: #{pipe.peek_available}"
39
+ puts "PipeState: #{pipe.peek_state}" # 3 == OK
40
+ puts "IsConnected: #{pipe.is_connected?}"
41
+
42
+ pipe.close
43
+ puts "IsConnected: #{pipe.is_connected?}"
44
+ client.tree_connects[-1].disconnect!
45
+ client.disconnect!
@@ -23,7 +23,9 @@ module RubySMB
23
23
  # Dialect value for SMB2 Default (Version 2.02)
24
24
  SMB2_DIALECT_DEFAULT = 0x0202
25
25
  # The default maximum size of a SMB message that the Client accepts (in bytes)
26
- MAX_BUFFER_SIZE = 4356
26
+ MAX_BUFFER_SIZE = 64512
27
+ # The default maximum size of a SMB message that the Server accepts (in bytes)
28
+ SERVER_MAX_BUFFER_SIZE = 4356
27
29
 
28
30
  # The dispatcher responsible for sending packets
29
31
  # @!attribute [rw] dispatcher
@@ -158,7 +160,23 @@ module RubySMB
158
160
  # @return [Integer]
159
161
  attr_accessor :server_max_buffer_size
160
162
 
161
- # @param dispatcher [RubySMB::Dispacther::Socket] the packet dispatcher to use
163
+ # The maximum size SMB2 write request that the Server accepts (in bytes)
164
+ # @!attribute [rw] server_max_write_size
165
+ # @return [Integer]
166
+ attr_accessor :server_max_write_size
167
+
168
+ # The maximum size SMB2 read request that the Server accepts (in bytes)
169
+ # @!attribute [rw] server_max_read_size
170
+ # @return [Integer]
171
+ attr_accessor :server_max_read_size
172
+
173
+ # The maximum size SMB2 transaction that the Server accepts (in bytes)
174
+ # For transactions that are not a read or write request
175
+ # @!attribute [rw] server_max_transact_size
176
+ # @return [Integer]
177
+ attr_accessor :server_max_transact_size
178
+
179
+ # @param dispatcher [RubySMB::Dispatcher::Socket] the packet dispatcher to use
162
180
  # @param smb1 [Boolean] whether or not to enable SMB1 support
163
181
  # @param smb2 [Boolean] whether or not to enable SMB2 support
164
182
  def initialize(dispatcher, smb1: true, smb2: true, username:, password:, domain: '.', local_workstation: 'WORKSTATION')
@@ -178,7 +196,11 @@ module RubySMB
178
196
  @smb2 = smb2
179
197
  @username = username.encode('utf-8') || ''.encode('utf-8')
180
198
  @max_buffer_size = MAX_BUFFER_SIZE
181
- @server_max_buffer_size = MAX_BUFFER_SIZE
199
+ # These sizes will be modifed during negotiation
200
+ @server_max_buffer_size = SERVER_MAX_BUFFER_SIZE
201
+ @server_max_read_size = RubySMB::SMB2::File::MAX_PACKET_SIZE
202
+ @server_max_write_size = RubySMB::SMB2::File::MAX_PACKET_SIZE
203
+ @server_max_transact_size = RubySMB::SMB2::File::MAX_PACKET_SIZE
182
204
 
183
205
  negotiate_version_flag = 0x02000000
184
206
  flags = Net::NTLM::Client::DEFAULT_FLAGS |
@@ -82,14 +82,21 @@ module RubySMB
82
82
  self.smb2 = false
83
83
  self.signing_required = packet.parameter_block.security_mode.security_signatures_required == 1
84
84
  self.dialect = packet.negotiated_dialect.to_s
85
- self.server_max_buffer_size = packet.parameter_block.max_buffer_size
85
+ # MaxBufferSize is largest message server will receive, measured from start of the SMB header. Subtract 260
86
+ # for protocol overhead. Then this value can be used for max read/write size without having to factor in
87
+ # protocol overhead every time.
88
+ self.server_max_buffer_size = packet.parameter_block.max_buffer_size - 260
86
89
  'SMB1'
87
90
  when RubySMB::SMB2::Packet::NegotiateResponse
88
91
  self.smb1 = false
89
92
  self.smb2 = true
90
93
  self.signing_required = packet.security_mode.signing_required == 1
91
94
  self.dialect = "0x%04x" % packet.dialect_revision
92
- self.server_max_buffer_size = 16644
95
+ self.server_max_read_size = packet.max_read_size
96
+ self.server_max_write_size = packet.max_write_size
97
+ self.server_max_transact_size = packet.max_transact_size
98
+ # This value is used in SMB1 only but calculate a valid value anyway
99
+ self.server_max_buffer_size = [self.server_max_read_size, self.server_max_write_size, self.server_max_transact_size].min
93
100
  'SMB2'
94
101
  end
95
102
 
@@ -102,7 +109,7 @@ module RubySMB
102
109
  def smb1_negotiate_request
103
110
  packet = RubySMB::SMB1::Packet::NegotiateRequest.new
104
111
  # Default to always enabling Extended Security. It simplifies the Negotiation process
105
- # while being gauranteed to work with any modern Windows system. We can get more sophisticated
112
+ # while being guaranteed to work with any modern Windows system. We can get more sophisticated
106
113
  # with switching this on and off at a later date if the need arises.
107
114
  packet.smb_header.flags2.extended_security = 1
108
115
  # There is no real good reason to ever send an SMB1 Negotiate packet
@@ -5,9 +5,9 @@ module RubySMB
5
5
  class SessionHeader < BinData::Record
6
6
  endian :big
7
7
 
8
- uint8 :session_packet_type, label: 'Session Packet Type'
9
- uint8 :flags, label: 'Flags', initial_value: 0
10
- uint16 :packet_length, label: 'Packet Length'
8
+ uint8 :session_packet_type, label: 'Session Packet Type'
9
+ bit7 :flags, label: 'Flags', initial_value: 0
10
+ bit17 :packet_length, label: 'Packet Length'
11
11
  end
12
12
  end
13
13
  end
@@ -18,5 +18,6 @@ module RubySMB
18
18
  require 'ruby_smb/smb1/packet'
19
19
  require 'ruby_smb/smb1/tree'
20
20
  require 'ruby_smb/smb1/file'
21
+ require 'ruby_smb/smb1/pipe'
21
22
  end
22
23
  end
@@ -10,6 +10,7 @@ module RubySMB
10
10
  require 'ruby_smb/smb1/bit_field/optional_support'
11
11
  require 'ruby_smb/smb1/bit_field/directory_access_mask'
12
12
  require 'ruby_smb/smb1/bit_field/file_access_mask'
13
+ require 'ruby_smb/smb1/bit_field/trans_flags'
13
14
  require 'ruby_smb/smb1/bit_field/trans2_flags'
14
15
  require 'ruby_smb/smb1/bit_field/open2_flags'
15
16
  require 'ruby_smb/smb1/bit_field/open2_access_mode'
@@ -0,0 +1,15 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module BitField
4
+ # The Flags bit-field for a Trans Request Packet
5
+ # [2.2.4.33.1 Request](https://msdn.microsoft.com/en-us/library/ee441730.aspx)
6
+ class TransFlags < BinData::Record
7
+ endian :little
8
+ bit6 :reserved, label: 'Reserved Space', initial_value: 0
9
+ bit1 :no_response, label: 'Do Not reply', initial_value: 0
10
+ bit1 :disconnect, label: 'Disconnect Tree', initial_value: 0
11
+ bit8 :reserved2, label: 'Reserved Space', initial_value: 0
12
+ end
13
+ end
14
+ end
15
+ end
@@ -2,6 +2,7 @@ module RubySMB
2
2
  module SMB1
3
3
  module Commands
4
4
  SMB_COM_CLOSE = 0x04
5
+ SMB_COM_TRANSACTION = 0x25
5
6
  SMB_COM_ECHO = 0x2B
6
7
  SMB_COM_READ_ANDX = 0x2E
7
8
  SMB_COM_WRITE_ANDX = 0x2F
@@ -19,6 +19,7 @@ module RubySMB
19
19
  require 'ruby_smb/smb1/packet/logoff_response'
20
20
  require 'ruby_smb/smb1/packet/echo_request'
21
21
  require 'ruby_smb/smb1/packet/echo_response'
22
+ require 'ruby_smb/smb1/packet/trans'
22
23
  require 'ruby_smb/smb1/packet/trans2'
23
24
  require 'ruby_smb/smb1/packet/nt_trans'
24
25
  require 'ruby_smb/smb1/packet/nt_create_andx_request'
@@ -0,0 +1,16 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ # Namespace for the Transaction sub-protocol documented in
5
+ # [2.2.4.33 SMB_COM_TRANSACTION (0x25)](https://msdn.microsoft.com/en-us/library/ee441489.aspx)
6
+ module Trans
7
+ require 'ruby_smb/smb1/packet/trans/subcommands'
8
+ require 'ruby_smb/smb1/packet/trans/data_block'
9
+ require 'ruby_smb/smb1/packet/trans/request'
10
+ require 'ruby_smb/smb1/packet/trans/response'
11
+ require 'ruby_smb/smb1/packet/trans/peek_nmpipe_request'
12
+ require 'ruby_smb/smb1/packet/trans/peek_nmpipe_response'
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,49 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # Extends the {RubySMB::SMB1::DataBlock} to include padding methods
6
+ # that all Trans DataBlocks will need to handle proper byte alignment.
7
+ class DataBlock < RubySMB::SMB1::DataBlock
8
+ # Controls whether the padding fields will be used
9
+ # @!attribute [rw] enable_padding
10
+ # @return [Boolean]
11
+ attr_accessor :enable_padding
12
+
13
+ def initialize_instance
14
+ super
15
+ @enable_padding = true
16
+ end
17
+
18
+ private
19
+
20
+ # Determines the correct length for the padding in front of
21
+ # trans_parameters. It should always force a 4-byte alignment.
22
+ def pad1_length
23
+ if enable_padding
24
+ offset = if respond_to?(:name)
25
+ (name.abs_offset + 1) % 4
26
+ else
27
+ (byte_count.abs_offset + 2) % 4
28
+ end
29
+ (4 - offset) % 4
30
+ else
31
+ 0
32
+ end
33
+ end
34
+
35
+ # Determines the correct length for the padding in front of
36
+ # trans_data. It should always force a 4-byte alignment.
37
+ def pad2_length
38
+ if enable_padding
39
+ offset = (trans_parameters.abs_offset + trans_parameters.length) % 4
40
+ (4 - offset) % 4
41
+ else
42
+ 0
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,24 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # This class represents an SMB1 Trans PeekNamedPipe Request Packet as defined in
6
+ # [2.2.5.5.1 Request](https://msdn.microsoft.com/en-us/library/ee442106.aspx)
7
+ class PeekNmpipeRequest < RubySMB::SMB1::Packet::Trans::Request
8
+
9
+ def fid=(file_id)
10
+ parameter_block.setup = [RubySMB::SMB1::Packet::Trans::Subcommands::PEEK_NMPIPE, file_id]
11
+ end
12
+
13
+ def initialize_instance
14
+ super
15
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION
16
+ data_block.name = "\\PIPE\\"
17
+ parameter_block.setup << RubySMB::SMB1::Packet::Trans::Subcommands::PEEK_NMPIPE
18
+ parameter_block.setup_count = 2
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,59 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # This class represents an SMB1 Trans PeekNamedPipe Response Packet as defined in
6
+ # [2.2.5.5.2 Response](https://msdn.microsoft.com/en-us/library/ee441883.aspx)
7
+ class PeekNmpipeResponse < RubySMB::GenericPacket
8
+ class ParameterBlock < RubySMB::SMB1::Packet::Trans::Response::ParameterBlock
9
+ end
10
+
11
+ # The Trans Parameter Block for this particular Subcommand
12
+ class TransParameters < BinData::Record
13
+ endian :little
14
+
15
+ uint16 :read_data_available, label: 'Read bytes available'
16
+ uint16 :message_bytes_length, label: 'Byte length of available message'
17
+ uint16 :pipe_state, label: 'Named pipe state'
18
+
19
+ # Returns the length of the TransParameters struct
20
+ # in number of bytes
21
+ def length
22
+ do_num_bytes
23
+ end
24
+ end
25
+
26
+ class TransData < BinData::Record
27
+ string :read_data, label: 'Readable data', length: -> { parent.parameter_block.total_data_count }
28
+
29
+ # Returns the length of the TransData struct
30
+ # in number of bytes
31
+ def length
32
+ do_num_bytes
33
+ end
34
+ end
35
+
36
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
37
+ class DataBlock < RubySMB::SMB1::Packet::Trans::DataBlock
38
+ string :pad1, length: -> { pad1_length }
39
+ trans_parameters :trans_parameters, label: 'Trans Parameters'
40
+ # dont understand the padding on this one...
41
+ string :pad2, length: -> { parent.parameter_block.data_offset - parent.parameter_block.parameter_offset - parent.parameter_block.parameter_count }
42
+ trans_data :trans_data, label: 'Trans Data'
43
+ end
44
+
45
+ smb_header :smb_header
46
+ parameter_block :parameter_block
47
+ data_block :data_block
48
+
49
+ def initialize_instance
50
+ super
51
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION
52
+ smb_header.flags.reply = 1
53
+ parameter_block.setup << RubySMB::SMB1::Packet::Trans::Subcommands::PEEK_NMPIPE
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,50 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # A SMB1 SMB_COM_TRANSACTION Request Packet as defined in
6
+ # [2.2.4.33.1 Request](https://msdn.microsoft.com/en-us/library/ee441730.aspx)
7
+ class Request < RubySMB::GenericPacket
8
+ # A SMB1 Parameter Block
9
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
10
+ uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
11
+ uint16 :total_data_count, label: 'Total Data Count(bytes)'
12
+ uint16 :max_parameter_count, label: 'Max Parameter Count(bytes)'
13
+ uint16 :max_data_count, label: 'Max Data Count(bytes)'
14
+ uint8 :max_setup_count, label: 'Max Setup Count'
15
+ uint8 :reserved, label: 'Reserved Space', initial_value: 0x00
16
+ trans_flags :flags
17
+ uint32 :timeout, label: 'Timeout', initial_value: 0x00000000
18
+ uint16 :reserved2, label: 'Reserved Space', initial_value: 0x00
19
+ uint16 :parameter_count, label: 'Parameter Count(bytes)', initial_value: -> { parent.data_block.trans_parameters.length }
20
+ uint16 :parameter_offset, label: 'Parameter Offset', initial_value: -> { parent.data_block.trans_parameters.abs_offset }
21
+ uint16 :data_count, label: 'Data Count(bytes)', initial_value: -> { parent.data_block.trans_data.length }
22
+ uint16 :data_offset, label: 'Data Offset', initial_value: -> { parent.data_block.trans_data.abs_offset }
23
+ uint8 :setup_count, label: 'Setup Count', initial_value: -> { setup.length }
24
+ uint8 :reserved3, label: 'Reserved Space', initial_value: 0x00
25
+
26
+ array :setup, type: :uint16, initial_length: 0
27
+ end
28
+
29
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
30
+ class DataBlock < RubySMB::SMB1::Packet::Trans::DataBlock
31
+ stringz :name, label: 'Name', initial_value: ""
32
+ string :pad1, length: -> { pad1_length }
33
+ string :trans_parameters, label: 'Trans Parameters'
34
+ string :pad2, length: -> { pad2_length }
35
+ string :trans_data, label: 'Trans Data'
36
+ end
37
+
38
+ smb_header :smb_header
39
+ parameter_block :parameter_block
40
+ data_block :data_block
41
+
42
+ def initialize_instance
43
+ super
44
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,46 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+ module Trans
5
+ # A SMB1 SMB_COM_TRANSACTION Response Packet as defined in
6
+ # [2.2.4.33.2 Response](https://msdn.microsoft.com/en-us/library/ee442061.aspx)
7
+ class Response < RubySMB::GenericPacket
8
+ # A SMB1 Parameter Block
9
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
10
+ uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
11
+ uint16 :total_data_count, label: 'Total Data Count(bytes)'
12
+ uint16 :reserved, label: 'Reserved Space', initial_value: 0x00
13
+ uint16 :parameter_count, label: 'Parameter Count(bytes)', initial_value: -> { parent.data_block.trans_parameters.length }
14
+ uint16 :parameter_offset, label: 'Parameter Offset', initial_value: -> { parent.data_block.trans_parameters.abs_offset }
15
+ uint16 :parameter_displacement, label: 'Parameter Displacement'
16
+ uint16 :data_count, label: 'Data Count(bytes)', initial_value: -> { parent.data_block.trans_data.length }
17
+ uint16 :data_offset, label: 'Data Offset', initial_value: -> { parent.data_block.trans_data.abs_offset }
18
+ uint16 :data_displacement, label: 'Data Displacement'
19
+ uint8 :setup_count, label: 'Setup Count', initial_value: -> { setup.length }
20
+ uint8 :reserved2, label: 'Reserved Space', initial_value: 0x00
21
+
22
+ array :setup, type: :uint16, initial_length: 0
23
+ end
24
+
25
+ # The {RubySMB::SMB1::DataBlock} specific to this packet type.
26
+ class DataBlock < RubySMB::SMB1::Packet::Trans::DataBlock
27
+ string :pad1, length: -> { pad1_length }
28
+ string :trans_parameters, label: 'Trans Parameters'
29
+ string :pad2, length: -> { pad2_length }
30
+ string :trans_data, label: 'Trans Data'
31
+ end
32
+
33
+ smb_header :smb_header
34
+ parameter_block :parameter_block
35
+ data_block :data_block
36
+
37
+ def initialize_instance
38
+ super
39
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION
40
+ smb_header.flags.reply = 1
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end