a
    kÄ#d‚&  ã                '   @   s  d Z ddlZddlZddlmZ ddlmZ ddlmZm	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 dd	lmZmZmZmZ dd
lmZm Z  ddl!m"Z" ddl#m$Z$ dddddœZ%ddddœZ&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/d0d1d2d3d4d5d6d7d8d9d:d;d<œ&Z'G d=d>„ d>eƒZ(G d?d@„ d@eƒZ)G dAdB„ dBeƒZ*G dCdD„ dDeƒZ+e e(e)ddE� e e(e*dFdE� e e(e+dGdE� ej, -ee(¡ dHdI„ Z.e�r dJdK„ Z/dLdM„ Z0G dNdO„ dOeƒZ1e 2e1¡ dUdQdR„Z3G dSdT„ dTe"ƒZ4e4e_5dS )Vz+
Default USB frames & Basic implementation
é    N)Úconf)ÚWINDOWS)ÚchbÚ	plain_str)ÚMTUÚDLT_USBPCAP)Úwarning)	Ú	ByteFieldÚ
XByteFieldÚByteEnumFieldÚLEShortFieldÚLEShortEnumFieldÚ
LEIntFieldÚLEIntEnumFieldÚXLELongFieldÚLenField)ÚNetworkInterfaceÚInterfaceProviderÚnetwork_nameÚIFACES)ÚPacketÚbind_top_down)ÚSuperSocket)Ú
PcapReaderZSuccessZPendingZHaltedÚError)r   i   @l        l        ZIsochronousZ	InterruptÚControl)r   é   é   ZURB_FUNCTION_CONTROL_TRANSFERZ'URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFERZURB_FUNCTION_ISOCH_TRANSFERZ'URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICEZ%URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICEZ"URB_FUNCTION_SET_FEATURE_TO_DEVICEZ%URB_FUNCTION_SET_FEATURE_TO_INTERFACEZ$URB_FUNCTION_SET_FEATURE_TO_ENDPOINTZ$URB_FUNCTION_CLEAR_FEATURE_TO_DEVICEZ'URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACEZ&URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINTZ#URB_FUNCTION_GET_STATUS_FROM_DEVICEZ&URB_FUNCTION_GET_STATUS_FROM_INTERFACEZ%URB_FUNCTION_GET_STATUS_FROM_ENDPOINTZURB_FUNCTION_VENDOR_DEVICEZURB_FUNCTION_VENDOR_INTERFACEZURB_FUNCTION_VENDOR_ENDPOINTZURB_FUNCTION_CLASS_DEVICEZURB_FUNCTION_CLASS_INTERFACEZURB_FUNCTION_CLASS_ENDPOINTZURB_FUNCTION_CLASS_OTHERZURB_FUNCTION_VENDOR_OTHERZ"URB_FUNCTION_GET_STATUS_FROM_OTHERZ#URB_FUNCTION_CLEAR_FEATURE_TO_OTHERZ!URB_FUNCTION_SET_FEATURE_TO_OTHERZ)URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINTZ'URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINTZURB_FUNCTION_GET_CONFIGURATIONZURB_FUNCTION_GET_INTERFACEZ*URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACEZ(URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACEZ&URB_FUNCTION_GET_MS_FEATURE_DESCRIPTORZ URB_FUNCTION_CONTROL_TRANSFER_EXZ9URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER_USING_CHAINED_MDLZURB_FUNCTION_ABORT_PIPEZ,URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALLZURB_FUNCTION_SYNC_RESET_PIPEZURB_FUNCTION_SYNC_CLEAR_STALL)&é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é2   é7   r   é   é0   é1   c                       sŽ   e Zd ZdZeddƒeddƒeddƒeddeƒedde	ƒe
d	dƒed
dƒeddƒe
ddƒeddeƒedddd�gZdd„ Z‡ fdd„Z‡  ZS )ÚUSBpcapzUSBpcap URBÚ	headerLenNÚresr   ZirpIdÚusbd_statusÚfunctionÚinfoÚbusZdeviceZendpointÚtransferZ
dataLengthz<I)Úfmtc                 C   sZ   | j d u rRt|ƒ}t| jtttfƒr>|t| jƒt| jjƒ 7 }t|ƒ|dd …  }|| S )Nr   )rD   ÚlenÚ
isinstanceÚpayloadÚUSBpcapTransferIsochronousÚUSBpcapTransferInterruptÚUSBpcapTransferControlr   )ÚselfÚpZpayrD   © rT   úG/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/usb.pyÚ
post_buildf   s    
þzUSBpcap.post_buildc                    sT   | j dkrtt| ƒ |¡S | jdkr(tS | jdkr6tS | jdkrDtS tt| ƒ |¡S )Nr0   r   r   r   )rD   ÚsuperrC   Úguess_payload_classrJ   rO   rP   rQ   )rR   rN   ©Ú	__class__rT   rU   rX   p   s    



