???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
:)gP                 @   s   d dl mZ d dlZddlmZ G dd dejZG dd dejZG d	d
 d
ej	Z
G dd dejZG dd dZdddZdd Zdd ZG dd dZdddZdS )    )linesepN   )get_table_type_namec               @   s    e Zd ZdejfdejfgZdS )OffsetUnionZoffsetuoffsetN)__name__
__module____qualname__ctZc_uint16Zc_int16_fields_ r   r   "/usr/lib/python3.6/disassembler.pyr      s   r   c               @   s    e Zd ZdejfdejfgZdS )ImmUnionimmuimmN)r   r   r	   r
   Zc_uint32Zc_int32r   r   r   r   r   r      s   r   c               @   s@   e Zd ZdZd	ZdejfdejdfdejdfdefdefgZ	dS )
BPFInstrFieldsr   oiopcodedst   srcN)r   r   )
r   r   r	   _pack__anonymous_r
   Zc_uint8r   r   r   r   r   r   r   r      s   

r   c               @   s&   e Zd ZdZdZdefdejfgZdS )BPFInstrr   sinstrN)	r   r   r	   r   r   r   r
   c_uint64r   r   r   r   r   r   "   s   r   c            d   @   s  e Zd Z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ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^g]Zdddddddddddddddddddddddddddddddddddddddddddddddddddddd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ddd d!d"d#d$d%d&d'd(d)d*dǜaZeddɄ ZdeS (+  
BPFDecoderr   ZunspecZmap_lookup_elemZmap_update_elemZmap_delete_elemZ
probe_readZktime_get_nsZtrace_printkZget_prandom_u32Zget_smp_processor_idZskb_store_bytesZl3_csum_replaceZl4_csum_replaceZ	tail_callZclone_redirectZget_current_pid_tgidZget_current_uid_gidZget_current_commZget_cgroup_classidZskb_vlan_pushZskb_vlan_popZskb_get_tunnel_keyZskb_set_tunnel_keyZperf_event_readZredirectZget_route_realmZperf_event_outputZskb_load_bytesZget_stackidZ	csum_diffZskb_get_tunnel_optZskb_set_tunnel_optZskb_change_protoZskb_change_typeZskb_under_cgroupZget_hash_recalcZget_current_taskZprobe_write_userZcurrent_task_under_cgroupZskb_change_tailZskb_pull_dataZcsum_updateZset_hash_invalidZget_numa_node_idZskb_change_headZxdp_adjust_headZprobe_read_strZget_socket_cookieZget_socket_uidZset_hashZ
setsockoptZskb_adjust_roomZredirect_mapZsk_redirect_mapZsock_map_updateZxdp_adjust_metaZperf_event_read_valueZperf_prog_read_valueZ
getsockoptZoverride_returnZsock_ops_cb_flags_setZmsg_redirect_mapZmsg_apply_bytesZmsg_cork_bytesZmsg_pull_dataZbindZxdp_adjust_tailZskb_get_xfrm_stateZ	get_stackZskb_load_bytes_relativeZ
fib_lookupZsock_hash_updateZmsg_redirect_hashZsk_redirect_hashZlwt_push_encapZlwt_seg6_store_bytesZlwt_seg6_adjust_srhZlwt_seg6_actionZ	rc_repeatZ
rc_keydownZskb_cgroup_idZget_current_cgroup_idZget_local_storageZsk_select_reuseportZskb_ancestor_cgroup_idZsk_lookup_tcpZsk_lookup_udpZ
sk_releaseZmap_push_elemZmap_pop_elemZmap_peek_elemZmsg_push_dataZmsg_pop_dataZrc_pointer_reladd32dstimm+=    jajoffN@   adddstsrcsub32-=jeq
jdstimmoff==sublddw
jdstsrcoffldabswldabsmul32*=jgt>mulldabsh   ldabsb   div32/=jge>=divldabsdwldindwldindor32	dstimm_bw|=jset&orldindhldindband32&=jne!=andldinddwldxw
ldstsrcoffstw
sdstoffimmstxw
sdstoffsrclsh32<<=jsgts>lshldxhsthstxhldxbstbstxbrsh32>>=jsges>=rshldxdwstdwstxdwneg32r   ~callnegmod32%=exitmodxor32^=jlt<xormov32=jle<=movarsh32s>>=jslts<arshjsles<=endian32endian)ar                                    r"   $   %   '   (   ,   -   /   0   4   5   7   8   <   =   ?   r%   D   E   G   H   L   M   O   P   T   U   W   X   \   ]   _   a   b   c   d   e   g   i   j   k   l   m   o   q   r   s   t   u   w   y   z   {   |   }                                                                                             c       	      C   s  y| j |j \}}}}|dkr6d|j||jf dfS |dkrTd|j||jf dfS |dkr|dd|j ||j d	 f dfS |d
krd|j||jf dfS |dkrd|j||jd|j ||j d	 f dfS |dkr d|j||jd|j ||j d	 f dfS |dkr^|d krtd|jdkr<d|j|jf d	fS |jd> |jB }d|j|f d	fS |dkrzd||jf dfS |dkrd||jd|j f dfS |dkrd|j||jd|j f dfS |dkrd||jd|j |jf dfS |dkrd||jd|j |jf dfS |dkr8d |j|||jf dfS |d!kr|j| jkryd"|| j	|j |jf dfS  t
k
r   d#||jf dfS X d$|d|j f dfS |d%kr|dfS td&W n tk
r   d'|j S X d S )(Nr    z	r%d %s %dr   rD   zr%d %s 0x%xr$   zgoto %s <%d>z%+dr   r'   z
r%d %s r%dr+   zif r%d %s %d goto pc%s <%d>r/   zif r%d %s r%d goto pc%s <%d>r.   z1lddw requires two instructions to be disassembledzr%d = <map at fd #%d>r"   z
r%d = 0x%xr1   zr0 = *(u%s*)skb[%s]rB   zr0 = *(u%d*)skb[r%d %s]rR   zr%d = *(u%d*)(r%d %s)rT   z*(u%d*)(r%d %s) = %drV   z*(u%d*)(r%d %s) = r%dr   zr%d = %s (u%s)r%drl   z%s bpf_%s#%dz%s <unknown helper #%d>z%s %srp   zunknown opcode classzunknown <0x%x>)opcodesr   r   r   r   r   r   	ExceptionBPF_PSEUDO_CALLbpf_helpers
IndexErrorKeyError)	clsr   ww1nameZopclassopbitsr   r   r   r   decode   sl    











