U
    {f
                     @  sd	  d dl mZ d dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZmZ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mZ ddlmZmZmZmZ eeje dsee  Z!ej"d  d	k Z#e#re$Z%d
dddddZ&dZ'e( Z)dd Z*ej+dkr
e*d dd Z,dZ-e.dde/edej01ej02e!d  ddej34 ej+dkr\dnde.ddgZ5e5D ]8Z6e6dkrqpe,e6e&7ej+dZ-e-dk	rp qqpe-dkre5D ]<Z6e6dkrʐqe,e6dZ-e-dk	re8dej9d  qqe-dkre:dd ej;ej<ej=f Z>d!d" Z?ej@ZAej@ZBej@ZCejDZEejDZFejGZHG d#d$ d$ejIZJG d%d& d&ejIZKe?e-d'ejLeMej@eMej@ e?e-d(ejNej@ e?e-d)eAejLejLeMeE e?e-d*eAeE e?e-d+ejOeA e?e-d,eAeE e?e-d-eAeEej@ejD e?e-d.eAeEej@ejD e?e-d/eAeEejPeMejQejG e?e-d0eAeEejPeMejQejG e?e-d1eAeEejPejPejPejG e?e-d2eAeE e?e-d3eAeEeH e?e-d4eAeEejPejGejDejDejDejD
 e?e-d5eAeEejPejGejR e?e-d6eAeEejPejGejRejD e?e-d7eAeEejPejG e?e-d8eAeEejPejGejR e?e-d9eAeEejReMejG e?e-d:eAeEeMeF e?e-d;eAejD e?e-d<eAeEeF e?e-d=eAeEeF e?e-d>ejGeE e?e-d?eAeFej@ejD e?e-d@eAeFej@ejD e?e-dAeAeF e?e-dBeAeEeMeMeJeMejR e?e-dCeAeEeMeHej@ejDejDejPejP
 e?e-dDeAeEej@ eSdeEejPejGejDZTeSejNeEejDZUeSejNeEej@ejPej@ejVejDZWeSdeEej@ejPej@ejVejDZXeSdeEejRejDZYeSejReEejRej@ejDZZeSdeEejRej@ejRejDZ[eSdeEejDZ\eSejReEejRejDejDZ]eSejReEejDZ^eSejPeEejPej@ejDZ_eSdeEejPej@ejPejDZ`eSdeEeMeKeMeKejDZaeSdeEejPejPejPejDZbG dEdF dFecZddGd' ZedHdI ZfdJd( Zgeehehehehehehehf Zieehehehehehf Zjeehehehehehehehehf Zkeehehehehehehf Zleehehehehf Zmeehehf ZndkdKdLZodMdN ZpdOdP ZqG dQdR dRejIZrG dSdT dTejIZsG dUdV dVejIZtG dWdX dXejIZuG dYdZ dZejIZvG d[d\ d\ejIZwG d]d^ d^ejIZxG d_d` d`ejIZyG dadb dbejzZ{G dcdd dde|Z}G dedf dfe|Z~G dgdh dhZe
e~ehehe	gdf Ze
e~e	gef Ze
e~ehehehehe	gef Ze
e~ehehehehe	gdf Ze
e~ehe	gdf Ze
e~ehehe	gehf Ze
e~ehehehe	gdf Ze
e~e	gdf Ze
e~eheehehehehehehf e	gehf Ze
e~e	gehf Ze
e~ehehe	gehf Ze
e~ehehehe	gdf Ze
e~eKeKe	gdf Ze
e~ehehehe	gdf Zeeeeeeeeeeeef Zdidj ZdS )l    )annotationsNwraps)AnyCallableListTupleUnion)
namedtuple   )	x86_const	arm_constarm64_constunicorn_const__file__   zlibunicorn.2.dylibzunicorn.dllzcygunicorn.dllzlibunicorn.so.2)darwinwin32cygwinlinuxZlinux2)zlibwinpthread-1.dllzlibgcc_s_seh-1.dllzlibgcc_s_dw2-1.dllc                 C  s   t D ]~}|tkrqtj| |}d| kr0d| ks<tj|rztj| t	| W q t
k
r } zW Y qW 5 d }~X Y qX qd S )N/\)_all_windows_dlls_loaded_windows_dllsospathjoinexistsctypescdllLoadLibraryaddOSError)r   dlllib_filee r&   N/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/unicorn/unicorn.py_load_win_support)   s    r(   r   r    c              
   C  s`   z2t jdkrt|  tj| |}tj|}|W S  t	k
