o
    j2                    @   sF  d dl mZ d dl mZ d dlZd dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZ G d
d dZdZdZdZdZdZG dd deZ G dd de Z!G dd de Z"G dd de Z#G dd de$Z%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-d Z.d!Z/d Z0dZ1d"Z2dZ3d Z4dZ5dZ6dZ7d"Z8d!Z9de9 Z:dZ;d Z<dZ=d#Z>d$Z?d%Z@d&ZAd'ZBd(ZCd)ZDd*ZEd+ZFd,ZGd-ZHd.ZId/ZJd*ZKe>e?e@fZLd0d1 ZMd2ZNdZOdZPd3ZQd4ZRd5ZSd6ZTd7ZUd8ZVd9ZWd:ZXd;ZYd<ZZd=Z[d>Z\d?Z]d@Z^dAZ_dBZ`dCZadDZbdEZcdFZddZedGZfd9ZgdHZhdZidZjdZkdZldIZmdZndZod"ZpdJZqdGZrdKZsdLZtdMZudNZvdOZwdPZxdQZydRZzdSZ{dTZ|dUZ}dVZ~dWZdXZdYZdZZd[Zd\Zd]Zd^Zd_Zd`ZdaZdbZdcZddZdeZdfZdgZdhZdiZd6ZdjZd>ZdkZdlZdmZdnZdoZdpZdqZdrZdsZG dtdu dueZG dvdw dweZG dxdy dyeZG dzd{ d{eZG d|d} d}eZG d~d deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dZdS )    )division)print_functionN)md5)Decimal
getcontext)uuid4)ntlmuuidLOG)	Structure)MSSQL_VERSIONc                   @   s   e Zd Zdd ZdS )
DummyPrintc                 C   s6   |dkr
t | d S |dkrt   d S t |dd d S )N
 )end)print)selfmessage r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/tds.py
logMessage>   s
   
zDummyPrint.logMessageN)__name__
__module____qualname__r   r   r   r   r   r   =   s    r   i              c                   @      e Zd ZdZdS )SQLR))OpCodeBN)r   r   r   	commonHdrr   r   r   r   r    O       r    c                   @      e Zd ZdZdddZdS )SQLR_UCAST_INSTInstance:Nc                 C   $   t | | |d urt| d< d S d S Nr!   )r    __init__SQLR_CLNT_UCAST_INSTr   datar   r   r   r,   V      zSQLR_UCAST_INST.__init__Nr   r   r   	structurer,   r   r   r   r   r&   S   s    r&   c                   @   r%   )SQLR_UCAST_DAC))ProtocolzB=1r'   Nc                 C   r*   r+   )r    r,   SQLR_CLNT_UCAST_DACr.   r   r   r   r,   b   r0   zSQLR_UCAST_DAC.__init__r1   r2   r   r   r   r   r4   \   s    r4   c                   @   r   )SQLR_Response))Size<H)_Data_-Datazself["Size"]Datar)   Nr   r   r   r3   r   r   r   r   r7   h   r$   r7   c                   @   s   e Zd ZdS )SQLErrorExceptionN)r   r   r   r   r   r   r   r?   p   s    r?                           p   q   iq  ir	 is
 is it  i   i  qi 	ri 
si si  tc                 C   s   | t vS r1   )TDS_LEGACY_LOGIN7_VERSIONS)tds_versionr   r   r    login7_uses_72_plus_token_layout   s   rL                                             x      y               
         	         0   2   4   8   :   ;   <   =   >   z      $   &   7   ?   h   j   l   m   n   o   (   )   *   +   /   '   -   %                     #   "   c   b   c                   @   r   )	TDSPacket)Type<B)Statusz<B=1)Lengthz>H=8+len(Data))SPIDz>H=0)PacketID<B=0)Windowr   r<   Nr>   r   r   r   r   r     r$   r   c                   @   s   e Zd ZdZdd ZdS )TDS_PRELOGIN))VersionTokenz>B=0)VersionOffset>H)VersionLengthz>H=len(self["Version"]))EncryptionTokenz>B=0x1)EncryptionOffsetr   )EncryptionLengthz>H=1)InstanceTokenz>B=2)InstanceOffsetr   )InstanceLengthz>H=len(self["Instance"]))ThreadIDTokenz>B=3)ThreadIDOffsetr   )ThreadIDLengthz>H=4)EndTokenz>B=0xff)_Versionz	_-Versionzself["VersionLength"])Versionr)   )
Encryptionr"   )	_Instancez
_-Instancezself["InstanceLength"]-1r'   )ThreadIDr)   c                 C   sR   d| d< | d t | d  | d< | d d | d< | d t | d  | d< t| S )	N   r   r   r   r@   r   r(   r   )lenr   getDatar   r   r   r   r   3  s
   
zTDS_PRELOGIN.getDataN)r   r   r   r3   r   r   r   r   r   r     s    r   c                   @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )	TDS_LOGIN)3)r   <L=0)
TDSVersionz>L=0x71)
PacketSizez<L=32764)ClientProgVerz>L=7)	ClientPIDr   )ConnectionIDr   )OptionFlags1z<B=0xe0)OptionFlags2r   )	TypeFlagsr   )OptionFlags3r   )ClientTimeZoner   )
ClientLCIDr   )HostNameOffsetr9   )HostNameLengthz<H=len(self["HostName"])//2)UserNameOffset<H=0)UserNameLengthz<H=len(self["UserName"])//2)PasswordOffsetr   )PasswordLengthz<H=len(self["Password"])//2)AppNameOffsetr9   )AppNameLengthz<H=len(self["AppName"])//2)ServerNameOffsetr9   )ServerNameLengthz<H=len(self["ServerName"])//2)ExtensionOffsetr   )ExtensionLengthr   )CltIntNameOffsetr9   )CltIntNameLengthz<H=len(self["CltIntName"])//2)LanguageOffsetr   )LanguageLengthz<H=len(self["Language"])//2)DatabaseOffsetr   )DatabaseLengthz<H=len(self["Database"])//2)ClientIDz6s=b"")
SSPIOffsetr9   )
SSPILengthz!<H=min(len(self["SSPI"]), 0xFFFF))AtchDBFileOffsetr9   )AtchDBFileLengthz<H=len(self["AtchDBFile"])//2)ChangePasswordOffsetr   )ChangePasswordLengthz!<H=len(self["ChangePassword"])//2)SSPILongLengthr   )HostNamer)   )UserNamer)   )Passwordr)   )AppNamer)   
ServerNamer)   )ExtensionOffsetDatar)   )
CltIntNamer)   )Languager)   )Databaser)   )SSPIr)   )
AtchDBFiler)   )ChangePasswordr)   )FeatureExtDatar)   Nc                 C   s   t | | |d u rHd| d< d| d< d| d< d| d< d| d< d| d< d| d	< d
| d< d
| d< d| d< d| d< d| d< d| d< d| d< d| d< d S d S )N    r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r,   r.   r   r   r   r,   r  s$   zTDS_LOGIN.__init__c                 C   s   | j dt}|tkS )Nr   )fieldsgetTDS_LOGIN7_VERSION_71TDS_LOGIN7_VERSION_74r   rK   r   r   r   _uses_74_plus_layout  s   zTDS_LOGIN._uses_74_plus_layoutc                 C   s   t d|t|| S )Nz<BL)structpackr   )r   
feature_idpayloadr   r   r   _pack_feature_ext  s   zTDS_LOGIN._pack_feature_extc                 C   s   dS )Nr   r   r   r   r   r   _build_feature_ext  s   zTDS_LOGIN._build_feature_extc                 C   s  t | | | d dkr|| d d  d | d d  | d< | d dkr6|| d d  d | d d  | d< | d	 dkrN|| d
 d  d | d	 d  | d< | d dkrf|| d d  d | d d  | d< | d dkr~|| d d  d | d d  | d< | d dkr|| d d  d | d d  | d< | d dkr|| d d  d | d d  | d< | d dkr|| d d  d | d d  | d< | d dkr| d p| d }|| d d  d | | d< | d dkr|| d  d  d | d d  | d!< | d" dkr|| d# d  d | d" d  | d$< | d% d&krN| d' d& t|krP|| d' | d' d&  | d(< td)| d( d }|t|k rR||d  | d*< d S d S d S d S )+Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <Lr   )r   
fromStringr   r   unpack)r   r/   sspi_lenfeature_ext_offsetr   r   r   r     sf   $$zTDS_LOGIN.fromStringc                 C   sB  |   }|r
|  nd}t|}d}|| d< |t| d 7 }| d dkr)|| d< nd| d< |t| d 7 }| d	 dkr@|| d
< nd| d
< |t| d	 7 }|| d< | d t| d  }|| d< |t| d 7 }|r| jdddB | d< || d< |r{|nd| d< |rdnd| d< |r| d  dO  < |d7 }nd| d< d| d< d| d< d| d< | jddd@ | d< || d< |t| d 7 }|| d< |t| d 7 }|| d< |t| d 7 }|| d< |t| d 7 }|| d < |t| d! 7 }|| d"< |t| d# 7 }|rtd$|| d< nd| d< t| d d%krt| d nd| d&< t	| S )'Nr   ^   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   r   r   rD   r   ir   r   r   r   r   r   r   r   r   r   r   r   r     r   )
r   r   boolr   r   r   r   r   r   r   )r   uses_74_plus_layoutfeature_ext_datahas_feature_extindexr   r   r   r     sb   

&
zTDS_LOGIN.getDatar1   )
r   r   r   r3   r,   r   r   r   r   r   r   r   r   r   r   ;  s    
6>r   c                   @   r   )TDS_LOGIN_ACK)	TokenTyper   r   r9   )	Interfacer   )r   z>L)ProgNameLenr   )_ProgNameLenz
_-ProgNamezself["ProgNameLen"]*2)ProgNamer)   )MajorVerr   )MinorVerr   )
BuildNumHir   )BuildNumLowr   Nr>   r   r   r   r   r    r$   r  c                   @   s"   e Zd ZdZdddZdd ZdS )TDS_FEATUREEXTACKr   Nc                 C   s\   t |  t| d< g | d< i | d< d | d< d | d< d | d< d | d< |d ur,| | d S d S )Nr  FeaturesFeatureAckDataFedAuthFedAuthNonceFedAuthSignatureUTF8Support)r   r,   TDS_FEATUREEXTACK_TOKENr   r.   r   r   r   r,   )  s   
zTDS_FEATUREEXTACK.__init__c           	      C   s  t |dk r
tdtd|d d d }|tkr td| d}g }i }d | d< d | d< d | d< d | d	< 	 |t |krAtdtd|||d  d }|d7 }|tkrXns|d t |krdtdtd|||d  d }|d7 }|| t |krtd||||  }||7 }|||f |||< |tkr|| d< |dkr|d d | d< |dkr|dd | d< n|tkr|dkr|d dk| d	< q7|| d< || d< || d< |d | | _	|d | | _
| S )Nr@   zTruncated FEATUREEXTACK tokenr   r   z%Invalid FEATUREEXTACK token type 0x%xr  r  r  r  Tz Unterminated FEATUREEXTACK tokenr   zTruncated FEATUREEXTACK lengthr   zTruncated FEATUREEXTACK payload    @   r  r  r  )r   	Exceptionr   r   r  TDS_FEATURE_EXT_TERMINATORappendTDS_FEATURE_EXT_FEDAUTHTDS_FEATURE_EXT_UTF8_SUPPORTr/   rawData)	r   r/   
token_typeoffsetfeaturesfeature_ack_datar   feature_lenfeature_datar   r   r   r   6  sZ   "zTDS_FEATUREEXTACK.fromStringr1   )r   r   r   r3   r,   r   r   r   r   r   r  &  s    
r  c                   @   r   )TDS_RETURNSTATUS)r  )Valuer   Nr>   r   r   r   r   r#  r  r$   r#  c                   @   r   )TDS_INFO_ERROR)r  )r   zH<H=12+len(self["MsgText"])+len(self["ServerName"])+len(self["ProcName"])Numberr   Stater   Classr   
MsgTextLenr9   _MsgTextLenz	_-MsgTextzself["MsgTextLen"]*2MsgTextr)   ServerNameLenr   _ServerNameLenz_-ServerNamezself["ServerNameLen"]*2r   ProcNameLenr   _ProcNameLenz
_-ProcNamezself["ProcNameLen"]*2ProcNamer)   )
LineNumberr9   Nr>   r   r   r   r   r%  y  r$   r%  c                   @   r   )TDS_INFO_ERROR72)r  )r   zH<H=14+len(self["MsgText"])+len(self["ServerName"])+len(self["ProcName"])r&  r(  r*  r,  r.  r0  r2  r4  r   r6  r8  r:  )r<  r   Nr>   r   r   r   r   r=    r$   r=  c                   @   r   )TDS_ENVCHANGE)r  )r   z<H=4+len(Data)r   )r:   r;   zself["Length"]-1r<   Nr>   r   r   r   r   r>    r$   r>  c                   @   r   )TDS_DONEINPROCr  r   r9   CurCmdr9   )DoneRowCountr   Nr>   r   r   r   r   r?    r$   r?  c                   @   r   )TDS_DONEINPROC72r  rA  rB  )rD  <QNr>   r   r   r   r   rE    r$   rE  c                   @   r   )	TDS_ORDER)r  r  )r:   r;   zself["Length"]r<   Nr>   r   r   r   r   rH    r$   rH  c                   @   r   )TDS_ENVCHANGE_VARCHAR))NewValueLenz<B=len(NewValue))	_NewValuez
_-NewValuezself["NewValueLen"]*2)NewValuer)   )OldValueLenz<B=len(OldValue))	_OldValuez
_-OldValuezself["OldValueLen"]*2)OldValuer)   Nr>   r   r   r   r   rI    r$   rI  c                   @   r   )TDS_ROW)r  r<   Nr>   r   r   r   r   rP    r$   rP  c                   @   r   )TDS_DONEr@  Nr>   r   r   r   r   rQ    r$   rQ  c                   @   r   )
TDS_DONE72rF  Nr>   r   r   r   r   rR    r$   rR  c                   @   r   )TDS_COLMETADATA)r  )Countr9   r<   Nr>   r   r   r   r   rS    r$   rS  c                   @   s.   e Zd ZdZdZd
ddZdd Zdd	 ZdS )TDS_SSVARIANTaP  
    SQL Server Variant Type Structure.

    As defined in [MS-TDS] 2.2.5.5.4 sql_variant Values:

    The SSVARIANTTYPE is a special data type that acts as a place holder for other data types.
    When a SSVARIANTTYPE is filled with a data value, it takes on properties of the base data
    type that represents the data value.

    Structure Definition:
        VARIANT_BASETYPE    = BYTE      ; data type definition
        VARIANT_PROPBYTES   = BYTE      ; see below
        VARIANT_PROPERTIES  = *BYTE     ; see below
        VARIANT_DATAVAL     = 1*BYTE    ; actual data value

        SSVARIANT_INSTANCE  = VARIANT_BASETYPE
                              VARIANT_PROPBYTES
                              VARIANT_PROPERTIES
                              VARIANT_DATAVAL

    VARIANT_PROPBYTES and VARIANT_PROPERTIES by VARIANT_BASETYPE:

    | VARIANT_BASETYPE                     | VARIANT_PROPBYTES | VARIANT_PROPERTIES                    |
    |--------------------------------------|-------------------|---------------------------------------|
    | GUIDTYPE, BITTYPE,                   | 0                 | <not specified>                       |
    | INT1TYPE, INT2TYPE,                  |                   |                                       |
    | INT4TYPE, INT8TYPE,                  |                   |                                       |
    | DATETIMETYPE, DATETIM4TYPE,          |                   |                                       |
    | FLT4TYPE, FLT8TYPE,                  |                   |                                       |
    | MONEYTYPE, MONEY4TYPE,               |                   |                                       |
    | DATENTYPE                            |                   |                                       |
    |--------------------------------------|-------------------|---------------------------------------|
    | TIMENTYPE,                           | 1                 | 1 byte specifying scale               |
    | DATETIME2NTYPE,                      |                   |                                       |
    | DATETIMEOFFSETNTYPE                  |                   |                                       |
    |--------------------------------------|-------------------|---------------------------------------|
    | BIGVARBINARYTYPE,                    | 2                 | 2 bytes specifying max length         |
    | BIGBINARYTYPE                        |                   |                                       |
    |--------------------------------------|-------------------|---------------------------------------|
    | NUMERICNTYPE,                        | 2                 | 1 byte for precision followed by      |
    | DECIMALNTYPE                         |                   | 1 byte for scale                      |
    |--------------------------------------|-------------------|---------------------------------------|
    | BIGVARCHARTYPE, BIGCHARTYPE,         | 7                 | 5-byte COLLATION, followed by a       |
    | NVARCHARTYPE, NCHARTYPE              |                   | 2-byte max length                     |
    |--------------------------------------|-------------------|---------------------------------------|

    Note: Data types cannot be NULL when inside a sql_variant. If the value is NULL,
    the sql_variant itself has to be NULL (TotalLength = 0).
    ))TotalLengthr   r<   Nc                 C   s(   t | | d | _d | _d | _d | _d S r1   )r   r,   baseType	propBytes
propertiesvaluer.   r   r   r   r,   *  s
   
zTDS_SSVARIANT.__init__c                 C   s   | d dkrdS | d }t d|dd d | _|dd }t d|dd d | _|dd }|d| j | _|| jd }| d d | j }|d| }| | j|| j| _| jS )	z
        Parse the sql_variant data and extract the base type, properties, and value.

        Returns:
            Parsed value in its appropriate Python type, or 'NULL' if empty
        rV  r   NULLr=   r   Nr@   r   )r   r   rW  rX  rY  _parseValuerZ  )r   r/   
dataLength	valueDatar   r   r   parse1  s   zTDS_SSVARIANT.parsec              
   C   s~  z|t krtd|dd d W S |tkr$td|dd d W S |tkr5td|dd d W S |tkrFtd	|dd
 d W S |tkrWtd|dd d W S |tkrhtd|dd d W S |tkrytd|dd
 d W S |t	t
fv r|dW S |ttttfv rz|dW W S  ty   |d Y W S w |ttttfv rt|dW S |tkrtd|dd d }t|td W S |tkrtd|dd
 \}}|d> | }t|td W S |tkrt|W S |tkrCtd|dd d }td|dd
 d }tddd}	tj |	! | }t"|d d\}
}t"|d\}}t|j#|j$|j%|
||W S |t&krtd|dd d }td|dd d }tddd}	tj |	! | }t"|d\}
}t|j#|j$|j%|
|dW S |t'krt(|dk rW dS td|dd d d }tj |W S |t)kr.t(|dkr|d nd}t(|}|dkrtd|dd d d }n-|dkrtd|dd d }n|dkrtd|dd d  d }nd!| d"W S d#| }|| }t*|d }
t*|d d }t*|d }t*|d d$ }t+|
|||W S |t,krt(|dkr>|d nd}|dkrGdn|dkrNdnd}t(||d k r\W dS |dkrptd|dd d d }n |dkrtd|dd d }ntd|dd d  d }||d }td|dd d d }d#| }|| }t*|d }
t*|d d }t*|d }t*|d d$ }tj |}t|j#|j$|j%|
|||W S |t-krt(|dkr|d nd}|dkrdn|dkrdnd}t(||d k rW dS |dkrtd|dd d d }n |dkr1td|dd d }ntd|dd d  d }||d }td|dd d d }|dd }td|dd d }d#| }|| }t*|d }
t*|d d }t*|d }t*|d d$ }tj |}t|j#|j$|j%|
|||}t.tj/|d%}|j0|d&W S |t1t2fv rt(|dkr|d nd}t(|dkr|d nd}t(|dkrW dS |d dkrdnd'}|dd }t*j3|d(d)d*}|t4 _5t|}|r|td#|  }|dk r| }|W S d+t|d W S  t6y> } zd,t7| d-t|d d"W  Y d}~S d}~ww ).a  
        Parse the value based on the base type following MS-TDS 2.2.5.5.4.

        Args:
            baseType: The SQL Server base type identifier (VARIANT_BASETYPE)
            data: The raw data bytes containing the value (VARIANT_DATAVAL)
            properties: Type-specific property bytes (VARIANT_PROPERTIES)

        Returns:
            Parsed value in appropriate Python type
        r   Nr@   r   <hr   <lr   <qrG   <f<dutf-16leutf-8latin-1ascii'  <lLr  r   l  ,    rn   r9   r   r[      rB   rd   rG  s      z<unsupported time bytes: >rb   i@B )minutes)tzinfolittleF	byteordersigned0xz<parse_error: z, hex: )8TDS_INT1TYPEr   r   TDS_INT2TYPETDS_INT4TYPETDS_INT8TYPETDS_BITTYPETDS_FLT4TYPETDS_FLT8TYPETDS_NVARCHARTYPETDS_NCHARTYPEdecodeTDS_VARCHARTYPETDS_CHARTYPETDS_BIGVARCHRTYPETDS_BIGCHARTYPEUnicodeDecodeErrorTDS_VARBINARYTYPETDS_BINARYTYPETDS_BIGVARBINTYPETDS_BIGBINARYTYPEbinasciib2a_hexTDS_MONEY4TYPEr   TDS_MONEYTYPETDS_GUIDTYPEr	   bin_to_stringTDS_DATETIMETYPEdatetimedatefromordinal	toordinaldivmodyearmonthdayTDS_DATETIM4TYPETDS_DATENTYPEr   TDS_TIMENTYPEinttimeTDS_DATETIME2NTYPETDS_DATETIMEOFFSETNTYPEtimezone	timedeltareplaceTDS_NUMERICNTYPETDS_DECIMALNTYPE
from_bytesr   precr  str)r   rW  r/   rY  rZ  highlow	dateValue	timeValuebaseDatehoursmodrp  secondscale	timeBytesdivisorsecondssecs	microsecsdate_objoffsetMinutesdttz	precisionsignnumBytesnumberer   r   r   r\  Q  sT  

	





 



 


.zTDS_SSVARIANT._parseValuer1   )r   r   r   __doc__r3   r,   r_  r\  r   r   r   r   rU    s    2
 rU  c                   @   s  e Zd Zdddde fdedefddZdmdd	Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdnddZdoddZd d! Zd"d# Zd$d% Zdpd'd(Zd)d* Zd+d, Zdqd.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Ze d@dA Z!dBdC Z"			-		-	-	-	D	-drdEdFZ#			-		-dsdGdHZ$dIdJ Z%dKdL Z&dMdN Z'e(j)e(j*fdOdPZ+dndQdRZ,dSdT Z-dtdUdVZ.dndWdXZ/dYdZ Z0d[d\ Z1d]d^ Z2dtd_d`Z3dndadbZ4e3Z5dcdd Z6dtdedfZ7dudgdhZ8e9didj Z:e9dkdl Z;d-S )vMSSQLi  r   workstation_idapplication_namec                 C   s   d| _ || _|| _|| _d| _i | _g | _g | _d| _d| _	d| _
