@@ -7,16 +7,59 @@ module InformationLevel
7
7
# This mixin provides methods to handle TRAN2_QUERY_PATH_INFORMATION subcommands
8
8
module Query
9
9
10
- # shortcut.. always send OBJECT_NAME_NOT_FOUND
11
- def smb_cmd_trans_query_file_info_basic ( c , buff )
10
+ #
11
+ # Responds to QUERY_PATH_INFO (Basic) requests
12
+ #
13
+ def smb_cmd_trans_query_file_info_basic ( c , fid )
14
+ smb = @state [ c ]
12
15
pkt = CONST ::SMB_TRANS_RES_PKT . make_struct
13
16
smb_set_defaults ( c , pkt )
17
+
18
+ if fid . eql? smb [ :file_id ] . to_i
19
+ attrib = CONST ::SMB_EXT_FILE_ATTR_NORMAL # File attributes => file
20
+ elsif fid . nil? || fid . empty? || fid == "\x00 " # empty path
21
+ # QUERY_PATH_INFO_PARAMETERS doesn't include a file name, return a Directory answer
22
+ attrib = CONST ::SMB_EXT_FILE_ATTR_DIRECTORY # File attributes => directory
23
+ else
24
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Command' ] = CONST ::SMB_COM_TRANSACTION2
25
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'ErrorClass' ] = CONST ::SMB_STATUS_OBJECT_NAME_NOT_FOUND # OBJECT_NAME_NOT_FOUND
26
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Flags1' ] = FLAGS
27
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Flags2' ] = FLAGS2
28
+ c . put ( pkt . to_s )
29
+ return
30
+ end
31
+
32
+ trans2_params = CONST ::SMB_TRANS2_QUERY_PATH_INFORMATION_RES_PARAMETERS . make_struct
33
+ trans2_params . v [ 'EaErrorOffset' ] = 0
34
+
35
+ query_path_info = CONST ::SMB_QUERY_FILE_BASIC_INFO_HDR . make_struct
36
+ query_path_info . v [ 'loCreationTime' ] = lo
37
+ query_path_info . v [ 'hiCreationTime' ] = hi
38
+ query_path_info . v [ 'loLastAccessTime' ] = lo
39
+ query_path_info . v [ 'hiLastAccessTime' ] = hi
40
+ query_path_info . v [ 'loLastWriteTime' ] = lo
41
+ query_path_info . v [ 'hiLastWriteTime' ] = hi
42
+ query_path_info . v [ 'loLastChangeTime' ] = lo
43
+ query_path_info . v [ 'hiLastChangeTime' ] = hi
44
+ query_path_info . v [ 'ExtFileAttributes' ] = attrib
45
+
14
46
pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Command' ] = CONST ::SMB_COM_TRANSACTION2
15
- pkt [ 'Payload' ] [ 'SMB' ] . v [ 'ErrorClass' ] = CONST ::SMB_STATUS_OBJECT_NAME_NOT_FOUND
16
47
pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Flags1' ] = FLAGS
17
48
pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Flags2' ] = FLAGS2
49
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'WordCount' ] = 10
50
+ pkt [ 'Payload' ] . v [ 'ParamCountTotal' ] = trans2_params . to_s . length
51
+ pkt [ 'Payload' ] . v [ 'DataCountTotal' ] = query_path_info . to_s . length
52
+ pkt [ 'Payload' ] . v [ 'ParamCount' ] = trans2_params . to_s . length
53
+ pkt [ 'Payload' ] . v [ 'ParamOffset' ] = CONST ::SMB_TRANS_RES_PKT_LENGTH
54
+ pkt [ 'Payload' ] . v [ 'DataCount' ] = query_path_info . to_s . length
55
+ pkt [ 'Payload' ] . v [ 'DataOffset' ] = CONST ::SMB_TRANS_RES_PKT_LENGTH + trans2_params . to_s . length + UNICODE_NULL_LENGTH
56
+ pkt [ 'Payload' ] . v [ 'Payload' ] =
57
+ "\x00 " + # Padding
58
+ trans2_params . to_s +
59
+ "\x00 \x00 " + # Padding
60
+ query_path_info . to_s
61
+
18
62
c . put ( pkt . to_s )
19
- return
20
63
end
21
64
22
65
# shortcut, we only have one file....
@@ -113,7 +156,6 @@ def smb_cmd_trans_query_path_info_basic(c, path)
113
156
c . put ( pkt . to_s )
114
157
end
115
158
116
-
117
159
#
118
160
# Responds to QUERY_PATH_INFO (Standard) requests
119
161
#
@@ -123,10 +165,8 @@ def smb_cmd_trans_query_path_info_standard(c, path)
123
165
pkt = CONST ::SMB_TRANS_RES_PKT . make_struct
124
166
smb_set_defaults ( c , pkt )
125
167
126
- if path && path . ends_with ?( file_name ) #TODO: do it better
168
+ if path && path . include ?( file_name ) #TODO: do it better
127
169
attrib = 0 # File attributes => file
128
- elsif path && path . ends_with? ( file_name + '.Local' )
129
- attrib = 1 # File attributes => file
130
170
elsif path && path == path_name
131
171
# QUERY_PATH_INFO_PARAMETERS doesn't include a file name, return a Directory answer
132
172
attrib = 1 # File attributes => directory
@@ -174,61 +214,68 @@ def smb_cmd_trans_query_path_info_standard(c, path)
174
214
c . put ( pkt . to_s )
175
215
end
176
216
177
- =begin
178
217
#
179
- # Responds to QUERY_FILE_INFO (Network) requests
180
- # Is it needed?
181
- def smb_cmd_trans_query_file_info_network(c, buff)
182
- pkt = CONST::SMB_TRANS2_PKT.make_struct
183
- pkt.from_s(buff)
184
-
185
- payload = pkt['Payload'].v['SetupData'].gsub(/\x00/, '').gsub(/.*\\/, '').chomp.strip
218
+ # Responds to QUERY_PATH_INFO (Network Open) requests
219
+ #
220
+ # At the moment we just support '\\' path always send a SUCCESS...
221
+ def smb_cmd_trans_query_path_info_network ( c , path )
186
222
187
- dprint("[smb_cmd_trans_query_file_info_network] Payload length: #{payload.length.to_s}")
188
- dprint("[smb_cmd_trans_query_file_info_network] Payload is : #{payload.to_s}" )
223
+ pkt = CONST :: SMB_TRANS_RES_PKT . make_struct
224
+ smb_set_defaults ( c , pkt )
189
225
190
- if payload.length.to_s.eql?('4')
191
- attrib = "\x10\x00\x00\x00" # File attributes => directory
226
+ if path && path . include? ( file_name ) #TODO: do it better
227
+ attrib = 0 # File attributes => file
228
+ elsif path && path == path_name
229
+ # QUERY_PATH_INFO_PARAMETERS doesn't include a file name, return a Directory answer
230
+ attrib = CONST ::SMB_EXT_FILE_ATTR_DIRECTORY # File attributes => directory
231
+ elsif path . nil? || path . empty? || path == "\x00 " # empty path
232
+ # QUERY_PATH_INFO_PARAMETERS doesn't include a file name, return a Directory answer
233
+ attrib = CONST ::SMB_EXT_FILE_ATTR_DIRECTORY # File attributes => directory
192
234
else
193
- attrib = "\x80\x00\x00\x00" # File attributes => normal file
235
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Command' ] = CONST ::SMB_COM_TRANSACTION2
236
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'ErrorClass' ] = CONST ::SMB_STATUS_OBJECT_NAME_NOT_FOUND # OBJECT_NAME_NOT_FOUND
237
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Flags1' ] = 0x88
238
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Flags2' ] = FLAGS2
239
+ c . put ( pkt . to_s )
240
+ return
194
241
end
195
242
243
+ trans2_params = CONST ::SMB_TRANS2_QUERY_PATH_INFORMATION_RES_PARAMETERS . make_struct
244
+ trans2_params . v [ 'EaErrorOffset' ] = 0
245
+
246
+ query_path_info = CONST ::SMB_QUERY_FILE_NETWORK_INFO_HDR . make_struct
247
+ query_path_info . v [ 'loCreationTime' ] = lo
248
+ query_path_info . v [ 'hiCreationTime' ] = hi
249
+ query_path_info . v [ 'loLastAccessTime' ] = lo
250
+ query_path_info . v [ 'hiLastAccessTime' ] = hi
251
+ query_path_info . v [ 'loLastWriteTime' ] = lo
252
+ query_path_info . v [ 'hiLastWriteTime' ] = hi
253
+ query_path_info . v [ 'loLastChangeTime' ] = lo
254
+ query_path_info . v [ 'hiLastChangeTime' ] = hi
255
+ query_path_info . v [ 'AllocationSize' ] = 1048576
256
+ query_path_info . v [ 'EndOfFile' ] = exe_contents . length
257
+ query_path_info . v [ 'ExtFileAttributes' ] = attrib
258
+
196
259
pkt = CONST ::SMB_TRANS_RES_PKT . make_struct
197
260
smb_set_defaults ( c , pkt )
198
261
199
262
pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Command' ] = CONST ::SMB_COM_TRANSACTION2
200
- pkt['Payload']['SMB'].v['Flags1'] = 0x88
263
+ pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Flags1' ] = FLAGS
201
264
pkt [ 'Payload' ] [ 'SMB' ] . v [ 'Flags2' ] = FLAGS2
202
265
pkt [ 'Payload' ] [ 'SMB' ] . v [ 'WordCount' ] = 10
203
- pkt['Payload'].v['ParamCountTotal'] = 2
204
- pkt['Payload'].v['DataCountTotal'] = 56
205
- pkt['Payload'].v['ParamCount'] = 2
206
- pkt['Payload'].v['ParamOffset'] = 56
207
- pkt['Payload'].v['DataCount'] = 56
208
- pkt['Payload'].v['DataOffset'] = 60
266
+ pkt [ 'Payload' ] . v [ 'ParamCountTotal' ] = trans2_params . to_s . length
267
+ pkt [ 'Payload' ] . v [ 'DataCountTotal' ] = query_path_info . to_s . length + UNICODE_NULL_LENGTH
268
+ pkt [ 'Payload' ] . v [ 'ParamCount' ] = trans2_params . to_s . length
269
+ pkt [ 'Payload' ] . v [ 'ParamOffset' ] = CONST :: SMB_TRANS_RES_PKT_LENGTH
270
+ pkt [ 'Payload' ] . v [ 'DataCount' ] = query_path_info . to_s . length + UNICODE_NULL_LENGTH
271
+ pkt [ 'Payload' ] . v [ 'DataOffset' ] = CONST :: SMB_TRANS_RES_PKT_LENGTH + trans2_params . to_s . length + UNICODE_NULL_LENGTH
209
272
pkt [ 'Payload' ] . v [ 'Payload' ] =
210
273
"\x00 " + # Padding
211
- # QUERY_PATH_INFO Parameters
212
- "\x00\x00" + # EA Error Offset
274
+ trans2_params . to_s +
213
275
"\x00 \x00 " + # Padding
214
- # QUERY_PATH_INFO Data
215
- [lo, hi].pack("VV") + # Created
216
- [lo, hi].pack("VV") + # Last Access
217
- [lo, hi].pack("VV") + # Last Write
218
- [lo, hi].pack("VV") + # Change
219
- "\x00\x00\x10\x00\x00\x00\x00\x00" + # Allocation Size = 1048576 || 1Mb
220
- [exe_contents.length].pack("V") + "\x00\x00\x00\x00" + # End Of File
221
- attrib +
222
- "\x00\x00\x00\x00" # Unknown
223
-
224
- my_pkt = pkt.to_s
225
- original_length = my_pkt[2, 2].unpack("n").first
226
- original_length = original_length + 24
227
- my_pkt[2, 2] = [original_length].pack("n")
228
- new_length = my_pkt[2, 2].unpack("n").first
276
+ query_path_info . to_s
229
277
c . put ( pkt . to_s )
230
278
end
231
- =end
232
279
end
233
280
end
234
281
end
0 commit comments