a
    kÄ#dy  ã                
   @   s¦  d 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
mZmZmZmZmZmZmZmZmZmZmZ dddd	d
dddddœ	ZddddddddœZdddddd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G d)d*„ d*eƒZG d+d,„ d,eƒZG d-d.„ d.eƒZ G d/d0„ d0eƒZ!G d1d2„ d2eƒZ"G d3d4„ d4eƒZ#G d5d6„ d6eƒZ$G d7d8„ d8eƒZ%G d9d:„ d:eƒZ&eee&d;d<� eee&d;d=� dS )>zv
EtherNet/IP (Industrial Protocol)

Based on https://github.com/scy-phy/scapy-cip-enip
EtherNet/IP Home: www.odva.org
é    N)ÚPacketÚbind_layers)ÚTCP)ÚLEShortFieldÚLEShortEnumFieldÚLEIntEnumFieldÚ
LEIntFieldÚLELongFieldÚFieldLenFieldÚPacketListFieldÚ	ByteFieldÚPacketFieldÚMultipleTypeFieldÚStrLenFieldÚStrFixedLenFieldÚXLEIntFieldÚXLEStrLenFieldZListServicesZListIdentityZListInterfacesZRegisterSessionZUnregisterSessionZ
SendRRDataZSendUnitDataZIndicateStatusZCancel)	é   éc   éd   ée   éf   éo   ép   ér   és   ÚsuccessZinvalid_cmdZno_resourcesZincorrect_dataZinvalid_sessionZinvalid_lengthZunsupported_prot_rev)r   é   é   é   r   r   éi   zNull Address ItemzConnection-based Address Itemz$Connected Transport packet Data ItemzUnconnected message Data Itemz-Sockaddr Info, originator-to-target Data Itemz-Sockaddr Info, target-to-originator Data Item)r   é¡   é±   é²   i €  i€  c                   @   sB   e Zd ZdZdZeddeƒeddƒedddd	„ d
�gZ	dd„ Z
dS )ÚItemDatazCommon Packet Formatz	Item DataZtypeIdr   ÚlengthÚdataÚ c                 C   s   | j S ©N)r%   ©Úpkt© r+   úL/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/enipTCP.pyÚ<lambda>>   ó    zItemData.<lambda>©Zlength_fromc                 C   s   d|fS )Nr'   r+   )ÚselfÚsr+   r+   r,   Úextract_paddingA   s    zItemData.extract_paddingN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer   Ú_itemIDr   r   Úfields_descr2   r+   r+   r+   r,   r$   8   s   
ýr$   c                   @   s2   e Zd ZdZdZeddƒeddedd„ d�gZdS )	ÚEncapsulatedPacketzEncapsulated PacketÚ	itemCountr   ÚitemNc                 C   s   | j S r(   )r;   r)   r+   r+   r,   r-   I   r.   zEncapsulatedPacket.<lambda>)Z
count_from)	r3   r4   r5   r6   r7   r   r   r$   r9   r+   r+   r+   r,   r:   E   s
   
ÿr:   c                   @   s.   e Zd ZdZeddƒeddƒeddeƒgZdS )ÚBaseSendPacketz Abstract ClassZinterfaceHandler   ÚtimeoutZencapsulatedPacketN)	r3   r4   r5   r6   r   r   r   r:   r9   r+   r+   r+   r,   r=   L   s
   
ýr=   c                   @   s   e Zd ZdZdS )ÚCommandSpecificDataz#Command Specific Data Field DefaultN)r3   r4   r5   r6   r+   r+   r+   r,   r?   U   s   r?   c                   @   s   e Zd ZdZd ZdS )ÚENIPSendUnitDatazSend Unit Data Command FieldN©r3   r4   r5   r6   r7   r+   r+   r+   r,   r@   Z   s   r@   c                   @   s   e Zd ZdZd ZdS )ÚENIPSendRRDatazSend RR Data Command FieldNrA   r+   r+   r+   r,   rB   _   s   rB   c                   @   s<   e Zd ZdZd Zeddƒedddd�edddd	„ d
�gZdS )ÚENIPListInterfacesReplyItemszList Interfaces Items FieldÚitemTypeCoder   Ú
itemLengthÚitemData©Z	length_ofr'   c                 C   s   | j S r(   )rE   r)   r+   r+   r,   r-   j   r.   z%ENIPListInterfacesReplyItems.<lambda>r/   N©	r3   r4   r5   r6   r7   r   r
   r   r9   r+   r+   r+   r,   rC   d   s   ýrC   c                   @   s.   e Zd ZdZd Zedddd�eddeƒgZdS )ÚENIPListInterfacesReplyzList Interfaces Command Fieldr;   r   ÚidentityItems©Zcount_ofN)	r3   r4   r5   r6   r7   r
   r   rC   r9   r+   r+   r+   r,   rI   n   s
   
