mirror of https://gitee.com/openkylin/curl.git
1364 lines
40 KiB
Python
1364 lines
40 KiB
Python
# Copyright (c) 2003-2016 CORE Security Technologies
|
|
#
|
|
# This software is provided under under a slightly modified version
|
|
# of the Apache Software License. See the accompanying LICENSE file
|
|
# for more information.
|
|
#
|
|
# Author: Alberto Solino (@agsolino)
|
|
#
|
|
# Description:
|
|
# SMB 2 and 3 Protocol Structures and constants [MS-SMB2]
|
|
#
|
|
|
|
from impacket.structure import Structure
|
|
|
|
# Constants
|
|
|
|
# SMB Packet
|
|
SMB2_PACKET_SIZE = 64
|
|
|
|
# SMB Commands
|
|
SMB2_NEGOTIATE = 0x0000 #
|
|
SMB2_SESSION_SETUP = 0x0001 #
|
|
SMB2_LOGOFF = 0x0002 #
|
|
SMB2_TREE_CONNECT = 0x0003 #
|
|
SMB2_TREE_DISCONNECT = 0x0004 #
|
|
SMB2_CREATE = 0x0005 #
|
|
SMB2_CLOSE = 0x0006 #
|
|
SMB2_FLUSH = 0x0007 #
|
|
SMB2_READ = 0x0008 #
|
|
SMB2_WRITE = 0x0009 #
|
|
SMB2_LOCK = 0x000A #
|
|
SMB2_IOCTL = 0x000B #
|
|
SMB2_CANCEL = 0x000C #
|
|
SMB2_ECHO = 0x000D #
|
|
SMB2_QUERY_DIRECTORY = 0x000E #
|
|
SMB2_CHANGE_NOTIFY = 0x000F
|
|
SMB2_QUERY_INFO = 0x0010 #
|
|
SMB2_SET_INFO = 0x0011
|
|
SMB2_OPLOCK_BREAK = 0x0012
|
|
|
|
# SMB Flags
|
|
SMB2_FLAGS_SERVER_TO_REDIR = 0x00000001
|
|
SMB2_FLAGS_ASYNC_COMMAND = 0x00000002
|
|
SMB2_FLAGS_RELATED_OPERATIONS = 0x00000004
|
|
SMB2_FLAGS_SIGNED = 0x00000008
|
|
SMB2_FLAGS_DFS_OPERATIONS = 0x10000000
|
|
SMB2_FLAGS_REPLAY_OPERATION = 0x80000000
|
|
|
|
# SMB Error SymLink Flags
|
|
SYMLINK_FLAG_ABSOLUTE = 0x0
|
|
SYMLINK_FLAG_RELATIVE = 0x1
|
|
|
|
# SMB2_NEGOTIATE
|
|
# Security Modes
|
|
SMB2_NEGOTIATE_SIGNING_ENABLED = 0x1
|
|
SMB2_NEGOTIATE_SIGNING_REQUIRED = 0x2
|
|
|
|
# Capabilities
|
|
SMB2_GLOBAL_CAP_DFS = 0x01
|
|
SMB2_GLOBAL_CAP_LEASING = 0x02
|
|
SMB2_GLOBAL_CAP_LARGE_MTU = 0x04
|
|
SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x08
|
|
SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10
|
|
SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x20
|
|
SMB2_GLOBAL_CAP_ENCRYPTION = 0x40
|
|
|
|
# Dialects
|
|
SMB2_DIALECT_002 = 0x0202
|
|
SMB2_DIALECT_21 = 0x0210
|
|
SMB2_DIALECT_30 = 0x0300
|
|
SMB2_DIALECT_WILDCARD = 0x02FF
|
|
|
|
# SMB2_SESSION_SETUP
|
|
# Flags
|
|
SMB2_SESSION_FLAG_BINDING = 0x01
|
|
SMB2_SESSION_FLAG_IS_GUEST = 0x01
|
|
SMB2_SESSION_FLAG_IS_NULL = 0x02
|
|
SMB2_SESSION_FLAG_ENCRYPT_DATA = 0x04
|
|
|
|
# SMB2_TREE_CONNECT
|
|
# Types
|
|
SMB2_SHARE_TYPE_DISK = 0x1
|
|
SMB2_SHARE_TYPE_PIPE = 0x2
|
|
SMB2_SHARE_TYPE_PRINT = 0x3
|
|
|
|
# Share Flags
|
|
SMB2_SHAREFLAG_MANUAL_CACHING = 0x00000000
|
|
SMB2_SHAREFLAG_AUTO_CACHING = 0x00000010
|
|
SMB2_SHAREFLAG_VDO_CACHING = 0x00000020
|
|
SMB2_SHAREFLAG_NO_CACHING = 0x00000030
|
|
SMB2_SHAREFLAG_DFS = 0x00000001
|
|
SMB2_SHAREFLAG_DFS_ROOT = 0x00000002
|
|
SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS = 0x00000100
|
|
SMB2_SHAREFLAG_FORCE_SHARED_DELETE = 0x00000200
|
|
SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING = 0x00000400
|
|
SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM = 0x00000800
|
|
SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK = 0x00001000
|
|
SMB2_SHAREFLAG_ENABLE_HASH_V1 = 0x00002000
|
|
SMB2_SHAREFLAG_ENABLE_HASH_V2 = 0x00004000
|
|
SMB2_SHAREFLAG_ENCRYPT_DATA = 0x00008000
|
|
|
|
# Capabilities
|
|
SMB2_SHARE_CAP_DFS = 0x00000008
|
|
SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY = 0x00000010
|
|
SMB2_SHARE_CAP_SCALEOUT = 0x00000020
|
|
SMB2_SHARE_CAP_CLUSTER = 0x00000040
|
|
|
|
# SMB_CREATE
|
|
# Oplocks
|
|
SMB2_OPLOCK_LEVEL_NONE = 0x00
|
|
SMB2_OPLOCK_LEVEL_II = 0x01
|
|
SMB2_OPLOCK_LEVEL_EXCLUSIVE = 0x08
|
|
SMB2_OPLOCK_LEVEL_BATCH = 0x09
|
|
SMB2_OPLOCK_LEVEL_LEASE = 0xFF
|
|
|
|
# Impersonation Level
|
|
SMB2_IL_ANONYMOUS = 0x00000000
|
|
SMB2_IL_IDENTIFICATION = 0x00000001
|
|
SMB2_IL_IMPERSONATION = 0x00000002
|
|
SMB2_IL_DELEGATE = 0x00000003
|
|
|
|
# File Attributes
|
|
FILE_ATTRIBUTE_ARCHIVE = 0x00000020
|
|
FILE_ATTRIBUTE_COMPRESSED = 0x00000800
|
|
FILE_ATTRIBUTE_DIRECTORY = 0x00000010
|
|
FILE_ATTRIBUTE_ENCRYPTED = 0x00004000
|
|
FILE_ATTRIBUTE_HIDDEN = 0x00000002
|
|
FILE_ATTRIBUTE_NORMAL = 0x00000080
|
|
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000
|
|
FILE_ATTRIBUTE_OFFLINE = 0x00001000
|
|
FILE_ATTRIBUTE_READONLY = 0x00000001
|
|
FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
|
|
FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200
|
|
FILE_ATTRIBUTE_SYSTEM = 0x00000004
|
|
FILE_ATTRIBUTE_TEMPORARY = 0x00000100
|
|
FILE_ATTRIBUTE_INTEGRITY_STREAM = 0x00000800
|
|
FILE_ATTRIBUTE_NO_SCRUB_DATA = 0x00020000
|
|
|
|
# Share Access
|
|
FILE_SHARE_READ = 0x00000001
|
|
FILE_SHARE_WRITE = 0x00000002
|
|
FILE_SHARE_DELETE = 0x00000004
|
|
|
|
# Create Disposition
|
|
FILE_SUPERSEDE = 0x00000000
|
|
FILE_OPEN = 0x00000001
|
|
FILE_CREATE = 0x00000002
|
|
FILE_OPEN_IF = 0x00000003
|
|
FILE_OVERWRITE = 0x00000004
|
|
FILE_OVERWRITE_IF = 0x00000005
|
|
|
|
# Create Options
|
|
FILE_DIRECTORY_FILE = 0x00000001
|
|
FILE_WRITE_THROUGH = 0x00000002
|
|
FILE_SEQUENTIAL_ONLY = 0x00000004
|
|
FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008
|
|
FILE_SYNCHRONOUS_IO_ALERT = 0x00000010
|
|
FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020
|
|
FILE_NON_DIRECTORY_FILE = 0x00000040
|
|
FILE_COMPLETE_IF_OPLOCKED = 0x00000100
|
|
FILE_NO_EA_KNOWLEDGE = 0x00000200
|
|
FILE_RANDOM_ACCESS = 0x00000800
|
|
FILE_DELETE_ON_CLOSE = 0x00001000
|
|
FILE_OPEN_BY_FILE_ID = 0x00002000
|
|
FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000
|
|
FILE_NO_COMPRESSION = 0x00008000
|
|
FILE_RESERVE_OPFILTER = 0x00100000
|
|
FILE_OPEN_REPARSE_POINT = 0x00200000
|
|
FILE_OPEN_NO_RECALL = 0x00400000
|
|
FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000
|
|
|
|
# File Access Mask / Desired Access
|
|
FILE_READ_DATA = 0x00000001
|
|
FILE_WRITE_DATA = 0x00000002
|
|
FILE_APPEND_DATA = 0x00000004
|
|
FILE_READ_EA = 0x00000008
|
|
FILE_WRITE_EA = 0x00000010
|
|
FILE_EXECUTE = 0x00000020
|
|
FILE_READ_ATTRIBUTES = 0x00000080
|
|
FILE_WRITE_ATTRIBUTES = 0x00000100
|
|
DELETE = 0x00010000
|
|
READ_CONTROL = 0x00020000
|
|
WRITE_DAC = 0x00040000
|
|
WRITE_OWNER = 0x00080000
|
|
SYNCHRONIZE = 0x00100000
|
|
ACCESS_SYSTEM_SECURITY = 0x01000000
|
|
MAXIMUM_ALLOWED = 0x02000000
|
|
GENERIC_ALL = 0x10000000
|
|
GENERIC_EXECUTE = 0x20000000
|
|
GENERIC_WRITE = 0x40000000
|
|
GENERIC_READ = 0x80000000
|
|
|
|
# Directory Access Mask
|
|
FILE_LIST_DIRECTORY = 0x00000001
|
|
FILE_ADD_FILE = 0x00000002
|
|
FILE_ADD_SUBDIRECTORY = 0x00000004
|
|
FILE_TRAVERSE = 0x00000020
|
|
FILE_DELETE_CHILD = 0x00000040
|
|
|
|
# Create Contexts
|
|
SMB2_CREATE_EA_BUFFER = 0x45787441
|
|
SMB2_CREATE_SD_BUFFER = 0x53656344
|
|
SMB2_CREATE_DURABLE_HANDLE_REQUEST = 0x44486e51
|
|
SMB2_CREATE_DURABLE_HANDLE_RECONNECT = 0x44486e43
|
|
SMB2_CREATE_ALLOCATION_SIZE = 0x416c5369
|
|
SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST = 0x4d784163
|
|
SMB2_CREATE_TIMEWARP_TOKEN = 0x54577270
|
|
SMB2_CREATE_QUERY_ON_DISK_ID = 0x51466964
|
|
SMB2_CREATE_REQUEST = 0x52714c73
|
|
SMB2_CREATE_REQUEST_LEASE_V2 = 0x52714c73
|
|
SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 = 0x44483251
|
|
SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 = 0x44483243
|
|
SMB2_CREATE_APP_INSTANCE_ID = 0x45BCA66AEFA7F74A9008FA462E144D74
|
|
|
|
# Flags
|
|
SMB2_CREATE_FLAG_REPARSEPOINT = 0x1
|
|
FILE_NEED_EA = 0x80
|
|
|
|
# CreateAction
|
|
FILE_SUPERSEDED = 0x00000000
|
|
FILE_OPENED = 0x00000001
|
|
FILE_CREATED = 0x00000002
|
|
FILE_OVERWRITTEN = 0x00000003
|
|
|
|
# SMB2_CREATE_REQUEST_LEASE states
|
|
SMB2_LEASE_NONE = 0x00
|
|
SMB2_LEASE_READ_CACHING = 0x01
|
|
SMB2_LEASE_HANDLE_CACHING = 0x02
|
|
SMB2_LEASE_WRITE_CACHING = 0x04
|
|
|
|
# SMB2_CREATE_REQUEST_LEASE_V2 Flags
|
|
SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET = 0x4
|
|
|
|
# SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 Flags
|
|
SMB2_DHANDLE_FLAG_PERSISTENT = 0x02
|
|
|
|
# SMB2_CLOSE
|
|
# Flags
|
|
SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB = 0x0001
|
|
|
|
# SMB2_READ
|
|
# Channel
|
|
SMB2_CHANNEL_NONE = 0x00
|
|
SMB2_CHANNEL_RDMA_V1 = 0x01
|
|
|
|
# SMB2_WRITE
|
|
# Flags
|
|
SMB2_WRITEFLAG_WRITE_THROUGH = 0x01
|
|
|
|
# Lease Break Notification
|
|
SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED = 0x01
|
|
|
|
# SMB_LOCK
|
|
# Flags
|
|
SMB2_LOCKFLAG_SHARED_LOCK = 0x01
|
|
SMB2_LOCKFLAG_EXCLUSIVE_LOCK = 0x02
|
|
SMB2_LOCKFLAG_UNLOCK = 0x04
|
|
SMB2_LOCKFLAG_FAIL_IMMEDIATELY = 0x10
|
|
|
|
# SMB IOCTL
|
|
# Control Codes
|
|
FSCTL_DFS_GET_REFERRALS = 0x00060194
|
|
FSCTL_PIPE_PEEK = 0x0011400C
|
|
FSCTL_PIPE_WAIT = 0x00110018
|
|
FSCTL_PIPE_TRANSCEIVE = 0x0011C017
|
|
FSCTL_SRV_COPYCHUNK = 0x001440F2
|
|
FSCTL_SRV_ENUMERATE_SNAPSHOTS = 0x00144064
|
|
FSCTL_SRV_REQUEST_RESUME_KEY = 0x00140078
|
|
FSCTL_SRV_READ_HASH = 0x001441bb
|
|
FSCTL_SRV_COPYCHUNK_WRITE = 0x001480F2
|
|
FSCTL_LMR_REQUEST_RESILIENCY = 0x001401D4
|
|
FSCTL_QUERY_NETWORK_INTERFACE_INFO = 0x001401FC
|
|
FSCTL_SET_REPARSE_POINT = 0x000900A4
|
|
FSCTL_DFS_GET_REFERRALS_EX = 0x000601B0
|
|
FSCTL_FILE_LEVEL_TRIM = 0x00098208
|
|
FSCTL_VALIDATE_NEGOTIATE_INFO = 0x00140204
|
|
|
|
# Flags
|
|
SMB2_0_IOCTL_IS_FSCTL = 0x1
|
|
|
|
# SRV_READ_HASH
|
|
# Type
|
|
SRV_HASH_TYPE_PEER_DIST = 0x01
|
|
|
|
# Version
|
|
SRV_HASH_VER_1 = 0x1
|
|
SRV_HASH_VER_2 = 0x2
|
|
|
|
# Retrieval Type
|
|
SRV_HASH_RETRIEVE_HASH_BASED = 0x01
|
|
SRV_HASH_RETRIEVE_FILE_BASED = 0x02
|
|
|
|
# NETWORK_INTERFACE_INFO
|
|
# Capabilities
|
|
RSS_CAPABLE = 0x01
|
|
RDMA_CAPABLE = 0x02
|
|
|
|
# SMB2_QUERY_DIRECTORIES
|
|
# Information Class
|
|
FILE_DIRECTORY_INFORMATION = 0x01
|
|
FILE_FULL_DIRECTORY_INFORMATION = 0x02
|
|
FILEID_FULL_DIRECTORY_INFORMATION = 0x26
|
|
FILE_BOTH_DIRECTORY_INFORMATION = 0x03
|
|
FILEID_BOTH_DIRECTORY_INFORMATION = 0x25
|
|
FILENAMES_INFORMATION = 0x0C
|
|
|
|
# Flags
|
|
SMB2_RESTART_SCANS = 0x01
|
|
SMB2_RETURN_SINGLE_ENTRY = 0x02
|
|
SMB2_INDEX_SPECIFIED = 0x04
|
|
SMB2_REOPEN = 0x10
|
|
|
|
# SMB2_CHANGE_NOTIFY
|
|
# Flags
|
|
SMB2_WATCH_TREE = 0x01
|
|
|
|
# Filters
|
|
FILE_NOTIFY_CHANGE_FILE_NAME = 0x00000001
|
|
FILE_NOTIFY_CHANGE_DIR_NAME = 0x00000002
|
|
FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x00000004
|
|
FILE_NOTIFY_CHANGE_SIZE = 0x00000008
|
|
FILE_NOTIFY_CHANGE_LAST_WRITE = 0x00000010
|
|
FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x00000020
|
|
FILE_NOTIFY_CHANGE_CREATION = 0x00000040
|
|
FILE_NOTIFY_CHANGE_EA = 0x00000080
|
|
FILE_NOTIFY_CHANGE_SECURITY = 0x00000100
|
|
FILE_NOTIFY_CHANGE_STREAM_NAME = 0x00000200
|
|
FILE_NOTIFY_CHANGE_STREAM_SIZE = 0x00000400
|
|
FILE_NOTIFY_CHANGE_STREAM_WRITE = 0x00000800
|
|
|
|
# FILE_NOTIFY_INFORMATION
|
|
# Actions
|
|
FILE_ACTION_ADDED = 0x00000001
|
|
FILE_ACTION_REMOVED = 0x00000002
|
|
FILE_ACTION_MODIFIED = 0x00000003
|
|
FILE_ACTION_RENAMED_OLD_NAME = 0x00000004
|
|
FILE_ACTION_RENAMED_NEW_NAME = 0x00000005
|
|
|
|
# SMB2_QUERY_INFO
|
|
# InfoTypes
|
|
SMB2_0_INFO_FILE = 0x01
|
|
SMB2_0_INFO_FILESYSTEM = 0x02
|
|
SMB2_0_INFO_SECURITY = 0x03
|
|
SMB2_0_INFO_QUOTA = 0x04
|
|
|
|
# File Information Classes
|
|
SMB2_FILE_ACCESS_INFO = 8
|
|
SMB2_FILE_ALIGNMENT_INFO = 17
|
|
SMB2_FILE_ALL_INFO = 18
|
|
SMB2_FILE_ALLOCATION_INFO = 19
|
|
SMB2_FILE_ALTERNATE_NAME_INFO = 21
|
|
SMB2_ATTRIBUTE_TAG_INFO = 35
|
|
SMB2_FILE_BASIC_INFO = 4
|
|
SMB2_FILE_BOTH_DIRECTORY_INFO = 3
|
|
SMB2_FILE_COMPRESSION_INFO = 28
|
|
SMB2_FILE_DIRECTORY_INFO = 1
|
|
SMB2_FILE_DISPOSITION_INFO = 13
|
|
SMB2_FILE_EA_INFO = 7
|
|
SMB2_FILE_END_OF_FILE_INFO = 20
|
|
SMB2_FULL_DIRECTORY_INFO = 2
|
|
SMB2_FULL_EA_INFO = 15
|
|
SMB2_FILE_HARDLINK_INFO = 46
|
|
SMB2_FILE_ID_BOTH_DIRECTORY_INFO = 37
|
|
SMB2_FILE_ID_FULL_DIRECTORY_INFO = 38
|
|
SMB2_FILE_ID_GLOBAL_TX_DIRECTORY_INFO = 50
|
|
SMB2_FILE_INTERNAL_INFO = 6
|
|
SMB2_FILE_LINK_INFO = 11
|
|
SMB2_FILE_MAILSLOT_QUERY_INFO = 26
|
|
SMB2_FILE_MAILSLOT_SET_INFO = 27
|
|
SMB2_FILE_MODE_INFO = 16
|
|
SMB2_FILE_MOVE_CLUSTER_INFO = 31
|
|
SMB2_FILE_NAME_INFO = 9
|
|
SMB2_FILE_NAMES_INFO = 12
|
|
SMB2_FILE_NETWORK_OPEN_INFO = 34
|
|
SMB2_FILE_NORMALIZED_NAME_INFO = 48
|
|
SMB2_FILE_OBJECT_ID_INFO = 29
|
|
SMB2_FILE_PIPE_INFO = 23
|
|
SMB2_FILE_PIPE_LOCAL_INFO = 24
|
|
SMB2_FILE_PIPE_REMOTE_INFO = 25
|
|
SMB2_FILE_POSITION_INFO = 14
|
|
SMB2_FILE_QUOTA_INFO = 32
|
|
SMB2_FILE_RENAME_INFO = 10
|
|
SMB2_FILE_REPARSE_POINT_INFO = 33
|
|
SMB2_FILE_SFIO_RESERVE_INFO = 44
|
|
SMB2_FILE_SHORT_NAME_INFO = 45
|
|
SMB2_FILE_STANDARD_INFO = 5
|
|
SMB2_FILE_STANDARD_LINK_INFO = 54
|
|
SMB2_FILE_STREAM_INFO = 22
|
|
SMB2_FILE_TRACKING_INFO = 36
|
|
SMB2_FILE_VALID_DATA_LENGTH_INFO = 39
|
|
|
|
# File System Information Classes
|
|
SMB2_FILESYSTEM_VOLUME_INFO = 1
|
|
SMB2_FILESYSTEM_LABEL_INFO = 2
|
|
SMB2_FILESYSTEM_SIZE_INFO = 3
|
|
SMB2_FILESYSTEM_DEVICE_INFO = 4
|
|
SMB2_FILESYSTEM_ATTRIBUTE_INFO = 5
|
|
SMB2_FILESYSTEM_CONTROL_INFO = 6
|
|
SMB2_FILESYSTEM_FULL_SIZE_INFO = 7
|
|
SMB2_FILESYSTEM_OBJECT_ID_INFO = 8
|
|
SMB2_FILESYSTEM_DRIVER_PATH_INFO = 9
|
|
SMB2_FILESYSTEM_SECTOR_SIZE_INFO = 11
|
|
|
|
# Additional information
|
|
OWNER_SECURITY_INFORMATION = 0x00000001
|
|
GROUP_SECURITY_INFORMATION = 0x00000002
|
|
DACL_SECURITY_INFORMATION = 0x00000004
|
|
SACL_SECURITY_INFORMATION = 0x00000008
|
|
LABEL_SECURITY_INFORMATION = 0x00000010
|
|
|
|
# Flags
|
|
SL_RESTART_SCAN = 0x00000001
|
|
SL_RETURN_SINGLE_ENTRY = 0x00000002
|
|
SL_INDEX_SPECIFIED = 0x00000004
|
|
|
|
# TRANSFORM_HEADER
|
|
SMB2_ENCRYPTION_AES128_CCM = 0x0001
|
|
|
|
|
|
# STRUCtures
|
|
# Represents a SMB2/3 Packet
|
|
class SMBPacketBase(Structure):
|
|
def addCommand(self,command):
|
|
# Pad to 8 bytes and put the offset of another SMBPacket
|
|
raise 'Implement This!'
|
|
|
|
def isValidAnswer(self, status):
|
|
if self['Status'] != status:
|
|
import smb3
|
|
raise smb3.SessionError(self['Status'], self)
|
|
return True
|
|
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['TreeID'] = 0
|
|
|
|
|
|
class SMB2PacketAsync(SMBPacketBase):
|
|
structure = (
|
|
('ProtocolID','"\xfeSMB'),
|
|
('StructureSize','<H=64'),
|
|
('CreditCharge','<H=0'),
|
|
('Status','<L=0'),
|
|
('Command','<H=0'),
|
|
('CreditRequestResponse','<H=0'),
|
|
('Flags','<L=0'),
|
|
('NextCommand','<L=0'),
|
|
('MessageID','<Q=0'),
|
|
('AsyncID','<Q=0'),
|
|
('SessionID','<Q=0'),
|
|
('Signature','16s=""'),
|
|
('Data',':=""'),
|
|
)
|
|
|
|
class SMB3PacketAsync(SMBPacketBase):
|
|
structure = (
|
|
('ProtocolID','"\xfeSMB'),
|
|
('StructureSize','<H=64'),
|
|
('CreditCharge','<H=0'),
|
|
('ChannelSequence','<H=0'),
|
|
('Reserved','<H=0'),
|
|
('Command','<H=0'),
|
|
('CreditRequestResponse','<H=0'),
|
|
('Flags','<L=0'),
|
|
('NextCommand','<L=0'),
|
|
('MessageID','<Q=0'),
|
|
('AsyncID','<Q=0'),
|
|
('SessionID','<Q=0'),
|
|
('Signature','16s=""'),
|
|
('Data',':=""'),
|
|
)
|
|
|
|
class SMB2Packet(SMBPacketBase):
|
|
structure = (
|
|
('ProtocolID','"\xfeSMB'),
|
|
('StructureSize','<H=64'),
|
|
('CreditCharge','<H=0'),
|
|
('Status','<L=0'),
|
|
('Command','<H=0'),
|
|
('CreditRequestResponse','<H=0'),
|
|
('Flags','<L=0'),
|
|
('NextCommand','<L=0'),
|
|
('MessageID','<Q=0'),
|
|
('Reserved','<L=0'),
|
|
('TreeID','<L=0'),
|
|
('SessionID','<Q=0'),
|
|
('Signature','16s=""'),
|
|
('Data',':=""'),
|
|
)
|
|
|
|
class SMB3Packet(SMBPacketBase):
|
|
structure = (
|
|
('ProtocolID','"\xfeSMB'),
|
|
('StructureSize','<H=64'),
|
|
('CreditCharge','<H=0'),
|
|
('ChannelSequence','<H=0'),
|
|
('Reserved','<H=0'),
|
|
('Command','<H=0'),
|
|
('CreditRequestResponse','<H=0'),
|
|
('Flags','<L=0'),
|
|
('NextCommand','<L=0'),
|
|
('MessageID','<Q=0'),
|
|
('Reserved','<L=0'),
|
|
('TreeID','<L=0'),
|
|
('SessionID','<Q=0'),
|
|
('Signature','16s=""'),
|
|
('Data',':=""'),
|
|
)
|
|
|
|
class SMB2Error(Structure):
|
|
structure = (
|
|
('StructureSize','<H=9'),
|
|
('Reserved','<H=0'),
|
|
('ByteCount','<L=0'),
|
|
('_ErrorData','_-ErrorData','self["ByteCount"]'),
|
|
('ErrorData','"\xff'),
|
|
)
|
|
|
|
class SMB2ErrorSymbolicLink(Structure):
|
|
structure = (
|
|
('SymLinkLength','<L=0'),
|
|
('SymLinkErrorTag','<L=0'),
|
|
('ReparseTag','<L=0'),
|
|
('ReparseDataLenght','<H=0'),
|
|
('UnparsedPathLength','<H=0'),
|
|
('SubstituteNameOffset','<H=0'),
|
|
('SubstituteNameLength','<H=0'),
|
|
('PrintNameOffset','<H=0'),
|
|
('PrintNameLength','<H=0'),
|
|
('Flags','<L=0'),
|
|
('PathBuffer',':'),
|
|
)
|
|
|
|
# SMB2_NEGOTIATE
|
|
class SMB2Negotiate(Structure):
|
|
structure = (
|
|
('StructureSize','<H=36'),
|
|
('DialectCount','<H=0'),
|
|
('SecurityMode','<H=0'),
|
|
('Reserved','<H=0'),
|
|
('Capabilities','<L=0'),
|
|
('ClientGuid','16s=""'),
|
|
('ClientStartTime','<Q=0'),
|
|
('Dialects','*<H'),
|
|
)
|
|
|
|
class SMB2Negotiate_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=65'),
|
|
('SecurityMode','<H=0'),
|
|
('DialectRevision','<H=0'),
|
|
('Reserved','<H=0'),
|
|
('ServerGuid','16s=""'),
|
|
('Capabilities','<L=0'),
|
|
('MaxTransactSize','<L=0'),
|
|
('MaxReadSize','<L=0'),
|
|
('MaxWriteSize','<L=0'),
|
|
('SystemTime','<Q=0'),
|
|
('ServerStartTime','<Q=0'),
|
|
('SecurityBufferOffset','<H=0'),
|
|
('SecurityBufferLength','<H=0'),
|
|
('Reserved2','<L=0'),
|
|
('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
# SMB2_SESSION_SETUP
|
|
class SMB2SessionSetup(Structure):
|
|
SIZE = 24
|
|
structure = (
|
|
('StructureSize','<H=25'),
|
|
('Flags','<B=0'),
|
|
('SecurityMode','<B=0'),
|
|
('Capabilities','<L=0'),
|
|
('Channel','<L=0'),
|
|
('SecurityBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
|
|
('SecurityBufferLength','<H=0'),
|
|
('PreviousSessionId','<Q=0'),
|
|
('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['AlignPad'] = ''
|
|
|
|
def getData(self):
|
|
#self['AlignPad'] = '\x00' * ((8 - ((24 + SMB2_PACKET_SIZE) & 7)) & 7)
|
|
#self['SecurityBufferOffset'] = 24 + SMB2_PACKET_SIZE +len(self['AlignPad'])
|
|
#self['SecurityBufferLength'] += len(self['AlignPad'])
|
|
return Structure.getData(self)
|
|
|
|
|
|
class SMB2SessionSetup_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=9'),
|
|
('SessionFlags','<H=0'),
|
|
('SecurityBufferOffset','<H=0'),
|
|
('SecurityBufferLength','<H=0'),
|
|
('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
# SMB2_LOGOFF
|
|
class SMB2Logoff(Structure):
|
|
structure = (
|
|
('StructureSize','<H=4'),
|
|
('Reserved','<H=0'),
|
|
)
|
|
|
|
|
|
class SMB2Logoff_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=4'),
|
|
('Reserved','<H=0'),
|
|
)
|
|
|
|
# SMB2_TREE_CONNECT
|
|
class SMB2TreeConnect(Structure):
|
|
SIZE = 8
|
|
structure = (
|
|
('StructureSize','<H=9'),
|
|
('Reserved','<H=0'),
|
|
('PathOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
|
|
('PathLength','<H=0'),
|
|
('_AlignPad','_-AlignPad','self["PathOffset"] - (64 + self.SIZE - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["PathLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['AlignPad'] = ''
|
|
|
|
class SMB2TreeConnect_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=16'),
|
|
('ShareType','<B=0'),
|
|
('Reserved','<B=0'),
|
|
('ShareFlags','<L=0'),
|
|
('Capabilities','<L=0'),
|
|
('MaximalAccess','<L=0'),
|
|
)
|
|
|
|
# SMB2_TREE_DISCONNECT
|
|
class SMB2TreeDisconnect(Structure):
|
|
structure = (
|
|
('StructureSize','<H=4'),
|
|
('Reserved','<H=0'),
|
|
)
|
|
|
|
class SMB2TreeDisconnect_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=4'),
|
|
('Reserved','<H=0'),
|
|
)
|
|
|
|
# SMB2_CREATE
|
|
class SMB2Create(Structure):
|
|
SIZE = 56
|
|
structure = (
|
|
('StructureSize','<H=57'),
|
|
('SecurityFlags','<B=0'),
|
|
('RequestedOplockLevel','<B=0'),
|
|
('ImpersonationLevel','<L=0'),
|
|
('SmbCreateFlags','<Q=0'),
|
|
('Reserved','<Q=0'),
|
|
('DesiredAccess','<L=0'),
|
|
('FileAttributes','<L=0'),
|
|
('ShareAccess','<L=0'),
|
|
('CreateDisposition','<L=0'),
|
|
('CreateOptions','<L=0'),
|
|
('NameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
|
|
('NameLength','<H=0'),
|
|
('CreateContextsOffset','<L=0'),
|
|
('CreateContextsLength','<L=0'),
|
|
('_AlignPad','_-AlignPad','self["NameOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["CreateContextsLength"]+self["NameLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['AlignPad'] = ''
|
|
|
|
class SMB2CreateContext(Structure):
|
|
structure = (
|
|
('Next','<L=0'),
|
|
('NameOffset','<H=0'),
|
|
('NameLength','<H=0'),
|
|
('Reserved','<H=0'),
|
|
('DataOffset','<H=0'),
|
|
('DataLength','<L=0'),
|
|
('_Buffer','_-Buffer','self["DataLength"]+self["NameLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
class SMB2_FILEID(Structure):
|
|
structure = (
|
|
('Persistent','<Q=0'),
|
|
('Volatile','<Q=0'),
|
|
)
|
|
|
|
class SMB2Create_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=89'),
|
|
('OplockLevel','<B=0'),
|
|
('Flags','<B=0'),
|
|
('CreateAction','<L=0'),
|
|
('CreationTime','<Q=0'),
|
|
('LastAccessTime','<Q=0'),
|
|
('LastWriteTime','<Q=0'),
|
|
('ChangeTime','<Q=0'),
|
|
('AllocationSize','<Q=0'),
|
|
('EndOfFile','<Q=0'),
|
|
('FileAttributes','<L=0'),
|
|
('Reserved2','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('CreateContextsOffset','<L=0'),
|
|
('CreateContextsLength','<L=0'),
|
|
('_AlignPad','_-AlignPad','self["CreateContextsOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["CreateContextsLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
class FILE_FULL_EA_INFORMATION(Structure):
|
|
structure = (
|
|
('NextEntryOffset','<L=0'),
|
|
('Flags','<B=0'),
|
|
('EaNameLength','<B=0'),
|
|
('EaValueLength','<H=0'),
|
|
('_EaName','_-EaName','self["EaNameLength"]'),
|
|
('EaName',':'),
|
|
('_EaValue','_-EaValue','self["EaValue"]'),
|
|
('EaValue',':'),
|
|
)
|
|
|
|
|
|
class SMB2_CREATE_DURABLE_HANDLE_RECONNECT(Structure):
|
|
structure = (
|
|
('Data',':',SMB2_FILEID),
|
|
)
|
|
|
|
class SMB2_CREATE_DURABLE_HANDLE_REQUEST(Structure):
|
|
structure = (
|
|
('DurableRequest','16s=""'),
|
|
)
|
|
|
|
class SMB2_CREATE_DURABLE_HANDLE_RESPONSE(Structure):
|
|
structure = (
|
|
('Reserved','<Q=0'),
|
|
)
|
|
|
|
class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST(Structure):
|
|
structure = (
|
|
('Timestamp','<Q=0'),
|
|
)
|
|
|
|
class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE(Structure):
|
|
structure = (
|
|
('QueryStatus','<L=0'),
|
|
('MaximalAccess','<L=0'),
|
|
)
|
|
|
|
class SMB2_CREATE_ALLOCATION_SIZE(Structure):
|
|
structure = (
|
|
('AllocationSize','<Q=0'),
|
|
)
|
|
|
|
class SMB2_CREATE_TIMEWARP_TOKEN(Structure):
|
|
structure = (
|
|
('AllocationSize','<Q=0'),
|
|
)
|
|
|
|
class SMB2_CREATE_REQUEST_LEASE(Structure):
|
|
structure = (
|
|
('LeaseKey','16s=""'),
|
|
('LeaseState','<L=0'),
|
|
('LeaseFlags','<L=0'),
|
|
('LeaseDuration','<Q=0'),
|
|
)
|
|
|
|
SMB2_CREATE_RESPONSE_LEASE = SMB2_CREATE_REQUEST_LEASE
|
|
|
|
class SMB2_CREATE_REQUEST_LEASE_V2(Structure):
|
|
structure = (
|
|
('LeaseKey','16s=""'),
|
|
('LeaseState','<L=0'),
|
|
('Flags','<L=0'),
|
|
('LeaseDuration','<Q=0'),
|
|
('ParentLeaseKey','16s=""'),
|
|
('Epoch','<H=0'),
|
|
('Reserved','<H=0'),
|
|
)
|
|
|
|
SMB2_CREATE_RESPONSE_LEASE_V2 = SMB2_CREATE_REQUEST_LEASE_V2
|
|
|
|
class SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2(Structure):
|
|
structure = (
|
|
('Timeout','<L=0'),
|
|
('Flags','<L=0'),
|
|
('Reserved','8s=""'),
|
|
('CreateGuid','16s=""'),
|
|
)
|
|
|
|
class SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2(Structure):
|
|
structure = (
|
|
('Timeout','<L=0'),
|
|
('Flags','<L=0'),
|
|
)
|
|
|
|
class SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2(Structure):
|
|
structure = (
|
|
('FileID',':', SMB2_FILEID),
|
|
('CreateGuid','16s=""'),
|
|
('Flags','<L=0'),
|
|
)
|
|
|
|
class SMB2_CREATE_APP_INSTANCE_ID(Structure):
|
|
structure = (
|
|
('StructureSize','<H=0'),
|
|
('Reserved','<H=0'),
|
|
('AppInstanceId','16s=""'),
|
|
)
|
|
|
|
class SMB2_CREATE_QUERY_ON_DISK_ID(Structure):
|
|
structure = (
|
|
('DiskIDBuffer','32s=""'),
|
|
)
|
|
|
|
# Todo: Add Classes for
|
|
#SMB2_CREATE_SD_BUFFER
|
|
|
|
# SMB2_CLOSE
|
|
class SMB2Close(Structure):
|
|
structure = (
|
|
('StructureSize','<H=24'),
|
|
('Flags','<H=0'),
|
|
('Reserved','<L=0'),
|
|
('FileID',':', SMB2_FILEID),
|
|
)
|
|
|
|
class SMB2Close_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=60'),
|
|
('Flags','<H=0'),
|
|
('Reserved','<L=0'),
|
|
('CreationTime','<Q=0'),
|
|
('LastAccessTime','<Q=0'),
|
|
('LastWriteTime','<Q=0'),
|
|
('ChangeTime','<Q=0'),
|
|
('AllocationSize','<Q=0'),
|
|
('EndofFile','<Q=0'),
|
|
('FileAttributes','<L=0'),
|
|
)
|
|
|
|
# SMB2_FLUSH
|
|
class SMB2Flush(Structure):
|
|
structure = (
|
|
('StructureSize','<H=24'),
|
|
('Reserved1','<H=0'),
|
|
('Reserved2','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
)
|
|
|
|
class SMB2Flush_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=4'),
|
|
('Reserved','<H=0'),
|
|
)
|
|
|
|
# SMB2_READ
|
|
class SMB2Read(Structure):
|
|
SIZE = 48
|
|
structure = (
|
|
('StructureSize','<H=49'),
|
|
('Padding','<B=0'),
|
|
('Reserved','<B=0'),
|
|
('Length','<L=0'),
|
|
('Offset','<Q=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('MinimumCount','<L=0'),
|
|
('Channel','<L=0'),
|
|
('RemainingBytes','<L=0'),
|
|
('ReadChannelInfoOffset','<H=0'),
|
|
('ReadChannelInfoLength','<H=0'),
|
|
('_AlignPad','_-AlignPad','self["ReadChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["ReadChannelInfoLength"]'),
|
|
('Buffer',':=0'),
|
|
)
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['AlignPad'] = ''
|
|
|
|
|
|
class SMB2Read_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=17'),
|
|
('DataOffset','<B=0'),
|
|
('Reserved','<B=0'),
|
|
('DataLength','<L=0'),
|
|
('DataRemaining','<L=0'),
|
|
('Reserved2','<L=0'),
|
|
('_AlignPad','_-AlignPad','self["DataOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["DataLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
# SMB2_WRITE
|
|
class SMB2Write(Structure):
|
|
SIZE = 48
|
|
structure = (
|
|
('StructureSize','<H=49'),
|
|
('DataOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
|
|
('Length','<L=0'),
|
|
('Offset','<Q=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('Channel','<L=0'),
|
|
('RemainingBytes','<L=0'),
|
|
('WriteChannelInfoOffset','<H=0'),
|
|
('WriteChannelInfoLength','<H=0'),
|
|
('_AlignPad','_-AlignPad','self["DataOffset"] + self["WriteChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('Flags','<L=0'),
|
|
('_Buffer','_-Buffer','self["Length"]+self["WriteChannelInfoLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['AlignPad'] = ''
|
|
|
|
|
|
class SMB2Write_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=17'),
|
|
('Reserved','<H=0'),
|
|
('Count','<L=0'),
|
|
('Remaining','<L=0'),
|
|
('WriteChannelInfoOffset','<H=0'),
|
|
('WriteChannelInfoLength','<H=0'),
|
|
)
|
|
|
|
class SMB2OplockBreakNotification(Structure):
|
|
structure = (
|
|
('StructureSize','<H=24'),
|
|
('OplockLevel','<B=0'),
|
|
('Reserved','<B=0'),
|
|
('Reserved2','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
)
|
|
|
|
SMB2OplockBreakAcknowledgment = SMB2OplockBreakNotification
|
|
SMB2OplockBreakResponse = SMB2OplockBreakNotification
|
|
|
|
class SMB2LeaseBreakNotification(Structure):
|
|
structure = (
|
|
('StructureSize','<H=44'),
|
|
('NewEpoch','<H=0'),
|
|
('Flags','<L=0'),
|
|
('LeaseKey','16s=""'),
|
|
('CurrentLeaseState','<L=0'),
|
|
('NewLeaseState','<L=0'),
|
|
('BreakReason','<L=0'),
|
|
('AccessMaskHint','<L=0'),
|
|
('ShareMaskHint','<L=0'),
|
|
)
|
|
|
|
class SMB2LeaseBreakAcknowledgement(Structure):
|
|
structure = (
|
|
('StructureSize','<H=36'),
|
|
('Reserved','<H=0'),
|
|
('Flags','<L=0'),
|
|
('LeaseKey','16s=""'),
|
|
('LeaseState','<L=0'),
|
|
('LeaseDuration','<Q=0'),
|
|
)
|
|
|
|
SMB2LeaseBreakResponse = SMB2LeaseBreakAcknowledgement
|
|
|
|
# SMB2_LOCK
|
|
class SMB2_LOCK_ELEMENT(Structure):
|
|
structure = (
|
|
('Offset','<Q=0'),
|
|
('Length','<Q=0'),
|
|
('Flags','<L=0'),
|
|
('Reserved','<L=0'),
|
|
)
|
|
|
|
class SMB2Lock(Structure):
|
|
structure = (
|
|
('StructureSize','<H=48'),
|
|
('LockCount','<H=0'),
|
|
('LockSequence','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('_Locks','_-Locks','self["LockCount"]*24'),
|
|
('Locks',':'),
|
|
)
|
|
|
|
class SMB2Lock_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=4'),
|
|
('Reserved','<H=0'),
|
|
)
|
|
|
|
|
|
# SMB2_ECHO
|
|
class SMB2Echo(Structure):
|
|
structure = (
|
|
('StructureSize','<H=4'),
|
|
('Reserved','<H=0'),
|
|
)
|
|
|
|
SMB2Echo_Response = SMB2Echo
|
|
|
|
# SMB2_CANCEL`
|
|
class SMB2Cancel(Structure):
|
|
structure = (
|
|
('StructureSize','<H=4'),
|
|
('Reserved','<H=0'),
|
|
)
|
|
|
|
# SMB2_IOCTL
|
|
class SMB2Ioctl(Structure):
|
|
SIZE = 56
|
|
structure = (
|
|
('StructureSize','<H=57'),
|
|
('Reserved','<H=0'),
|
|
('CtlCode','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('InputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]))'),
|
|
('InputCount','<L=0'),
|
|
('MaxInputResponse','<L=0'),
|
|
('OutputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]) + self["InputCount"])'),
|
|
('OutputCount','<L=0'),
|
|
('MaxOutputResponse','<L=0'),
|
|
('Flags','<L=0'),
|
|
('Reserved2','<L=0'),
|
|
#('_AlignPad','_-AlignPad','self["InputOffset"] + self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
#('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
|
|
('Buffer',':'),
|
|
)
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['AlignPad'] = ''
|
|
|
|
class FSCTL_PIPE_WAIT_STRUCTURE(Structure):
|
|
structure = (
|
|
('Timeout','<q=0'),
|
|
('NameLength','<L=0'),
|
|
('TimeoutSpecified','<B=0'),
|
|
('Padding','<B=0'),
|
|
('_Name','_-Name','self["NameLength"]'),
|
|
('Name',':'),
|
|
)
|
|
|
|
class SRV_COPYCHUNK_COPY(Structure):
|
|
structure = (
|
|
('SourceKey','24s=""'),
|
|
('ChunkCount','<L=0'),
|
|
('Reserved','<L=0'),
|
|
('_Chunks','_-Chunks', 'self["ChunkCount"]*len(SRV_COPYCHUNK)'),
|
|
('Chunks',':'),
|
|
)
|
|
|
|
class SRV_COPYCHUNK(Structure):
|
|
structure = (
|
|
('SourceOffset','<Q=0'),
|
|
('TargetOffset','<Q=0'),
|
|
('Length','<L=0'),
|
|
('Reserved','<L=0'),
|
|
)
|
|
|
|
class SRV_COPYCHUNK_RESPONSE(Structure):
|
|
structure = (
|
|
('ChunksWritten','<L=0'),
|
|
('ChunkBytesWritten','<L=0'),
|
|
('TotalBytesWritten','<L=0'),
|
|
)
|
|
|
|
class SRV_READ_HASH(Structure):
|
|
structure = (
|
|
('HashType','<L=0'),
|
|
('HashVersion','<L=0'),
|
|
('HashRetrievalType','<L=0'),
|
|
('Length','<L=0'),
|
|
('Offset','<Q=0'),
|
|
)
|
|
|
|
class NETWORK_RESILIENCY_REQUEST(Structure):
|
|
structure = (
|
|
('Timeout','<L=0'),
|
|
('Reserved','<L=0'),
|
|
)
|
|
|
|
class VALIDATE_NEGOTIATE_INFO(Structure):
|
|
structure = (
|
|
('Capabilities','<L=0'),
|
|
('Guid','16s=""'),
|
|
('SecurityMode','<H=0'),
|
|
#('DialectCount','<H=0'),
|
|
('Dialects','<H*<H'),
|
|
)
|
|
|
|
class SRV_SNAPSHOT_ARRAY(Structure):
|
|
structure = (
|
|
('NumberOfSnapShots','<L=0'),
|
|
('NumberOfSnapShotsReturned','<L=0'),
|
|
('SnapShotArraySize','<L=0'),
|
|
('_SnapShots','_-SnapShots','self["SnapShotArraySize"]'),
|
|
('SnapShots',':'),
|
|
)
|
|
|
|
class SRV_REQUEST_RESUME_KEY(Structure):
|
|
structure = (
|
|
('ResumeKey','24s=""'),
|
|
('ContextLength','<L=0'),
|
|
('_Context','_-Context','self["ContextLength"]'),
|
|
('Context',':'),
|
|
)
|
|
|
|
class HASH_HEADER(Structure):
|
|
structure = (
|
|
('HashType','<L=0'),
|
|
('HashVersion','<L=0'),
|
|
('SourceFileChangeTime','<Q=0'),
|
|
('SourceFileSize','<Q=0'),
|
|
('HashBlobLength','<L=0'),
|
|
('HashBlobOffset','<L=0'),
|
|
('Dirty','<H=0'),
|
|
('SourceFileNameLength','<L=0'),
|
|
('_SourceFileName','_-SourceFileName','self["SourceFileNameLength"]',),
|
|
('SourceFileName',':'),
|
|
)
|
|
|
|
class SRV_HASH_RETRIEVE_HASH_BASED(Structure):
|
|
structure = (
|
|
('Offset','<Q=0'),
|
|
('BufferLength','<L=0'),
|
|
('Reserved','<L=0'),
|
|
('_Buffer','_-Buffer','self["BufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
class SRV_HASH_RETRIEVE_FILE_BASED(Structure):
|
|
structure = (
|
|
('FileDataOffset','<Q=0'),
|
|
('FileDataLength','<Q=0'),
|
|
('BufferLength','<L=0'),
|
|
('Reserved','<L=0'),
|
|
('_Buffer','_-Buffer','self["BufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
class NETWORK_INTERFACE_INFO(Structure):
|
|
structure = (
|
|
('Next','<L=0'),
|
|
('IfIndex','<L=0'),
|
|
('Capability','<L=0'),
|
|
('Reserved','<L=0'),
|
|
('LinkSpeed','<Q=0'),
|
|
('SockAddr_Storage','128s=""'),
|
|
)
|
|
|
|
class SMB2Ioctl_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=49'),
|
|
('Reserved','<H=0'),
|
|
('CtlCode','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('InputOffset','<L=0'),
|
|
('InputCount','<L=0'),
|
|
('OutputOffset','<L=0'),
|
|
('OutputCount','<L=0'),
|
|
('Flags','<L=0'),
|
|
('Reserved2','<L=0'),
|
|
('_AlignPad','_-AlignPad','self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
# SMB2_QUERY_DIRECTORY
|
|
class SMB2QueryDirectory(Structure):
|
|
SIZE = 32
|
|
structure = (
|
|
('StructureSize','<H=33'),
|
|
('FileInformationClass','<B=0'),
|
|
('Flags','<B=0'),
|
|
('FileIndex','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('FileNameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
|
|
('FileNameLength','<H=0'),
|
|
('OutputBufferLength','<L=0'),
|
|
('_AlignPad','_-AlignPad','self["FileNameOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["FileNameLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['AlignPad'] = ''
|
|
|
|
class SMB2QueryDirectory_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=9'),
|
|
('OutputBufferOffset','<H=0'),
|
|
('OutputBufferLength','<L=0'),
|
|
('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["OutputBufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
# SMB2_CHANGE_NOTIFY
|
|
class SMB2ChangeNotify(Structure):
|
|
structure = (
|
|
('StructureSize','<H=32'),
|
|
('Flags','<H=0'),
|
|
('OutputBufferLength','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('CompletionFilter','<L=0'),
|
|
('Reserved','<L=0'),
|
|
)
|
|
|
|
class SMB2ChangeNotify_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=9'),
|
|
('OutputBufferOffset','<H=0'),
|
|
('OutputBufferLength','<L=0'),
|
|
('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["OutputBufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
class FILE_NOTIFY_INFORMATION(Structure):
|
|
structure = (
|
|
('NextEntryOffset','<L=0'),
|
|
('Action','<L=0'),
|
|
('FileNameLength','<L=0'),
|
|
('_FileName','_-FileName','self["FileNameLength"]',),
|
|
('FileName',':'),
|
|
)
|
|
|
|
# SMB2_QUERY_INFO
|
|
class SMB2QueryInfo(Structure):
|
|
SIZE = 40
|
|
structure = (
|
|
('StructureSize','<H=41'),
|
|
('InfoType','<B=0'),
|
|
('FileInfoClass','<B=0'),
|
|
('OutputBufferLength','<L=0'),
|
|
('InputBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
|
|
('Reserved','<H=0'),
|
|
('InputBufferLength','<L=0'),
|
|
('AdditionalInformation','<L=0'),
|
|
('Flags','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('_AlignPad','_-AlignPad','self["InputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["InputBufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['AlignPad'] = ''
|
|
|
|
|
|
class SMB2_QUERY_QUOTA_INFO(Structure):
|
|
structure = (
|
|
('ReturnSingle','<B=0'),
|
|
('RestartScan','<B=0'),
|
|
('Reserved','<H=0'),
|
|
('SidListLength','<L=0'),
|
|
('StartSidLength','<L=0'),
|
|
('StartSidOffset','<L=0'),
|
|
# ToDo: Check 2.2.37.1 here
|
|
('SidBuffer',':'),
|
|
)
|
|
|
|
class SMB2QueryInfo_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=9'),
|
|
('OutputBufferOffset','<H=0'),
|
|
('OutputBufferLength','<L=0'),
|
|
('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["OutputBufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
|
|
# SMB2_SET_INFO
|
|
class SMB2SetInfo(Structure):
|
|
SIZE = 32
|
|
structure = (
|
|
('StructureSize','<H=33'),
|
|
('InfoType','<B=0'),
|
|
('FileInfoClass','<B=0'),
|
|
('BufferLength','<L=0'),
|
|
('BufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
|
|
('Reserved','<H=0'),
|
|
('AdditionalInformation','<L=0'),
|
|
('FileID',':',SMB2_FILEID),
|
|
('_AlignPad','_-AlignPad','self["BufferOffset"] - (64 + self["StructureSize"] - 1)'),
|
|
('AlignPad',':=""'),
|
|
('_Buffer','_-Buffer','self["BufferLength"]'),
|
|
('Buffer',':'),
|
|
)
|
|
def __init__(self, data = None):
|
|
Structure.__init__(self,data)
|
|
if data is None:
|
|
self['AlignPad'] = ''
|
|
|
|
class SMB2SetInfo_Response(Structure):
|
|
structure = (
|
|
('StructureSize','<H=2'),
|
|
)
|
|
|
|
class FILE_RENAME_INFORMATION_TYPE_2(Structure):
|
|
structure = (
|
|
('ReplaceIfExists','<B=0'),
|
|
('Reserved','7s=""'),
|
|
('RootDirectory','<Q=0'),
|
|
('FileNameLength','<L=0'),
|
|
('_FileName','_-FileName','self["FileNameLength"]'),
|
|
('FileName',':'),
|
|
)
|
|
|
|
class SMB2_TRANSFORM_HEADER(Structure):
|
|
structure = (
|
|
('ProtocolID','"\xfdSMB'),
|
|
('Signature','16s=""'),
|
|
('Nonce','16s=""'),
|
|
('OriginalMessageSize','<L=0'),
|
|
('Reserved','<H=0'),
|
|
('EncryptionAlgorithm','<H=0'),
|
|
('SessionID','<Q=0'),
|
|
)
|
|
|
|
# SMB2_FILE_INTERNAL_INFO
|
|
class FileInternalInformation(Structure):
|
|
structure = (
|
|
('IndexNumber','<q=0'),
|
|
)
|