rZ } z
W Y d S d }~X Y nX d S )Nr)   )
sysplatformr(   r   r   r   r   r   r    r"   )r   Zlib_namer$   r#   r%   r&   r&   r'   	_load_lib=   s    
r-   ZLIBUNICORN_PATHlibr   z/usr/local/lib/z
/usr/lib64PATHzlibunicorn.sozUFound an old style dynamic library libunicorn.so, consider checking your installation)filez(ERROR: fail to load the dynamic library.z%u.%u.%uc                 G  s>   z|t | |_|t | |_W n tk
r8   tdY nX d S )NzeERROR: Fail to setup some function prototypes. Make sure you have cleaned your unicorn1 installation.)getattrrestypeargtypesAttributeErrorImportError)r.   fnamer2   r3   r&   r&   r'   _setup_prototypew   s
    r7   c                   @  s(   e Zd ZdejfdejfdejfgZdS )_uc_mem_regionbeginendpermsN)__name__
__module____qualname__r   c_uint64c_uint32_fields_r&   r&   r&   r'   r8      s   r8   c                   @  s,   e Zd ZdZdejfdejfdejfgZdS )uc_tbz"TranslationBlockZpcZicountsizeNr<   r=   r>   __doc__r   r?   c_uint16rA   r&   r&   r&   r'   rB      s
   rB   
uc_versionuc_arch_supporteduc_openuc_closeuc_strerrorZuc_errnouc_reg_readuc_reg_writeuc_mem_readuc_mem_writeuc_emu_startuc_emu_stopuc_hook_deluc_mmio_map
uc_mem_mapuc_mem_map_ptruc_mem_unmapuc_mem_protectuc_queryuc_context_allocuc_freeuc_context_saveuc_context_restoreuc_context_sizeuc_context_reg_readuc_context_reg_writeuc_context_freeuc_mem_regionsuc_hook_adduc_ctlc                   @  s   e Zd Zdd Zdd ZdS )UcErrorc                 C  s
   || _ d S N)errno)selfrf   r&   r&   r'   __init__   s    zUcError.__init__c                 C  s   t | jdS )Nascii)_ucrK   rf   decoderg   r&   r&   r'   __str__   s    zUcError.__str__N)r<   r=   r>   rh   rm   r&   r&   r&   r'   rd      s   rd   c                  C  s6   t  } t  }tt | t |}| j|j|fS re   )r   c_intrj   rG   byrefvalue)majorminorcombinedr&   r&   r'   rG      s    c                   C  s   t jt jt jd> t j fS )N   )ucUC_API_MAJORUC_API_MINORr&   r&   r&   r'   version_bind   s     rx   c                 C  s
   t | S re   )rj   rH   )queryr&   r&   r'   rH      s    c                 C  sb  |t jkr|tjtjtjtjfkr`t }| |t	|}|t j
krLt||j|j|j|jfS |ttjtjd krt }| |t	|}|t j
krt||j|jfS |ttjtjd krt }| |t	|}|t j
krt||j|jd> B S |ttjtjd kr^t }| |t	|}|t j
kr:t||j|jd> B |jd> B |jd> B S |tjkr|d kr~tt j t! }||_"| |t	|}|t j
krt||j#S |t j$kr@|t%j&kr@t' }t(|t)rt*|dkrtt j |\|_+|_,|_-|_.|_/|_0|_1| |t	|}|t j
kr:t||j2S |t j3kr.|t4j5krt6 }t(|t)rxt*|dkrtt j |\|_.|_/|_7|_8|_9| |t	|}|t j
krt||j2S |tt4j:t4j;d ks|tt4j<t4j=d kr.t> }| |t	|}|t j
krt||j|jd> B S t?d	}| |t	|}|t j
kr\t||j#S )
Nrt   @                  r   r   )@ru   UC_ARCH_X86r   UC_X86_REG_IDTRUC_X86_REG_GDTRUC_X86_REG_LDTRUC_X86_REG_TR
uc_x86_mmrr   ro   	UC_ERR_OKrd   selectorbaselimitflagsrangeUC_X86_REG_FP0uc_x86_float80mantissaexponentUC_X86_REG_XMM0
uc_x86_xmm	low_qword
high_qwordUC_X86_REG_YMM0
uc_x86_ymmfirst_qwordsecond_qwordthird_qwordfourth_qwordUC_X86_REG_MSR
UC_ERR_ARG
uc_x86_msrridrp   UC_ARCH_ARMr   UC_ARM_REG_CP_REGuc_arm_cp_reg
isinstancetuplelencpis64seccrncrmopc1opc2valUC_ARCH_ARM64r   UC_ARM64_REG_CP_REGuc_arm64_cp_regop0op1op2UC_ARM64_REG_Q0UC_ARM64_REG_Q31UC_ARM64_REG_V0UC_ARM64_REG_V31uc_arm64_neon128r?   )Zreg_read_funcarchreg_idoptregstatusr&   r&   r'   reg_read   s    