þrI   c                   @   s<   e Zd ZdZd Zeddƒedddd�edddd	„ d
�gZdS )ÚENIPListIdentityReplyItemszList Identity Items FieldrD   r   rE   rF   rG   r'   c                 C   s   | j S r(   )Zitem_lengthr)   r+   r+   r,   r-   }   r.   z#ENIPListIdentityReplyItems.<lambda>r/   NrH   r+   r+   r+   r,   rL   w   s   ýrL   c                   @   s.   e Zd ZdZd Zedddd�eddeƒgZdS )ÚENIPListIdentityReplyzList Identity Command Fieldr;   r   rJ   rK   N)	r3   r4   r5   r6   r7   r
   r   rL   r9   r+   r+   r+   r,   rM   �   s
   
þrM   c                   @   sB   e Zd ZdZd Zeddƒeddƒeddƒeddƒedd	d
ƒgZd	S )ÚENIPListServicesReplyItemszList Services Items FieldrD   r   rE   Úversionr   ÚflagZserviceNameNé@   )	r3   r4   r5   r6   r7   r   r   r   r9   r+   r+   r+   r,   rN   Š   s   
ûrN   c                   @   s.   e Zd ZdZd Zedddd�eddeƒgZdS )ÚENIPListServicesReplyzList Services Command Fieldr;   r   rJ   rK   ZtargetItemsN)	r3   r4   r5   r6   r7   r
   r   rN   r9   r+   r+   r+   r,   rR   –   s
   
þrR   c                   @   s(   e Zd ZdZd ZeddƒeddƒgZdS )ÚENIPRegisterSessionzRegister Session Command FieldZprotocolVersionr   Úoptionsr   N)r3   r4   r5   r6   r7   r   r9   r+   r+   r+   r,   rS   Ÿ   s
   þrS   c                   @   sÐ   e Zd ZdZd Zeddeƒeddƒeddƒe	dde
ƒeddƒed	dƒeed
eeƒdd„ fed
eeƒdd„ fed
eeƒdd„ fed
eeƒdd„ fed
eeƒdd„ fed
eeƒdd„ fged
deƒƒgZdd„ ZdS )ÚENIPTCPzEthernet/IP packet over TCPÚ	commandIdNr%   r   ÚsessionÚstatusZsenderContextrT   ZcommandSpecificDatac                 C   s
   | j dkS )Nr   ©rV   r)   r+   r+   r,   r-   ·   r.   zENIPTCP.<lambda>c                 C   s
   | j dkS )Nr   rY   r)   r+   r+   r,   r-   »   r.   c                 C   s
   | j dkS )Nr   rY   r)   r+   r+   r,   r-   ¿   r.   c                 C   s
   | j dkS )Nr   rY   r)   r+   r+   r,   r-   Ã   r.   c                 C   s
   | j dkS )Nr   rY   r)   r+   r+   r,   r-   Ç   r.   c                 C   s
   | j dkS )Nr   rY   r)   r+   r+   r,   r-   Ë   r.   c                 C   s>   | j d u r6|r6|d d… t dt|ƒ¡ |dd …  }|| S )Nr   z<Hr   )r%   ÚstructÚpackÚlen)r0   r*   Zpayr+   r+   r,   Ú
post_buildÔ   s    (zENIPTCP.post_build)r3   r4   r5   r6   r7   r   Ú_commandIdListr   r   r   Ú_statusListr	   r   r   r   rR   rM   rI   rS   rB   r@   r?   r9   r]   r+   r+   r+   r,   rU   ¨   s`   

ÿþÿþÿþÿþÿþÿþêýåù)rU   i¯  )Údport)Zsport)'r6   rZ   Zscapy.packetr   r   Zscapy.layers.inetr   Zscapy.fieldsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r^   r_   r8   r$   r:   r=   r?   r@   rB   rC   rI   rL   rM   rN   rR   rS   rU   r+   r+   r+   r,   Ú<module>	   sZ   @÷ùú
	
	
			2