zUSBpcap.guess_payload_class)Ú__name__Ú
__module__Ú__qualname__Únamer	   r   r   Ú_usbd_status_codesr   Ú_urb_functionsr
   r   r   Ú_transfer_typesr   Úfields_descrV   rX   Ú__classcell__rT   rT   rY   rU   rC   X   s   


ö
rC   c                   @   s.   e Zd ZdZeddƒeddƒeddeƒgZdS )rO   zUSBpcap Transfer IsochronousÚoffsetr   ÚlengthrF   N)r[   r\   r]   r^   r   r   r_   rb   rT   rT   rT   rU   rO   }   s
   
ýrO   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )rP   zUSBpcap Transfer InterruptZ
startFramer   ZnumberOfPacketsZ
errorCountN)r[   r\   r]   r^   r   rb   rT   rT   rT   rU   rP   †   s
   ýrP   c                   @   s   e Zd ZdZeddƒgZdS )rQ   zUSBpcap Transfer ControlZstager   N)r[   r\   r]   r^   r	   rb   rT   rT   rT   rU   rQ   �   s   ÿrQ   )rJ   r   r   c                    s”   t j| g| t jt jd�}| ¡ \}}|jdkrDtd| |j|f ƒ‚t|ƒ}g }| d¡D ]4‰ ˆ  ¡ ‰ ˆ  	|¡srqZ| 
t‡ fdd„|D ƒƒ¡ qZ|S )zSFunction used to call a program using the extcap format,
    then parse the results©ÚstdoutÚstderrr   z"%s returned with error code %s: %sÚ
c                    s"   g | ]}t  d | ˆ ¡ d¡‘qS )z{%s=([^}]*)}r   )ÚreÚsearchÚgroup)Ú.0Úval©ZifarT   rU   Ú
<listcomp>¯   s   ÿz _extcap_call.<locals>.<listcomp>)Ú
subprocessÚPopenÚPIPEÚcommunicateÚ
returncodeÚOSErrorr   ÚsplitÚstripÚ
startswithÚappendÚtuple)ÚprogÚargsÚkeywordÚvaluesrS   ÚdataÚerrrE   rT   ro   rU   Ú_extcap_call�   s(    þ
þ
ÿr‚   c                   C   s   t jjstdƒ‚d S )Nz1USBpcap is not installed ! (USBpcapCMD not found))r   r|   Ú
usbpcapcmdrv   rT   rT   rT   rU   Ú_usbpcap_checkµ   s    r„   c                   C   s   t ƒ  ttjjdgdddgƒS )z-Return a list of available USBpcap interfacesz--extcap-interfacesÚ	interfaceÚvalueÚdisplay©r„   r‚   r   r|   rƒ   rT   rT   rT   rU   Úget_usbpcap_interfaces¹   s    ür‰   c                   @   s<   e Zd ZdZdZdZdd„ Zdd„ ZeZdd	„ Z	d
d„ Z
dS )ÚUsbpcapInterfaceProviderZUSBPcap)ÚIndexÚNameZAddressr   c                 C   s|   i }z
t ƒ }W n ty$   i  Y S 0 |D ]L\}}t d|¡}|rVt| d¡ƒd }nd}||||dœ}t| |ƒ||< q*|S )Nz.*(\d+)r   éd   )r^   r   ÚdescriptionÚindex)r‰   rv   rj   rk   Úintrl   r   )rR   r€   Z
interfacesZ	netw_namer^   r�   Zif_datarT   rT   rU   ÚloadÈ   s"    