d| _d | _d | _d| _d | _d | _d| _t| _|| _d| _|pMdt jd d	   | _|pRd
| _d S )Ni  r   r   z  rT   Fr   zDESKTOP-rG   z.Microsoft SQL Server Management Studio - Query)
packetSizeserver
remoteNameportsocketrepliescolMetarows	currentDBCOL_SEPARATORMAX_COL_LEN	lastError	tlsSocket
tls_uniquetds8in_bioout_bio_recv_bufferr   login_tds_version_MSSQL__rowsPrintermssql_versionr   hexupper_workstation_id_application_name)r   addressr  r  r  r  rowsPrinterr   r   r   r,   \  s0   
 zMSSQL.__init__rd   c                 C   s  t  }t|d< t| jtdtjd \}}}}}t|||}|| d| jtf t		|
 gg g |\}	}
}
|	s=g S |dd\}}
|  t|}|d d}|  g }t|D ]-\}}|d}i }t|D ]\}}|d@ dkr||d  d||d< qm|| q^|S )	Nr!   r   i   r=   s   ;;   ;r@   rf  )r    SQLR_CLNT_UCAST_EXr  getaddrinfor  	SQLR_PORT
SOCK_DGRAMsendtor   selectfilenorecvfromcloser7   splitpop	enumerater  r  )r   timeoutpacketafsocktypeproto	canonnamesasready_r/   respentriesientryr   retjfieldr   r   r   getInstances  s6   
zMSSQL.getInstancesc                 C   sn   t  }d|d< t|d< tdtdd|d< d|d	< | t| d | 	 }t |d
 }t
