summaryrefslogtreecommitdiff
path: root/examples/triage/files.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2019-04-02 15:30:45 -0400
committerRusty Wagner <rusty@vector35.com>2019-04-02 15:36:40 -0400
commit73a9399f5d1d86c7e291498b7fe836550f2f76ab (patch)
treee7c7cfe9a2f27a93ddac41cf600e7bc1fc638a83 /examples/triage/files.cpp
parentc17af471c48ea092434917c803f9c88fe91022a6 (diff)
Add a C++ version of the triage plugin (no Makefile yet)
Diffstat (limited to 'examples/triage/files.cpp')
-rw-r--r--examples/triage/files.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/examples/triage/files.cpp b/examples/triage/files.cpp
new file mode 100644
index 00000000..a736b81d
--- /dev/null
+++ b/examples/triage/files.cpp
@@ -0,0 +1,123 @@
+#include <QtWidgets/QVBoxLayout>
+#include <QtWidgets/QMessageBox>
+#include <QtCore/QSettings>
+#include "files.h"
+
+
+TriageFilePicker::TriageFilePicker(UIContext* context): m_contextMenuManager(this)
+{
+ m_context = context;
+ m_actionHandler.setupActionHandler(this);
+
+ QVBoxLayout* layout = new QVBoxLayout();
+ layout->setContentsMargins(0, 0, 0, 0);
+
+ m_model = new QFileSystemModel();
+ m_model->setRootPath("");
+ m_tree = new QTreeView(this);
+ m_tree->setModel(m_model);
+ m_tree->setSelectionMode(QAbstractItemView::ExtendedSelection);
+ m_tree->setColumnWidth(0, 500);
+ layout->addWidget(m_tree, 1);
+
+ setLayout(layout);
+
+ connect(m_tree, &QTreeView::doubleClicked, this, &TriageFilePicker::onDoubleClick);
+
+ QString recentFile = QSettings().value("triage/recentFile", QDir::homePath()).toString();
+ while (recentFile.size() > 0)
+ {
+ QModelIndex f = m_model->index(recentFile);
+ if (f.isValid())
+ {
+ m_tree->scrollTo(f);
+ m_tree->setExpanded(f, true);
+ break;
+ }
+ QString parentDir = QFileInfo(recentFile).path();
+ if (parentDir == recentFile)
+ break;
+ recentFile = parentDir;
+ }
+
+ m_actionHandler.bindAction("Open Selected Files", UIAction(
+ [=]() { openSelectedFiles(); },
+ [=]() { return areFilesSelected(); }));
+ m_contextMenu.addAction("Open Selected Files", "Open");
+}
+
+
+void TriageFilePicker::contextMenuEvent(QContextMenuEvent*)
+{
+ m_contextMenuManager.show(&m_contextMenu, &m_actionHandler);
+}
+
+
+void TriageFilePicker::onDoubleClick(const QModelIndex&)
+{
+ openSelectedFiles();
+}
+
+
+void TriageFilePicker::openSelectedFiles()
+{
+ std::vector<QString> failedToOpen;
+ std::set<QString> files;
+
+ for (auto& index: m_tree->selectionModel()->selectedIndexes())
+ if (m_model->fileInfo(index).isFile())
+ files.insert(m_model->fileInfo(index).absoluteFilePath());
+
+ for (auto& filename: files)
+ {
+ QSettings().setValue("triage/recentFile", filename);
+
+ FileContext* f = FileContext::openFilename(filename);
+ if (!f)
+ {
+ failedToOpen.push_back(filename);
+ continue;
+ }
+
+ f->createBinaryViews();
+ for (auto data: f->getAllDataViews())
+ {
+ BinaryNinja::Settings().Set("analysis.mode", BinaryNinja::Settings().Get<std::string>("triage.analysis_mode"), data);
+ BinaryNinja::Settings().Set("triage.always_prefer", true, data);
+ if (data->GetTypeName() != "Raw")
+ {
+ std::string linearSweepMode = BinaryNinja::Settings().Get<std::string>("triage.linear_sweep");
+ if (linearSweepMode == "none")
+ {
+ BinaryNinja::Settings().Set("analysis.linearSweep.autorun", false, data);
+ }
+ else if (linearSweepMode == "partial")
+ {
+ BinaryNinja::Settings().Set("analysis.linearSweep.autorun", true, data);
+ BinaryNinja::Settings().Set("analysis.linearSweep.controlFlowGraph", false, data);
+ }
+ else if (linearSweepMode == "full")
+ {
+ BinaryNinja::Settings().Set("analysis.linearSweep.autorun", true, data);
+ BinaryNinja::Settings().Set("analysis.linearSweep.controlFlowGraph", true, data);
+ }
+ }
+ }
+
+ m_context->openFileContext(f);
+ }
+
+ if (failedToOpen.size() > 0)
+ {
+ QString message = "Unable to open:\n";
+ for (auto& name: failedToOpen)
+ message += name + "\n";
+ QMessageBox::critical(this, "Error", message);
+ }
+}
+
+
+bool TriageFilePicker::areFilesSelected()
+{
+ return m_tree->selectionModel()->hasSelection();
+}