$


 
0
r   c              	   C  s  d }|t jkrD|tjtjtjtjfkrpt|tr>t	|dksBt
t }|d |_|d |_|d |_|d |_|ttjtjd krt }|d |_|d |_|ttjtjd krt }|d@ |_|d? |_|ttjtjd	 krt }|d@ |_|d? d@ |_|d
? d@ |_|d? |_|tjkrDt  }|d |_!|d |_"|t j#kr|tt$j%t$j&d ks|tt$j't$j(d krt) }|d@ |_|d? |_nR|t$j*krt+ }t|trt	|dkrt,t j-|\|_.|_/|_0|_1|_2|_3|t j4krT|t5j6krTt7 }t|tr&t	|dkr0t,t j-|\|_8|_9|_:|_.|_/|_;|_<|_3|d krht=>|}| |t=?|}|t j@krt,|d S )N   r   r      r   rt   l    rz   r{   r|   r}      )Aru   r   r   r   r   r   r   r   r   r   AssertionErrorr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rp   r   r   r   r   r   r   r   r   r   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r?   ro   r   )Zreg_write_funcr   r   rp   r   r   r&   r&   r'   	reg_writeE  sb    











0


$

r   c                   s   t   fdd}|S )Nc              
     sR   z | f||W S  t k
rL } z| jdkr4|| _|   W 5 d}~X Y nX dS )zCatches exceptions raised in hook functions.

        If an exception is raised, it is saved to the Uc object and a call to stop
        emulation is issued.
        N)	Exception_hook_exceptionemu_stop)rg   argskwargsr%   funcr&   r'   wrapper  s    
z&_catch_hook_exception.<locals>.wrapperr   )r   r   r&   r   r'   _catch_hook_exception  s    r   c                	   @  sT   e Zd ZdZdejfdejfdejfdejfdejfdejfdejfd	ejfgZd
S )r   z@ARM coprocessors registers for instructions MRC, MCR, MRRC, MCRRr   r   r   r   r   r   r   r   Nr<   r=   r>   rE   r   r@   r?   rA   r&   r&   r&   r'   r     s   r   c                   @  sD   e Zd ZdZdejfdejfdejfdejfdejfdejfgZdS )	r   z6ARM64 coprocessors registers for instructions MRS, MSRr   r   r   r   r   r   Nr   r&   r&   r&   r'   r     s   r   c                   @  s4   e Zd ZdZdejfdejfdejfdejfgZdS )r   zAMemory-Management Register for instructions IDTR, GDTR, LDTR, TR.r   r   r   r   N)	r<   r=   r>   rE   r   rF   r?   r@   rA   r&   r&   r&   r'   r     s   r   c                   @  s    e Zd ZdejfdejfgZdS )r   r   rp   N)r<   r=   r>   r   r@   r?   rA   r&   r&   r&   r'   r     s   r   c                   @  s$   e Zd ZdZdejfdejfgZdS )r   ZFloat80r   r   NrD   r&   r&   r&   r'   r     s   r   c                   @  s$   e Zd ZdZdejfdejfgZdS )r   z128-bit xmm registerr   r   Nr<   r=   r>   rE   r   r?   rA   r&   r&   r&   r'   r     s   r   c                   @  s4   e Zd ZdZdejfdejfdejfdejfgZdS )r   z256-bit ymm registerr   r   r   r   Nr   r&   r&   r&   r'   r     s   r   c                   @  s$   e Zd ZdZdejfdejfgZdS )r   z128-bit neon registerr   r   Nr   r&   r&   r&   r'   r     s   r   c                   @  s   e Zd ZdS )UcRefN)r<   r=   r>   r&   r&   r&   r'   r     s   r   c                   @  s$   e Zd Zdd Zdd Zdd ZdS )UcCleanupManagerc                 C  s
   i | _ d S re   )_refsrl   r&   r&   r'   rh     s    zUcCleanupManager.__init__c                 C  s.   t || j}|j|_|j|_|| jt|< d S re   )r   