|d | _|S )Ns    U  r   r   r   r   r   r   s   MSSQLServer r(   r=   )r   TDS_ENCRYPT_OFFr   r   randomrandintsendTDSTDS_PRE_LOGINr   recvTDSr   r  )r   prelogintdsresponser   r   r   preLogin  s   zMSSQL.preLoginc                 C   s   t tdd t|D S )Nc                 S   s(   g | ]}|d @ d> |d@ d?  dA qS )r   r   r   rQ   r   ).0xr   r   r   
<listcomp>  s    z)MSSQL.encryptPassword.<locals>.<listcomp>)bytes	bytearray)r   passwordr   r   r   encryptPassword  s   zMSSQL.encryptPasswordc                 C   s.   d | _ d | _d| _d | _d | _d| _t| _d S )NFr   )r  r  r  r  r  r  r   r  r   r   r   r   _reset_tls_state  s   
zMSSQL._reset_tls_statec                 C   s   | j d uo| jp| jd uS r1   )r  r  r  r   r   r   r   _has_active_tls_channel_binding  s   
z%MSSQL._has_active_tls_channel_bindingc                 C   s   | j rtS tS r1   )r  r   r   r   r   r   r   _get_default_login7_tds_version  s   z%MSSQL._get_default_login7_tds_versionc                 C   
   || _ d S r1   )r  r   r   r   r   _set_session_login7_tds_version     