üzUsbpcapInterfaceProvider.loadc                 C   s   t jS ©N)r   Ú	USBsocket©rR   rT   rT   rU   Úl2socketÝ   s    z!UsbpcapInterfaceProvider.l2socketc                 C   s   t dƒ‚d S )NzNo L3 available for USBpcap !)Ú
ValueErrorr”   rT   rT   rU   Úl3socketá   s    z!UsbpcapInterfaceProvider.l3socketc                 K   s   t |jƒ|j|jfS )z.Returns a tuple of the elements used by show())Ústrr�   r^   r   )rR   ÚdevÚkwargsrT   rT   rU   Ú_formatä   s    z UsbpcapInterfaceProvider._formatN)r[   r\   r]   r^   ÚheadersZheader_sortr‘   r•   Zl2listenr—   r›   rT   rT   rT   rU   rŠ   Ã   s   rŠ   Tc                 C   sF   t ƒ  ttjjd| dgdg d¢ƒ}dd„ |D ƒ}|rBdd„ |D ƒS |S )z0Return a list of devices on an USBpcap interfacez--extcap-interfacez--extcap-configr†   )r†   r‡   Úenabledc                 S   s&   g | ]}|d  |d |d dkf‘qS )r   r   r   ÚtruerT   ©rm   r™   rT   rT   rU   rp   õ   s
   þ
þz'get_usbpcap_devices.<locals>.<listcomp>c                 S   s   g | ]}|d  r|‘qS )r   rT   rŸ   rT   rT   rU   rp   ù   ó    rˆ   )Úifacer�   ZdevicesrT   rT   rU   Úget_usbpcap_devicesê   s     þúþr¢   c                   @   s@   e Zd ZdZdZeddd„ƒZddd„Zefdd	„Z	d
d„ Z
dS )ÚUSBpcapSocketz:
        Read packets at layer 2 using USBPcapCMD
        TNc                 C   s   | S r’   rT   )ÚsocketsZremainrT   rT   rU   Úselect  s    zUSBpcapSocket.selectc                 O   s„   t ƒ  |d u r2tdd dd„ tƒ D ƒ¡ƒ tdƒ‚t|ƒ}d | _d|ddd	d
dg}tjt	j
jg| tjtjd�| _t| jjƒ| _d S )NzAvailable interfaces: [%s]ú c                 s   s   | ]}|d  V  qdS )r   NrT   )rm   ÚxrT   rT   rU   Ú	<genexpr>
  r    z)USBpcapSocket.__init__.<locals>.<genexpr>z5No interface specified ! See get_usbpcap_interfaces()z-dz-bZ	134217728z-Az-oú-rf   )r„   r   Újoinr‰   Ú	NameErrorr   Zoutsrq   rr   r   r|   rƒ   rs   Úusbpcap_procr   rg   Úins)rR   r¡   r}   ZkargrT   rT   rU   Ú__init__  s    ÿþzUSBpcapSocket.__init__c                 C   s   | j  |¡S r’   )r­   Úrecv)rR   r§   rT   rT   rU   r¯     s    zUSBpcapSocket.recvc                 C   s   t  | ¡ | j ¡  d S r’   )r   Úcloser¬   Úkillr”   rT   rT   rU   r°     s    
zUSBpcapSocket.close)N)N)r[   r\   r]   Ú__doc__Znonblocking_socketÚstaticmethodr¥   r®   r   r¯   r°   rT   rT   rT   rU   r£   ü   s   
r£   )T)6r²   rj   rq   Zscapy.configr   Zscapy.constsr   Zscapy.compatr   r   Z
scapy.datar   r   Zscapy.errorr   Zscapy.fieldsr	   r
   r   r   r   r   r   r   r   Zscapy.interfacesr   r   r   r   Zscapy.packetr   r   Zscapy.supersocketr   Zscapy.utilsr   r_   ra   r`   rC   rO   rP   rQ   Zl2typesÚregisterr‚   r„   r‰   rŠ   Zregister_providerr¢   r£   r“   rT   rT   rT   rU   Ú<module>   sš   ,üýÚ*%		
%

!