From 801b4138784a45643a7201b7e54105ea5eb3b6c4 Mon Sep 17 00:00:00 2001 From: Brian Potchik Date: Fri, 13 Aug 2021 18:48:51 -0400 Subject: Workflows early preview. --- binaryninjaapi.h | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) (limited to 'binaryninjaapi.h') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index a4c723dd..e7358613 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include "binaryninjacore.h" #include "json/json.h" @@ -540,6 +542,7 @@ namespace BinaryNinja class BackgroundTask; class Platform; class Settings; + class Workflow; class Type; class DataBuffer; class MainThreadAction; @@ -1945,6 +1948,8 @@ __attribute__ ((format (printf, 1, 2))) void Reanalyze(); + Ref GetWorkflow() const; + void ShowPlainTextReport(const std::string& title, const std::string& contents); void ShowMarkdownReport(const std::string& title, const std::string& contents, const std::string& plainText); void ShowHTMLReport(const std::string& title, const std::string& contents, const std::string& plainText); @@ -3087,6 +3092,101 @@ __attribute__ ((format (printf, 1, 2))) EnumerationBuilder& ReplaceMember(size_t idx, const std::string& name, uint64_t value); }; + #if ((__cplusplus >= 201403L) || (_MSVC_LANG >= 201703L)) + template struct overload : Ts... { using Ts::operator()...; }; + template overload(Ts...) -> overload; + #endif + + class AnalysisContext: public CoreRefCountObject + { + std::unique_ptr m_reader; + Json::StreamWriterBuilder m_builder; + + public: + AnalysisContext(BNAnalysisContext* analysisContext); + virtual ~AnalysisContext(); + + Ref GetFunction(); + Ref GetLowLevelILFunction(); + Ref GetMediumLevelILFunction(); + + void SetLowLevelILFunction(Ref lowLevelIL); + + bool Inform(const std::string& request); + + #if ((__cplusplus >= 201403L) || (_MSVC_LANG >= 201703L)) + template + bool Inform(Args... args) + { + //using T = std::variant; // FIXME: remove type duplicates + using T = std::variant>; + std::vector unpackedArgs {args...}; + Json::Value request(Json::arrayValue); + for (auto& arg : unpackedArgs) + std::visit(overload { + [&](Ref arch) { request.append(Json::Value(arch->GetName())); }, + [&](uint64_t val) { request.append(Json::Value(val)); }, + [&](auto& val) { request.append(Json::Value(std::forward(val))); } + }, arg); + + return Inform(Json::writeString(m_builder, request)); + } + #endif + }; + + class Activity: public CoreRefCountObject + { + protected: + std::function analysisContext)> m_action; + + static void Run(void* ctxt, BNAnalysisContext* analysisContext); + + public: + Activity(const std::string& name, const std::function)>& action); + Activity(BNActivity* activity); + virtual ~Activity(); + + std::string GetName() const; + }; + + class Workflow: public CoreRefCountObject + { + public: + Workflow(const std::string& name = ""); + Workflow(BNWorkflow* workflow); + virtual ~Workflow() { } + + static std::vector> GetList(); + static Ref Instance(const std::string& name = ""); + static bool RegisterWorkflow(Ref workflow, const std::string& description = ""); + + Ref Clone(const std::string& name, const std::string& activity = ""); + bool RegisterActivity(Ref activity, const std::string& description = ""); + bool RegisterActivity(Ref activity, std::initializer_list initializer) { return RegisterActivity(activity, std::vector(initializer.begin(), initializer.end())); } + bool RegisterActivity(Ref activity, const std::vector& subactivities, const std::string& description = ""); + + bool Contains(const std::string& activity); + std::string GetConfiguration(const std::string& activity = ""); + std::string GetName() const; + bool IsRegistered() const; + size_t Size() const; + + Ref GetActivity(const std::string& activity); + std::vector GetActivityRoots(const std::string& activity = ""); + std::vector GetSubactivities(const std::string& activity = "", bool immediate = true); + bool AssignSubactivities(const std::string& activity, const std::vector& subactivities = {}); + bool Clear(); + bool Insert(const std::string& activity, const std::string& newActivity); + bool Insert(const std::string& activity, const std::vector& activities); + bool Remove(const std::string& activity); + bool Replace(const std::string& activity, const std::string& newActivity); + + Ref GetGraph(const std::string& activity = "", bool sequential = false); + void ShowReport(const std::string& name); + + //bool Run(const std::string& activity, Ref analysisContext); + }; + class DisassemblySettings: public CoreRefCountObject { @@ -3501,6 +3601,8 @@ __attribute__ ((format (printf, 1, 2))) void Reanalyze(); + Ref GetWorkflow() const; + void RequestAdvancedAnalysisData(); void ReleaseAdvancedAnalysisData(); void ReleaseAdvancedAnalysisData(size_t count); -- cgit v1.3.1