z%MSSQL._set_session_login7_tds_versionc                 C   s
   t | jS r1   )rL   r  r   r   r   r   _uses_72_plus_token_layout  r  z MSSQL._uses_72_plus_token_layoutc                 C   s   |   rtnt}||S r1   )r  r=  r%  )r   tokensparserr   r   r   _parse_info_error_token  s   zMSSQL._parse_info_error_tokenFc                 C   s0   |   r|rtnt}||S |rtnt}||S r1   )r  rE  rR  r?  rQ  )r   r  inprocr  r   r   r   _parse_done_token  s
   zMSSQL._parse_done_token   c                 C   sn   |    t| j| jdtjd \}}}}}t|||}|| z|| W n ty1    w || _|S Nr   )	r  r  r  r  r  SOCK_STREAM
settimeoutconnectr  )r   r  r  r  r  r  r  sockr   r   r   r    s   
zMSSQL.connectc                 C   sF   z| j r| j  W d| _ |   S W d| _ |   d S d| _ |   w r  )r  r  r  r   r   r   r   
disconnect   s   


zMSSQL.disconnectc                 C   r  r1   r  )r   r  r   r   r   setPacketSize  r  zMSSQL.setPacketSizec                 C      | j S r1   r"  r   r   r   r   getPacketSize  s   zMSSQL.getPacketSizer@   c                 C   s  t |d | jkrn|| jd d  }t }||d< t|d< ||d< |d | jd  |d< | |  t || jd krh|d7 }||d< |d | jd  |d< | |  || jd d  }t || jd ks<|}|d7 }t }||d< t|d< ||d< ||d< | |  d S )NrG   r   r   r   r=   r@   )r   r  r   TDS_STATUS_NORMALsocketSendallr   TDS_STATUS_EOM)r   
packetTyper/   packetID	remainingr  r   r   r   r    s.   zMSSQL.sendTDSc                 C   s    | j d u r| j|S | |S r1   )r  r  sendalltls_sendr.   r   r   r   r'  .  s   

