o
    àý°j6h  ã                   @   sZ   d dl Z d dlZd dlmZ G dd„ dƒZG dd„ dƒZG dd„ dƒZG d	d
„ d
eƒZdS )é    N)ÚProtocolPacketc                   @   s2  e Zd ZdZeddƒZeddƒZeddƒZeddƒZeddƒZ	eddƒZ
eddƒZeddƒZed	dƒZeddƒZed
dƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZ eddƒZ!dS )ÚDNSFlagsz&Bitmap with the flags of a dns packet.Ú0000000000000000é   Ú1000000000000000Ú0100000000000000Ú0010000000000000Ú0000100000000000Ú0100100000000000Ú0000010000000000Ú0000001000000000Ú0000000100000000Ú0000000010000000Ú0000000000100000Ú0000000000010000Ú0000000000001000Ú0000000000000100Ú0000000000001100Ú0000000000000010Ú0000000000001010Ú0000000000000110Ú0000000000001110Ú0000000000000001Ú0000000000001001Ú0000000000000101N)"Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚQR_QUERYÚQR_RESPONSEÚOP_STANDARD_QUERYÚOP_INVERSE_QUERYÚOP_STATUS_QUERYÚ	OP_NOTIFYÚ	OP_UPDATEÚAA_NOT_AUTH_ANSWERÚAA_AUTH_ANSWERÚTC_NOT_TRUNCATEDÚTC_TRUNCATEDÚRD_NOT_RECURSIVE_QUERYÚRD_RECURSIVE_QUERYÚRA_NOT_AVAILABLEÚRA_AVAILABLEÚZÚAUTHENTICATED_DATAÚCHECKING_DISABLEDÚRCODE_NO_ERRORÚRCODE_FORMAT_ERRORÚRCODE_SERVER_FAILUREÚRCODE_NAME_ERRORÚRCODE_NOT_IMPLEMENTEDÚRCODE_REFUSEDÚRCODE_YXDOMAINÚRCODE_YXRRSETÚRCODE_NXRRSETÚRCODE_NOAUTHÚRCODE_NOTZONE© r=   r=   ú/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/dns.pyr   )   s>    



























r   c                   @   s(  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZEeFdEdF„ ƒZGdGS )HÚDNSTypeé   r   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é0   é1   é2   é3   é7   é8   é9   éc   éd   ée   éf   ég   éù   éú   éû   éü   éý   éþ   éÿ   i €  i€  c                 C   ó,   t tj ¡ ƒD ]\}}|| kr|  S qd S ©N)Úlistr?   Ú__dict__Úitems©ÚtypeÚitemÚvaluer=   r=   r>   ÚgetTypeName�   ó
   ÿÿzDNSType.getTypeNameN)Hr   r   r   ÚAÚNSÚMDÚMFÚCNAMEÚSOAÚMBÚMGÚMRÚNULLÚWKSÚPTRÚHINFOÚMINFOÚMXÚTXTÚRPÚAFSDBÚX25ÚISDNÚRTÚNSAPÚNSAP_PTRÚSIGÚKEYÚPXÚGPOSÚAAAAÚLOCÚNXTÚEIDÚNBÚNBSTATÚATMAÚNAPTRÚKXÚCERTÚA6ÚDNAMEÚSINKÚOPTÚAPLÚDSÚSSHFPÚIPSECKEYÚRRSIGÚNSECÚDNSKEYÚDHCIDÚNSEC3Ú
