ruby_smb 0.0.20 → 0.0.21
Sign up to get free protection for your applications and to get access to all the features.
- 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
|