_finalizer_uch	__class___classr   id)rg   ru   refr&   r&   r'   register  s    zUcCleanupManager.registerc                 C  s   | j t|= |j|j d S re   )r   r   r   release_handler   )rg   r   r&   r&   r'   r     s    zUcCleanupManager._finalizerN)r<   r=   r>   rh   r   r   r&   r&   r&   r'   r     s   r   c                	   @  s  e Zd Ze ZdddddZeddddZdddddd
dddZd
dddZ	dddddddZ
dddddZddddZdddd Zddd!d"d#Zdd$d%d&d'Zd(d) Zd*d+ Zddd,d-d.d-d/d0d1Zejfdddd2d3d4Zddddd5d6d7Zddd!d8d9Zejfdddd2d:d;Zdd<d=d>Zed?d@ ZedAdB ZedCdD ZedEdF ZedGdH ZedIdJ Z edKdL Z!edMdN Z"edOdP Z#edQdR Z$edSdT Z%eddddUdVdWZ&ddXdYdZZ'd[d\ Z(d]d^ Z)d_d` Z*dadb Z+dcdd Z,dedf Z-dgdh Z.didj Z/dkdl Z0dmdn Z1ddodpdqZ2drds Z3dtdu Z4dvdodwdxZ5dydz Z6d{d| Z7d}d~ddZ8dd Z9ddoddZ:dddddZ;ddddZ<dd Z=dddd-dddddddZ>ddddZ?dd Z@ddddZAddddZBdd ZCdS )Ucint)r   modec                 C  s   t  \}}}|tjks |tjkr0d | _ttj|| | _| _t	
 | _t||t	| j}|tjkrvd | _t|i | _g | _d| _| j|  d | _d S Nr   )rG   ru   rv   rw   r   rd   ZUC_ERR_VERSION_arch_moder   c_void_prj   rI   ro   r   
_callbacks
_ctype_cbs_callback_count_cleanupr   r   )rg   r   r   rq   rr   	_combinedr   r&   r&   r'   rh     s    


zUc.__init__zctypes.CDLL)uchc                 C  s6   | r2z t | }|tjkr"t|W n   Y nX d S re   )rj   rJ   ru   r   rd   )r   r   r&   r&   r'   r     s    

zUc.release_handler   None)r9   untiltimeoutcountreturnc                 C  s@   d | _ t| j||||}|tjkr,t|| j d k	r<| j d S re   )r   rj   rP   r   ru   r   rd   )rg   r9   r   r   r   r   r&   r&   r'   	emu_start  s    

zUc.emu_start)r   c                 C  s"   t | j}|tjkrt|d S re   )rj   rQ   r   ru   r   rd   )rg   r   r&   r&   r'   r   )  s    
zUc.emu_stopNz&Union[None, int, ARMCPReg, ARM64CPReg]zUnion[int, X86MMRReg, X86FPReg])r   r   r   c                 C  s   t ttj| j| j||S re   )r   	functoolspartialrj   rL   r   r   rg   r   r   r&   r&   r'   r   /  s    zUc.reg_readz?Union[int, ARMCPRegValue, ARM64CPRegValue, X86MMRReg, X86FPReg])r   rp   c                 C  s   t ttj| j| j||S re   )r   r   r   rj   rM   r   r   rg   r   rp   r&   r&   r'   r   3  s    zUc.reg_write)msr_idc                 C  s   |  tj|S re   )r   r   r   )rg   r   r&   r&   r'   msr_read7  s    zUc.msr_read)rp   c                 C  s   |  tj||fS re   )r   r   r   )rg   r   rp   r&   r&   r'   	msr_write;  s    zUc.msr_write)addressrC   c                 C  s6   t |}t| j|||}|tjkr.t|t|S re   )	r   create_string_bufferrj   rN   r   ru   r   rd   	bytearray)rg   r   rC   datar   r&   r&   r'   mem_read?  s
    

zUc.mem_readbytes)r   r   c                 C  s,   t | j||t|}|tjkr(t|d S re   )rj   rO   r   r   ru   r   rd   )rg   r   r   r   r&   r&   r'   	mem_writeG  s    
zUc.mem_writec                 C  s   | j | \}}|| |||S re   r   )rg   handleoffsetrC   	user_datacbr   r&   r&   r'   _mmio_map_read_cbL  s    zUc._mmio_map_read_cbc                 C  s"   | j | \}}|| |||| d S re   r   )rg   r   r   rC   rp   r   r   r   r&   r&   r'   _mmio_map_write_cbP  s    zUc._mmio_map_write_cbUC_MMIO_READ_TYPEr   UC_MMIO_WRITE_TYPE)r   rC   read_cbuser_data_readwrite_cbuser_data_writec              	   C  s   t t| jt}t t| jt}|  jd7  _||f| j| j< | j}	|  jd7  _||f| j| j< | j}
t	| j
||||	||
}|tjkrt|| j| | j| d S Nr   )r   castUC_MMIO_READ_CBr   UC_MMIO_WRITE_CBr   r   r   rj   rS   r   ru   r   rd   r   append)rg   r   rC   r  r  r  r  Zinternal_read_cbZinternal_write_cbZ
read_countZwrite_countr   r&   r&   r'   mmio_mapT  s    
zUc.mmio_map)r   rC   r;   c                 C  s(   t | j|||}|tjkr$t|d S re   )rj   rT   r   ru   r   rd   rg   r   rC   r;   r   r&   r&   r'   mem_mapj  s    
z
Uc.mem_map)r   rC   r;   ptrc                 C  s*   t | j||||}|tjkr&t|d S re   )rj   rU   r   ru   r   rd   )rg   r   rC   r;   r  r   r&   r&   r'   mem_map_ptrp  s    
zUc.mem_map_ptrc                 C  s&   t | j||}|tjkr"t|d S re   )rj   rV   r   ru   r   rd   )rg   r   rC   r   r&   r&   r'   	mem_unmapv  s    
zUc.mem_unmapc                 C  s(   t | j|||}|tjkr$t|d S re   )rj   rW   r   ru   r   rd   r  r&   r&   r'   mem_protect|  s    
zUc.mem_protect)
query_modec                 C  s8   t d}t| j|t |}|tjkr2t||j	S r   )
r   c_size_trj   rX   r   ro   ru   r   rd   rp   )rg   r  resultr   r&   r&   r'   ry     s
    