NSEC3PARAMÚHIPÚNINFOÚRKEYÚSPFÚUINFOÚUIDÚGIDÚUNSPECÚTKEYÚTSIGÚIXFRÚAXFRÚMAILBÚMAILAÚALLÚDNSSECÚstaticmethodrŠ   r=   r=   r=   r>   r?   S   sŽ    r?   c                   @   s0   e Zd ZdZdZdZdZdZdZe	dd„ ƒZ
d	S )
ÚDNSClassr   r@   rA   rB   r   r€   c                 C   r�   r‚   )rƒ   rÐ   r„   r…   r†   r=   r=   r>   ÚgetClassName­   r‹   zDNSClass.getClassNameN)r   r   r   ÚRESERVEDÚINÚCHÚHSÚNONEÚANYrÏ   rÑ   r=   r=   r=   r>   rÐ   ¤   s    rÐ   c                   @   s�  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZeddƒZeddƒZdVd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d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$d+d,„ Z%d-d.„ Z&d/d0„ Z'd1d2„ Z(d3d4„ Z)dWd6d7„Z*d8d9„ Z+d:d;„ Z,d<d=„ Z-d>d?„ Z.d@dA„ Z/dBdC„ Z0dDdE„ Z1dFdG„ Z2dHdI„ Z3dJdK„ Z4dLdM„ Z5dNdO„ Z6dPdQ„ Z7dRdS„ Z8dTdU„ Z9dS )XÚDNSz€The Message Header is present in all messages. Never empty.
    Contains various flags and values which control the transaction.r   rB   Ú11000000Ú00111111Nc                 C   s4   d| _ d| _t | | j | j¡ |r|  |¡ d S d S )NrJ   r   )Ú_DNS__HEADER_BASE_SIZEÚ_DNS__TAIL_SIZEr   Ú__init__Úload_packet)ÚselfÚaBufferr=   r=   r>   rÝ   Æ   s   ÿzDNS.__init__c                 C   ó   | j  d¡S )úGet 16 bit message ID.r   ©ÚheaderÚget_word©rß   r=   r=   r>   Úget_transaction_idÍ   ó   zDNS.get_transaction_idc                 C   ó   | j  d|¡ dS )úSet 16 bit message ID.r   N©rä   Úset_word©rß   r‰   r=   r=   r>   Úset_transaction_idÑ   ó   zDNS.set_transaction_idc                 C   rá   )râ   r   rã   ræ   r=   r=   r>   Úget_transaction_id_tcpÕ   rè   zDNS.get_transaction_id_tcpc                 C   ré   )rê   r   Nrë   rí   r=   r=   r>   Úset_transaction_id_tcpÙ   rï   zDNS.set_transaction_id_tcpc                 C   rá   )úGet 16 bit flags.r   rã   ræ   r=   r=   r>   Ú	get_flagsÝ   rè   zDNS.get_flagsc                 C   ré   )úSet 16 bit flags.r   Nrë   rí   r=   r=   r>   Ú	set_flagsá   rï   zDNS.set_flagsc                 C   rá   )rò   rB   rã   ræ   r=   r=   r>   Úget_flags_tcpå   rè   zDNS.get_flags_tcpc                 C   ré   )rô   rB   Nrë   rí   r=   r=   r>   Úset_flags_tcpé   rï   zDNS.set_flags_tcpc                 C   rá   )úUGet Unsigned 16 bit integer specifying the number of entries in the question section.rB   rã   ræ   r=   r=   r>   Úget_qdcountí   rè   zDNS.get_qdcountc                 C   ré   )úUSet Unsigned 16 bit integer specifying the number of entries in the question section.rB   Nrë   rí   r=   r=   r>   Úset_qdcountñ   rï   zDNS.set_qdcountc                 C   rá   )rø   rD   rã   ræ   r=   r=   r>   Úget_qdcount_tcpõ   rè   zDNS.get_qdcount_tcpc                 C   ré   )rú   rD   Nrë   rí   r=   r=   r>   Úset_qdcount_tcpù   rï   zDNS.set_qdcount_tcpc                 C   rá   )z[Get Unsigned 16 bit integer specifying the number of resource records in the answer sectionrD   rã   ræ   r=   r=   r>   Úget_ancountý   rè   zDNS.get_ancountc                 C   ré   )z[Set Unsigned 16 bit integer specifying the number of resource records in the answer sectionrD   Nrë   rí   r=   r=   r>   Úset_ancount  rï   zDNS.set_ancountc                 C   rá   )zkGet Unsigned 16 bit integer specifying the number of name server resource records in the authority section.rF   rã   ræ   r=   r=   r>   Úget_nscount  rè   zDNS.get_nscountc                 C   ré   )zkSet Unsigned 16 bit integer specifying the number of name server resource records in the authority section.rF   Nrë   rí   r=   r=   r>   Úset_nscount	  rï   zDNS.set_nscountc                 C   rá   )zhGet Unsigned 16 bit integer specifying the number of resource records in the additional records section.rH   rã   ræ   r=   r=   r>   Úget_arcount  rè   zDNS.get_arcountc                 C   ré   )zhSet Unsigned 16 bit integer specifying the number of resource records in the additional records section.rH   Nrë   rí   r=   r=   r>   Úset_arcount  rï   zDNS.set_arcountc                 C   ó   |   ¡ d S ©zGet a list of the DNS Question.r   )Ú_DNS__get_questionsræ   r=   r=   r>   Úget_questions  rè   zDNS.get_questionsc           	      C   s¦   g }d}|   ¡ }|  ¡ }t|ƒD ]>}|  ||¡\}}|||| j … }|| j7 }|||| j … }|| j7 }t d|¡d }t d|¡d }| |||f¡ q||fS )Nr   ú!H)	rù   Úget_body_as_stringÚrangeÚparseCompressedMessageÚ_DNS__TYPE_LENÚ_DNS__CLASS_LENÚstructÚunpackÚappend©	rß   ÚauxÚoffsetÚqdcountÚdataÚ_ÚqnameÚqtypeÚqclassr=   r=   r>   Ú__get_questions  ó   

