diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-02-11 02:16:40 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-02-11 02:16:40 -0500 |
| commit | 47ad9dfe54195807ed67a2ec4b03fdc1e698310d (patch) | |
| tree | 78d8bbd7a85577d6dcc9ef2445aa529957b5fdef | |
| parent | 6277a83d956dad6f7cab7ee6193b9326680f8e1f (diff) | |
More ELF parsing, and a view type registration system
| -rw-r--r-- | binaryninjaapi.cpp | 97 | ||||
| -rw-r--r-- | binaryninjaapi.h | 33 |
2 files changed, 130 insertions, 0 deletions
diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp index 95bb71be..f9a9ac9c 100644 --- a/binaryninjaapi.cpp +++ b/binaryninjaapi.cpp @@ -619,6 +619,103 @@ BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor): } +BNBinaryView* BinaryViewType::CreateCallback(void* ctxt, BNBinaryView* data) +{ + BinaryViewType* type = (BinaryViewType*)ctxt; + Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data)); + Ref<BinaryView> result = type->Create(view); + return BNNewViewReference(result->GetViewObject()); +} + + +bool BinaryViewType::IsValidCallback(void* ctxt, BNBinaryView* data) +{ + BinaryViewType* type = (BinaryViewType*)ctxt; + Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data)); + return type->IsTypeValidForData(view); +} + + +BinaryViewType::BinaryViewType(BNBinaryViewType* type): m_type(type) +{ +} + + +BinaryViewType::BinaryViewType(const string& name): m_type(nullptr), m_nameForRegister(name) +{ +} + + +BinaryViewType::~BinaryViewType() +{ + BNFreeBinaryViewType(m_type); +} + + +void BinaryViewType::Register(BinaryViewType* type) +{ + BNCustomBinaryViewType callbacks; + callbacks.context = type; + callbacks.create = CreateCallback; + callbacks.isValidForData = IsValidCallback; + + type->m_type = BNRegisterBinaryViewType(type->m_nameForRegister.c_str(), &callbacks); +} + + +Ref<BinaryViewType> BinaryViewType::GetByName(const string& name) +{ + BNBinaryViewType* type = BNGetBinaryViewTypeByName(name.c_str()); + if (!type) + return nullptr; + return new CoreBinaryViewType(type); +} + + +vector<Ref<BinaryViewType>> BinaryViewType::GetViewTypesForData(BinaryData* data) +{ + BNBinaryViewType** types; + size_t count; + types = BNGetBinaryViewTypesForData(data->GetViewObject(), &count); + + vector<Ref<BinaryViewType>> result; + for (size_t i = 0; i < count; i++) + result.push_back(new CoreBinaryViewType(BNNewViewTypeReference(types[i]))); + + BNFreeBinaryViewTypeList(types, count); + return result; +} + + +string BinaryViewType::GetName() +{ + char* contents = BNGetBinaryViewTypeName(m_type); + string result = contents; + BNFreeString(contents); + return result; +} + + +CoreBinaryViewType::CoreBinaryViewType(BNBinaryViewType* type): BinaryViewType(type) +{ +} + + +BinaryView* CoreBinaryViewType::Create(BinaryView* data) +{ + BNBinaryView* view = BNCreateBinaryViewOfType(m_type, data->GetViewObject()); + if (!view) + return nullptr; + return new CoreBinaryView(view); +} + + +bool CoreBinaryViewType::IsTypeValidForData(BinaryView* data) +{ + return BNIsBinaryViewTypeValidForData(m_type, data->GetViewObject()); +} + + BinaryReader::BinaryReader(BinaryView* data, BNEndianness endian): m_view(data) { m_stream = BNCreateBinaryReader(data->GetViewObject()); diff --git a/binaryninjaapi.h b/binaryninjaapi.h index eee2ffac..45072d83 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -363,6 +363,39 @@ namespace BinaryNinja BinaryData(FileMetadata* file, FileAccessor* accessor); }; + class BinaryViewType: public RefCountObject + { + protected: + BNBinaryViewType* m_type; + std::string m_nameForRegister; + + static BNBinaryView* CreateCallback(void* ctxt, BNBinaryView* data); + static bool IsValidCallback(void* ctxt, BNBinaryView* data); + + BinaryViewType(BNBinaryViewType* type); + + public: + BinaryViewType(const std::string& name); + virtual ~BinaryViewType(); + + static void Register(BinaryViewType* type); + static Ref<BinaryViewType> GetByName(const std::string& name); + static std::vector<Ref<BinaryViewType>> GetViewTypesForData(BinaryData* data); + + std::string GetName(); + + virtual BinaryView* Create(BinaryView* data) = 0; + virtual bool IsTypeValidForData(BinaryView* data) = 0; + }; + + class CoreBinaryViewType: public BinaryViewType + { + public: + CoreBinaryViewType(BNBinaryViewType* type); + virtual BinaryView* Create(BinaryView* data) override; + virtual bool IsTypeValidForData(BinaryView* data) override; + }; + class ReadException: public std::exception { public: |
