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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -3
- data/examples/pipes.rb +45 -0
- data/lib/ruby_smb/client.rb +25 -3
- data/lib/ruby_smb/client/negotiation.rb +10 -3
- data/lib/ruby_smb/nbss/session_header.rb +3 -3
- data/lib/ruby_smb/smb1.rb +1 -0
- data/lib/ruby_smb/smb1/bit_field.rb +1 -0
- data/lib/ruby_smb/smb1/bit_field/trans_flags.rb +15 -0
- data/lib/ruby_smb/smb1/commands.rb +1 -0
- data/lib/ruby_smb/smb1/packet.rb +1 -0
- data/lib/ruby_smb/smb1/packet/trans.rb +16 -0
- data/lib/ruby_smb/smb1/packet/trans/data_block.rb +49 -0
- data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request.rb +24 -0
- data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response.rb +59 -0
- data/lib/ruby_smb/smb1/packet/trans/request.rb +50 -0
- data/lib/ruby_smb/smb1/packet/trans/response.rb +46 -0
- data/lib/ruby_smb/smb1/packet/trans/subcommands.rb +11 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +1 -1
- data/lib/ruby_smb/smb1/pipe.rb +65 -0
- data/lib/ruby_smb/smb1/tree.rb +8 -1
- data/lib/ruby_smb/smb2.rb +1 -0
- data/lib/ruby_smb/smb2/file.rb +6 -6
- data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +1 -0
- data/lib/ruby_smb/smb2/pipe.rb +69 -0
- data/lib/ruby_smb/smb2/tree.rb +11 -1
- data/lib/ruby_smb/version.rb +1 -1
- data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -4
- data/spec/lib/ruby_smb/smb1/bit_field/trans_flags_spec.rb +26 -0
- data/spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request_spec.rb +47 -0
- data/spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response_spec.rb +31 -0
- data/spec/lib/ruby_smb/smb1/packet/trans/request_spec.rb +94 -0
- data/spec/lib/ruby_smb/smb1/packet/trans/response_spec.rb +85 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +1 -1
- data/spec/lib/ruby_smb/smb1/pipe_spec.rb +65 -0
- data/spec/lib/ruby_smb/smb2/pipe_spec.rb +64 -0
- metadata +27 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 816022485d644911d10d8001578a7eb49206edc3
|
4
|
+
data.tar.gz: bcf4688f01257ffd062adbd8fa2cb94843365687
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b53ba46aac705524d9c60b27b4c02f9dc9be9f58c5b516596b05780c962eb527f57a5537bcc17882c016d3e63baff4ea4357360faa7fb7c8004687a4d3fc8e16
|
7
|
+
data.tar.gz: e442a5af8c2e22740f2d1f137677b55953548d30b86d4a32895cb600833c4624ec2895056610e3f3a9f0fa1afae6799907ba98b2d4c168f6b2e6c8cb20239848
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1,3 +1,2 @@
|
|
1
|
-
|
2
|
-
}
|
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$
|
data/examples/pipes.rb
ADDED
@@ -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!
|
data/lib/ruby_smb/client.rb
CHANGED
@@ -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 =
|
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
|
-
#
|
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
|
-
|
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
|
-
|
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.
|
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
|
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
|
9
|
-
|
10
|
-
|
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
|
data/lib/ruby_smb/smb1.rb
CHANGED
@@ -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
|
data/lib/ruby_smb/smb1/packet.rb
CHANGED
@@ -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
|