
    9c.                         d dl Z d dlZd dlZd dlZd dlZd dl d dlmZm	Z	m
Z
 	 d dlmZ  G d de      Zy# e$ r d ZY w xY w)    N)*)ModuleOptionKwarg)njitc                     | S N )funcs    9/usr/lib/python3/dist-packages/binwalk/modules/entropy.pyr   r      s        c                   
   e Zd ZdZd ZdZdZdZdZg dZ	dZ
dZdZd	Zd Zd
Z eddddid       eddddid       eddddid       eddddid       eddddid        ed!d"ed#eid$ez  %       ed&d'ed(eid)ez  %      gZ edd*       edd*       ed#e*       ed(e*       edd*       ed+d*       edd*       edd*       ed,d-*      g	Zd-Zd. Zd/ Zd0 Zd1 Zd2 Zd3 Zd4 Zeed5               Zd9d6Z d7 Z!y8):EntropyOffsetBEi   png)grcmyi   gffffff?g333333?   entropyenabledTzCalculate file entropy)shortlongkwargsdescriptionFfastuse_zlibz/Use faster, but less detailed, entropy analysisJsave	save_plotzSave plot as a PNGQnlegendshow_legendFz+Omit the legend from the entropy plot graphNnplotdo_plotz%Do not generate an entropy plot graphHhightrigger_highz=Set the rising edge entropy trigger threshold (default: %.2f))r   r   typer   r   Llowtrigger_lowz>Set the falling edge entropy trigger threshold (default: %.2f))namedefaultdisplay_results
block_sizer   c                    d| j                   d<   d| _        i | _        d | _        | j                  r| j
                  | _        n5dt        j                  v r| j                  | _        n| j                  | _        t        | j                        D ]  \  }}|j                  D ]  }|j                  s|j                  s|j                  s*|j                  j!                  d      d   }t#        | j                  |j                  j$                        s#g | j                  |j                  j$                  <   t'        |      | j                  kD  rt'        |      | _        | j                  |j                  j$                     j)                  |j*                  |f         | j                  rd| _        | j.                  s:| j0                  j2                  r| j0                  j2                  | _        y d | _        y y )NENTROPYr   numpy,F)HEADERmax_description_lengthfile_markersoutput_filer"   gzip	algorithmsysmodulesshannon_numpyshannoniteratorresultsplotfiler   splithas_keyr3   lenappendoffsetr5   r6   configblock)selfmoduleobjresultr   s        r   initzEntropy.init]   s   #B&'#==!YYDN#++%!%!3!3!% &dll3 	]MVS++ 
];;6;;63E3E"("4"4":":3"?"BK"4#4#4fkk6F6FG>@))&++*:*:;;'$*E*EE69+6F3%%fkk&6&67>>{?[\
]	] #(D {{  "&++"3"3"&	 r   c                     t        d       y )NzFuck it all.)print)rQ   argss     r   _entropy_sigterm_handlerz Entropy._entropy_sigterm_handler   s
    ~r   c                 $    | j                          y r	   )_run)rQ   s    r   runzEntropy.run   s    		r   c                    | j                   r(	 | j                  rdd l}|j                  d       dd lm} t        | j                  d       D ]L  }| j                  r| j                          | j                  |       | j                  s=| j!                          N y # t        $ r:}t        j                  j                  j                  d       d| _         Y d }~d }~ww xY w)Nr   AggzLFailed to import matplotlib module, visual entropy graphing will be disabledF)r+   r%   
matplotlibusematplotlib.pyplotpyplotImportErrorbinwalkcorecommonwarningiter	next_filer5   headercalculate_file_entropyfooter)rQ   mplpltefps        r   r[   zEntropy._run   s    <<
% >>,GGEN/
 t~~t, 	B##''+##		  %##++,z{$%s   'B 	C$0CCc                    d }d}| j                  d       | j                  B|j                  | j                  z  }t	        || j
                  |z
  | j
                  z  z         }n| j                  }|dk  r| j
                  }t        j                  j                  j                  d| j                  |fz         	 |j                         }|j                         \  }}|dk  rnd}||k  r| j                  ||||z          }	| j                  }
d|	z  }| j                  j                  s|dv r|	| j                   kD  rd}n|dv r|	| j"                  k  rd}|r%|	| j"                  k\  rd	|	z  }| j                  }
d}d
}n.|r%|	| j                   k  rd|	z  }| j                  }
d}d
}nd
}
d|	z  }| j%                  ||z   ||	||
      }||z  }||k  r| j&                  r| j)                  |j*                         y y )NT)rG   r   z'Entropy block size (%d data points): %d   z%fNr   )Nrr   zRising entropy edge (%f)FzFalling entropy edge (%f))rN   rI   r   r   display)clearr6   sizeDEFAULT_DATA_POINTSintDEFAULT_BLOCK_SIZErd   re   rf   debugtell
read_blockrA   r5   rO   verboser2   r.   rT   r+   plot_entropyr3   )rQ   rp   	last_edgetrigger_resetr6   file_offsetdatadlenir   rt   r   r   s                r   rk   zEntropy.calculate_file_entropy   s!    	  	