zBPFDecoder.decode)r   r    r!   r"   )r#   r$   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.   Nr%   )r(   r'   r)   r"   )r*   r/   r,   r%   )r-   r'   r)   r%   )r0   r1   Nr"   )r2   r    r3   r"   )r4   r+   r5   r%   )r6   r    r3   r%   )r7   r1   Nr8   )r2   r'   r3   r"   )r4   r/   r5   r%   )r6   r'   r3   r%   )r9   r1   Nr:   )r;   r    r<   r"   )r=   r+   r>   r%   )r?   r    r<   r%   )r@   r1   Nr%   )r;   r'   r<   r"   )r=   r/   r>   r%   )r?   r'   r<   r%   )rA   rB   Nr"   )rC   rD   rE   r"   )rF   r+   rG   r%   )rH   rD   rE   r%   )rI   rB   Nr8   )rC   r'   rE   r"   )rF   r/   rG   r%   )rH   r'   rE   r%   )rJ   rB   Nr:   )rK   rD   rL   r"   )rM   r+   rN   r%   )rO   rD   rL   r%   )rP   rB   Nr%   )rK   r'   rL   r"   )rM   r/   rN   r%   )rO   r'   rL   r%   )rQ   rR   Nr"   )rS   rT   Nr"   )rU   rV   Nr"   )rW   r    rX   r"   )rY   r+   rZ   r%   )r[   r    rX   r%   )r\   rR   Nr8   )r]   rT   Nr8   )r^   rV   Nr8   )rW   r'   rX   r"   )rY   r/   rZ   r%   )r[   r'   rX   r%   )r_   rR   Nr:   )r`   rT   Nr:   )ra   rV   Nr:   )rb   r    rc   r"   )rd   r+   re   r%   )rf   r    rc   r%   )rg   rR   Nr%   )rh   rT   Nr%   )ri   rV   Nr%   )rb   r'   rc   r"   )rd   r/   re   r%   )rf   r'   rc   r%   )rj   r   rk   r"   )rl   rl   Nr%   )rm   r   rk   r%   )rn   r    ro   r"   )rp   rp   Nr%   )rq   r    ro   r%   )rn   r'   ro   r"   )rq   r'   ro   r%   )rr   rD   rs   r"   )rt   r+   ru   r%   )rv   rD   rs   r%   )rr   r'   rs   r"   )rt   r/   ru   r%   )rv   r'   rs   r%   )rw   r    rx   r"   )ry   r+   rz   r%   )r{   r    rx   r%   )rw   r'   rx   r"   )ry   r/   rz   r%   )r{   r'   rx   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   r	   r   r   r   classmethodr   r   r   r   r   r   '   s  
r   c             C   s&   t j| ||\}}d| |j|f |fS )Nz%4d: (%02x) %s)r   r   r   )r   w0r   r   skipr   r   r   disassemble_instruction3  s    r   c       	      C   s   t jt j| t jt}tt| d }|d }d}g }xRtd|D ]D}|| }|rf|d8 }d| }nt|d ||\}}|j	| |}qDW t|d |d \}}|j	| |S )Nr:   r   r   z%4d:      (64-bit upper word))
r
   castZc_char_pZPOINTERr   intlenranger   append)	bpfstrZptrZnuminstrr   r   
