From 796932b62e7d007a46d8ad31cdb618e8125073ab Mon Sep 17 00:00:00 2001 From: Brian Potchik Date: Tue, 30 Sep 2025 15:09:48 -0400 Subject: Initial support for opening container formats. --- binaryninjaapi.h | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 4 deletions(-) (limited to 'binaryninjaapi.h') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index fd926ebd..9da9f677 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -3816,6 +3816,18 @@ namespace BinaryNinja { */ void SetFilename(const std::string& name); + /*! Get the path to the container file if the current file is inside a container (e.g. ZIP, TAR, etc.) + + \return The path to the container file if the current file is inside a container, otherwise an empty string + */ + std::string GetVirtualPath() const; + + /*! Set the path to the container file if the current file is inside a container (e.g. ZIP, TAR, etc.) + + \param path The path to the container file if the current file is inside a container + */ + void SetVirtualPath(const std::string& path); + /*! Whether the file has unsaved modifications \return Whether the file has unsaved modifications @@ -8947,6 +8959,7 @@ namespace BinaryNinja { { protected: BNTransformType m_typeForRegister; + BNTransformCapabilities m_capabilitiesForRegister; std::string m_nameForRegister, m_longNameForRegister, m_groupForRegister; Transform(BNTransform* xform); @@ -8957,6 +8970,7 @@ namespace BinaryNinja { void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount); static bool EncodeCallback( void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount); + static bool CanDecodeCallback(void* ctxt, BNBinaryView* input); static std::vector EncryptionKeyParameters(size_t fixedKeyLength = 0); static std::vector EncryptionKeyAndIVParameters( @@ -8964,22 +8978,24 @@ namespace BinaryNinja { public: Transform(BNTransformType type, const std::string& name, const std::string& longName, const std::string& group); + Transform(BNTransformType type, BNTransformCapabilities capabilities, const std::string& name, const std::string& longName, const std::string& group); static void Register(Transform* xform); static Ref GetByName(const std::string& name); static std::vector> GetTransformTypes(); BNTransformType GetType() const; + BNTransformCapabilities GetCapabilities() const; + bool SupportsDetection() const; std::string GetName() const; std::string GetLongName() const; std::string GetGroup() const; virtual std::vector GetParameters() const; - virtual bool Decode(const DataBuffer& input, DataBuffer& output, - const std::map& params = std::map()); - virtual bool Encode(const DataBuffer& input, DataBuffer& output, - const std::map& params = std::map()); + virtual bool Decode(const DataBuffer& input, DataBuffer& output, const std::map& params = std::map()); + virtual bool Encode(const DataBuffer& input, DataBuffer& output, const std::map& params = std::map()); + virtual bool CanDecode(Ref input) const; }; /*! @@ -8995,8 +9011,64 @@ namespace BinaryNinja { const std::map& params = std::map()) override; virtual bool Encode(const DataBuffer& input, DataBuffer& output, const std::map& params = std::map()) override; + virtual bool CanDecode(Ref input) const override; }; + class TransformContext : public CoreRefCountObject + { + public: + TransformContext(BNTransformContext* context); + virtual ~TransformContext(); + + std::string GetTransformName() const; + std::string GetFileName() const; + Ref GetInput() const; + Ref GetMetadata() const; + Ref GetParent() const; + size_t GetChildCount() const; + std::vector> GetChildren() const; + Ref GetChild(const std::string& filename) const; + Ref CreateChild(const DataBuffer& data, const std::string& filename); + bool IsLeaf() const; + bool IsRoot() const; + std::vector GetAvailableFiles() const; + void SetAvailableFiles(const std::vector& files); + bool HasAvailableFiles() const; + std::vector GetRequestedFiles() const; + void SetRequestedFiles(const std::vector& files); + bool HasRequestedFiles() const; + bool IsDatabase() const; + }; + + class TransformSession : public CoreRefCountObject + { + public: + TransformSession(const std::string& filename); + TransformSession(const std::string& filename, BNTransformSessionMode mode); + TransformSession(Ref initialView); + TransformSession(Ref initialView, BNTransformSessionMode mode); + TransformSession(BNTransformSession* session); + virtual ~TransformSession(); + + Ref GetCurrentView() const; + Ref GetRootContext() const; + Ref GetCurrentContext() const; + bool Process(); + bool HasAnyStages() const; + bool HasSinglePath() const; + + std::vector> GetSelectedContexts() const; + void SetSelectedContexts(const std::vector>& contexts); + + // UI interaction support + bool RequiresUserInput() const; + bool HasMultipleFileChoices() const; + std::vector GetAvailableFileChoices() const; + bool SelectFiles(const std::vector& selectedFiles); + bool ProcessWithUserInput(); + }; + + struct InstructionInfo : public BNInstructionInfo { InstructionInfo(); -- cgit v1.3.1