zMSSQL.socketSendallc              
   C   s   | j | 	 z| jd}|sW d S | j| W n) tjy%   Y d S  tjy/   Y d S  t	yC } z	t
d|   d }~ww q)NT   z([!] Connection reset when sending data: )r  writer  readr  r,  sslSSLWantReadErrorSSLWantWriteErrorConnectionResetErrorr
   error)r   r/   	encryptedr  r   r   r   r-  9  s"   zMSSQL.tls_sendNc                 C   sr   |d u r| j }| |}|d }|tkr7| |}|d }|d  |d 7  < |d  |d d 7  < |tks|S )Nr   r=   r   rG   )r  _recv_tds_packetr(  )r   r  r  status	tmpPacketr   r   r   r  T  s   

zMSSQL.recvTDSc                 C   s   |  |}|std|S NzServer closed connection)
socketRecvConnectionError)r   r  r/   r   r   r   _recv_chunkb  s   
zMSSQL._recv_chunkc                 C   sR   t | j|k r|  j| |7  _t | j|k s| jd | }| j|d  | _|S r1   )r   r  r=  )r   lengthr  r/   r   r   r   _recv_exacth  s   zMSSQL._recv_exactc                 C   s4   |  d|}t|}|d d }|  |||d< |S )NrG   r   r=   )r?  r   )r   r  headerr  	packetLenr   r   r   r7  p  s
   zMSSQL._recv_tds_packetc                 C   s0   | j d u r| j|}|std|S | |S r:  )r  r  recvr<  tls_recv)r   bufsizer/   r   r   r   r;  x  s   

zMSSQL.socketRecvc                 C   sT   	 z| j |}|r|W S W n
 tjy   Y nw | j|}|s#dS | j| q)NTr   )r  r0  r1  r2  r  rB  r  r/  )r   rD  	decryptedr6  r   r   r   rC    s   zMSSQL.tls_recvc                 C   sr   d}d}d}d| j  }t|jdddd}|}||7 }||7 }||7 }||7 }t| }td|   |S )	Nr   s           s   tls-unique:r   rs  Frt  zComputed tls-unique CBT token: )r  r   to_bytesr   digestr
   debugr  )r   channel_binding_structinitiator_addressacceptor_addressapplication_data_rawlen_application_dataapplication_data	cbt_tokenr   r   r   generate_cbt_from_tls_unique  s   
z"MSSQL.generate_cbt_from_tls_uniquec                 C   s   t d t }|d tjj|_tj|_	t
 }t
 }|||}	 z|  W n$ tjyP   |d}| t|d | d}|d }|| Y nw nq&d| _|| _|| _|| _|d| _d S )	Nz%Encryption required, switching to TLSALL:@SECLEVEL=0Tr.  r   r=   ?  
tls-unique)r
   infor1  
SSLContextset_ciphers
TLSVersionMINIMUM_SUPPORTEDminimum_version	CERT_NONEverify_mode	MemoryBIOwrap_biodo_handshaker2  r0  r  r  r  r/  r  r  r  r  get_channel_bindingr  )r   contextr  r  tlsr/   
tds_packettls_datar   r   r   set_tls_context  s2   




