From 6d7f4ac49f5db820c5c468b69efc953cab87307b Mon Sep 17 00:00:00 2001 From: Brian Potchik Date: Thu, 24 Oct 2024 12:06:09 -0400 Subject: Initial implementation of the module-level analysis workflow. --- workflow.cpp | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) (limited to 'workflow.cpp') diff --git a/workflow.cpp b/workflow.cpp index 0d02ab5b..90ddb024 100644 --- a/workflow.cpp +++ b/workflow.cpp @@ -1,5 +1,6 @@ #include "binaryninjaapi.h" #include "json/json.h" +#include "rapidjsonwrapper.h" #include #include @@ -100,6 +101,97 @@ bool AnalysisContext::Inform(const string& request) } +WorkflowMachine::WorkflowMachine(Ref view): m_view(view) +{ + +} + + +WorkflowMachine::WorkflowMachine(Ref function): m_function(function) +{ + +} + + +std::optional WorkflowMachine::QueryOverride(const string& activity) +{ + rapidjson::Document request(rapidjson::kObjectType); + rapidjson::Document::AllocatorType& allocator = request.GetAllocator(); + request.AddMember("command", "override", allocator); + request.AddMember("action", "query", allocator); + request.AddMember("activity", rapidjson::Value(activity.c_str(), allocator), allocator); + rapidjson::StringBuffer buffer; + rapidjson::Writer writer(buffer); + request.Accept(writer); + + string jsonResult; + if (m_function) + jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString()); + else + jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString()); + + rapidjson::Document response(rapidjson::kObjectType); + response.Parse(jsonResult.c_str()); + if (response.HasMember("response") && response["response"].HasMember("activity") && response["response"]["activity"].HasMember("override")) + return response["response"]["activity"]["override"].GetBool(); + + return std::nullopt; +} + + +bool WorkflowMachine::SetOverride(const string& activity, bool enable) +{ + rapidjson::Document request(rapidjson::kObjectType); + rapidjson::Document::AllocatorType& allocator = request.GetAllocator(); + request.AddMember("command", "override", allocator); + request.AddMember("action", "set", allocator); + request.AddMember("activity", rapidjson::Value(activity.c_str(), allocator), allocator); + request.AddMember("enable", enable, allocator); + rapidjson::StringBuffer buffer; + rapidjson::Writer writer(buffer); + request.Accept(writer); + + string jsonResult; + if (m_function) + jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString()); + else + jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString()); + + rapidjson::Document response(rapidjson::kObjectType); + response.Parse(jsonResult.c_str()); + if (response.HasMember("commandStatus") && response["commandStatus"].HasMember("accepted")) + return response["commandStatus"]["accepted"].GetBool(); + + return false; +} + + +bool WorkflowMachine::ClearOverride(const string& activity) +{ + rapidjson::Document request(rapidjson::kObjectType); + rapidjson::Document::AllocatorType& allocator = request.GetAllocator(); + request.AddMember("command", "override", allocator); + request.AddMember("action", "clear", allocator); + request.AddMember("activity", rapidjson::Value(activity.c_str(), allocator), allocator); + rapidjson::StringBuffer buffer; + rapidjson::Writer writer(buffer); + request.Accept(writer); + + string jsonResult; + if (m_function) + jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString()); + else + jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString()); + + rapidjson::Document response(rapidjson::kObjectType); + response.Parse(jsonResult.c_str()); + if (response.HasMember("commandStatus") && response["commandStatus"].HasMember("accepted")) + return response["commandStatus"]["accepted"].GetBool(); + + return false; +} + + Workflow::Workflow(const string& name) { m_object = BNCreateWorkflow(name.c_str()); @@ -112,6 +204,20 @@ Workflow::Workflow(BNWorkflow* workflow) } +Workflow::Workflow(BNWorkflow* workflow, Ref view) +{ + m_object = BNNewWorkflowReference(workflow); + m_machine = make_unique(view); +} + + +Workflow::Workflow(BNWorkflow* workflow, Ref function) +{ + m_object = BNNewWorkflowReference(workflow); + m_machine = make_unique(function); +} + + vector> Workflow::GetList() { size_t count; -- cgit v1.3.1