zDNS.__get_questionsc                 C   r  r  )Ú_DNS__get_questions_tcpræ   r=   r=   r>   Úget_questions_tcp)  rè   zDNS.get_questions_tcpc           	      C   s¦   g }d}|   ¡ }|  ¡ }t|ƒD ]>}|  ||¡\}}|||| j … }|| j7 }|||| j … }|| j7 }t d|¡d }t d|¡d }| |||f¡ q||fS )Nr   r  r   )	rü   r	  r
  r  r  r  r  r  r  r  r=   r=   r>   Ú__get_questions_tcp-  r  zDNS.__get_questions_tcpr   c                 C   sú   |t |ƒkr
tdƒ‚t d|||d … ¡d }|d@ dkrKt d|||d … ¡d }|d@ | j }||kr;td	ƒ‚|d7 }|  ||¡d }||fS |dkrW|d7 }|d
fS |d7 }|||| … }||7 }|  ||¡\}}|su||fS ||d | fS )z2Parse compressed message defined on rfc1035 4.1.4.z>No more data to parse. Offset is bigger than length of buffer.ÚBr@   r   éÀ   r  r   iÿ?  z\The infinite loop is in DNS decompression. Encountered pointer points to the current offset.Ú ó   .)ÚlenÚ	Exceptionr  r  rÛ   r  )rß   Úbufr  ÚbyteÚpointerÚnameÚunnamedr=   r=   r>   r  =  s*   zDNS.parseCompressedMessagec                 C   r  ©Nr   )Ú_DNS__get_answersræ   r=   r=   r>   Úget_answersZ  ó   zDNS.get_answersc                 C   r  r*  )Ú_DNS__get_authoritativeræ   r=   r=   r>   Úget_authoritative]  r-  zDNS.get_authoritativec                 C   r  r*  )Ú_DNS__get_additionalsræ   r=   r=   r>   Úget_additionals`  r-  zDNS.get_additionalsc                 C   ó    |   ¡ d }|  ¡ }|  ||¡S )Nr@   )r  rþ   Ú_DNS__process_answer_structure)rß   r  Úancountr=   r=   r>   Ú__get_answersc  s   zDNS.__get_answersc                 C   r2  )z$Get a list of the DNS Authoritative.r@   )r+  r   r3  )rß   r  Únscountr=   r=   r>   Ú__get_authoritativeh  ó   zDNS.__get_authoritativec                 C   r2  )z)Get a list of the DNS Additional Records.r@   )r.  r  r3  )rß   r  Úarcountr=   r=   r>   Ú__get_additionalsn  r8  zDNS.__get_additionalsc              
   C   sn  g }|   ¡ }t|ƒD �]§}|  ||¡\}}|||| j … }t d|¡d }|| j7 }|||| j … }t d|¡d }|| j7 }|||| j … }	t d|	¡d }
|| j7 }|||| j … }t d|¡d }|| j7 }i }|t	j
krˆt |||| … ¡|d< || j7 }�n |t	jk�r|  ||¡\}}||d< |  ||¡\}}||d< t d|||| j … ¡d |d< || j7 }t d|||| j … ¡d |d< || j7 }t d|||| j … ¡d |d	< || j7 }t d|||| j … ¡d |d
< || j7 }t d|||| j … ¡d |d< || j7 }n“|t	jk�r9t d|||| j … ¡d |d< |  ||¡\}}||d< no|t	jk�sK|t	jk�sK|t	jk�r]|  ||¡\}}t| d¡ƒ|d< nK|t	jk�r¤|}t d|	dd… ¡d }t d|	dd… ¡d }t d|	dd… ¡d }|||| … |d< ||7 }| |||||||f¡ q
||7 }| ||||
|f¡ q
||fS )Nr  r   z!LÚ	IPAddressÚ	PrimaryNSÚAdminMBÚSerialNumberÚRefreshIntervalÚRetryIntervalÚExpirationLimitÚ
MinimumTTLÚ
PreferenceÚMailExchangerÚasciiÚNamer  r@   r   rB   ÚRDATA)r	  r
  r  r  r  r  r  Ú_DNS__TTL_LENÚ_DNS__RDLENGTH_LENr?   rŒ   ÚsocketÚ	inet_ntoaÚ_DNS__TYPE_A_LENr‘   Ú_DNS__SERIAL_LENÚ_DNS__REFRESH_LENÚ_DNS__RETRY_LENÚ_DNS__EXPIRATION_LENÚ_DNS__MINTTL_LENrš   Ú_DNS__PREF_LENr—   r�   r�   ÚstrÚdecoder´   r  )rß   r  Únumr  r  r  r  r  r  Úqttl_rawÚqttlÚ	qrdlengthÚqrdataÚ	primaryNsÚadminMbÚmailExchr(  Úudp_payload_sizeÚ	ext_rcodeÚversionÚflagsr=   r=   r>   Ú__process_answer_structuret  sl   




"
"
"
"
""
$	zDNS.__process_answer_structurec                 C   s   | j S r‚   )rÛ   ræ   r=   r=   r>   Úget_header_sizeÆ  s   zDNS.get_header_sizec              
   C   sÌ  d}|   ¡ }|  ¡ }|  ¡ }|  ¡ }|  ¡ }|  ¡ }|d7 }|tj@ r(|d7 }n|d7 }|d||f 7 }|d||f 7 }|d||f 7 }|d||f 7 }|d	||f 7 }|d
||f 7 }|dkr�|d7 }|  ¡ }| 	¡  |r�| 
¡ \}	}
}t|	 d¡ƒt |
¡|
t |¡|f}|d| 7 }|sn|dkrÈ|d7 }|  ¡ }| 	¡  |rÈ| 
¡ \}	}
}}}t|	 d¡ƒt |
¡|
t |¡||t|ƒf}|d| 7 }|s¡|dk�r|d7 }|  ¡ }| 	¡  |�r| 
¡ \}	}
}}}t|	 d¡ƒt |
¡|
t |¡||t|ƒf}|d| 7 }|sÜ|dk�rd|d7 }|  ¡ }|D ]Q}|d }
|
tjk�r?|\}	}
}}}}}t |
¡|
||||t|d ƒf}|d| 7 }�q|\}	}
}}}t|	 d¡ƒt |
¡|
t |¡||t|ƒf}|d| 7 }�q|S )Nr!  zDNS z	RESPONSE
zQUERY
z! - Transaction ID -- [0x%04x] %d
z! - Flags ----------- [0x%04x] %d
z! - QdCount --------- [0x%04x] %d
z! - AnCount --------- [0x%04x] %d
z! - NsCount --------- [0x%04x] %d
z! - ArCount --------- [0x%04x] %d
r   z - Questions:
rE  z8  * Domain: %s - Type: %s [0x%04x] - Class: %s [0x%04x]
z - Answers:
zO  * Domain: %s - Type: %s [0x%04x] - Class: %s [0x%04x] - TTL: %d seconds - %s
z - Authoritative:
z - Additionals:
r@   rG  z•  * Name: <Root> - Type: %s [0x%04x] - udp payload size: [%d] - extended RCODE: [0x%02x] - EDNS0 version: [0x%02x] - Z Flags: [0x%02x] - RDATA: [%s]
)rç   ró   rù   rþ   r   r  r   r!   r  ÚreverseÚpoprS  rT  r?   rŠ   rÐ   rÑ   r,  Úreprr/  r1  r´   )rß   ÚresÚidr`  r  r4  r6  r9  Ú	questionsr  r  r  ÚformatÚanswersrW  rY  ÚauthoritativeÚadditionalsÚ
additionalr]  r^  r_  r=   r=   r>   Ú__str__É  sr   

