diff options
| author | Rusty Wagner <rusty@vector35.com> | 2019-03-13 11:26:05 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2019-03-20 12:58:42 -0400 |
| commit | 0e73aadf4e787df9e376108eb82e297626045b11 (patch) | |
| tree | e69d5546817e86a3ee23f94923a0e2ece67da3b3 /python/examples/triage/view.py | |
| parent | abd03fbbc68824fe2d38cd0d62ba3b99ecd89463 (diff) | |
Initial example triage UI plugin
Diffstat (limited to 'python/examples/triage/view.py')
| -rw-r--r-- | python/examples/triage/view.py | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/python/examples/triage/view.py b/python/examples/triage/view.py new file mode 100644 index 00000000..e06776ca --- /dev/null +++ b/python/examples/triage/view.py @@ -0,0 +1,114 @@ +import traceback +import binaryninjaui +from binaryninja.settings import Settings +from binaryninja import log +from binaryninjaui import View, ViewType, UIContext +from PySide2.QtWidgets import QScrollArea, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QGroupBox +from . import headers +from . import entropy +from . import imports + + +class TriageView(QScrollArea, View): + def __init__(self, parent, data): + QScrollArea.__init__(self, parent) + View.__init__(self) + self.setupView(self) + self.data = data + self.currentOffset = 0 + + container = QWidget(self) + layout = QVBoxLayout() + + entropyGroup = QGroupBox("Entropy") + entropyLayout = QVBoxLayout() + entropyLayout.addWidget(entropy.EntropyWidget(entropyGroup, self.data)) + entropyGroup.setLayout(entropyLayout) + layout.addWidget(entropyGroup) + + hdr = None + try: + if self.data.view_type == "PE": + hdr = headers.PEHeaders(self.data) + except: + log.log_error(traceback.format_exc()) + + if hdr is not None: + headerGroup = QGroupBox("Headers") + headerLayout = QVBoxLayout() + headerWidget = headers.HeaderWidget(headerGroup, hdr) + headerLayout.addWidget(headerWidget) + headerGroup.setLayout(headerLayout) + layout.addWidget(headerGroup) + + importGroup = QGroupBox("Imports") + importLayout = QVBoxLayout() + importLayout.addWidget(imports.ImportsWidget(importGroup, self, self.data)) + importGroup.setLayout(importLayout) + layout.addWidget(importGroup) + + button_layout = QHBoxLayout() + button_layout.addStretch(1) + self.full_analysis_button = QPushButton("Start Full Analysis") + self.full_analysis_button.clicked.connect(self.startFullAnalysis) + button_layout.addWidget(self.full_analysis_button) + layout.addLayout(button_layout) + + layout.addStretch(1) + container.setLayout(layout) + self.setWidgetResizable(True) + self.setWidget(container) + + if Settings().get_string("analysis.mode", data) == "full": + self.full_analysis_button.hide() + + def getData(self): + return self.data + + def getCurrentOffset(self): + return self.currentOffset + + def setCurrentOffset(self, offset): + self.currentOffset = offset + UIContext.updateStatus(True) + + def getFont(self): + return binaryninjaui.getMonospaceFont(self) + + def navigate(self, addr): + return False + + def startFullAnalysis(self): + Settings().set_string("analysis.mode", "full", self.data) + for f in self.data.functions: + if f.analysis_skipped: + f.reanalyze() + self.data.update_analysis() + self.full_analysis_button.hide() + + +class TriageViewType(ViewType): + def __init__(self): + super(TriageViewType, self).__init__("Triage", "Triage Summary") + + def getPriority(self, data, filename): + is_full = Settings().get_string("analysis.mode", data) == "full" + always_prefer = Settings().get_bool("ui.always_prefer_triage", data) + if data.executable and (always_prefer or not is_full): + return 100 + return 25 + + def create(self, data, view_frame): + return TriageView(view_frame, data) + + +Settings().register_setting("ui.always_prefer_triage", """ + { + "title" : "Always Prefer Triage Summary View", + "type" : "boolean", + "default" : false, + "description" : "Always prefer opening binaries in Triage Summary view, even when performing full analysis." + } + """) + +ViewType.registerViewType(TriageViewType()) |