instr_listr   r   Z	instr_strr   r   r   disassemble_str7  s     


r   c             C   s    d|  g}|t |7 }tj|S )NzDisassemble of BPF program %s:)r   r   join)Z	func_namer   r   r   r   r   disassemble_progJ  s    
r   c            "   @   s   e Zd Zejdejdejdejdejdej	dej
dejdejd	ejd
ejdejdejdejdejdejd dejd diZedd Zed!ddZed"ddZedd Zed#dd ZdS )$
MapDecoderZ_BoolcharZwchar_tzunsigned charZshortzunsigned shortr   zunsigned intZlongzunsigned longz	long longzunsigned long longfloatZdoublezlong double   Z__int128zunsigned __int128c             C   s   y^t |tjrd}nHt |tjr&d}n6t |tjrR| j|j d t|j d }n
| j| }W n t	k
rz   t|}Y nX |S )Nstructunion[])

issubclassr
   	StructureUnionZArray	ctype2strZ_type_strZ_length_r   )r   tfield_type_namer   r   r   get_ct_nameb  s     zMapDecoder.get_ct_nameFNc             C   s*   |sdS |d k	rd|||f S d||f S )N z[%d,%d +%d bit]z	[%d +%d] r   )r   r   sizeZenabledZ	bitoffsetr   r   r   format_size_infoq  s
    zMapDecoder.format_size_infor  r   c             C   s  g }yx|j D ]\}}t|tjp,t|tj}| j|}	t||j}
tj|}| j	||
 ||}|r|j
d|||	f  || j||d ||
 7 }|j
d||f  q|j
d|||	|f  qW W n tk
r   d}x|j D ]}t|dkr0|\}}}| j|}	| j	||||}|j
d|||	||f  n`|\}}| j|}	t||j}
tj|}d}d}| j	||
 ||}|j
d|||	|f  ||
7 }||7 }qW Y nX |S )Nz%s%s%s {z  z%s} %s;z
%s%s%s %s;r      z%s%s%s %s:%d;)r   r  r
   r  r  r  getattrr   Zsizeofr  r   print_ct_map
ValueErrorr   )r   r  indentr   sizeinfo	map_lines
field_nameZ
field_typeis_structuredr  Zfield_offsetZ
field_sizeZsizedescZoffset_bitsZfieldZ
field_bitsr   r   r   r  y  sZ    











zMapDecoder.print_ct_mapc             C   sf   t |tjpt |tj}| j|}|rTd| g}|| j|d|d7 }|jd|  nd||f g}|S )Nz  %s {z    )r  z  } %s;z  %s %s;)r  r
   r  r  r  r  r   )r   r  r  r  r  Z	type_namer  r   r   r   print_map_ctype  s    

zMapDecoder.print_map_ctypec             C   sL   d|||j |jf g}|| j|jd|d7 }|| j|jd|d7 }tj|S )Nz-Layout of BPF map %s (type %s, FD %d, ID %d):key)r  value)Zmap_fdZmap_idr  ZKeyZLeafr   r   )r   map_namemap_objmap_typer  r  r   r   r   
decode_map  s    zMapDecoder.decode_map)FN)r  r   F)F)r   r   r	   r
   Zc_boolZc_charZc_wcharZc_ubyteZc_shortZc_ushortZc_intZc_uintZc_longZc_ulongZ
c_longlongZc_ulonglongZc_floatZc_doubleZc_longdoubleZc_int64r   r	  r   r  r  r  r  r   r   r   r   r   r   O  s2   
3r   Fc             C   s   t |}tj| |||dS )N)r  )r   r   r   )r  r  r  r  Zmap_type_namer   r   r   r     s    r   )N)F)osr   Zctypesr
   tabler   r  r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   	  
u