zMSSQL.set_tls_contextc                 C   s   t d t }|d tjj|_tjj|_	d|_
tj|_|dg |j| j| jd| _d| _d| _| jd| _| jrJt d	| j   nt d
 t d dS )z9Wrap the TCP socket in TLS for TDS 8.0 strict encryption.z+(TDS8) Setting up TDS 8.0 strict encryptionrQ  Fztds/8.0)server_hostnameTrR  rS  z(TDS8) tls-unique: %su<   (TDS8) No tls-unique available — EPA will fail if requiredz)(TDS8) TDS 8.0 TLS connection establishedN)r
   rH  r1  rU  rV  rW  rX  rY  TLSv1_2maximum_versioncheck_hostnamerZ  r[  set_alpn_protocolswrap_socketr  r  r  r  r_  r  r  warningrT  )r   r`  r   r   r   _setup_tds8  s    




zMSSQL._setup_tds8c                 C   s:   t | ttttfrdS t | tr| jtjtjtj	fv S dS )NTF)

isinstancer<  r4  ConnectionAbortedErrorBrokenPipeErrorOSErrorerrno
ECONNRESETECONNABORTEDEPIPE)excr   r   r   _should_retry_prelogin_as_tds8  s   

z$MSSQL._should_retry_prelogin_as_tds8c                 C   s   z|   }W n@ tyF } z4| |s tdt|j|f  z|   W n	 ty/   Y nw |   | 	  |   W  Y d}~S d}~ww |d t
krbtd |   |   | 	  |   S |d tttfv ro|   |S )zPerform preLogin exchange and set up encryption.

        Handles all encryption modes including TDS 8.0 strict encryption
        where the server closes or resets the connection on a plain PRELOGIN.

        Returns the preLogin response dict.
        z2Plain TDS preLogin failed (%s: %s), trying TDS 8.0Nr   z?Server requires TDS 8.0 (ENCRYPT_STRICT), reconnecting with TLS)r  r  rv  r
   rH  typer   r!  r  rl  TDS_ENCRYPT_STRICTrT  TDS_ENCRYPT_REQTDS_ENCRYPT_ONr  rd  )r   r  r  r   r   r   _negotiate_encryption  s:   

zMSSQL._negotiate_encryptionTc           <      C   s  |d ur| d\}}t|}t|}nd}d}|  }t | _d\| jd< | jd< | jd< t }|  |d< | 	|d  | j
d|d	< | jd|d
< | jd|d< |d
 |d< tdd|d< | j|d< |d urw|d|d< ttB |d< ddlm}m} ddlm} ddlm}m}m}m} ddlm}m}m }m!} ddl"m#} ddl$m%}m&}m'} ddl(m)}m*}  ddl+m,}! ddl-m!}m.}"m/}# |
r3|0||d| j| j1f \}}}}	|	d u r3t23d| j1  | 4 }$d }%|$D ]%}&zt5|&d | j1kr|&d }%W q t6y }' zW Y d }'~'qd }'~'ww |%r3|0||d | j d!d ||%f \}}}}	|||j7j8j9d"}(	 |d u r|	d u rz||(||||||\})}*}+},W n` |y }' zF|': |j;j<j9kr|dkr|dkr|dks~|d u r|d u r|	d u rdd$l=m>}-m?}. t23d% |-|}|.|}W Y d }'~'q<  d }'~'ww n|d& })|d' }*|d( },|	d u r6|d)| j d!d || j1f |j7j@j9d"}/z||/|||)|*|,\}0}*}+},W nS |y4 }' zF|': |j;j<j9kr)|dkr(|dkr(|dks|d u r(|d u r(|	d u r(dd$l=m>}-m?}. t23d% |-|}|.|}n  W Y d }'~'nd }'~'ww n|	d& }0|	d' }*|	d( },nq=| }1|d* g|1d+< |jA|0| d,d }0| }2|2B|0d-  | }3d.|3d/< t5|jCjj9|3d0< tD }4|E|4|3d1< ||3d-|2jF | }5d.|5d2< ||5d3< ||5d4|(jG tHjHItHjJjK}6|6jL|5d5< |F|6|5d6< |!|5d7< d8|5d7 d9< | }7d:|7d;< |#|"B |7d<< | M r|d ur||7d=< n| N |7d=< |7O |5d7 d>< d|5d?< | |5}8|*P|,d@|8d }9|!|3dA< |*jQ|3dA dB< |9|3dA d'< | |3|1dC< |d  tRO  < |1O |dD< tS|O |dE< |O }:| TtU|: | jVs5|dF tWkr5d | _X| Y };| Z|;dG | _[t\| j[v rId#S dHS )INr)   r   rb   r   i|O  ProductMajorVersionProductMinorVersionProductBuildr   re  r   r   r   r   r      r   r   r   r   )SPNEGO_NegTokenInit	TypesMech)CCache)AP_REQAuthenticatorTGS_REPseq_set)getKerberosTGTgetKerberosTGSKerberosErrorCheckSumField)	constants)	PrincipalKerberosTimeTicket)decoderencoder)noValue)r  GSS_C_REPLAY_FLAGGSS_C_SEQUENCE_FLAGzMSSQLSvc/%s:%dz7Searching target's instances to look for port number %stcpInstanceNamezMSSQLSvc/%s.%s:%s.)rw  T)compute_lmhashcompute_nthashz)Got KDC_ERR_ETYPE_NOSUPP, fallback to RC4KDC_REPcipher
sessionKeyzMSSQLSvc/%s.%s:%dzMS KRB5 - Microsoft Kerberos 5	MechTypes)asn1Specticketrd   pvnozmsg-typez
ap-optionszauthenticator-vnocrealmcnamecusecctimecksumi  	cksumtyperD   LgthFlagsBndchecksumz
seq-numberrf   authenticatoretype	MechTokenr   r   r   r=   F)]r  r  a2b_hexr{  r   VERSIONversionr   r  r  r  encoder  r  r  r   r  TDS_INIT_LANG_FATALTDS_ODBC_ONimpacket.spnegor  r  impacket.krb5.ccacher  impacket.krb5.asn1r  r  r  r  impacket.krb5.kerberosv5r  r  r  r  impacket.krb5r  impacket.krb5.typesr  r  r  pyasn1.codec.derr  r  pyasn1.type.univr  impacket.krb5.gssapir  r  	parseFiler  r
   rH  r  r  r  PrincipalNameTypeNT_PRINCIPALrZ  getErrorCode
ErrorCodesKDC_ERR_ETYPE_NOSUPPimpacket.ntlmr  r  NT_SRV_INSTr  	from_asn1ApplicationTagNumberslistencodeFlagsto_asn1components_to_asn1r  nowr  utcmicrosecondr  rP  r   encryptenctypeTDS_INTEGRATED_SECURITY_ONr   r  
TDS_LOGIN7r  r  r  r  
parseReplyr  TDS_LOGINACK_TOKEN)<r   databaseusernamer  domainhashesaesKeykdcHostTGTTGSuseCachecbt_fake_valuelmhashnthashr  loginr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  	instancesinstanceNamer  r  userNametgtr  oldSessionKeyr  r  r  
serverNametgsblobr  apReqoptsr  r  chkFieldencodedAuthenticatorencryptedEncodedAuthenticator
login_datar  r   r   r   kerberosLogin+  sf  











 






]




zMSSQL.kerberosLoginc                 C   s  |d ur| d\}}	t|}t|	}	nd}d}	|  }
t | _d\| jd< | jd< | jd< t }|  |d< | 	|d  | j
d|d	< | jd|d
< | jd|d< |d
 |d< tdd|d< | j|d< |d urw|d|d< ttB |d< |du r|d  tO  < tjddd| jd}| |d< n|d|d< | |d|d< d|d< t| |d< | }| t| | js|
d tkrd | _|  }|du r9|d dd  }d}|  r|d ur|}n|  }tj |||||||	dd|| jd\}}d|d < | }t!| }| }t"||| | }t#$d!|%   ||d < | t&|  |  }| '|d | _(t)| j(v rIdS d"S )#Nr)   r   r|  r}  r~  r  r   re  r   r   r   r   r   r  r   r   r   r   T)
use_ntlmv2r  r   r   r   r   r   r=   r   r   MSSQLSvc)servicer  channel_binding_valuer  s                   MICzComputed MIC is F)*r  r  r  r{  r   r  r  r   r  r  r  r  r  r  r  r   r  r  r  r  getNTLMSSPType1r   r  r   r  r  r  r  r  r  r  rP  getNTLMSSPType3NTLMAuthChallengehmac_md5r
   rH  r  TDS_SSPIr  r  r  )r   r  r  r  r  r  useWindowsAuthr  r  r  r  r  authr  r  serverChallenger  type3exportedSessionKeyntlm_negotiate_datantlm_challenge_datantlm_authenticate_datanewmicr   r   r   r  ;  s   





zMSSQL.loginc                 C   s  | j D ]}|d tttfv r|d d |d< d}n|d tfv r'd|d< d}n~|d ttfv r>t|d dd	 |d< d}ng|d tfv rLd
|d< d}nY|d t	t
fv r[d|d< d}nJ|d ttfv rjd|d< d}n;|d ttfv r{|d |d< d}n*|d ttfv r|d d |d< d}n|d ttfv r|d |d< d}nd|d< d}d|d< | jD ]}tt||d  |d krtt||d  |d< q|d |d k r|d |d< t|d |d krt|d |d< n|d | jkr| j|d< ||d  |d< qd S )Nr   TypeDatar   r   z%%-%dsrs   z%%%dsr   r@      rf      rb   	minLenghtNameFormat)r  r  r  TDS_NTEXTTYPEr  r  r  ordTDS_DATETIMNTYPErz  TDS_INTNTYPETDS_FLTNTYPETDS_MONEYNTYPETDS_BITNTYPEr  r  r  TDS_TEXTTYPEr  r  r   r  r  )r   colfmtrowr   r   r   processColMeta  sV   


zMSSQL.processColMetac                 C   s~   t | jdkr	d S | jD ]}| j|d |d  | j  q| jd | jD ]}| jd|d  | j  q'| jd d S )Nr   r  r  r   -r   )r   r  r  r   r  )r   r  r   r   r   printColumnsHeader  s   

zMSSQL.printColumnsHeaderc                 C   sh   | j du rd S |   |   | jD ]}| jD ]}| j|d ||d   | j  q| jd qd S )NTr  r  r   )r  r  r  r  r  r  r   r  )r   r  r  r   r   r   	printRows  s   


