
    j                        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 d dl	m
Z
mZmZ d dlmZ d dlmZ d dlmZ ddZ	 	 d d!dZ	 d d"dZ	 	 	 d#d$dZdS )%    )annotationsN)Union)logger)	androconfapkdex)Analysis)
decompiler)Sessionreturnr   c                     t           j        d         t                      t           j        d<   t           j        d         S )z
    Return the default [Session][androguard.session.Session] from the configuration
    or create a new one, if the session in the configuration is `None`.

    :returns: `androguard.session.Session` object
    SESSION)r   CONFr        V/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/androguard/misc.pyget_default_sessionr      s.     ~i ($+II	y!>)$$r   F_fileUnion[str, bytes]sessionUnion[Session, None]rawbool'tuple[apk.APK, list[dex.DEX], Analysis]c                n   t          j        d           |rt          j        d                    |                     |r)| }t          j        |                                           }n>t          | d          5 }|                                }| }ddd           n# 1 swxY w Y   |                    ||          }|	                    ||          S t          j        d           t          j        | |          }g }t                      }	|                                D ]|}
t          j        |
|                                          }|	                    |           |                    |           |                    t'          j        ||	                     }|	                                 |||	fS )a  
    Analyze an android application and setup all stuff for a more quickly
    analysis!
    If session is `None`, no session is used at all. This is the default
    behaviour.
    If you like to continue your work later, it might be a good idea to use a
    session.
    A default session can be created by using [get_default_session][androguard.misc.get_default_session].

    :param _file: the filename of the android application or a buffer which represents the application
    :param session: A session (default: None)
    :param raw: boolean if raw bytes are supplied instead of a filename
    :returns: the `androguard.core.apk.APK`, list of `androguard.core.dex.DEX`, and `androguard.core.analysis.analysis.Analysis` objects
    
AnalyzeAPKzUsing existing session {}rbNzAnalysing without session)r   )	using_api)r   debugformathashlibmd5	hexdigestopenreadaddget_objects_apkr   APKr	   get_all_dexr   DEXget_target_sdk_versionappendset_decompilerr
   DecompilerDADcreate_xref)r   r   r   datafilenamefddigestaddx	dex_bytesdfs               r   r   r      s   & L 077@@AAA 	!D{5))3355HHeT"" !bwwyy ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! Xt,,&&x8880111GEs### ZZ 	@ 	@Ia.F.F.H.HIIIBFF2JJJHHRLLLj6r2>>????
!Rxs   9BB #B r1   strtuple[str, dex.DEX, Analysis]c                    t          j        d           |st                      }|r| }n<t          | d          5 }|                                }ddd           n# 1 swxY w Y   |                    | |          S )a  
    Analyze an android dex file and setup all stuff for a more quickly analysis !

    :param filename: the filename of the android dex file or a buffer which represents the dex file
    :param session: A session (Default `None`)
    :param raw: If set, `filenam`` will be used as the odex's data (bytes). Defaults to `False`

    :returns: a tuple of (sha256hash, `DEX`, `Analysis`)
    
AnalyzeDexr   N)r   r   r   r$   r%   addDEX)r1   r   r   r0   r2   s        r   r<   r<   S   s     L (%''
 (D!! 	R7799D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 >>(D)))s   AA"AT_uniquereplaceforce_ntc                
   t          j        d|          rt          d          t          j                            |           \  }}t          j        d|          r||z  }t          j        d||          }t          j        d||          }d}t          |          |k    rYd|v rK|                    dd          \  }}d		                    |d
|t          |          dz   z
           |          }n
|d
|         }|st          j
        dk    rt          t          j                            t          j                            ||                              dk    r:|d
dt          t          j                            |                    dz   z
           }|rd}	|}
t          j                            t          j                            ||                    rd|v r1|
                    dd          \  }}d	                    ||	|          }nd	                    |
|	          }|	dz  }	t          j                            t          j                            ||                    t          j                            ||          S )a!  
    Return a filename version, which has no characters in it which are forbidden.
    On Windows these are for example <, /, ?, ...

    The intention of this function is to allow distribution of files to different OSes.

    :param filename: string to clean
    :param unique: check if the filename is already taken and append an integer to be unique (default: `True`)
    :param replace: replacement character. (default: '_')
    :param force_nt: Force shortening of paths like on NT systems (default: `False`)
    :returns: clean string
    z[<>:"/\\|?* .\x00-\x1f]z%replacement character is not allowed!z#(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])z[<>:"/\\|?*\x00-\x1f]z[ .]$   .   z{}.{}Nnt   r   z{}_{}.{}z{}_{})rematch
ValueErrorospathsplitsublenrsplitr    nameabspathjoinisfile)r1   r?   r@   rA   rL   fnamePATH_MAX_LENGTHfextcounterorignames              r   clean_file_namer[      sD   & 
x*G44 B@AAA'--))KD%
 
x6>>  F+We<<EF8We,,E O
5zzO##%<<\\#q))FAsNN1%G#c((Q,'G%G#H#NNEE*?*+E D27d?? rwrw||D%8899::S@@BC3rwt'<'<#=#=#ABBCE 
gnnRW\\$6677 	e||!a003"))!Wc::x99qLG gnnRW\\$6677 	 7<<e$$$r   )r   r   )NF)r   r   r   r   r   r   r   r   )r1   r9   r   r   r   r   r   r:   )Tr>   F)
r1   r9   r?   r   r@   r9   rA   r   r   r9   )
__future__r   r!   rK   rH   typingr   logurur   androguard.corer   r   r   !androguard.core.analysis.analysisr	   androguard.decompilerr
   androguard.sessionr   r   r   r<   r[   r   r   r   <module>rc      s6   # " " " " "  				 				             / / / / / / / / / / 6 6 6 6 6 6 , , , , , , & & & & & &	% 	% 	% 	% %)1 1 1 1 1j 9>* * * * *j 	D% D% D% D% D% D% D%r   