diff options
| -rw-r--r-- | binaryninjaapi.h | 4 | ||||
| -rw-r--r-- | binaryninjacore.h | 4 | ||||
| -rw-r--r-- | ui/workflowmonitor.h | 86 | ||||
| -rw-r--r-- | workflow.cpp | 12 |
4 files changed, 91 insertions, 15 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index e2275fdc..c911dc50 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1177,7 +1177,7 @@ namespace BinaryNinja { return result; } }; - + std::string EscapeString(const std::string& s); std::string UnescapeString(const std::string& s); @@ -10152,6 +10152,8 @@ namespace BinaryNinja { bool PostJsonRequest(const std::string& request); + Ref<FlowGraph> GetGraph(const std::string& activity = "", bool sequential = false); + void ShowTopology(); WorkflowMachine::Status GetStatus(); diff --git a/binaryninjacore.h b/binaryninjacore.h index 4a75eeb1..91e366f4 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -37,7 +37,7 @@ // Current ABI version for linking to the core. This is incremented any time // there are changes to the API that affect linking, including new functions, // new types, or modifications to existing functions or types. -#define BN_CURRENT_CORE_ABI_VERSION 104 +#define BN_CURRENT_CORE_ABI_VERSION 105 // Minimum ABI version that is supported for loading of plugins. Plugins that // are linked to an ABI version less than this will not be able to load and @@ -5547,11 +5547,13 @@ extern "C" // BinaryView Workflow Machine BINARYNINJACOREAPI BNWorkflow* BNGetWorkflowForBinaryView(BNBinaryView* view); BINARYNINJACOREAPI char* BNPostWorkflowRequestForBinaryView(BNBinaryView* view, const char* request); + BINARYNINJACOREAPI BNFlowGraph* BNGetWorkflowGraphForBinaryView(BNBinaryView* view, const char* name, bool sequential); BINARYNINJACOREAPI void BNShowWorkflowReportForBinaryView(BNBinaryView* view, const char* name); // Function Workflow Machine BINARYNINJACOREAPI BNWorkflow* BNGetWorkflowForFunction(BNFunction* func); BINARYNINJACOREAPI char* BNPostWorkflowRequestForFunction(BNFunction* func, const char* request); + BINARYNINJACOREAPI BNFlowGraph* BNGetWorkflowGraphForFunction(BNFunction* func, const char* name, bool sequential); BINARYNINJACOREAPI void BNShowWorkflowReportForFunction(BNFunction* func, const char* name); // Provenance diff --git a/ui/workflowmonitor.h b/ui/workflowmonitor.h index 7dcb05a5..1a5a81f1 100644 --- a/ui/workflowmonitor.h +++ b/ui/workflowmonitor.h @@ -6,12 +6,17 @@ #include <QIcon> #include <QLabel> #include <QPropertyAnimation> +#include <QTabWidget> #include "binaryninjaapi.h" +#include "flowgraphwidget.h" +#include "fontsettings.h" +#include "pane.h" #include "sidebarwidget.h" #include "uicontext.h" +#include "viewframe.h" -class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget +class BINARYNINJAUIAPI WorkflowMonitorWidget : public QWidget { Q_OBJECT Q_PROPERTY(qreal dotBrightness READ dotBrightness WRITE setDotBrightness) @@ -21,10 +26,12 @@ class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget WorkflowRef m_workflow; Menu* m_menu; - ContextMenuManager* m_contextMenuManager; + //ContextMenuManager* m_contextMenuManager; UIActionHandler m_actionHandler; QToolBar* m_toolbar; + QTabWidget* m_tabs; + FlowGraphWidget* m_flowGraphWidget; QAction* m_startAction; QAction* m_haltAction; @@ -32,7 +39,6 @@ class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget QAction* m_resetAction; QAction* m_toggleSuspendAction; QAction* m_toggleLogAction; - QAction* m_topologyAction; QPushButton* m_contextButton; QLabel* m_contextLabel; @@ -48,8 +54,6 @@ class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget qreal m_dotBrightness; bool m_animationRunning; - virtual void contextMenuEvent(QContextMenuEvent*) override; - void updateToolbarActions(bool force = false); void updateToolbarIcons(); void setupToolbar(); @@ -60,24 +64,80 @@ class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget void setDotBrightness(qreal brightness); public: - WorkflowMonitorWidget(BinaryViewRef data); + WorkflowMonitorWidget(BinaryViewRef data, FunctionRef function = nullptr); ~WorkflowMonitorWidget(); - void notifyRefresh() override; - void notifyFontChanged() override; - void notifyThemeChanged() override; - void notifyViewLocationChanged(View* view, const ViewLocation& viewLocation) override; + FunctionRef getCurrentFunction() const { return m_function; } + + void notifyRefresh(); + void notifyFontChanged(); + void notifyThemeChanged(); + void notifyViewLocationChanged(View* view, const ViewLocation& viewLocation); void startDotAnimation(); void stopDotAnimation(); }; -class BINARYNINJAUIAPI WorkflowMonitorWidgetType : public SidebarWidgetType +class BINARYNINJAUIAPI WorkflowMonitorSidebarWidget : public SidebarWidget { + Q_OBJECT + + WorkflowMonitorWidget* m_widget; + public: - WorkflowMonitorWidgetType(); - SidebarWidget* createWidget(ViewFrame* frame, BinaryViewRef data) override; + WorkflowMonitorSidebarWidget(BinaryViewRef data); + + void notifyRefresh() override { m_widget->notifyRefresh(); } + void notifyFontChanged() override { m_widget->notifyFontChanged(); } + void notifyThemeChanged() override { m_widget->notifyThemeChanged(); } + void notifyViewLocationChanged(View* view, const ViewLocation& viewLocation) override { m_widget->notifyViewLocationChanged(view, viewLocation); } +}; + + +class BINARYNINJAUIAPI WorkflowMonitorSidebarWidgetType : public SidebarWidgetType +{ +public: + WorkflowMonitorSidebarWidgetType(); + SidebarWidgetLocation defaultLocation() const override { return SidebarWidgetLocation::LeftReference; } SidebarContextSensitivity contextSensitivity() const override { return PerViewTypeSidebarContext; } + + SidebarWidget* createWidget(ViewFrame* frame, BinaryViewRef data) override; + + bool canUseAsPane(SplitPaneWidget* panes, BinaryViewRef data) const override { return true; } + Pane* createPane(SplitPaneWidget* panes, BinaryViewRef data) override; +}; + + +class BINARYNINJAUIAPI WorkflowView : public QWidget, public View +{ + Q_OBJECT + + BinaryViewRef m_data; + uint64_t m_currentOffset = 0; + WorkflowMonitorWidget* m_widget; + +public: + WorkflowView(BinaryViewRef data, ViewFrame* frame); + + void notifyRefresh() override { m_widget->notifyRefresh(); } + BinaryViewRef getData() override { return m_data; } + uint64_t getCurrentOffset() override { return m_currentOffset; } + void setSelectionOffsets(BNAddressRange range) override { m_currentOffset = range.start; } + bool navigate(uint64_t offset) override; + QFont getFont() override { return getMonospaceFont(m_widget); } + FunctionRef getCurrentFunction() override { return m_widget->getCurrentFunction(); } +}; + + +class BINARYNINJAUIAPI WorkflowViewType : public ViewType +{ + static WorkflowViewType* m_instance; + +public: + WorkflowViewType(); + virtual int getPriority(BinaryViewRef data, const QString& filename); + virtual QWidget* create(BinaryViewRef data, ViewFrame* viewFrame); + static void init(); }; diff --git a/workflow.cpp b/workflow.cpp index d4b94eb4..9c1c7d20 100644 --- a/workflow.cpp +++ b/workflow.cpp @@ -164,6 +164,18 @@ bool WorkflowMachine::PostJsonRequest(const std::string& request) } +Ref<FlowGraph> WorkflowMachine::GetGraph(const std::string& activity, bool sequential) +{ + BNFlowGraph* graph; + if (m_function) + graph = BNGetWorkflowGraphForFunction(m_function->GetObject(), activity.c_str(), sequential); + else + graph = BNGetWorkflowGraphForBinaryView(m_view->GetObject(), activity.c_str(), sequential); + + return new CoreFlowGraph(graph); +} + + void WorkflowMachine::ShowTopology() { if (m_function) |