zMSSQL.printRowsc              	   C   s  t | j D ]}t| j| D ]\}}|d tkr6td|d d|d |d df | _|| j q|d tkrR|d|d d|d |d df  q|d t	krf|d|d	  d
| j
  q|d tkr|d ttttfv rt|d }|d dkrdd|d< n|d dkrdd|d< |d tkrd}n!|d tkrd}n|d tkrd}n|d tkrd}nd|d  }|d||d d|d df  qqd S )Nr  ERROR(%s): Line %d: %sr   re  r<  r1  zINFO(%s): Line %d: %szACK: Result: r  z - r   r=   rO  r   NonerL  DATABASELANGUAGECHARSET
PACKETSIZEz%dz+ENVCHANGE(%s): Old Value: %s, New Value: %s)r  r  keysr  TDS_ERROR_TOKENr?   r  r  TDS_INFO_TOKENr  r  TDS_ENVCHANGE_TOKENTDS_ENVCHANGE_DATABASETDS_ENVCHANGE_LANGUAGETDS_ENVCHANGE_CHARSETTDS_ENVCHANGE_PACKETSIZErI  r  )r   error_loggerinfo_loggerr  r  keyrecord_typer   r   r   printReplies	  sr   	zMSSQL.printRepliesc           #   	   C   sZ  t |dkrdS |rg ni }t |d }|d }| jD ]}|d }|tk|tkB r[td|d td d }|tdd  }|dkrW|d | d}	||d  }n:d}	n6|tkrtd|d d	 d }|d	d  }|dkr|d | }
||d  }z|
d
}	W n t	y   |
jddd}	Y nw d}	n|t
krt|dd }|dd  }|dkr|d | }t|}	||d  }nd}	n|tk|tkB r6t|dd }|dkrd}	|dd  }n|d| d d  }td|d td d }|tdd  }|dkr2|tkr!|d | d}	n	t|d | }	||d  }n_d}	n[|tkrt|dd }|dkrRd}	|dd  }n?|d| d d  }td|d td d }|tdd  }|dkr|d | }	||d  }n
d}	n|tk|tkB rtd|d td d }|tdd  }|dkrt|d | }	||d  }nd}	n|tk|tkB |tkB rd}	|tkrt|dd dkrt}nt|dd dkrt}nd}	|dd  }|tkr<td|d d d }|dd  }|dk r"tddd}ntddd}td|d d d }|dd  }n<|tkrxtd|d td d }|tdd  }td|d td d }|tdd  }tddd}|	dkrtj| | }t|d d\}}t|d\}}t|j|j|j|||}	n|t krtd|d d d }	|dd  }n|t!krtd|d d d }	|dd  }n|t"krtd|d d d }
t#|
t#d }	|dd  }n|t$kr8t|d d }|dkrd}n|dkrd}|dd  }|dkr4t||d | d }	||d  }n]d}	nY|t%krt|d d }|dkrMd}n|dkrTd}|dd  }|dkrt|dkrhdnd|d | d }
t#|
t#d }	||d  }nd}	n|t&krtd|d td d }|tdd  }|d | }	||d  }n|t'krtd|d d d }	|dd  }n|t(krtd|d d d }	|dd  }n|t)kr
td|d d \}}|d> | }t#|t#d }	|dd  }n|t*kr#td|d d	 d }	|d	d  }nn|t+kr]t|d d }|dd  }|dkrY|d | }td|d d }tj|}	||d  }n8d}	n4|t,k|t-kB rtt.|d }	|dd  }n|t/t0fv r|d }|dd  }|dkrd}	n|d | }
||d  }|d d }|d d	 }|
d dkrdnd }t1j2|
dd  d!d"d#}|t3 _4t#|}|r|t#d$|  }|dkr|n| }	n|t5krt|d d }|dd  }|dkr|dkrt|d | }	n	|d | }	nd}	||d  }n|t6krat|d d }|dkr&d%}n|d	kr.d&}n|dkr6d}n
|dkr>d}nd}|dd  }|dkr^t||d | d }	||d  }n3d}	n0|t7krtd|d d d } |d d|   }!t8|!}"|"9 }	|d|  d  }nt:d'| |r|;|	 q|	||d( < q| j<;| |t | S ))Nr@   r   r=   r   r9   r   re  r[  r   rg  rf  r  )errorsrG   r   r   r   ra  i  rk  rl  rm  rn   rc  ri  rd  rb  rj  r  rn  r  rr  rs  Frt  rb   r   r`  z$ParseROW: Unsupported data type: 0%xr  )=r   r  r  r  r   r   calcsizer  r  r  r  r
  r	   r  r	  TDS_IMAGETYPEr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rz  r}  r  r   r  r  r  r{  r~  r  ry  r  r|  rx  r   r  r  r  r  r   r  r  r  TDS_SSVARIANTTYPErU  r_  r  r  r  )#r   token	tuplemoder  origDataLenr/   r  r*  charLenrZ  rawuuidLenuur  r  r  r  r  rp  r  	valueSizer  r  r  combined	dateBytesvalueLenr  r  r  integerr  totalLengthvariantDatavariantr   r   r   parseRowE  s  













	



























zMSSQL.parseRowc              	   C   s  |d }|dkr
dS g | _ t|d }|d }t|D ]}i }|  r&dnd}t||d t| d }|t|d  }td|d td d }	|tdd  }td|d td d }
|tdd  }|
tk|
tkB |
t	kB |
t
kB |
tkB |
tkB |
tkB |
tkB |
tkB |
tkB |
tkB |
tkB rd}n|
tk|
tkB |
tkB |
tkB |
tkB |
tkB |
tkB |
tkB rt|dd	 }|d	d  }n|
tkrt|dd	 }|d	d  }nt|
tk|
tkB |
tkB |
t kB |
t!kB |
t"kB rtd|d d
 d }|d
d  }nH|
t#k|
t$kB |
t%kB r+|d d }|dd  }n.|
t&k|
t'kB |
t(kB |
t)kB |
t*kB rStd|d d d }|dd  }nt+d|
 |
t*k|
t"kB |
t!kB |
tkB |
t kB |
t'kB rx|dd  }|
t&k|
t'kB |
t*kB rtd|d d
 d }|d
d  }||d
 d  }td|d td d }|tdd  }|d |d
  ,d}||d
 d  }||d< |
|d< ||d< |	|d< | j -| q|t| S )NrT  r   r   r=   r   r9   r   r   r@   r   r   r   zUnsupported data type: 0x%xrd   re  r  r   r  r  ).r  r   ranger  r   r   r-  r|  rx  ry  r{  r  r  r}  r~  r  r  r  rz  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r  TDS_DECIMALTYPEr.  r  TDS_XMLTYPEr/  r	  r  r  r  )r   r0  countr2  r/   r  columnuserTypeFormatuserTypeflagscolTypetypeDatadataLencolNameLengthcolNamer   r   r   parseColMetaData	  s   	

	zMSSQL.parseColMetaDatac           	      C   s&  i }t |dkrtd|dd d }|tkr5| |}td|d d|d |d df | _n|tkr>t	|}n|t
