|i+ dZddlmZdZddlZddlZddlZddlZddlZej dkrej dej ej ej eZej ej edZeej vrej dedd lmZdd lmZdd lmZd ezZejd ejdejdejdej dej!diZ"ejdejdejdejdej dej!diZ#ddddZ$dZ%dZ&dZ'e(dkr e'dSdS)a_ oledir.py oledir parses OLE files to display technical information about their directory entries, including deleted/orphan streams/storages and unused entries. Author: Philippe Lagadec - http://www.decalage.info License: BSD, see source code or documentation oledir is part of the python-oletools package: http://www.decalage.info/python/oletools )print_functionz0.54NntT) auto_colorsz..) tablestream)xglob) KNOWN_CLSIDSz0oledir %s - http://decalage.info/python/oletoolsEmptyStorageStream ILockBytesIPropertyStorageRootgreencyanyellowmagentared)unusedORPHANc*|tjkrdS|S)N-)olefileNOSTREAM)sids =C:\PYTHON\_runtimes\venv\Lib\site-packages\oletools/oledir.py sid_displayrys gs cz|}|tvr|dt|zz }d}d|vrd}||fS)Nz %srCVEr)upperr)clsid clsid_uppercolors r clsid_displayr%sK++--Kl"" ,{333 E ~~ 5>rc d}tj|}|dddd|dd d d dd |dddd dd |\}}t |dkrOt t t t|tj t t tj dkr!tjddt!j||j|j|jD]\}}}|r|dr|r|d|n|}t d|z|t-j|}nt-j|}t1jgddt0j} t7t |jD]J} |j| } | 0|| } | jt,jkrd} nd} nd } | j d!rd"} ntC| j d#d$} tE| j#}tE| j$}tE| j%}tL'| jd%}tP'| jd&}tR'| d&}| *| | || |||d'| j+z| j,f d||ddddddf (Lt1jgd)d*t0j} |-}d}|j.j/}ta|\}}| *||d+|fdd,d|f(tc|2d-D]}|d$} tC| d#d$} d}|3|t,j4t,j5fvrd,}d.t |d#z z| z}|6|} |7|}n #d+}YnxYw|8|}ta|\}}| *||||fd|d|f(|9dS)/Nz2usage: oledir [options] [filename2 ...])usagez-r store_true recursivez)find files recursively in subdirectories.)actiondesthelpz-zz--zip zip_passwordstrzhif the file is a zip archive, open all files from it, using the provided password (requires Python 2.6+))r+typedefaultr,z-fz --zipfname zip_fname*zoif the file is a zip archive, file(s) to be opened within the zip. Wildcards * and ? are supported. (default:*)rrT)r reset_atexit)r)r-r1/z in z!OLE directory entries in file %s:) r9r9r6) idStatusTypeNameLeftRightChildz1st SectSize) column_width header_rowstylerrrUnknownrz%X)colors)r5r6&)r;r>rBCLSIDrr)storagesz ):optparse OptionParser add_option parse_argslenprintBANNER__doc__ print_helpsysexitosname colorclassWindowsenabler iter_filesr)r-r1endswithr OleFileIOr TableStreamTableStyleSlimrange direntries_load_direntry entry_type STGTY_EMPTY startswithreprrsid_left sid_right sid_child STORAGE_NAMESgetSTORAGE_COLORS STATUS_COLORS write_row isectStartsizeget_rootentry_namerootr"r%sortedlistdirget_type STGTY_STORAGE STGTY_ROOT_findget_sizegetclsidclose)r'parseroptionsargs containerfilenamedata full_nameoletabler;dstatusr\leftrightchildrh etype_color status_colorrootnameentry_idr" clsid_text clsid_colorentry name_color indented_namerus rmainrs] @E  " / / /F d>>  #D))CC#H--C'5Q5Q5Qe,...CN++,, ^ ^Br"Ay&&r**<7#666%FF%FF"v  (( *AF||AbD) ++D ,,E ,,E&**1<CCJ(,,Q\5AAK(,,VU;;L OORT4tVWVbObdedjklKtT4QUW[\  ^ ^ ^ ^'^^^6,...))++"/"6"6 K 8S*= $fdK@  B B BCKKK6677 J JE9D::ad#DJ||E""w'P&QQQ#  #e**Q,/$6Myy''H ||E** LL''E&3E&:&: #J OOX}dJG$(*dK#H  J J J J Caas Q22Q8__main__))rW __future__r __version__rYr[rPrr]r\r^r_pathnormpathabspathdirname__file___thismodule_dirjoin _parent_dirinsertoletools.thirdparty.tablestreamroletools.thirdparty.xglobroletools.common.clsidrrVrir{ STGTY_STREAMSTGTY_LOCKBYTESSTGTY_PROPERTYr|rorqrrrr%r__name__rrrs)  L&%%%%%  7d??$///'""27??27??83L3L#M#MNNgrw||OTBBCC chHOOA{###777777++++++......