$ý,ý
,ý
 ,zDNS.__str__c                 C   s0   |   ¡ dkrdS |  ¡ d }|  ¡ d |… }|S ©Nr   r!  r@   )rù   r  r	  )rß   Úquestions_offsetÚraw_datar=   r=   r>   Ú__get_questions_raw  ó
   zDNS.__get_questions_rawc                 C   ó<   |   ¡ dkrdS |  ¡ d }|  ¡ d }|  ¡ ||… }|S ro  )rþ   r  r+  r	  )rß   rp  Úanswers_offsetrq  r=   r=   r>   Ú__get_answers_raw  ó   zDNS.__get_answers_rawc                 C   rt  ro  )r   r+  r.  r	  )rß   ru  Úauthoritative_offsetrq  r=   r=   r>   Ú__get_authoritative_raw  rw  zDNS.__get_authoritative_rawc                 C   s0   |   ¡ dkrdS |  ¡ d }|  ¡ |d … }|S ro  )r  r.  r	  )rß   rx  rq  r=   r=   r>   Ú__get_additionals_raw#  rs  zDNS.__get_additionals_rawc                 C   s\   |   ¡ }|  ¡ }|  ¡ }|  ¡ }||7 }|| | | }|  |¡ |  ¡ d }|  |¡ dS )zAdd a raw answerr@   N)Ú_DNS__get_questions_rawÚ_DNS__get_answers_rawÚ_DNS__get_authoritative_rawÚ_DNS__get_additionals_rawÚ	load_bodyrþ   rÿ   )rß   Ú
answer_rawÚquestions_rawÚanswers_rawÚauthoritative_rawÚadditionals_rawÚbodyÚcur_answer_countr=   r=   r>   Ú
add_answer*  s   
zDNS.add_answerc                 C   s.   |   ¡ }|D ]}|d }|tjkr dS qdS )Nr@   TF)r1  r?   r´   )rß   rl  rˆ   Úresponse_typer=   r=   r>   Úis_edns0:  s   
ÿzDNS.is_edns0r‚   )r   ):r   r   r   r   r  r  Ú_DNS__POINTER_LENrH  rI  rL  rM  rN  rO  rP  rQ  rR  r   Ú_DNS__IS_POINTERÚ_DNS__OFFSETMASKrÝ   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/  r1  r+  r.  r0  r3  rb  rn  r{  r|  r}  r~  r‡  r‰  r=   r=   r=   r>   rØ   ³   sn    



RCrØ   )rJ  r  Úimpacket.ImpactPacketr   r   r?   rÐ   rØ   r=   r=   r=   r>   Ú<module>   s   "*Q