zUc.queryc                 C  s"   | j | \}}|| |||| d S re   r   )rg   r   r   arg1arg2r   r   r   r&   r&   r'   _hook_tcg_op_cb  s    zUc._hook_tcg_op_cbc                 C  s$   | j | \}}|| |j|j| d S re   )r   contents)rg   r   curprevr   r   r   r&   r&   r'   _hook_edge_gen_cb  s    zUc._hook_edge_gen_cbc                 C  s    | j | \}}|| ||| d S re   r   )rg   r   r   rC   r   r   r   r&   r&   r'   _hookcode_cb  s    zUc._hookcode_cbc           	      C  s    | j | \}}|| |||||S re   r   	rg   r   accessr   rC   rp   r   r   r   r&   r&   r'   _hook_mem_invalid_cb  s    zUc._hook_mem_invalid_cbc           	      C  s$   | j | \}}|| ||||| d S re   r   r  r&   r&   r'   _hook_mem_access_cb  s    zUc._hook_mem_access_cbc                 C  s   | j | \}}|| || d S re   r   )rg   r   Zintnor   r   r   r&   r&   r'   _hook_intr_cb  s    zUc._hook_intr_cbc                 C  s   | j | \}}|| |S re   r   rg   r   r   r   r   r&   r&   r'   _hook_insn_invalid_cb  s    zUc._hook_insn_invalid_cbc                 C  s   | j | \}}|| |||S re   r   )rg   r   portrC   r   r   r   r&   r&   r'   _hook_insn_in_cb  s    zUc._hook_insn_in_cbc           	   
   C  s`   t |t tj}tdddddddg}| j| \}}|| |||j|j|j	|j
|j|j|S )Nuc_arm64_cp_reg_tupler   r   r   r   r   r   )r   r  POINTERr   r  r
   r   r   r   r   r   r   r   )	rg   r   r   Zpcp_regr   Zcp_regr&  r   r   r&   r&   r'   _hook_insn_sys_cb  s    zUc._hook_insn_sys_cbc                 C  s"   | j | \}}|| |||| d S re   r   )rg   r   r$  rC   rp   r   r   r   r&   r&   r'   _hook_insn_out_cb  s    zUc._hook_insn_out_cbc                 C  s   | j | \}}|| | d S re   r   r"  r&   r&   r'   _hook_insn_syscall_cb  s    zUc._hook_insn_syscall_cb)r   r   r   c                 C  s   | j | \}}|| |S re   r   r"  r&   r&   r'   _hook_insn_cpuid_cb  s    zUc._hook_insn_cpuid_cb)controlc                 G  s*   t j| j|f| }|tjkr&t||S re   )rj   rc   r   ru   r   rd   )rg   r,  r   r   r&   r&   r'   ctl  s    
zUc.ctlc                 C  s   ||d> B |d> B S )N      r&   )rg   r-  nrrwr&   r&   r'   Z__ctl  s    zUc.__ctlc                 C  s   |  ||tjS re   )_Uc__ctlru   ZUC_CTL_IO_READrg   r-  r0  r&   r&   r'   Z__ctl_r  s    z
Uc.__ctl_rc                 C  s   |  ||tjS re   )r2  ru   ZUC_CTL_IO_WRITEr3  r&   r&   r'   Z__ctl_w  s    z
Uc.__ctl_wc                 C  s   |  ||tjS re   )r2  ru   ZUC_CTL_IO_READ_WRITEr3  r&   r&   r'   Z__ctl_rw  s    zUc.__ctl_rwc                 C  s&   | }|  | |dt| |jS r  )r-  
_Uc__ctl_rr   ro   rp   )rg   r-  ctpargr&   r&   r'   Z__ctl_r_1_arg  s    zUc.__ctl_r_1_argc                 C  s    ||}|  | |d| d S r  r-  
_Uc__ctl_w)rg   r-  r   r5  r6  r&   r&   r'   Z__ctl_w_1_arg  s    zUc.__ctl_w_1_argc                 C  s*   ||}||}|  | |d|| d S Nr   r7  )rg   r-  Zval1Zval2ctp1ctp2r  r  r&   r&   r'   Z__ctl_w_2_arg  s    zUc.__ctl_w_2_argc                 C  s.   ||}| }|  | |d|t| |S r9  )r-  _Uc__ctl_rwr   ro   )rg   r-  r   r:  r;  r  r  r&   r&   r'   Z__ctl_rw_1_1_arg  s    zUc.__ctl_rw_1_1_argc                 C  s   |  tjtjS re   )_Uc__ctl_r_1_argru   ZUC_CTL_UC_MODEr   rn   rl   r&   r&   r'   ctl_get_mode  s    zUc.ctl_get_modec                 C  s   |  tjtjS re   )r=  ru   UC_CTL_UC_PAGE_SIZEr   r@   rl   r&   r&   r'   ctl_get_page_size  s    zUc.ctl_get_page_size)r   c                 C  s   |  tj|tj d S re   )_Uc__ctl_w_1_argru   r?  r   r@   rg   r   r&   r&   r'   ctl_set_page_size  s    zUc.ctl_set_page_sizec                 C  s   |  tjtjS re   )r=  ru   ZUC_CTL_UC_ARCHr   rn   rl   r&   r&   r'   ctl_get_arch  s    zUc.ctl_get_archc                 C  s   |  tjtjS re   )r=  ru   ZUC_CTL_UC_TIMEOUTr   r?   rl   r&   r&   r'   ctl_get_timeout  s    zUc.ctl_get_timeoutboolc                 C  s   |  tj|tj d S re   )rA  ru   ZUC_CTL_UC_USE_EXITSr   rn   rB  r&   r&   r'   ctl_exits_enabled  s    zUc.ctl_exits_enabledc                 C  s   |  tjtjS re   )r=  ru   ZUC_CTL_UC_EXITS_CNTr   r  rl   r&   r&   r'   ctl_get_exits_cnt  s    zUc.ctl_get_exits_cntc                 C  sJ   |   }tj|  }| | tjdt|tjt	| dd |D S )Nr   c                 S  s   g | ]}|qS r&   r&   ).0ir&   r&   r'   
<listcomp>  s     z$Uc.ctl_get_exits.<locals>.<listcomp>)
rH  r   r?   r-  r4  ru   UC_CTL_UC_EXITSr  r   r  )rg   larrr&   r&   r'   ctl_get_exits  s    (zUc.ctl_get_exitsz	List[int])exitsc                 C  sZ   t jt|  }t|D ]\}}|||< q| | tjdt |t j	t 
t| d S r9  )r   r?   r   	enumerater-  r8  ru   rL  r  r   r  )rg   rP  rN  idxexitr&   r&   r'   ctl_set_exits  s    
zUc.ctl_set_exitsc                 C  s   |  tjtjS re   )r=  ru   UC_CTL_CPU_MODELr   rn   rl   r&   r&   r'   ctl_get_cpu_model  s    zUc.ctl_get_cpu_modelc                 C  s   |  tj|tj d S re   )rA  ru   rU  r   rn   rB  r&   r&   r'   ctl_set_cpu_model  s    zUc.ctl_set_cpu_model)addrr:   c                 C  s   |  tj||tjtj d S re   )_Uc__ctl_w_2_argru   ZUC_CTL_TB_REMOVE_CACHEr   r?   )rg   rX  r:   r&   r&   r'   ctl_remove_cache   s    zUc.ctl_remove_cache)rX  c                 C  s   |  tj|tjtS re   )_Uc__ctl_rw_1_1_argru   ZUC_CTL_TB_REQUEST_CACHEr   r?   rB   )rg   rX  r&   r&   r'   ctl_request_cache#  s    zUc.ctl_request_cachec                 C  s   |  | tjd d S r   )r-  r8  ru   ZUC_CTL_TB_FLUSHrl   r&   r&   r'   ctl_flush_tb&  s    zUc.ctl_flush_tbr   UC_HOOK_CALLBACK_TYPE)htypecallbackr   r9   r:   r  r  c                 C  s  t  }|  jd7  _||f| j| j< d }	|tjkrt|}
|tjkrZt	t
| jt
}	|tjkrvt	t| jt}	|tjtjfkrt	t| jt}	|tjkrt	t| jt}	|tjtjtjtjfkrt	t| jt}	t| jt |||	t	| jtj!t"|t"||
}n|tj#krt|}t|}t| jt ||t	t$| j%t$t	| jtj!t"|t"|||	}n |tj&krt	t'| j(t'}	t| jt |||	t	| jtj!t"|t"|}n|tj)kr6t	t*| j+t*}	t| jt |||	t	| jtj!t"|t"|}np|tj,krt	t-| j.t-}	t| jt |||	t	| jtj!t"|t"|}n|tj/tj0fkrt	t1| j2t1}	t| jt |||	t	| jtj!t"|t"|}n|tj3tj4B tj5B tj6B tj7B tj8B @ r^t	t9| j:t9}	t| jt |||	t	| jtj!t"|t"|}nHt	t;| j<t;}	t| jt |||	t	| jtj!t"|t"|}| j=>|	 |tj?krt@||jAS r  )B	uc_hook_hr   r   ru   ZUC_HOOK_INSNr   rn   r   ZUC_X86_INS_INr  UC_HOOK_INSN_IN_CBr%  ZUC_X86_INS_OUTUC_HOOK_INSN_OUT_CBr)  ZUC_X86_INS_SYSCALLZUC_X86_INS_SYSENTERUC_HOOK_INSN_SYSCALL_CBr*  ZUC_X86_INS_CPUIDUC_HOOK_INSN_CPUID_CBr+  r   ZUC_ARM64_INS_MRSZUC_ARM64_INS_MSRZUC_ARM64_INS_SYSZUC_ARM64_INS_SYSLUC_HOOK_INSN_SYS_CBr(  rj   rb   r   ro   r   r?   ZUC_HOOK_TCG_OPCODEUC_HOOK_TCG_OPCODE_CBr  ZUC_HOOK_INTRUC_HOOK_INTR_CBr!  ZUC_HOOK_INSN_INVALIDUC_HOOK_INSN_INVALID_CBr#  ZUC_HOOK_EDGE_GENERATEDUC_HOOK_EDGE_GEN_CBr  ZUC_HOOK_BLOCKZUC_HOOK_CODEUC_HOOK_CODE_CBr  ZUC_HOOK_MEM_READ_UNMAPPEDZUC_HOOK_MEM_WRITE_UNMAPPEDZUC_HOOK_MEM_FETCH_UNMAPPEDZUC_HOOK_MEM_READ_PROTZUC_HOOK_MEM_WRITE_PROTZUC_HOOK_MEM_FETCH_PROTUC_HOOK_MEM_INVALID_CBr  UC_HOOK_MEM_ACCESS_CBr   r   r
  r   rd   rp   )rg   r_  r`  r   r9   r:   r  r  Z_h2r   Zinsnr   opcoder   r&   r&   r'   hook_add*  s    



     

                              zUc.hook_add)hc                 C  s0   t |}t| j|}|tjkr(t|d}d S r   )ra  rj   rR   r   ru   r   rd   )rg   rp  _hr   r&   r&   r'   hook_del  s
    