4
  ??"4#;#;;JZD,C,Cj,PTXTkTk+klmJJ ?00J!!"K#'#;#;Z"H#I 	J '')K==?LT4axAd(..aJ)?@.."Wn{{** I-'D<L<L2L(,"i/Gd>O>O4O(,$D4E4E)E&@7&J"&"6"6$%	(-&7d6F6F+F&AG&K"&"6"6$%	(-"'&*WnKKa%'(/,7(/	   1 Z? d( R <<bgg& r   c                 $   d}|rt        |      }t        d t        dd      D              }|D ]  }||xx   dz  cc<    t        dd      D ]>  }t        |t	        |               |z  }|dkD  s#||t        j                  |d      z  z  }@ |dz  S )zO
        Performs a Shannon entropy analysis on a given block of data.
        r   c              3   6   K   | ]  }t        |      d f  yw)r   N)chr).0xs     r   	<genexpr>z"Entropy.shannon.<locals>.<genexpr>   s     <#a&!<s      rr      r   )rL   dictrangefloatr   mathlog)rQ   r   r   lengthseenbyter   p_xs           r   rE   zEntropy.shannon   s     YF<eAsm<=D  T
a
  1c] 6DQL)F27sTXXc1%555G6
 !r   c                 <    |r| j                  t        |            S yrs   )_shannon_numpy	bytes2str)rQ   r   s     r   rD   zEntropy.shannon_numpy   s    &&y77r   c                     t         j                  | t         j                        }t         j                  |      t	        |      z  }t         j                  |t         j                  |      z         }|dz  S )N)dtyper   )np
frombufferuint8bincountrL   nansumlog2)r   ApAr   s       r   r   zEntropy._shannon_numpy  sW     d"((3AQ#a&(ByyBGGBK00GaK r   c                     t        t        t        t        j                  t	        |      d                  t        t        |            z        }|r|dkD  rd}|S )z
        Performs an entropy analysis based on zlib compression ratio.
        This is faster than the shannon entropy analysis, but not as accurate.
        	   g      ?)r   rL   zlibcompress	str2bytes)rQ   r   truncatero   s       r   r@   zEntropy.gzip  sH     %DMM)D/1=>?%D	BRRSCAr   c                 H   	 dd l m} d}g }g }i }| j                  D ]8  }|j	                  |j
                         |j	                  |j                         : |j                         }		 |	j                  ddddd      }
|
j                  | j                         |
j                  | j                         |
j                  | j                         |
j!                  ||dd	       |
j!                  t#        |      d
z   dd	       |
j!                  t#        |      d
z   dd	       | j$                  rt'        | j(                  |      r| j(                  |   D ]i  \  }}t'        ||      r||   }d }n3| j*                  |   }|||<   |dz  }|t-        | j*                        k\  rd}|
j!                  ||gddgd|z  d|       k |
j/                  dd       | j0                  rut2        j4                  j7                  t3        j8                         t2        j4                  j;                  |            dz   | _        |	j?                  | j<                  d       y |jA                          y # t        $ r
}Y d }~y d }~ww xY w# t        $ r |	j                  ddddd      }
Y "w xY w)Nr   rr   Tblack)autoscale_on	facecolor)r   axisbgr   r   )lwgMbP?g?z%s-)r   labelzcenter left)rr   g      ?)locbbox_to_anchorz.pngtight)bbox_inches)!ra   rb   rc   rG   rM   rN   r   figureadd_subplotAttributeError	set_titleTITLE
set_xlabelXLABEL
set_ylabelYLABELrH   maxr(   rK   r>   COLORSrL   legendr%   ospathjoingetcwdbasenamer?   savefigshow)rQ   fnamern   ro   r   r   r   plotted_colorsr   figaxrN   r   colors                 r   r~   zEntropy.plot_entropy  sU   	+  	 AHHQXXHHQYY	  jjl
	MAqtwOB 	TZZ 
dkk"
dkk"
1ca  	#a&+*
#a&+a((9(95 A)-):):5)A \% >;7*;7E"&K KKNE27N;/FAC,,(1c(EEMa{[%\( II-IA>>!ww||BIIK9I9I%9PQTZZDKK((gK>HHJw  		&  	MAqtGLB	Ms#   I( (I> (	I;6I;>J! J!N)T)"__name__
__module____qualname__r   r   XUNITSYUNITS
FILE_WIDTHFILE_FORMATr   ry   rw   DEFAULT_TRIGGER_HIGHDEFAULT_TRIGGER_LOWr   ORDERr   r   CLIr   KWARGSPRIORITYrU   rY   r\   r[   rk   rE   rD   staticmethodr   r   r@   r~   r
   r   r   r   r      s   FFFFJK&FEE 	S $'3	5 	S!4(L	N 	S"D)/	1 	S$e,H	J 	S %(B	D 	S%';<Z]qq		s
 	S$&9:[^qq		s5CD 	9e,;.>+?@=*=>:u-$d39d+=$/<+
F H%'N2E'N( 	! 
 !>r   r   )r   rB   r   r   binwalk.core.commonrd   binwalk.core.compatbinwalk.core.moduler   r   r   numbar   rc   r   r
   r   r   <module>r      sK    
 
    ! 5 5
Cf C	  s   7 AA