diff --git a/deps.sh b/deps.sh index 2e9bd2b..3234e42 100755 --- a/deps.sh +++ b/deps.sh @@ -38,11 +38,11 @@ then else APT_CANDIDATES="git build-essential libqt4-opengl mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract cramfsprogs cramfsswap squashfs-tools zlib1g-dev liblzma-dev liblzo2-dev sleuthkit default-jdk lzop srecord" fi -PYTHON2_APT_CANDIDATES="python-crypto python-lzo python-lzma python-pip python-opengl python-qt4 python-qt4-gl python-numpy python-scipy" -PYTHON3_APT_CANDIDATES="python3-crypto python3-pip python3-opengl python3-pyqt4 python3-pyqt4.qtopengl python3-numpy python3-scipy" +PYTHON2_APT_CANDIDATES="python-crypto python-lzo python-lzma python-pip" +PYTHON3_APT_CANDIDATES="python3-crypto python3-pip" PYTHON3_YUM_CANDIDATES="" YUM_CANDIDATES="git gcc gcc-c++ make openssl-devel qtwebkit-devel qt-devel gzip bzip2 tar arj p7zip p7zip-plugins cabextract squashfs-tools zlib zlib-devel lzo lzo-devel xz xz-compat-libs xz-libs xz-devel xz-lzma-compat python-backports-lzma lzip pyliblzma perl-Compress-Raw-Lzma lzop srecord" -PYTHON2_YUM_CANDIDATES="python-pip python-opengl python-qt4 numpy python-numdisplay numpy-2f python-Bottleneck scipy" +PYTHON2_YUM_CANDIDATES="python-pip python-Bottleneck" APT_CANDIDATES="$APT_CANDIDATES $PYTHON2_APT_CANDIDATES" YUM_CANDIDATES="$YUM_CANDIDATES $PYTHON2_YUM_CANDIDATES" PIP_COMMANDS="pip" @@ -226,7 +226,7 @@ if [ $? -ne 0 ] echo "Package installation failed: $PKG_CANDIDATES" exit 1 fi -install_pip_package pyqtgraph +install_pip_package matplotlib install_pip_package capstone install_sasquatch install_yaffshiv diff --git a/src/binwalk/modules/entropy.py b/src/binwalk/modules/entropy.py index 58cf94b..f909f16 100644 --- a/src/binwalk/modules/entropy.py +++ b/src/binwalk/modules/entropy.py @@ -120,19 +120,15 @@ class Entropy(Module): print ("FUck it all.") def run(self): - # If generating a graphical plot, this function will never return, as it invokes - # pg.exit. Calling pg.exit is pretty much required, but pg.exit calls os._exit in - # order to work around QT cleanup issues. self._run() def _run(self): - # Sanity check and warning if pyqtgraph isn't found + # Sanity check and warning if matplotlib isn't found if self.do_plot: try: - import pyqtgraph as pg + import matplotlib.pyplot as plt except ImportError as e: - binwalk.core.common.warning( - "Failed to import pyqtgraph module, visual entropy graphing will be disabled") + binwalk.core.common.warning("Failed to import matplotlib module, visual entropy graphing will be disabled") self.do_plot = False for fp in iter(self.next_file, None): @@ -145,12 +141,6 @@ class Entropy(Module): if self.display_results: self.footer() - if self.do_plot: - if not self.save_plot: - from pyqtgraph.Qt import QtGui - QtGui.QApplication.instance().exec_() - pg.exit() - def calculate_file_entropy(self, fp): # Tracks the last displayed rising/falling edge (0 for falling, 1 for # rising, None if nothing has been printed yet) @@ -260,9 +250,7 @@ class Entropy(Module): def plot_entropy(self, fname): try: - import numpy as np - import pyqtgraph as pg - import pyqtgraph.exporters as exporters + import matplotlib.pyplot as plt except ImportError as e: return @@ -275,54 +263,60 @@ class Entropy(Module): x.append(r.offset) y.append(r.entropy) - plt = pg.plot(title=fname, clear=True) + fig = plt.figure() + ax = fig.add_subplot(1, 1, 1, autoscale_on=True) + ax.set_title(fname) + ax.set_xlabel(self.XLABEL) + ax.set_ylabel(self.YLABEL) + ax.plot(x, y) - # Disable auto-ranging of the Y (entropy) axis, as it - # can cause some very un-intuitive graphs, particularly - # for files with only high-entropy data. - plt.setYRange(0, 1) + if self.save_plot: + out_file = os.path.join(os.getcwd(), os.path.basename(fname)) + '.png' + fig.savefig(out_file) + else: + plt.show() - if self.show_legend and has_key(self.file_markers, fname): - plt.addLegend(size=(self.max_description_length * 10, 0)) + #if self.show_legend and has_key(self.file_markers, fname): + # plt.addLegend(size=(self.max_description_length * 10, 0)) - for (offset, description) in self.file_markers[fname]: + # for (offset, description) in self.file_markers[fname]: # If this description has already been plotted at a different offset, we need to # use the same color for the marker, but set the description to None to prevent # duplicate entries in the graph legend. # # Else, get the next color and use it to mark descriptions of # this type. - if has_key(plotted_colors, description): - color = plotted_colors[description] - description = None - else: - color = self.COLORS[i] - plotted_colors[description] = color + # if has_key(plotted_colors, description): + # color = plotted_colors[description] + # description = None + # else: + # color = self.COLORS[i] + # plotted_colors[description] = color - i += 1 - if i >= len(self.COLORS): - i = 0 + # i += 1 + # if i >= len(self.COLORS): + # i = 0 - plt.plot(x=[offset, offset], y=[0, 1.1], - name=description, pen=pg.mkPen(color, width=2.5)) + # plt.plot(x=[offset, offset], y=[0, 1.1], + # name=description, pen=pg.mkPen(color, width=2.5)) # Plot data points - plt.plot(x, y, pen='y') + #plt.plot(x, y, pen='y') # TODO: legend is not displayed properly when saving plots to disk - if self.save_plot: + #if self.save_plot: # Save graph to CWD - out_file = os.path.join(os.getcwd(), os.path.basename(fname)) + # out_file = os.path.join(os.getcwd(), os.path.basename(fname)) # exporters.ImageExporter is different in different versions of # pyqtgraph - try: - exporter = exporters.ImageExporter(plt.plotItem) - except TypeError: - exporter = exporters.ImageExporter.ImageExporter(plt.plotItem) - exporter.parameters()['width'] = self.FILE_WIDTH - exporter.export( - binwalk.core.common.unique_file_name(out_file, self.FILE_FORMAT)) - else: - plt.setLabel('left', self.YLABEL, units=self.YUNITS) - plt.setLabel('bottom', self.XLABEL, units=self.XUNITS) + # try: + # exporter = exporters.ImageExporter(plt.plotItem) + # except TypeError: + # exporter = exporters.ImageExporter.ImageExporter(plt.plotItem) + # exporter.parameters()['width'] = self.FILE_WIDTH + # exporter.export( + # binwalk.core.common.unique_file_name(out_file, self.FILE_FORMAT)) + #else: + # plt.setLabel('left', self.YLABEL, units=self.YUNITS) + # plt.setLabel('bottom', self.XLABEL, units=self.XUNITS)