zUc.hook_delc                 C  s8   t | j| j| j}t| j|j}|tjkr4t	||S re   )
	UcContextr   r   r   rj   r[   contextru   r   rd   rg   rt  r   r&   r&   r'   context_save  s
    
zUc.context_savers  )rt  c                 C  s&   t | j|j}|tjkr"t|d S re   )rj   r[   r   rt  ru   r   rd   ru  r&   r&   r'   context_update  s    
zUc.context_updatec                 C  s&   t | j|j}|tjkr"t|d S re   )rj   r\   r   rt  ru   r   rd   ru  r&   r&   r'   context_restore  s    
zUc.context_restorec              	   c  s   t t }t  }t| jt |t |}|tj	krBt
|z2t|jD ]"}|| j|| j|| jfV  qNW 5 t| X d S re   )r   r'  r8   r@   rj   ra   r   ro   ru   r   rd   rZ   r   rp   r9   r:   r;   )rg   Zregionsr   r   rJ  r&   r&   r'   mem_regions  s    
$zUc.mem_regions)r   r   )N)Nr   r   r   r   )Dr<   r=   r>   r   r   rh   staticmethodr   r   r   r   r   r   r   r   r   r   r   r  ru   ZUC_PROT_ALLr  r  r  r  ry   r   r  r  r  r  r   r!  r#  r%  r(  r)  r*  r+  r-  r2  r4  r8  r<  r=  rA  rY  r[  r>  r@  rC  rD  rE  rG  rH  rO  rT  rV  rW  rZ  r\  r]  ro  rr  rv  rw  rx  ry  r&   r&   r&   r'   r     s   










	

