1 # Copyright (c) 2003-2016 CORE Security Technologies
3 # This software is provided under under a slightly modified version
4 # of the Apache Software License. See the accompanying LICENSE file
5 # for more information.
7 # Author: Alberto Solino (@agsolino)
10 # SMB 2 and 3 Protocol Structures and constants [MS-SMB2]
13 from impacket.structure import Structure
21 SMB2_NEGOTIATE = 0x0000 #
22 SMB2_SESSION_SETUP = 0x0001 #
23 SMB2_LOGOFF = 0x0002 #
24 SMB2_TREE_CONNECT = 0x0003 #
25 SMB2_TREE_DISCONNECT = 0x0004 #
26 SMB2_CREATE = 0x0005 #
33 SMB2_CANCEL = 0x000C #
35 SMB2_QUERY_DIRECTORY = 0x000E #
36 SMB2_CHANGE_NOTIFY = 0x000F
37 SMB2_QUERY_INFO = 0x0010 #
38 SMB2_SET_INFO = 0x0011
39 SMB2_OPLOCK_BREAK = 0x0012
42 SMB2_FLAGS_SERVER_TO_REDIR = 0x00000001
43 SMB2_FLAGS_ASYNC_COMMAND = 0x00000002
44 SMB2_FLAGS_RELATED_OPERATIONS = 0x00000004
45 SMB2_FLAGS_SIGNED = 0x00000008
46 SMB2_FLAGS_DFS_OPERATIONS = 0x10000000
47 SMB2_FLAGS_REPLAY_OPERATION = 0x80000000
49 # SMB Error SymLink Flags
50 SYMLINK_FLAG_ABSOLUTE = 0x0
51 SYMLINK_FLAG_RELATIVE = 0x1
55 SMB2_NEGOTIATE_SIGNING_ENABLED = 0x1
56 SMB2_NEGOTIATE_SIGNING_REQUIRED = 0x2
59 SMB2_GLOBAL_CAP_DFS = 0x01
60 SMB2_GLOBAL_CAP_LEASING = 0x02
61 SMB2_GLOBAL_CAP_LARGE_MTU = 0x04
62 SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x08
63 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10
64 SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x20
65 SMB2_GLOBAL_CAP_ENCRYPTION = 0x40
68 SMB2_DIALECT_002 = 0x0202
69 SMB2_DIALECT_21 = 0x0210
70 SMB2_DIALECT_30 = 0x0300
71 SMB2_DIALECT_WILDCARD = 0x02FF
75 SMB2_SESSION_FLAG_BINDING = 0x01
76 SMB2_SESSION_FLAG_IS_GUEST = 0x01
77 SMB2_SESSION_FLAG_IS_NULL = 0x02
78 SMB2_SESSION_FLAG_ENCRYPT_DATA = 0x04
82 SMB2_SHARE_TYPE_DISK = 0x1
83 SMB2_SHARE_TYPE_PIPE = 0x2
84 SMB2_SHARE_TYPE_PRINT = 0x3
87 SMB2_SHAREFLAG_MANUAL_CACHING = 0x00000000
88 SMB2_SHAREFLAG_AUTO_CACHING = 0x00000010
89 SMB2_SHAREFLAG_VDO_CACHING = 0x00000020
90 SMB2_SHAREFLAG_NO_CACHING = 0x00000030
91 SMB2_SHAREFLAG_DFS = 0x00000001
92 SMB2_SHAREFLAG_DFS_ROOT = 0x00000002
93 SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS = 0x00000100
94 SMB2_SHAREFLAG_FORCE_SHARED_DELETE = 0x00000200
95 SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING = 0x00000400
96 SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM = 0x00000800
97 SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK = 0x00001000
98 SMB2_SHAREFLAG_ENABLE_HASH_V1 = 0x00002000
99 SMB2_SHAREFLAG_ENABLE_HASH_V2 = 0x00004000
100 SMB2_SHAREFLAG_ENCRYPT_DATA = 0x00008000
103 SMB2_SHARE_CAP_DFS = 0x00000008
104 SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY = 0x00000010
105 SMB2_SHARE_CAP_SCALEOUT = 0x00000020
106 SMB2_SHARE_CAP_CLUSTER = 0x00000040
110 SMB2_OPLOCK_LEVEL_NONE = 0x00
111 SMB2_OPLOCK_LEVEL_II = 0x01
112 SMB2_OPLOCK_LEVEL_EXCLUSIVE = 0x08
113 SMB2_OPLOCK_LEVEL_BATCH = 0x09
114 SMB2_OPLOCK_LEVEL_LEASE = 0xFF
116 # Impersonation Level
117 SMB2_IL_ANONYMOUS = 0x00000000
118 SMB2_IL_IDENTIFICATION = 0x00000001
119 SMB2_IL_IMPERSONATION = 0x00000002
120 SMB2_IL_DELEGATE = 0x00000003
123 FILE_ATTRIBUTE_ARCHIVE = 0x00000020
124 FILE_ATTRIBUTE_COMPRESSED = 0x00000800
125 FILE_ATTRIBUTE_DIRECTORY = 0x00000010
126 FILE_ATTRIBUTE_ENCRYPTED = 0x00004000
127 FILE_ATTRIBUTE_HIDDEN = 0x00000002
128 FILE_ATTRIBUTE_NORMAL = 0x00000080
129 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000
130 FILE_ATTRIBUTE_OFFLINE = 0x00001000
131 FILE_ATTRIBUTE_READONLY = 0x00000001
132 FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
133 FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200
134 FILE_ATTRIBUTE_SYSTEM = 0x00000004
135 FILE_ATTRIBUTE_TEMPORARY = 0x00000100
136 FILE_ATTRIBUTE_INTEGRITY_STREAM = 0x00000800
137 FILE_ATTRIBUTE_NO_SCRUB_DATA = 0x00020000
140 FILE_SHARE_READ = 0x00000001
141 FILE_SHARE_WRITE = 0x00000002
142 FILE_SHARE_DELETE = 0x00000004
145 FILE_SUPERSEDE = 0x00000000
146 FILE_OPEN = 0x00000001
147 FILE_CREATE = 0x00000002
148 FILE_OPEN_IF = 0x00000003
149 FILE_OVERWRITE = 0x00000004
150 FILE_OVERWRITE_IF = 0x00000005
153 FILE_DIRECTORY_FILE = 0x00000001
154 FILE_WRITE_THROUGH = 0x00000002
155 FILE_SEQUENTIAL_ONLY = 0x00000004
156 FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008
157 FILE_SYNCHRONOUS_IO_ALERT = 0x00000010
158 FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020
159 FILE_NON_DIRECTORY_FILE = 0x00000040
160 FILE_COMPLETE_IF_OPLOCKED = 0x00000100
161 FILE_NO_EA_KNOWLEDGE = 0x00000200
162 FILE_RANDOM_ACCESS = 0x00000800
163 FILE_DELETE_ON_CLOSE = 0x00001000
164 FILE_OPEN_BY_FILE_ID = 0x00002000
165 FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000
166 FILE_NO_COMPRESSION = 0x00008000
167 FILE_RESERVE_OPFILTER = 0x00100000
168 FILE_OPEN_REPARSE_POINT = 0x00200000
169 FILE_OPEN_NO_RECALL = 0x00400000
170 FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000
172 # File Access Mask / Desired Access
173 FILE_READ_DATA = 0x00000001
174 FILE_WRITE_DATA = 0x00000002
175 FILE_APPEND_DATA = 0x00000004
176 FILE_READ_EA = 0x00000008
177 FILE_WRITE_EA = 0x00000010
178 FILE_EXECUTE = 0x00000020
179 FILE_READ_ATTRIBUTES = 0x00000080
180 FILE_WRITE_ATTRIBUTES = 0x00000100
182 READ_CONTROL = 0x00020000
183 WRITE_DAC = 0x00040000
184 WRITE_OWNER = 0x00080000
185 SYNCHRONIZE = 0x00100000
186 ACCESS_SYSTEM_SECURITY = 0x01000000
187 MAXIMUM_ALLOWED = 0x02000000
188 GENERIC_ALL = 0x10000000
189 GENERIC_EXECUTE = 0x20000000
190 GENERIC_WRITE = 0x40000000
191 GENERIC_READ = 0x80000000
193 # Directory Access Mask
194 FILE_LIST_DIRECTORY = 0x00000001
195 FILE_ADD_FILE = 0x00000002
196 FILE_ADD_SUBDIRECTORY = 0x00000004
197 FILE_TRAVERSE = 0x00000020
198 FILE_DELETE_CHILD = 0x00000040
201 SMB2_CREATE_EA_BUFFER = 0x45787441
202 SMB2_CREATE_SD_BUFFER = 0x53656344
203 SMB2_CREATE_DURABLE_HANDLE_REQUEST = 0x44486e51
204 SMB2_CREATE_DURABLE_HANDLE_RECONNECT = 0x44486e43
205 SMB2_CREATE_ALLOCATION_SIZE = 0x416c5369
206 SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST = 0x4d784163
207 SMB2_CREATE_TIMEWARP_TOKEN = 0x54577270
208 SMB2_CREATE_QUERY_ON_DISK_ID = 0x51466964
209 SMB2_CREATE_REQUEST = 0x52714c73
210 SMB2_CREATE_REQUEST_LEASE_V2 = 0x52714c73
211 SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 = 0x44483251
212 SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 = 0x44483243
213 SMB2_CREATE_APP_INSTANCE_ID = 0x45BCA66AEFA7F74A9008FA462E144D74
216 SMB2_CREATE_FLAG_REPARSEPOINT = 0x1
220 FILE_SUPERSEDED = 0x00000000
221 FILE_OPENED = 0x00000001
222 FILE_CREATED = 0x00000002
223 FILE_OVERWRITTEN = 0x00000003
225 # SMB2_CREATE_REQUEST_LEASE states
226 SMB2_LEASE_NONE = 0x00
227 SMB2_LEASE_READ_CACHING = 0x01
228 SMB2_LEASE_HANDLE_CACHING = 0x02
229 SMB2_LEASE_WRITE_CACHING = 0x04
231 # SMB2_CREATE_REQUEST_LEASE_V2 Flags
232 SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET = 0x4
234 # SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 Flags
235 SMB2_DHANDLE_FLAG_PERSISTENT = 0x02
239 SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB = 0x0001
243 SMB2_CHANNEL_NONE = 0x00
244 SMB2_CHANNEL_RDMA_V1 = 0x01
248 SMB2_WRITEFLAG_WRITE_THROUGH = 0x01
250 # Lease Break Notification
251 SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED = 0x01
255 SMB2_LOCKFLAG_SHARED_LOCK = 0x01
256 SMB2_LOCKFLAG_EXCLUSIVE_LOCK = 0x02
257 SMB2_LOCKFLAG_UNLOCK = 0x04
258 SMB2_LOCKFLAG_FAIL_IMMEDIATELY = 0x10
262 FSCTL_DFS_GET_REFERRALS = 0x00060194
263 FSCTL_PIPE_PEEK = 0x0011400C
264 FSCTL_PIPE_WAIT = 0x00110018
265 FSCTL_PIPE_TRANSCEIVE = 0x0011C017
266 FSCTL_SRV_COPYCHUNK = 0x001440F2
267 FSCTL_SRV_ENUMERATE_SNAPSHOTS = 0x00144064
268 FSCTL_SRV_REQUEST_RESUME_KEY = 0x00140078
269 FSCTL_SRV_READ_HASH = 0x001441bb
270 FSCTL_SRV_COPYCHUNK_WRITE = 0x001480F2
271 FSCTL_LMR_REQUEST_RESILIENCY = 0x001401D4
272 FSCTL_QUERY_NETWORK_INTERFACE_INFO = 0x001401FC
273 FSCTL_SET_REPARSE_POINT = 0x000900A4
274 FSCTL_DFS_GET_REFERRALS_EX = 0x000601B0
275 FSCTL_FILE_LEVEL_TRIM = 0x00098208
276 FSCTL_VALIDATE_NEGOTIATE_INFO = 0x00140204
279 SMB2_0_IOCTL_IS_FSCTL = 0x1
283 SRV_HASH_TYPE_PEER_DIST = 0x01
290 SRV_HASH_RETRIEVE_HASH_BASED = 0x01
291 SRV_HASH_RETRIEVE_FILE_BASED = 0x02
293 # NETWORK_INTERFACE_INFO
298 # SMB2_QUERY_DIRECTORIES
300 FILE_DIRECTORY_INFORMATION = 0x01
301 FILE_FULL_DIRECTORY_INFORMATION = 0x02
302 FILEID_FULL_DIRECTORY_INFORMATION = 0x26
303 FILE_BOTH_DIRECTORY_INFORMATION = 0x03
304 FILEID_BOTH_DIRECTORY_INFORMATION = 0x25
305 FILENAMES_INFORMATION = 0x0C
308 SMB2_RESTART_SCANS = 0x01
309 SMB2_RETURN_SINGLE_ENTRY = 0x02
310 SMB2_INDEX_SPECIFIED = 0x04
315 SMB2_WATCH_TREE = 0x01
318 FILE_NOTIFY_CHANGE_FILE_NAME = 0x00000001
319 FILE_NOTIFY_CHANGE_DIR_NAME = 0x00000002
320 FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x00000004
321 FILE_NOTIFY_CHANGE_SIZE = 0x00000008
322 FILE_NOTIFY_CHANGE_LAST_WRITE = 0x00000010
323 FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x00000020
324 FILE_NOTIFY_CHANGE_CREATION = 0x00000040
325 FILE_NOTIFY_CHANGE_EA = 0x00000080
326 FILE_NOTIFY_CHANGE_SECURITY = 0x00000100
327 FILE_NOTIFY_CHANGE_STREAM_NAME = 0x00000200
328 FILE_NOTIFY_CHANGE_STREAM_SIZE = 0x00000400
329 FILE_NOTIFY_CHANGE_STREAM_WRITE = 0x00000800
331 # FILE_NOTIFY_INFORMATION
333 FILE_ACTION_ADDED = 0x00000001
334 FILE_ACTION_REMOVED = 0x00000002
335 FILE_ACTION_MODIFIED = 0x00000003
336 FILE_ACTION_RENAMED_OLD_NAME = 0x00000004
337 FILE_ACTION_RENAMED_NEW_NAME = 0x00000005
341 SMB2_0_INFO_FILE = 0x01
342 SMB2_0_INFO_FILESYSTEM = 0x02
343 SMB2_0_INFO_SECURITY = 0x03
344 SMB2_0_INFO_QUOTA = 0x04
346 # File Information Classes
347 SMB2_FILE_ACCESS_INFO = 8
348 SMB2_FILE_ALIGNMENT_INFO = 17
349 SMB2_FILE_ALL_INFO = 18
350 SMB2_FILE_ALLOCATION_INFO = 19
351 SMB2_FILE_ALTERNATE_NAME_INFO = 21
352 SMB2_ATTRIBUTE_TAG_INFO = 35
353 SMB2_FILE_BASIC_INFO = 4
354 SMB2_FILE_BOTH_DIRECTORY_INFO = 3
355 SMB2_FILE_COMPRESSION_INFO = 28
356 SMB2_FILE_DIRECTORY_INFO = 1
357 SMB2_FILE_DISPOSITION_INFO = 13
358 SMB2_FILE_EA_INFO = 7
359 SMB2_FILE_END_OF_FILE_INFO = 20
360 SMB2_FULL_DIRECTORY_INFO = 2
361 SMB2_FULL_EA_INFO = 15
362 SMB2_FILE_HARDLINK_INFO = 46
363 SMB2_FILE_ID_BOTH_DIRECTORY_INFO = 37
364 SMB2_FILE_ID_FULL_DIRECTORY_INFO = 38
365 SMB2_FILE_ID_GLOBAL_TX_DIRECTORY_INFO = 50
366 SMB2_FILE_INTERNAL_INFO = 6
367 SMB2_FILE_LINK_INFO = 11
368 SMB2_FILE_MAILSLOT_QUERY_INFO = 26
369 SMB2_FILE_MAILSLOT_SET_INFO = 27
370 SMB2_FILE_MODE_INFO = 16
371 SMB2_FILE_MOVE_CLUSTER_INFO = 31
372 SMB2_FILE_NAME_INFO = 9
373 SMB2_FILE_NAMES_INFO = 12
374 SMB2_FILE_NETWORK_OPEN_INFO = 34
375 SMB2_FILE_NORMALIZED_NAME_INFO = 48
376 SMB2_FILE_OBJECT_ID_INFO = 29
377 SMB2_FILE_PIPE_INFO = 23
378 SMB2_FILE_PIPE_LOCAL_INFO = 24
379 SMB2_FILE_PIPE_REMOTE_INFO = 25
380 SMB2_FILE_POSITION_INFO = 14
381 SMB2_FILE_QUOTA_INFO = 32
382 SMB2_FILE_RENAME_INFO = 10
383 SMB2_FILE_REPARSE_POINT_INFO = 33
384 SMB2_FILE_SFIO_RESERVE_INFO = 44
385 SMB2_FILE_SHORT_NAME_INFO = 45
386 SMB2_FILE_STANDARD_INFO = 5
387 SMB2_FILE_STANDARD_LINK_INFO = 54
388 SMB2_FILE_STREAM_INFO = 22
389 SMB2_FILE_TRACKING_INFO = 36
390 SMB2_FILE_VALID_DATA_LENGTH_INFO = 39
392 # File System Information Classes
393 SMB2_FILESYSTEM_VOLUME_INFO = 1
394 SMB2_FILESYSTEM_LABEL_INFO = 2
395 SMB2_FILESYSTEM_SIZE_INFO = 3
396 SMB2_FILESYSTEM_DEVICE_INFO = 4
397 SMB2_FILESYSTEM_ATTRIBUTE_INFO = 5
398 SMB2_FILESYSTEM_CONTROL_INFO = 6
399 SMB2_FILESYSTEM_FULL_SIZE_INFO = 7
400 SMB2_FILESYSTEM_OBJECT_ID_INFO = 8
401 SMB2_FILESYSTEM_DRIVER_PATH_INFO = 9
402 SMB2_FILESYSTEM_SECTOR_SIZE_INFO = 11
404 # Additional information
405 OWNER_SECURITY_INFORMATION = 0x00000001
406 GROUP_SECURITY_INFORMATION = 0x00000002
407 DACL_SECURITY_INFORMATION = 0x00000004
408 SACL_SECURITY_INFORMATION = 0x00000008
409 LABEL_SECURITY_INFORMATION = 0x00000010
412 SL_RESTART_SCAN = 0x00000001
413 SL_RETURN_SINGLE_ENTRY = 0x00000002
414 SL_INDEX_SPECIFIED = 0x00000004
417 SMB2_ENCRYPTION_AES128_CCM = 0x0001
421 # Represents a SMB2/3 Packet
422 class SMBPacketBase(Structure):
423 def addCommand(self,command):
424 # Pad to 8 bytes and put the offset of another SMBPacket
425 raise 'Implement This!'
427 def isValidAnswer(self, status):
428 if self['Status'] != status:
430 raise smb3.SessionError(self['Status'], self)
433 def __init__(self, data = None):
434 Structure.__init__(self,data)
439 class SMB2PacketAsync(SMBPacketBase):
441 ('ProtocolID','"\xfeSMB'),
442 ('StructureSize','<H=64'),
443 ('CreditCharge','<H=0'),
446 ('CreditRequestResponse','<H=0'),
448 ('NextCommand','<L=0'),
449 ('MessageID','<Q=0'),
451 ('SessionID','<Q=0'),
452 ('Signature','16s=""'),
456 class SMB3PacketAsync(SMBPacketBase):
458 ('ProtocolID','"\xfeSMB'),
459 ('StructureSize','<H=64'),
460 ('CreditCharge','<H=0'),
461 ('ChannelSequence','<H=0'),
464 ('CreditRequestResponse','<H=0'),
466 ('NextCommand','<L=0'),
467 ('MessageID','<Q=0'),
469 ('SessionID','<Q=0'),
470 ('Signature','16s=""'),
474 class SMB2Packet(SMBPacketBase):
476 ('ProtocolID','"\xfeSMB'),
477 ('StructureSize','<H=64'),
478 ('CreditCharge','<H=0'),
481 ('CreditRequestResponse','<H=0'),
483 ('NextCommand','<L=0'),
484 ('MessageID','<Q=0'),
487 ('SessionID','<Q=0'),
488 ('Signature','16s=""'),
492 class SMB3Packet(SMBPacketBase):
494 ('ProtocolID','"\xfeSMB'),
495 ('StructureSize','<H=64'),
496 ('CreditCharge','<H=0'),
497 ('ChannelSequence','<H=0'),
500 ('CreditRequestResponse','<H=0'),
502 ('NextCommand','<L=0'),
503 ('MessageID','<Q=0'),
506 ('SessionID','<Q=0'),
507 ('Signature','16s=""'),
511 class SMB2Error(Structure):
513 ('StructureSize','<H=9'),
515 ('ByteCount','<L=0'),
516 ('_ErrorData','_-ErrorData','self["ByteCount"]'),
517 ('ErrorData','"\xff'),
520 class SMB2ErrorSymbolicLink(Structure):
522 ('SymLinkLength','<L=0'),
523 ('SymLinkErrorTag','<L=0'),
524 ('ReparseTag','<L=0'),
525 ('ReparseDataLenght','<H=0'),
526 ('UnparsedPathLength','<H=0'),
527 ('SubstituteNameOffset','<H=0'),
528 ('SubstituteNameLength','<H=0'),
529 ('PrintNameOffset','<H=0'),
530 ('PrintNameLength','<H=0'),
536 class SMB2Negotiate(Structure):
538 ('StructureSize','<H=36'),
539 ('DialectCount','<H=0'),
540 ('SecurityMode','<H=0'),
542 ('Capabilities','<L=0'),
543 ('ClientGuid','16s=""'),
544 ('ClientStartTime','<Q=0'),
548 class SMB2Negotiate_Response(Structure):
550 ('StructureSize','<H=65'),
551 ('SecurityMode','<H=0'),
552 ('DialectRevision','<H=0'),
554 ('ServerGuid','16s=""'),
555 ('Capabilities','<L=0'),
556 ('MaxTransactSize','<L=0'),
557 ('MaxReadSize','<L=0'),
558 ('MaxWriteSize','<L=0'),
559 ('SystemTime','<Q=0'),
560 ('ServerStartTime','<Q=0'),
561 ('SecurityBufferOffset','<H=0'),
562 ('SecurityBufferLength','<H=0'),
563 ('Reserved2','<L=0'),
564 ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
566 ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
571 class SMB2SessionSetup(Structure):
574 ('StructureSize','<H=25'),
576 ('SecurityMode','<B=0'),
577 ('Capabilities','<L=0'),
579 ('SecurityBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
580 ('SecurityBufferLength','<H=0'),
581 ('PreviousSessionId','<Q=0'),
582 ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
584 ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
588 def __init__(self, data = None):
589 Structure.__init__(self,data)
591 self['AlignPad'] = ''
594 #self['AlignPad'] = '\x00' * ((8 - ((24 + SMB2_PACKET_SIZE) & 7)) & 7)
595 #self['SecurityBufferOffset'] = 24 + SMB2_PACKET_SIZE +len(self['AlignPad'])
596 #self['SecurityBufferLength'] += len(self['AlignPad'])
597 return Structure.getData(self)
600 class SMB2SessionSetup_Response(Structure):
602 ('StructureSize','<H=9'),
603 ('SessionFlags','<H=0'),
604 ('SecurityBufferOffset','<H=0'),
605 ('SecurityBufferLength','<H=0'),
606 ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
608 ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
613 class SMB2Logoff(Structure):
615 ('StructureSize','<H=4'),
620 class SMB2Logoff_Response(Structure):
622 ('StructureSize','<H=4'),
627 class SMB2TreeConnect(Structure):
630 ('StructureSize','<H=9'),
632 ('PathOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
633 ('PathLength','<H=0'),
634 ('_AlignPad','_-AlignPad','self["PathOffset"] - (64 + self.SIZE - 1)'),
636 ('_Buffer','_-Buffer','self["PathLength"]'),
639 def __init__(self, data = None):
640 Structure.__init__(self,data)
642 self['AlignPad'] = ''
644 class SMB2TreeConnect_Response(Structure):
646 ('StructureSize','<H=16'),
647 ('ShareType','<B=0'),
649 ('ShareFlags','<L=0'),
650 ('Capabilities','<L=0'),
651 ('MaximalAccess','<L=0'),
654 # SMB2_TREE_DISCONNECT
655 class SMB2TreeDisconnect(Structure):
657 ('StructureSize','<H=4'),
661 class SMB2TreeDisconnect_Response(Structure):
663 ('StructureSize','<H=4'),
668 class SMB2Create(Structure):
671 ('StructureSize','<H=57'),
672 ('SecurityFlags','<B=0'),
673 ('RequestedOplockLevel','<B=0'),
674 ('ImpersonationLevel','<L=0'),
675 ('SmbCreateFlags','<Q=0'),
677 ('DesiredAccess','<L=0'),
678 ('FileAttributes','<L=0'),
679 ('ShareAccess','<L=0'),
680 ('CreateDisposition','<L=0'),
681 ('CreateOptions','<L=0'),
682 ('NameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
683 ('NameLength','<H=0'),
684 ('CreateContextsOffset','<L=0'),
685 ('CreateContextsLength','<L=0'),
686 ('_AlignPad','_-AlignPad','self["NameOffset"] - (64 + self["StructureSize"] - 1)'),
688 ('_Buffer','_-Buffer','self["CreateContextsLength"]+self["NameLength"]'),
691 def __init__(self, data = None):
692 Structure.__init__(self,data)
694 self['AlignPad'] = ''
696 class SMB2CreateContext(Structure):
699 ('NameOffset','<H=0'),
700 ('NameLength','<H=0'),
702 ('DataOffset','<H=0'),
703 ('DataLength','<L=0'),
704 ('_Buffer','_-Buffer','self["DataLength"]+self["NameLength"]'),
708 class SMB2_FILEID(Structure):
710 ('Persistent','<Q=0'),
714 class SMB2Create_Response(Structure):
716 ('StructureSize','<H=89'),
717 ('OplockLevel','<B=0'),
719 ('CreateAction','<L=0'),
720 ('CreationTime','<Q=0'),
721 ('LastAccessTime','<Q=0'),
722 ('LastWriteTime','<Q=0'),
723 ('ChangeTime','<Q=0'),
724 ('AllocationSize','<Q=0'),
725 ('EndOfFile','<Q=0'),
726 ('FileAttributes','<L=0'),
727 ('Reserved2','<L=0'),
728 ('FileID',':',SMB2_FILEID),
729 ('CreateContextsOffset','<L=0'),
730 ('CreateContextsLength','<L=0'),
731 ('_AlignPad','_-AlignPad','self["CreateContextsOffset"] - (64 + self["StructureSize"] - 1)'),
733 ('_Buffer','_-Buffer','self["CreateContextsLength"]'),
737 class FILE_FULL_EA_INFORMATION(Structure):
739 ('NextEntryOffset','<L=0'),
741 ('EaNameLength','<B=0'),
742 ('EaValueLength','<H=0'),
743 ('_EaName','_-EaName','self["EaNameLength"]'),
745 ('_EaValue','_-EaValue','self["EaValue"]'),
750 class SMB2_CREATE_DURABLE_HANDLE_RECONNECT(Structure):
752 ('Data',':',SMB2_FILEID),
755 class SMB2_CREATE_DURABLE_HANDLE_REQUEST(Structure):
757 ('DurableRequest','16s=""'),
760 class SMB2_CREATE_DURABLE_HANDLE_RESPONSE(Structure):
765 class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST(Structure):
767 ('Timestamp','<Q=0'),
770 class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE(Structure):
772 ('QueryStatus','<L=0'),
773 ('MaximalAccess','<L=0'),
776 class SMB2_CREATE_ALLOCATION_SIZE(Structure):
778 ('AllocationSize','<Q=0'),
781 class SMB2_CREATE_TIMEWARP_TOKEN(Structure):
783 ('AllocationSize','<Q=0'),
786 class SMB2_CREATE_REQUEST_LEASE(Structure):
788 ('LeaseKey','16s=""'),
789 ('LeaseState','<L=0'),
790 ('LeaseFlags','<L=0'),
791 ('LeaseDuration','<Q=0'),
794 SMB2_CREATE_RESPONSE_LEASE = SMB2_CREATE_REQUEST_LEASE
796 class SMB2_CREATE_REQUEST_LEASE_V2(Structure):
798 ('LeaseKey','16s=""'),
799 ('LeaseState','<L=0'),
801 ('LeaseDuration','<Q=0'),
802 ('ParentLeaseKey','16s=""'),
807 SMB2_CREATE_RESPONSE_LEASE_V2 = SMB2_CREATE_REQUEST_LEASE_V2
809 class SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2(Structure):
813 ('Reserved','8s=""'),
814 ('CreateGuid','16s=""'),
817 class SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2(Structure):
823 class SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2(Structure):
825 ('FileID',':', SMB2_FILEID),
826 ('CreateGuid','16s=""'),
830 class SMB2_CREATE_APP_INSTANCE_ID(Structure):
832 ('StructureSize','<H=0'),
834 ('AppInstanceId','16s=""'),
837 class SMB2_CREATE_QUERY_ON_DISK_ID(Structure):
839 ('DiskIDBuffer','32s=""'),
842 # Todo: Add Classes for
843 #SMB2_CREATE_SD_BUFFER
846 class SMB2Close(Structure):
848 ('StructureSize','<H=24'),
851 ('FileID',':', SMB2_FILEID),
854 class SMB2Close_Response(Structure):
856 ('StructureSize','<H=60'),
859 ('CreationTime','<Q=0'),
860 ('LastAccessTime','<Q=0'),
861 ('LastWriteTime','<Q=0'),
862 ('ChangeTime','<Q=0'),
863 ('AllocationSize','<Q=0'),
864 ('EndofFile','<Q=0'),
865 ('FileAttributes','<L=0'),
869 class SMB2Flush(Structure):
871 ('StructureSize','<H=24'),
872 ('Reserved1','<H=0'),
873 ('Reserved2','<L=0'),
874 ('FileID',':',SMB2_FILEID),
877 class SMB2Flush_Response(Structure):
879 ('StructureSize','<H=4'),
884 class SMB2Read(Structure):
887 ('StructureSize','<H=49'),
892 ('FileID',':',SMB2_FILEID),
893 ('MinimumCount','<L=0'),
895 ('RemainingBytes','<L=0'),
896 ('ReadChannelInfoOffset','<H=0'),
897 ('ReadChannelInfoLength','<H=0'),
898 ('_AlignPad','_-AlignPad','self["ReadChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
900 ('_Buffer','_-Buffer','self["ReadChannelInfoLength"]'),
903 def __init__(self, data = None):
904 Structure.__init__(self,data)
906 self['AlignPad'] = ''
909 class SMB2Read_Response(Structure):
911 ('StructureSize','<H=17'),
912 ('DataOffset','<B=0'),
914 ('DataLength','<L=0'),
915 ('DataRemaining','<L=0'),
916 ('Reserved2','<L=0'),
917 ('_AlignPad','_-AlignPad','self["DataOffset"] - (64 + self["StructureSize"] - 1)'),
919 ('_Buffer','_-Buffer','self["DataLength"]'),
924 class SMB2Write(Structure):
927 ('StructureSize','<H=49'),
928 ('DataOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
931 ('FileID',':',SMB2_FILEID),
933 ('RemainingBytes','<L=0'),
934 ('WriteChannelInfoOffset','<H=0'),
935 ('WriteChannelInfoLength','<H=0'),
936 ('_AlignPad','_-AlignPad','self["DataOffset"] + self["WriteChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
939 ('_Buffer','_-Buffer','self["Length"]+self["WriteChannelInfoLength"]'),
942 def __init__(self, data = None):
943 Structure.__init__(self,data)
945 self['AlignPad'] = ''
948 class SMB2Write_Response(Structure):
950 ('StructureSize','<H=17'),
953 ('Remaining','<L=0'),
954 ('WriteChannelInfoOffset','<H=0'),
955 ('WriteChannelInfoLength','<H=0'),
958 class SMB2OplockBreakNotification(Structure):
960 ('StructureSize','<H=24'),
961 ('OplockLevel','<B=0'),
963 ('Reserved2','<L=0'),
964 ('FileID',':',SMB2_FILEID),
967 SMB2OplockBreakAcknowledgment = SMB2OplockBreakNotification
968 SMB2OplockBreakResponse = SMB2OplockBreakNotification
970 class SMB2LeaseBreakNotification(Structure):
972 ('StructureSize','<H=44'),
975 ('LeaseKey','16s=""'),
976 ('CurrentLeaseState','<L=0'),
977 ('NewLeaseState','<L=0'),
978 ('BreakReason','<L=0'),
979 ('AccessMaskHint','<L=0'),
980 ('ShareMaskHint','<L=0'),
983 class SMB2LeaseBreakAcknowledgement(Structure):
985 ('StructureSize','<H=36'),
988 ('LeaseKey','16s=""'),
989 ('LeaseState','<L=0'),
990 ('LeaseDuration','<Q=0'),
993 SMB2LeaseBreakResponse = SMB2LeaseBreakAcknowledgement
996 class SMB2_LOCK_ELEMENT(Structure):
1001 ('Reserved','<L=0'),
1004 class SMB2Lock(Structure):
1006 ('StructureSize','<H=48'),
1007 ('LockCount','<H=0'),
1008 ('LockSequence','<L=0'),
1009 ('FileID',':',SMB2_FILEID),
1010 ('_Locks','_-Locks','self["LockCount"]*24'),
1014 class SMB2Lock_Response(Structure):
1016 ('StructureSize','<H=4'),
1017 ('Reserved','<H=0'),
1022 class SMB2Echo(Structure):
1024 ('StructureSize','<H=4'),
1025 ('Reserved','<H=0'),
1028 SMB2Echo_Response = SMB2Echo
1031 class SMB2Cancel(Structure):
1033 ('StructureSize','<H=4'),
1034 ('Reserved','<H=0'),
1038 class SMB2Ioctl(Structure):
1041 ('StructureSize','<H=57'),
1042 ('Reserved','<H=0'),
1044 ('FileID',':',SMB2_FILEID),
1045 ('InputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]))'),
1046 ('InputCount','<L=0'),
1047 ('MaxInputResponse','<L=0'),
1048 ('OutputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]) + self["InputCount"])'),
1049 ('OutputCount','<L=0'),
1050 ('MaxOutputResponse','<L=0'),
1052 ('Reserved2','<L=0'),
1053 #('_AlignPad','_-AlignPad','self["InputOffset"] + self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
1054 #('AlignPad',':=""'),
1055 ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
1058 def __init__(self, data = None):
1059 Structure.__init__(self,data)
1061 self['AlignPad'] = ''
1063 class FSCTL_PIPE_WAIT_STRUCTURE(Structure):
1066 ('NameLength','<L=0'),
1067 ('TimeoutSpecified','<B=0'),
1069 ('_Name','_-Name','self["NameLength"]'),
1073 class SRV_COPYCHUNK_COPY(Structure):
1075 ('SourceKey','24s=""'),
1076 ('ChunkCount','<L=0'),
1077 ('Reserved','<L=0'),
1078 ('_Chunks','_-Chunks', 'self["ChunkCount"]*len(SRV_COPYCHUNK)'),
1082 class SRV_COPYCHUNK(Structure):
1084 ('SourceOffset','<Q=0'),
1085 ('TargetOffset','<Q=0'),
1087 ('Reserved','<L=0'),
1090 class SRV_COPYCHUNK_RESPONSE(Structure):
1092 ('ChunksWritten','<L=0'),
1093 ('ChunkBytesWritten','<L=0'),
1094 ('TotalBytesWritten','<L=0'),
1097 class SRV_READ_HASH(Structure):
1099 ('HashType','<L=0'),
1100 ('HashVersion','<L=0'),
1101 ('HashRetrievalType','<L=0'),
1106 class NETWORK_RESILIENCY_REQUEST(Structure):
1109 ('Reserved','<L=0'),
1112 class VALIDATE_NEGOTIATE_INFO(Structure):
1114 ('Capabilities','<L=0'),
1116 ('SecurityMode','<H=0'),
1117 #('DialectCount','<H=0'),
1118 ('Dialects','<H*<H'),
1121 class SRV_SNAPSHOT_ARRAY(Structure):
1123 ('NumberOfSnapShots','<L=0'),
1124 ('NumberOfSnapShotsReturned','<L=0'),
1125 ('SnapShotArraySize','<L=0'),
1126 ('_SnapShots','_-SnapShots','self["SnapShotArraySize"]'),
1130 class SRV_REQUEST_RESUME_KEY(Structure):
1132 ('ResumeKey','24s=""'),
1133 ('ContextLength','<L=0'),
1134 ('_Context','_-Context','self["ContextLength"]'),
1138 class HASH_HEADER(Structure):
1140 ('HashType','<L=0'),
1141 ('HashVersion','<L=0'),
1142 ('SourceFileChangeTime','<Q=0'),
1143 ('SourceFileSize','<Q=0'),
1144 ('HashBlobLength','<L=0'),
1145 ('HashBlobOffset','<L=0'),
1147 ('SourceFileNameLength','<L=0'),
1148 ('_SourceFileName','_-SourceFileName','self["SourceFileNameLength"]',),
1149 ('SourceFileName',':'),
1152 class SRV_HASH_RETRIEVE_HASH_BASED(Structure):
1155 ('BufferLength','<L=0'),
1156 ('Reserved','<L=0'),
1157 ('_Buffer','_-Buffer','self["BufferLength"]'),
1161 class SRV_HASH_RETRIEVE_FILE_BASED(Structure):
1163 ('FileDataOffset','<Q=0'),
1164 ('FileDataLength','<Q=0'),
1165 ('BufferLength','<L=0'),
1166 ('Reserved','<L=0'),
1167 ('_Buffer','_-Buffer','self["BufferLength"]'),
1171 class NETWORK_INTERFACE_INFO(Structure):
1175 ('Capability','<L=0'),
1176 ('Reserved','<L=0'),
1177 ('LinkSpeed','<Q=0'),
1178 ('SockAddr_Storage','128s=""'),
1181 class SMB2Ioctl_Response(Structure):
1183 ('StructureSize','<H=49'),
1184 ('Reserved','<H=0'),
1186 ('FileID',':',SMB2_FILEID),
1187 ('InputOffset','<L=0'),
1188 ('InputCount','<L=0'),
1189 ('OutputOffset','<L=0'),
1190 ('OutputCount','<L=0'),
1192 ('Reserved2','<L=0'),
1193 ('_AlignPad','_-AlignPad','self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
1194 ('AlignPad',':=""'),
1195 ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
1199 # SMB2_QUERY_DIRECTORY
1200 class SMB2QueryDirectory(Structure):
1203 ('StructureSize','<H=33'),
1204 ('FileInformationClass','<B=0'),
1206 ('FileIndex','<L=0'),
1207 ('FileID',':',SMB2_FILEID),
1208 ('FileNameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
1209 ('FileNameLength','<H=0'),
1210 ('OutputBufferLength','<L=0'),
1211 ('_AlignPad','_-AlignPad','self["FileNameOffset"] - (64 + self["StructureSize"] - 1)'),
1212 ('AlignPad',':=""'),
1213 ('_Buffer','_-Buffer','self["FileNameLength"]'),
1216 def __init__(self, data = None):
1217 Structure.__init__(self,data)
1219 self['AlignPad'] = ''
1221 class SMB2QueryDirectory_Response(Structure):
1223 ('StructureSize','<H=9'),
1224 ('OutputBufferOffset','<H=0'),
1225 ('OutputBufferLength','<L=0'),
1226 ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
1227 ('AlignPad',':=""'),
1228 ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
1232 # SMB2_CHANGE_NOTIFY
1233 class SMB2ChangeNotify(Structure):
1235 ('StructureSize','<H=32'),
1237 ('OutputBufferLength','<L=0'),
1238 ('FileID',':',SMB2_FILEID),
1239 ('CompletionFilter','<L=0'),
1240 ('Reserved','<L=0'),
1243 class SMB2ChangeNotify_Response(Structure):
1245 ('StructureSize','<H=9'),
1246 ('OutputBufferOffset','<H=0'),
1247 ('OutputBufferLength','<L=0'),
1248 ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
1249 ('AlignPad',':=""'),
1250 ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
1254 class FILE_NOTIFY_INFORMATION(Structure):
1256 ('NextEntryOffset','<L=0'),
1258 ('FileNameLength','<L=0'),
1259 ('_FileName','_-FileName','self["FileNameLength"]',),
1264 class SMB2QueryInfo(Structure):
1267 ('StructureSize','<H=41'),
1268 ('InfoType','<B=0'),
1269 ('FileInfoClass','<B=0'),
1270 ('OutputBufferLength','<L=0'),
1271 ('InputBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
1272 ('Reserved','<H=0'),
1273 ('InputBufferLength','<L=0'),
1274 ('AdditionalInformation','<L=0'),
1276 ('FileID',':',SMB2_FILEID),
1277 ('_AlignPad','_-AlignPad','self["InputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
1278 ('AlignPad',':=""'),
1279 ('_Buffer','_-Buffer','self["InputBufferLength"]'),
1282 def __init__(self, data = None):
1283 Structure.__init__(self,data)
1285 self['AlignPad'] = ''
1288 class SMB2_QUERY_QUOTA_INFO(Structure):
1290 ('ReturnSingle','<B=0'),
1291 ('RestartScan','<B=0'),
1292 ('Reserved','<H=0'),
1293 ('SidListLength','<L=0'),
1294 ('StartSidLength','<L=0'),
1295 ('StartSidOffset','<L=0'),
1296 # ToDo: Check 2.2.37.1 here
1300 class SMB2QueryInfo_Response(Structure):
1302 ('StructureSize','<H=9'),
1303 ('OutputBufferOffset','<H=0'),
1304 ('OutputBufferLength','<L=0'),
1305 ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
1306 ('AlignPad',':=""'),
1307 ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
1312 class SMB2SetInfo(Structure):
1315 ('StructureSize','<H=33'),
1316 ('InfoType','<B=0'),
1317 ('FileInfoClass','<B=0'),
1318 ('BufferLength','<L=0'),
1319 ('BufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
1320 ('Reserved','<H=0'),
1321 ('AdditionalInformation','<L=0'),
1322 ('FileID',':',SMB2_FILEID),
1323 ('_AlignPad','_-AlignPad','self["BufferOffset"] - (64 + self["StructureSize"] - 1)'),
1324 ('AlignPad',':=""'),
1325 ('_Buffer','_-Buffer','self["BufferLength"]'),
1328 def __init__(self, data = None):
1329 Structure.__init__(self,data)
1331 self['AlignPad'] = ''
1333 class SMB2SetInfo_Response(Structure):
1335 ('StructureSize','<H=2'),
1338 class FILE_RENAME_INFORMATION_TYPE_2(Structure):
1340 ('ReplaceIfExists','<B=0'),
1341 ('Reserved','7s=""'),
1342 ('RootDirectory','<Q=0'),
1343 ('FileNameLength','<L=0'),
1344 ('_FileName','_-FileName','self["FileNameLength"]'),
1348 class SMB2_TRANSFORM_HEADER(Structure):
1350 ('ProtocolID','"\xfdSMB'),
1351 ('Signature','16s=""'),
1353 ('OriginalMessageSize','<L=0'),
1354 ('Reserved','<H=0'),
1355 ('EncryptionAlgorithm','<H=0'),
1356 ('SessionID','<Q=0'),
1359 # SMB2_FILE_INTERNAL_INFO
1360 class FileInternalInformation(Structure):
1362 ('IndexNumber','<q=0'),