krH| |}n|tkrQt|}n|tkrZt|}n|tkrt|}|d	 tu ryt|d
 }t|d d| _nv|d	 tu rt|d
 }|d d| _na|tk|tkB r| j|dd}nQ|tkrt|}nH|tkrt|}| ||}|d
 d | |d
< n/|tkrt |}| !|}|d
 d | |d
< n|t"kr| |}n|rt#$d|  |dfS ||v durt% ||< || &| |t |d  }t |dks	|dfS )Nr   r"   r@   r  r   re  r<  r1  r   r=   rL  T)r  zUnknown Token %xF)'r   r   r   r  r  r?   r  r  TDS_RETURNSTATUS_TOKENr#  r   r  r  r  r  r!  r>  r%  rI  r  r  r"  r  TDS_DONEINPROC_TOKENTDS_DONEPROC_TOKENr  TDS_ORDER_TOKENrH  TDS_ROW_TOKENrP  r?  TDS_COLMETADATA_TOKENrS  rM  TDS_DONE_TOKENr
   r5  r  r  )	r   r  r1  log_unknownr  tokenIDr0  r)  tokenLenr   r   r   _parse_reply_tokens	  sj   






:zMSSQL._parse_reply_tokensc                 C   s$   t |dkrdS | ||\}}|S )Nr   F)r   rX  )r   r  r1  r  r  r   r   r   r  ;
  s   zMSSQL.parseReplyc                 C   sP   t dt}|t dt7 }|t dt7 }|t dt7 }|t dt7 }|S )Nz<Ir9   rG  )r   r   TDS_ALL_HEADERS_LENGTH-TDS_ALL_HEADERS_TRANSACTION_DESCRIPTOR_LENGTH&TDS_HEADER_TYPE_TRANSACTION_DESCRIPTOR"TDS_TRAN_DESCRIPTOR_NO_TRANSACTIONTDS_OUTSTANDING_REQUEST_COUNT)r   all_headersr   r   r   _build_tds8_sql_batch_headersB
  s   z#MSSQL._build_tds8_sql_batch_headersc                 C   s   | j r	|  | S |S )zAPrepend TDS 8.0 ALL_HEADERS to an already-encoded SQL_BATCH body.)r  r_  )r   sql_textr   r   r   _wrap_sql_batch_dataK
  s   zMSSQL._wrap_sql_batch_datac                 C   s   |d  d}| |S )z@Build SQL_BATCH packet data, prepending ALL_HEADERS for TDS 8.0.z
re  )r  ra  )r   cmdr`  r   r   r   _build_batch_dataQ
  s   
zMSSQL._build_batch_datac                 C   sL   g | _ g | _d| _| t| | |r$|  }| |d || _| j S dS )NFr=   T)	r  r  r  r  TDS_SQL_BATCHrc  r  r  r  )r   rb  r1  waitr  r   r   r   batchV
  s   zMSSQL.batchc                 C   s(   g | _ g | _d| _| t| | d S )NF)r  r  r  r  rd  rc  )r   rb  r1  r   r   r   batchStatementc
  s   zMSSQL.batchStatementc                 C   s,   || j krd| }| | |   d S d S )Nzuse %s)r  rf  r+  )r   dbchdbr   r   r   changeDBn
  s
   

zMSSQL.changeDBc                 K   sP   |pd}|  | |   | |||}|r|   | jr | j| jr&| j|S )Nmaster)rj  r+  rf  r  )r   rh  	sql_queryr1  re  kwArgsr  r   r   r   RunSQLQueryt
  s   
zMSSQL.RunSQLQueryc                 K   s    | j |||d | jr| jdS )N)re  T)rn  r  )r   rh  rl  re  rm  r   r   r   RunSQLStatement
  s   zMSSQL.RunSQLStatementc                 C   r$  r1   )r  r   r   r   r   r  
     zMSSQL.workstation_idc                 C   r$  r1   )r  r   r   r   r   r  
  rp  zMSSQL.application_name)rd   )F)r  )r@   r1   )	r   r   Nr   NNNTN)r   r   NFN)FT)T)<r   r   r   r   r  r,   r  r  r  r  r  r  r  r  r  r  r  r!  r#  r%  r  r'  r-  r  r=  r?  r7  r;  rC  rP  rd  rl  staticmethodrv  r{  r  r  r  r  r  r
   r5  rT  r+  r?  rM  rX  r  r_  ra  rc  rf  rg  rl  rj  rn  ro  propertyr  r  r   r   r   r   r  [  s    

'(
	

	

4
*
  
 /
<  C
w
>	

	


r  )
__future__r   r   r1  hashlibr   r   r  r  r  r  rq  mathr  decimalr   r   r	   r   impacketr   r
   impacket.structurer   impacket.mssql.versionr   r   r  SQLR_CLNT_BCAST_EXr  r-   r6   r    r&   r4   r7   r  r?   rd  TDS_PRE_TDS_LOGINTDS_RPCTDS_TABULARTDS_ATTENTIONTDS_BULK_LOAD_DATATDS_TRANSACTIONr  r  r  r&  r(  TDS_STATUS_RESET_CONNECTIONTDS_STATUS_RESET_SKIPTRANSr  rz  TDS_ENCRYPT_NOT_SUPry  rx  rZ  rY  r[  r\  r]  TDS_LOGIN7_VERSION_70r   TDS_LOGIN7_VERSION_71REV1TDS_LOGIN7_VERSION_72TDS_LOGIN7_VERSION_73ATDS_LOGIN7_VERSION_73Br   TDS_LOGIN7_VERSION_80TDS_VERSION_71TDS_VERSION_72TDS_VERSION_73ATDS_VERSION_73BTDS_VERSION_74TDS_VERSION_80rJ   rL   r  r  r  TDS_ALTMETADATA_TOKENTDS_ALTROW_TOKENrS  TDS_COLINFO_TOKENrT  rP  rO  r!  r  r  r   r  TDS_NBCROW_TOKENTDS_OFFSET_TOKENrQ  rN  TDS_RETURNVALUE_TOKENrR  TDS_SSPI_TOKENTDS_TABNAME_TOKENr  r  r  $TDS_FEATURE_EXT_UTF8_SUPPORT_ENABLEDr"  r#  r$  r%  TDS_ENVCHANGE_UNICODETDS_ENVCHANGE_UNICODE_DSTDS_ENVCHANGE_COLLATIONTDS_ENVCHANGE_TRANS_STARTTDS_ENVCHANGE_TRANS_COMMITTDS_ENVCHANGE_ROLLBACKTDS_ENVCHANGE_DTCTDS_NULL_TYPErx  r|  ry  rz  r  r}  r  r  r~  r  r{  r  r  rA  TDS_NUMERICTYPEr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rB  TDS_UDTTYPEr  r.  r	  r/  r   r   r   r  r  r#  r%  r=  r>  r?  rE  rH  rI  rP  rQ  rR  rS  rU  r  r   r   r   r   <module>   sZ   	 \L
					  k