^r   c                   @  sv   e Zd Zdd Zedd Zedd Zedd Zed	d
 ZdddZ	dd Z
dd Zdd Zdd Zdd ZdS )rs  c                 C  sP   t  | _t|| _d| _t|t| j}|t	j
kr@t||| _|| _d S )NT)
uc_context_contextrj   r]   _size_to_freerY   r   ro   ru   r   rd   r   r   )rg   rp  r   r   r   r&   r&   r'   rh     s    
zUcContext.__init__c                 C  s   | j S re   )r|  rl   r&   r&   r'   rt    s    zUcContext.contextc                 C  s   | j S re   )r}  rl   r&   r&   r'   rC     s    zUcContext.sizec                 C  s   | j S re   )r   rl   r&   r&   r'   r     s    zUcContext.archc                 C  s   | j S re   )r   rl   r&   r&   r'   r     s    zUcContext.modeNc                 C  s   t ttj| j| j||S re   )r   r   r   rj   r^   r|  r   r   r&   r&   r'   r     s    zUcContext.reg_readc                 C  s   t ttj| j| j||S re   )r   r   r   rj   r_   r|  r   r   r&   r&   r'   r     s    zUcContext.reg_writec                 C  s   t | | j| j| jfS re   )r   rC   r   r   rl   r&   r&   r'   __getstate__  s    zUcContext.__getstate__c                 C  sD   |d | _ tt|d | j t| _d| _|d | _|d | _d S )Nr   r   Fr   r   )	r}  r   r  r   r{  r|  r~  r   r   )rg   stater&   r&   r'   __setstate__  s
    

