ruby_smb 3.0.6 → 3.1.2
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/examples/file_server.rb +8 -1
- data/examples/virtual_file_server.rb +143 -0
- data/lib/ruby_smb/client/encryption.rb +16 -4
- data/lib/ruby_smb/client/negotiation.rb +10 -8
- data/lib/ruby_smb/fscc/file_information/file_access_information.rb +15 -0
- data/lib/ruby_smb/fscc/file_information/file_alignment_information.rb +45 -0
- data/lib/ruby_smb/fscc/file_information/file_all_information.rb +23 -0
- data/lib/ruby_smb/fscc/file_information/file_basic_information.rb +20 -0
- data/lib/ruby_smb/fscc/file_information/file_both_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_ea_information.rb +1 -0
- data/lib/ruby_smb/fscc/file_information/file_full_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_id_both_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_id_full_directory_information.rb +3 -3
- data/lib/ruby_smb/fscc/file_information/file_internal_information.rb +15 -0
- data/lib/ruby_smb/fscc/file_information/file_mode_information.rb +29 -0
- data/lib/ruby_smb/fscc/file_information/file_name_information.rb +16 -0
- data/lib/ruby_smb/fscc/file_information/file_names_information.rb +1 -1
- data/lib/ruby_smb/fscc/file_information/file_normalized_name_information.rb +16 -0
- data/lib/ruby_smb/fscc/file_information/file_position_information.rb +15 -0
- data/lib/ruby_smb/fscc/file_information/file_rename_information.rb +1 -1
- data/lib/ruby_smb/fscc/file_information/file_standard_information.rb +20 -0
- data/lib/ruby_smb/fscc/file_information/file_stream_information.rb +3 -0
- data/lib/ruby_smb/fscc/file_information.rb +43 -6
- data/lib/ruby_smb/fscc/file_system_information/file_fs_attribute_information.rb +1 -0
- data/lib/ruby_smb/fscc/file_system_information/file_fs_volume_information.rb +1 -0
- data/lib/ruby_smb/fscc/file_system_information.rb +4 -0
- data/lib/ruby_smb/gss/provider/ntlm.rb +20 -3
- data/lib/ruby_smb/gss/provider.rb +10 -1
- data/lib/ruby_smb/server/server_client/encryption.rb +66 -0
- data/lib/ruby_smb/server/server_client/negotiation.rb +14 -3
- data/lib/ruby_smb/server/server_client/session_setup.rb +21 -4
- data/lib/ruby_smb/server/server_client/share_io.rb +17 -0
- data/lib/ruby_smb/server/server_client/tree_connect.rb +40 -3
- data/lib/ruby_smb/server/server_client.rb +156 -38
- data/lib/ruby_smb/server/session.rb +5 -1
- data/lib/ruby_smb/server/share/provider/disk/file_system.rb +28 -0
- data/lib/ruby_smb/server/share/provider/disk/processor/close.rb +46 -0
- data/lib/ruby_smb/server/share/provider/disk/processor/create.rb +143 -0
- data/lib/ruby_smb/server/share/provider/disk/processor/query.rb +359 -0
- data/lib/ruby_smb/server/share/provider/disk/processor/read.rb +70 -0
- data/lib/ruby_smb/server/share/provider/disk/processor.rb +223 -0
- data/lib/ruby_smb/server/share/provider/disk.rb +12 -418
- data/lib/ruby_smb/server/share/provider/pipe.rb +2 -2
- data/lib/ruby_smb/server/share/provider/processor.rb +16 -0
- data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_file.rb +85 -0
- data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_pathname.rb +196 -0
- data/lib/ruby_smb/server/share/provider/virtual_disk/virtual_stat.rb +175 -0
- data/lib/ruby_smb/server/share/provider/virtual_disk.rb +116 -0
- data/lib/ruby_smb/server/share/provider.rb +1 -0
- data/lib/ruby_smb/server.rb +13 -3
- data/lib/ruby_smb/signing.rb +18 -4
- data/lib/ruby_smb/smb1/commands.rb +1 -0
- data/lib/ruby_smb/smb1/packet/nt_create_andx_request.rb +11 -1
- data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +1 -1
- data/lib/ruby_smb/smb1/packet/read_andx_response.rb +5 -4
- data/lib/ruby_smb/smb1/packet/session_setup_request.rb +12 -4
- data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +9 -1
- data/lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb +52 -51
- data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +37 -37
- data/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_both_directory_info.rb +48 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_information_level.rb +28 -15
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_request.rb +51 -51
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +36 -36
- data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +40 -39
- data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +40 -40
- data/lib/ruby_smb/smb1/packet/trans2/query_file_information_request.rb +60 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_file_information_response.rb +59 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_level/query_fs_attribute_info.rb +31 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_level.rb +40 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_request.rb +46 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_fs_information_response.rb +59 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_information_level/query_file_basic_info.rb +23 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_information_level/query_file_standard_info.rb +22 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_information_level.rb +62 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_path_information_request.rb +65 -0
- data/lib/ruby_smb/smb1/packet/trans2/query_path_information_response.rb +59 -0
- data/lib/ruby_smb/smb1/packet/trans2/request.rb +24 -8
- data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +4 -4
- data/lib/ruby_smb/smb1/packet/trans2/response.rb +29 -20
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_request.rb +42 -42
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +23 -23
- data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +23 -5
- data/lib/ruby_smb/smb1/packet/trans2.rb +4 -0
- data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +4 -1
- data/lib/ruby_smb/smb2/negotiate_context.rb +10 -1
- data/lib/ruby_smb/smb2/packet/transform_header.rb +7 -7
- data/lib/ruby_smb/smb2/tree.rb +1 -0
- data/lib/ruby_smb/smb2.rb +1 -0
- data/lib/ruby_smb/version.rb +1 -1
- data/spec/lib/ruby_smb/client_spec.rb +31 -8
- data/spec/lib/ruby_smb/fscc/file_information/file_access_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_alignment_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_all_information_spec.rb +61 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_basic_information_spec.rb +41 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_both_directory_information_spec.rb +59 -10
- data/spec/lib/ruby_smb/fscc/file_information/file_directory_information_spec.rb +30 -12
- data/spec/lib/ruby_smb/fscc/file_information/file_ea_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_full_directory_information_spec.rb +30 -12
- data/spec/lib/ruby_smb/fscc/file_information/file_id_both_directory_information_spec.rb +63 -10
- data/spec/lib/ruby_smb/fscc/file_information/file_id_full_directory_information_spec.rb +30 -12
- data/spec/lib/ruby_smb/fscc/file_information/file_internal_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_mode_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_name_information_spec.rb +44 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_names_information_spec.rb +30 -12
- data/spec/lib/ruby_smb/fscc/file_information/file_network_open_information_spec.rb +51 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_normalized_name_information_spec.rb +44 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_position_information_spec.rb +21 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_rename_information_spec.rb +1 -1
- data/spec/lib/ruby_smb/fscc/file_information/file_standard_information_spec.rb +41 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_stream_information_spec.rb +51 -0
- data/spec/lib/ruby_smb/fscc/file_information_spec.rb +14 -0
- data/spec/lib/ruby_smb/fscc/file_system_information/file_fs_attribute_information_spec.rb +46 -0
- data/spec/lib/ruby_smb/fscc/file_system_information/file_fs_volume_information_spec.rb +51 -0
- data/spec/lib/ruby_smb/fscc/file_system_information_spec.rb +14 -0
- data/spec/lib/ruby_smb/server/server_client_spec.rb +15 -0
- data/spec/lib/ruby_smb/server/share/provider/virtual_disk/virtual_pathname_spec.rb +581 -0
- data/spec/lib/ruby_smb/server/share/provider/virtual_disk/virtual_stat_spec.rb +207 -0
- data/spec/lib/ruby_smb/server/share/provider/virtual_disk_spec.rb +122 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +36 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +35 -1
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_file_information_request_spec.rb +74 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_file_information_response_spec.rb +96 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_fs_information_request_spec.rb +62 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_fs_information_response_spec.rb +88 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_path_information_request_spec.rb +79 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/query_path_information_response_spec.rb +96 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +3 -3
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_request_spec.rb +3 -2
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +7 -2
- data/spec/lib/ruby_smb/smb1/tree_spec.rb +3 -3
- data/spec/lib/ruby_smb/smb2/packet/transform_header_spec.rb +2 -2
- data.tar.gz.sig +0 -0
- metadata +88 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 498d32e1eeed4cb410f03dfdc5ea1b23dd5506d89e387a3533494b9f73294ffa
|
4
|
+
data.tar.gz: 838a864709be049725a3978de10d71a0cf9eb75e91d00468cdee07fc5e614250
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e60651395300c2f7bc88049e7572a2b5376646615da08a1978d8e71afe694ca2f32396e124cbda71cc203811ff8df0241aa072f58aeffa8265498789cab7696f
|
7
|
+
data.tar.gz: e9d3bd5ffb781a01e4382d8f0f2327cd384d4be520a394fbf00336fbc23b9913fae58b380c05c1782c320364edd8ac5e729639091c0f54b32208469972810705
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/examples/file_server.rb
CHANGED
@@ -10,6 +10,7 @@ Encoding.default_internal = 'UTF-8' if Encoding.default_internal.nil?
|
|
10
10
|
|
11
11
|
options = {
|
12
12
|
allow_anonymous: true,
|
13
|
+
allow_guests: false,
|
13
14
|
domain: nil,
|
14
15
|
username: 'RubySMB',
|
15
16
|
password: 'password',
|
@@ -39,6 +40,9 @@ OptionParser.new do |opts|
|
|
39
40
|
opts.on("--[no-]smbv3", "Enable or disable SMBv3 (default: #{options[:smbv3] ? 'Enabled' : 'Disabled'})") do |smbv3|
|
40
41
|
options[:smbv3] = smbv3
|
41
42
|
end
|
43
|
+
opts.on("--[no-]guests", "Allow guest accounts (default: #{options[:allow_guests]})") do |allow_guests|
|
44
|
+
options[:allow_guests] = allow_guests
|
45
|
+
end
|
42
46
|
opts.on("--username USERNAME", "The account's username (default: #{options[:username]})") do |username|
|
43
47
|
if username.include?('\\')
|
44
48
|
options[:domain], options[:username] = username.split('\\', 2)
|
@@ -51,7 +55,10 @@ OptionParser.new do |opts|
|
|
51
55
|
end
|
52
56
|
end.parse!
|
53
57
|
|
54
|
-
ntlm_provider = RubySMB::Gss::Provider::NTLM.new(
|
58
|
+
ntlm_provider = RubySMB::Gss::Provider::NTLM.new(
|
59
|
+
allow_anonymous: options[:allow_anonymous],
|
60
|
+
allow_guests: options[:allow_guests]
|
61
|
+
)
|
55
62
|
ntlm_provider.put_account(options[:username], options[:password], domain: options[:domain]) # password can also be an NTLM hash
|
56
63
|
|
57
64
|
server = RubySMB::Server.new(
|
@@ -0,0 +1,143 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'optparse'
|
5
|
+
require 'ruby_smb'
|
6
|
+
require 'ruby_smb/gss/provider/ntlm'
|
7
|
+
|
8
|
+
# we just need *a* default encoding to handle the strings from the NTLM messages
|
9
|
+
Encoding.default_internal = 'UTF-8' if Encoding.default_internal.nil?
|
10
|
+
|
11
|
+
# see: https://en.wikipedia.org/wiki/Magic_8-ball#Possible_answers
|
12
|
+
MAGIC_8_BALL_ANSWERS = [
|
13
|
+
'It is certain.',
|
14
|
+
'It is decidedly so.',
|
15
|
+
'Without a doubt.',
|
16
|
+
'Yes definitely.',
|
17
|
+
'You may rely on it.',
|
18
|
+
'As I see it, yes.',
|
19
|
+
'Most likely.',
|
20
|
+
'Outlook good.',
|
21
|
+
'Yes.',
|
22
|
+
'Signs point to yes.',
|
23
|
+
'Reply hazy, try again.',
|
24
|
+
'Ask again later.',
|
25
|
+
'Better not tell you now.',
|
26
|
+
'Cannot predict now.',
|
27
|
+
'Concentrate and ask again.',
|
28
|
+
'Don\'t count on it.',
|
29
|
+
'My reply is no.',
|
30
|
+
'My sources say no.',
|
31
|
+
'Outlook not so good.',
|
32
|
+
'Very doubtful'
|
33
|
+
]
|
34
|
+
|
35
|
+
options = {
|
36
|
+
allow_anonymous: true,
|
37
|
+
domain: nil,
|
38
|
+
username: 'RubySMB',
|
39
|
+
password: 'password',
|
40
|
+
share_name: 'home',
|
41
|
+
smbv1: true,
|
42
|
+
smbv2: true,
|
43
|
+
smbv3: true
|
44
|
+
}
|
45
|
+
OptionParser.new do |opts|
|
46
|
+
opts.banner = "Usage: #{File.basename(__FILE__)} [options]"
|
47
|
+
opts.on("--share SHARE", "The share name (default: #{options[:share_name]})") do |share|
|
48
|
+
options[:share_name] = share
|
49
|
+
end
|
50
|
+
opts.on("--[no-]anonymous", "Allow anonymous access (default: #{options[:allow_anonymous]})") do |allow_anonymous|
|
51
|
+
options[:allow_anonymous] = allow_anonymous
|
52
|
+
end
|
53
|
+
opts.on("--[no-]smbv1", "Enable or disable SMBv1 (default: #{options[:smbv1] ? 'Enabled' : 'Disabled'})") do |smbv1|
|
54
|
+
options[:smbv1] = smbv1
|
55
|
+
end
|
56
|
+
opts.on("--[no-]smbv2", "Enable or disable SMBv2 (default: #{options[:smbv2] ? 'Enabled' : 'Disabled'})") do |smbv2|
|
57
|
+
options[:smbv2] = smbv2
|
58
|
+
end
|
59
|
+
opts.on("--[no-]smbv3", "Enable or disable SMBv3 (default: #{options[:smbv3] ? 'Enabled' : 'Disabled'})") do |smbv3|
|
60
|
+
options[:smbv3] = smbv3
|
61
|
+
end
|
62
|
+
opts.on("--username USERNAME", "The account's username (default: #{options[:username]})") do |username|
|
63
|
+
if username.include?('\\')
|
64
|
+
options[:domain], options[:username] = username.split('\\', 2)
|
65
|
+
else
|
66
|
+
options[:username] = username
|
67
|
+
end
|
68
|
+
end
|
69
|
+
opts.on("--password PASSWORD", "The account's password (default: #{options[:password]})") do |password|
|
70
|
+
options[:password] = password
|
71
|
+
end
|
72
|
+
opts.on("--virtual-content CONTENT", "The virtual share contents") do |virtual_content|
|
73
|
+
options[:virtual_content] = virtual_content
|
74
|
+
end
|
75
|
+
opts.on("--virtual-name NAME", "The virtual share file name") do |virtual_name|
|
76
|
+
options[:virtual_name] = virtual_name
|
77
|
+
end
|
78
|
+
opts.on("--virtual-type TYPE", "The virtual share type") do |virtual_type|
|
79
|
+
options[:virtual_type] = virtual_type
|
80
|
+
end
|
81
|
+
end.parse!
|
82
|
+
|
83
|
+
ntlm_provider = RubySMB::Gss::Provider::NTLM.new(allow_anonymous: options[:allow_anonymous])
|
84
|
+
ntlm_provider.put_account(options[:username], options[:password], domain: options[:domain]) # password can also be an NTLM hash
|
85
|
+
|
86
|
+
server = RubySMB::Server.new(
|
87
|
+
gss_provider: ntlm_provider,
|
88
|
+
logger: :stdout
|
89
|
+
)
|
90
|
+
server.dialects.select! { |dialect| RubySMB::Dialect[dialect].family != RubySMB::Dialect::FAMILY_SMB1 } unless options[:smbv1]
|
91
|
+
server.dialects.select! { |dialect| RubySMB::Dialect[dialect].family != RubySMB::Dialect::FAMILY_SMB2 } unless options[:smbv2]
|
92
|
+
server.dialects.select! { |dialect| RubySMB::Dialect[dialect].family != RubySMB::Dialect::FAMILY_SMB3 } unless options[:smbv3]
|
93
|
+
|
94
|
+
if server.dialects.empty?
|
95
|
+
puts "at least one version must be enabled"
|
96
|
+
exit false
|
97
|
+
end
|
98
|
+
|
99
|
+
virtual_disk = RubySMB::Server::Share::Provider::VirtualDisk.new(options[:share_name])
|
100
|
+
|
101
|
+
# greeting is a static text file
|
102
|
+
virtual_disk.add_static_file('greeting', 'Hello World!')
|
103
|
+
|
104
|
+
# self is this example file, it's read when it's added and its #stat object is copied over
|
105
|
+
virtual_disk.add_static_file('self/static', File.open(__FILE__))
|
106
|
+
|
107
|
+
# self is this example file, it's mapped in using a real Pathname object
|
108
|
+
virtual_disk.add_mapped_file('self/mapped', Pathname.new(File.expand_path(__FILE__)))
|
109
|
+
|
110
|
+
# magic_8_ball is a dynamic file that is generated each time it is open
|
111
|
+
virtual_disk.add_dynamic_file('magic_8_ball') do
|
112
|
+
MAGIC_8_BALL_ANSWERS.sample
|
113
|
+
end
|
114
|
+
|
115
|
+
if options[:virtual_content] && options[:virtual_name] && options[:virtual_type]
|
116
|
+
case options[:virtual_type].downcase
|
117
|
+
when 'static'
|
118
|
+
# for static, content is left as is
|
119
|
+
virtual_disk.add_static_file(options[:virtual_name], options[:virtual_content])
|
120
|
+
when 'mapped'
|
121
|
+
# for mapped, content is a file path
|
122
|
+
virtual_disk.add_mapped_file(options[:virtual_name], Pathname.new(File.expand_path(options[:virtual_content])))
|
123
|
+
when 'dynamic'
|
124
|
+
# for dynamic, content is a file path
|
125
|
+
virtual_disk.add_dynamic_file(options[:virtual_name]) do
|
126
|
+
File.read(options[:virtual_content])
|
127
|
+
end
|
128
|
+
else
|
129
|
+
puts "virtual type: #{options[:virtual_type]}, must be one of static, mapped, or dynamic"
|
130
|
+
exit false
|
131
|
+
end
|
132
|
+
elsif options[:virtual_content] || options[:virtual_name] || options[:virtual_type]
|
133
|
+
puts 'the --virtual-* flags are only used when all are specified'
|
134
|
+
exit false
|
135
|
+
end
|
136
|
+
|
137
|
+
server.add_share(virtual_disk)
|
138
|
+
puts "server is running"
|
139
|
+
server.run do |server_client|
|
140
|
+
puts "received connection"
|
141
|
+
true
|
142
|
+
end
|
143
|
+
|
@@ -4,18 +4,24 @@ module RubySMB
|
|
4
4
|
module Encryption
|
5
5
|
def smb3_encrypt(data)
|
6
6
|
unless @client_encryption_key
|
7
|
+
raise RubySMB::Error::EncryptionError.new('The encryption algorithm has not been set') if @encryption_algorithm.nil?
|
8
|
+
|
9
|
+
key_bit_len = OpenSSL::Cipher.new(@encryption_algorithm).key_len * 8
|
10
|
+
|
7
11
|
case @dialect
|
8
12
|
when '0x0300', '0x0302'
|
9
13
|
@client_encryption_key = RubySMB::Crypto::KDF.counter_mode(
|
10
14
|
@session_key,
|
11
15
|
"SMB2AESCCM\x00",
|
12
|
-
"ServerIn \x00"
|
16
|
+
"ServerIn \x00",
|
17
|
+
length: key_bit_len
|
13
18
|
)
|
14
19
|
when '0x0311'
|
15
20
|
@client_encryption_key = RubySMB::Crypto::KDF.counter_mode(
|
16
21
|
@session_key,
|
17
22
|
"SMBC2SCipherKey\x00",
|
18
|
-
@preauth_integrity_hash_value
|
23
|
+
@preauth_integrity_hash_value,
|
24
|
+
length: key_bit_len
|
19
25
|
)
|
20
26
|
else
|
21
27
|
raise RubySMB::Error::EncryptionError.new('Dialect is incompatible with SMBv3 encryption')
|
@@ -33,18 +39,24 @@ module RubySMB
|
|
33
39
|
|
34
40
|
def smb3_decrypt(th)
|
35
41
|
unless @server_encryption_key
|
42
|
+
raise RubySMB::Error::EncryptionError.new('The encryption algorithm has not been set') if @encryption_algorithm.nil?
|
43
|
+
|
44
|
+
key_bit_len = OpenSSL::Cipher.new(@encryption_algorithm).key_len * 8
|
45
|
+
|
36
46
|
case @dialect
|
37
47
|
when '0x0300', '0x0302'
|
38
48
|
@server_encryption_key = RubySMB::Crypto::KDF.counter_mode(
|
39
49
|
@session_key,
|
40
50
|
"SMB2AESCCM\x00",
|
41
|
-
"ServerOut\x00"
|
51
|
+
"ServerOut\x00",
|
52
|
+
length: key_bit_len
|
42
53
|
)
|
43
54
|
when '0x0311'
|
44
55
|
@server_encryption_key = RubySMB::Crypto::KDF.counter_mode(
|
45
56
|
@session_key,
|
46
57
|
"SMBS2CCipherKey\x00",
|
47
|
-
@preauth_integrity_hash_value
|
58
|
+
@preauth_integrity_hash_value,
|
59
|
+
length: key_bit_len
|
48
60
|
)
|
49
61
|
else
|
50
62
|
raise RubySMB::Error::EncryptionError.new('Dialect is incompatible with SMBv3 decryption')
|
@@ -5,7 +5,7 @@ module RubySMB
|
|
5
5
|
module Negotiation
|
6
6
|
# Handles the entire SMB Multi-Protocol Negotiation from the
|
7
7
|
# Client to the Server. It sets state on the client appropriate
|
8
|
-
# to the protocol and
|
8
|
+
# to the protocol and capabilities negotiated during the exchange.
|
9
9
|
# It also keeps track of the negotiated dialect.
|
10
10
|
#
|
11
11
|
# @return [void]
|
@@ -23,13 +23,13 @@ module RubySMB
|
|
23
23
|
update_preauth_hash(response_packet)
|
24
24
|
end
|
25
25
|
|
26
|
-
# If the response contains
|
27
|
-
# it indicates that the server
|
28
|
-
#
|
29
|
-
# request to negotiate the actual SMB 2 Protocol revision to
|
30
|
-
# The wildcard revision number is sent only in response to a
|
26
|
+
# If the response contains an SMB2 dialect and the request was SMB1;
|
27
|
+
# it indicates that the server supports SMB2 and wants to upgrade the
|
28
|
+
# connection. The server expects the client to send a subsequent SMB2
|
29
|
+
# Negotiate request to negotiate the actual SMB 2 Protocol revision to
|
30
|
+
# be used. The wildcard revision number is sent only in response to a
|
31
31
|
# multi-protocol negotiate request with the "SMB 2.???" dialect string.
|
32
|
-
if @dialect ==
|
32
|
+
if request_packet.packet_smb_version == 'SMB1' && RubySMB::Dialect[@dialect]&.order == RubySMB::Dialect::ORDER_SMB2
|
33
33
|
self.smb2_message_id += 1
|
34
34
|
version = negotiate
|
35
35
|
end
|
@@ -265,8 +265,10 @@ module RubySMB
|
|
265
265
|
nc = RubySMB::SMB2::NegotiateContext.new(
|
266
266
|
context_type: RubySMB::SMB2::NegotiateContext::SMB2_ENCRYPTION_CAPABILITIES
|
267
267
|
)
|
268
|
-
nc.data.ciphers << RubySMB::SMB2::EncryptionCapabilities::
|
268
|
+
nc.data.ciphers << RubySMB::SMB2::EncryptionCapabilities::AES_256_GCM
|
269
|
+
nc.data.ciphers << RubySMB::SMB2::EncryptionCapabilities::AES_256_CCM
|
269
270
|
nc.data.ciphers << RubySMB::SMB2::EncryptionCapabilities::AES_128_GCM
|
271
|
+
nc.data.ciphers << RubySMB::SMB2::EncryptionCapabilities::AES_128_CCM
|
270
272
|
packet.add_negotiate_context(nc)
|
271
273
|
|
272
274
|
nc = RubySMB::SMB2::NegotiateContext.new(
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileAccessInformation Class as defined in
|
5
|
+
# [2.4.1 FileAccessInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/01cf43d2-deb3-40d3-a39b-9e68693d7c90)
|
6
|
+
class FileAccessInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_ACCESS_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :access_flags, label: 'Access Flags'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileAlignmentInformation Class as defined in
|
5
|
+
# [2.4.3 FileAlignmentInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/9b0b9971-85aa-4651-8438-f1c4298bcb0d)
|
6
|
+
class FileAlignmentInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_ALIGNMENT_INFORMATION
|
8
|
+
|
9
|
+
# If this value is specified, there are no alignment requirements for the device.
|
10
|
+
FILE_BYTE_ALIGNMENT = 0x00000000 # 0
|
11
|
+
|
12
|
+
# If this value is specified, data MUST be aligned on a 2-byte boundary.
|
13
|
+
FILE_WORD_ALIGNMENT = 0x00000001 # 1
|
14
|
+
|
15
|
+
# If this value is specified, data MUST be aligned on a 4-byte boundary.
|
16
|
+
FILE_LONG_ALIGNMENT = 0x00000003 # 3
|
17
|
+
|
18
|
+
# If this value is specified, data MUST be aligned on an 8-byte boundary.
|
19
|
+
FILE_QUAD_ALIGNMENT = 0x00000007 # 7
|
20
|
+
|
21
|
+
# If this value is specified, data MUST be aligned on a 16-byte boundary.
|
22
|
+
FILE_OCTA_ALIGNMENT = 0X0000000F # 15
|
23
|
+
|
24
|
+
# If this value is specified, data MUST be aligned on a 32-byte boundary.
|
25
|
+
FILE_32_BYTE_ALIGNMENT = 0X0000001F # 31
|
26
|
+
|
27
|
+
# If this value is specified, data MUST be aligned on a 64-byte boundary.
|
28
|
+
FILE_64_BYTE_ALIGNMENT = 0X0000003F # 63
|
29
|
+
|
30
|
+
# If this value is specified, data MUST be aligned on a 128-byte boundary.
|
31
|
+
FILE_128_BYTE_ALIGNMENT = 0X0000007F # 127
|
32
|
+
|
33
|
+
# If this value is specified, data MUST be aligned on a 256-byte boundary.
|
34
|
+
FILE_256_BYTE_ALIGNMENT = 0X000000FF # 255
|
35
|
+
|
36
|
+
# If this value is specified, data MUST be aligned on a 512-byte boundary.
|
37
|
+
FILE_512_BYTE_ALIGNMENT = 0X000001FF # 511
|
38
|
+
|
39
|
+
endian :little
|
40
|
+
|
41
|
+
uint32 :alignment_requirement, label: 'Alignment Requirement', initial_value: FILE_BYTE_ALIGNMENT
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileAllInformation Class as defined in
|
5
|
+
# [2.4.2 FileAllInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/95f3056a-ebc1-4f5d-b938-3f68a44677a6)
|
6
|
+
class FileAllInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_ALL_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
file_basic_information :basic_information, label: 'Basic Information'
|
12
|
+
file_standard_information :standard_information, label: 'Standard Information'
|
13
|
+
file_internal_information :internal_information, label: 'Internal Information'
|
14
|
+
file_ea_information :ea_information, label: 'EA Information'
|
15
|
+
file_access_information :access_information, label: 'Access Information'
|
16
|
+
file_position_information :position_information, label: 'Position Information'
|
17
|
+
file_mode_information :mode_information, label: 'Mode Information'
|
18
|
+
file_alignment_information :alignment_information, label: 'Alignment Information'
|
19
|
+
file_name_information :name_information, label: 'Name Information'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileBasicInformation Class as defined in
|
5
|
+
# [2.4.7 FileBasicInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/16023025-8a78-492f-8b96-c873b042ac50)
|
6
|
+
class FileBasicInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_BASIC_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
file_time :create_time, label: 'Create Time'
|
12
|
+
file_time :last_access, label: 'Last Accessed Time'
|
13
|
+
file_time :last_write, label: 'Last Write Time'
|
14
|
+
file_time :last_change, label: 'Last Modified Time'
|
15
|
+
file_attributes :file_attributes, label: 'File Attributes'
|
16
|
+
string :reserved, label: 'Reserved', length: 4
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -2,7 +2,7 @@ module RubySMB
|
|
2
2
|
module Fscc
|
3
3
|
module FileInformation
|
4
4
|
# The FileBothDirectoryInformation Class as defined in
|
5
|
-
# [2.4.8 FileBothDirectoryInformation](https://
|
5
|
+
# [2.4.8 FileBothDirectoryInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/270df317-9ba5-4ccb-ba00-8d22be139bc5)
|
6
6
|
class FileBothDirectoryInformation < BinData::Record
|
7
7
|
CLASS_LEVEL = FileInformation::FILE_BOTH_DIRECTORY_INFORMATION
|
8
8
|
|
@@ -14,8 +14,8 @@ module RubySMB
|
|
14
14
|
file_time :last_access, label: 'Last Accessed Time'
|
15
15
|
file_time :last_write, label: 'Last Write Time'
|
16
16
|
file_time :last_change, label: 'Last Modified Time'
|
17
|
-
|
18
|
-
|
17
|
+
int64 :end_of_file, label: 'End of File'
|
18
|
+
int64 :allocation_size, label: 'Allocated Size'
|
19
19
|
file_attributes :file_attributes, label: 'File Attributes'
|
20
20
|
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
21
|
uint32 :ea_size, label: 'Extended Attributes Size'
|
@@ -2,7 +2,7 @@ module RubySMB
|
|
2
2
|
module Fscc
|
3
3
|
module FileInformation
|
4
4
|
# The FileDirectoryInformation Class as defined in
|
5
|
-
# [2.4.10 FileDirectoryInformation](https://
|
5
|
+
# [2.4.10 FileDirectoryInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/b38bf518-9057-4c88-9ddd-5e2d3976a64b)
|
6
6
|
class FileDirectoryInformation < BinData::Record
|
7
7
|
CLASS_LEVEL = FileInformation::FILE_DIRECTORY_INFORMATION
|
8
8
|
|
@@ -14,8 +14,8 @@ module RubySMB
|
|
14
14
|
file_time :last_access, label: 'Last Accessed Time'
|
15
15
|
file_time :last_write, label: 'Last Write Time'
|
16
16
|
file_time :last_change, label: 'Last Modified Time'
|
17
|
-
|
18
|
-
|
17
|
+
int64 :end_of_file, label: 'End of File'
|
18
|
+
int64 :allocation_size, label: 'Allocated Size'
|
19
19
|
file_attributes :file_attributes, label: 'File Attributes'
|
20
20
|
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
21
|
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
@@ -2,7 +2,7 @@ module RubySMB
|
|
2
2
|
module Fscc
|
3
3
|
module FileInformation
|
4
4
|
# The FileFullDirectoryInformation Class as defined in
|
5
|
-
# [2.4.14 FileFullDirectoryInformation](https://
|
5
|
+
# [2.4.14 FileFullDirectoryInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/e8d926d1-3a22-4654-be9c-58317a85540b)
|
6
6
|
class FileFullDirectoryInformation < BinData::Record
|
7
7
|
CLASS_LEVEL = FileInformation::FILE_FULL_DIRECTORY_INFORMATION
|
8
8
|
|
@@ -14,8 +14,8 @@ module RubySMB
|
|
14
14
|
file_time :last_access, label: 'Last Accessed Time'
|
15
15
|
file_time :last_write, label: 'Last Write Time'
|
16
16
|
file_time :last_change, label: 'Last Modified Time'
|
17
|
-
|
18
|
-
|
17
|
+
int64 :end_of_file, label: 'End of File'
|
18
|
+
int64 :allocation_size, label: 'Allocated Size'
|
19
19
|
file_attributes :file_attributes, label: 'File Attributes'
|
20
20
|
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
21
|
uint32 :ea_size, label: 'Extended Attributes Size'
|
@@ -14,8 +14,8 @@ module RubySMB
|
|
14
14
|
file_time :last_access, label: 'Last Accessed Time'
|
15
15
|
file_time :last_write, label: 'Last Write Time'
|
16
16
|
file_time :last_change, label: 'Last Modified Time'
|
17
|
-
|
18
|
-
|
17
|
+
int64 :end_of_file, label: 'End of File'
|
18
|
+
int64 :allocation_size, label: 'Allocated Size'
|
19
19
|
file_attributes :file_attributes, label: 'File Attributes'
|
20
20
|
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
21
|
uint32 :ea_size, label: 'Extended Attributes Size'
|
@@ -23,7 +23,7 @@ module RubySMB
|
|
23
23
|
uint8 :reserved, label: 'Reserved Space'
|
24
24
|
string16 :short_name, label: 'File Short Name', length: 24
|
25
25
|
uint16 :reserved2, label: 'Reserved Space'
|
26
|
-
uint64 :file_id, label: 'File
|
26
|
+
uint64 :file_id, label: 'File ID'
|
27
27
|
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
28
28
|
end
|
29
29
|
end
|
@@ -2,7 +2,7 @@ module RubySMB
|
|
2
2
|
module Fscc
|
3
3
|
module FileInformation
|
4
4
|
# The FileIdDirectoryInformation Class as defined in
|
5
|
-
# [2.4.18 FileIdFullDirectoryInformation](https://
|
5
|
+
# [2.4.18 FileIdFullDirectoryInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/ab8e7558-899c-4be1-a7c5-3a9ae8ab76a0)
|
6
6
|
class FileIdFullDirectoryInformation < BinData::Record
|
7
7
|
CLASS_LEVEL = FileInformation::FILE_ID_FULL_DIRECTORY_INFORMATION
|
8
8
|
|
@@ -14,8 +14,8 @@ module RubySMB
|
|
14
14
|
file_time :last_access, label: 'Last Accessed Time'
|
15
15
|
file_time :last_write, label: 'Last Write Time'
|
16
16
|
file_time :last_change, label: 'Last Modified Time'
|
17
|
-
|
18
|
-
|
17
|
+
int64 :end_of_file, label: 'End of File'
|
18
|
+
int64 :allocation_size, label: 'Allocated Size'
|
19
19
|
file_attributes :file_attributes, label: 'File Attributes'
|
20
20
|
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
21
|
uint32 :ea_size, label: 'Extended Attributes Size'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileInternalInformation Class as defined in
|
5
|
+
# [2.4.22 FileInternalInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/7d796611-2fa5-41ac-8178-b6fea3a017b3)
|
6
|
+
class FileInternalInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_INTERNAL_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint64 :file_id, label: 'File ID'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileModeInformation Class as defined in
|
5
|
+
# [2.4.26 FileModeInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/52df7798-8330-474b-ac31-9afe8075640c)
|
6
|
+
class FileModeInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_MODE_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
struct :flags do
|
12
|
+
bit2 :reserved
|
13
|
+
bit1 :file_synchronous_io_nonalert, label: 'File Synchronous IO Nonalert'
|
14
|
+
bit1 :file_synchronous_io_alert, label: 'File Synchronous IO Alert'
|
15
|
+
bit1 :file_no_intermediate_buffering, label: 'File No Intermediate Buffering'
|
16
|
+
bit1 :file_sequential_only, label: 'File Sequential Only'
|
17
|
+
bit1 :file_write_through, label: 'File Write Through'
|
18
|
+
bit1 :reserved2
|
19
|
+
# byte boundary
|
20
|
+
bit3 :reserved3
|
21
|
+
bit1 :file_delete_on_close, label: 'File Delete On Close'
|
22
|
+
bit4 :reserved4
|
23
|
+
# byte boundary
|
24
|
+
bit16 :reserved5
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileNameInformation Class as defined in
|
5
|
+
# [2.4.27 FileNameInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/cb30e415-54c5-4483-a346-822ea90e1e89)
|
6
|
+
class FileNameInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_NAME_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
12
|
+
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -2,7 +2,7 @@ module RubySMB
|
|
2
2
|
module Fscc
|
3
3
|
module FileInformation
|
4
4
|
# The FileNamesInformation Class as defined in
|
5
|
-
# [2.4.
|
5
|
+
# [2.4.28 FileNamesInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/a289f7a8-83d2-4927-8c88-b2d328dde5a5)
|
6
6
|
class FileNamesInformation < BinData::Record
|
7
7
|
CLASS_LEVEL = FileInformation::FILE_NAMES_INFORMATION
|
8
8
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileNormalizedNameInformation Class as defined in
|
5
|
+
# [2.4.30 FileNormalizedNameInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/20bcadba-808c-4880-b757-4af93e41edf6)
|
6
|
+
class FileNormalizedNameInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_NORMALIZED_NAME_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
12
|
+
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FilePositionInformation Class as defined in
|
5
|
+
# [2.4.35 FilePositionInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/e3ce4a39-327e-495c-99b6-6b61606b6f16)
|
6
|
+
class FilePositionInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_POSITION_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
int64 :current_byte_offset, label: 'Current Byte Offset'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -4,7 +4,7 @@ module RubySMB
|
|
4
4
|
# The FileRenameInformation Class as defined in
|
5
5
|
# [2.4.34.2 FileRenameInformation](https://msdn.microsoft.com/en-us/library/cc704597.aspx)
|
6
6
|
class FileRenameInformation < BinData::Record
|
7
|
-
CLASS_LEVEL = FileInformation::
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_RENAME_INFORMATION
|
8
8
|
|
9
9
|
endian :little
|
10
10
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileStandardInformation Class as defined in
|
5
|
+
# [2.4.41 FileStandardInformation](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/5afa7f66-619c-48f3-955f-68c4ece704ae)
|
6
|
+
class FileStandardInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_STANDARD_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
int64 :allocation_size, label: 'Allocation Size'
|
12
|
+
int64 :end_of_file, label: 'End of File'
|
13
|
+
uint32 :number_of_links, label: 'Number of Links'
|
14
|
+
int8 :delete_pending, label: 'Delete Pending'
|
15
|
+
int8 :directory, label: 'Directory'
|
16
|
+
string :reserved, label: 'Reserved', length: 2
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|