zUcContext.__setstate__c                 C  s   t | j| jS re   )r   Z	string_atrt  rC   rl   r&   r&   r'   	__bytes__  s    zUcContext.__bytes__c                 C  s   | j rt| j d S re   )r~  rj   r`   r|  rl   r&   r&   r'   __del__  s    zUcContext.__del__)N)r<   r=   r>   rh   propertyrt  rC   r   r   r   r   r  r  r  r  r&   r&   r&   r'   rs    s   





rs  c               	   C  sz   t jt jt jt jt jt jt jt jd} d}| 	 }t
|D ]}t| | r:|d| 7 }q:t \}}}d|||t jt jf S )N)armarm64mipsZsparcZm68kx86Zriscvppcr*   z-%szpython-%s-c%u.%u-b%u.%u)ru   r   r   ZUC_ARCH_MIPSZUC_ARCH_SPARCZUC_ARCH_M68Kr   ZUC_ARCH_RISCVZUC_ARCH_PPCkeyssortedrH   rG   rv   rw   )ZarchsZ	all_archsr  krq   rr   r   r&   r&   r'   debug  s,        r  )N)
__future__r   r   ctypes.utildistutils.sysconfig	distutilsr   r   typingr   r   r   r   r	   pkg_resourcesinspectos.pathr   r+   weakrefcollectionsr
   r*   r   r   r   r   ru   hasattrmodulesr<   getfilecurrentframer   version_infoZ_python2xranger   Z_libr   setr   r(   r,   r-   rj   getenvresource_filenamer   r   split	sysconfigget_python_libZ
_path_list_pathgetprintstderrr5   ZUC_VERSION_MAJORZUC_VERSION_MINORZUC_VERSION_PATCH__version__r7   rn   ZucerrZuc_modeZuc_archr   Z	uc_enginer{  r  ra  Z	Structurer8   rB   Zc_uintr'  Zc_boolc_char_pr?   Zc_charr@   Z	CFUNCTYPErk  ri  Zc_int64rl  rm  rh  rb  rc  rd  rf  re  r  r	  rj  rg  r   rd   rG   rx   rH   r   ZARMCPRegZ
ARM64CPRegZARMCPRegValueZARM64CPRegValueZ	X86MMRRegZX86FPRegr   r   r   r   r   r   r   r   r   r   r   r   r   objectr   r   rs  ZUC_HOOK_CODE_TYPErF  ZUC_HOOK_INSN_INVALID_TYPEZUC_HOOK_MEM_INVALID_TYPEZUC_HOOK_MEM_ACCESS_TYPEZUC_HOOK_INTR_TYPEZUC_HOOK_INSN_IN_TYPEZUC_HOOK_INSN_OUT_TYPEZUC_HOOK_INSN_SYSCALL_TYPEZUC_HOOK_INSN_SYS_TYPEZUC_HOOK_INSN_CPUID_TYPEr   r  ZUC_HOOK_EDGE_GEN_TYPEZUC_HOOK_TCG_OPCODE_TYPEr^  r  r&   r&   r&   r'   <module>   s  




 







"  &&*                                       	
H:		   97$