diff options
| author | Xusheng <xusheng@vector35.com> | 2022-06-27 15:48:32 +0800 |
|---|---|---|
| committer | Xusheng <xusheng@vector35.com> | 2022-06-30 10:21:21 +0800 |
| commit | 6e282b0e11fa15e9aacddf52f0fedb5ab2f13bbc (patch) | |
| tree | c6254cad3f10bb1c8e41ac0733a6eac252cd80f6 | |
| parent | a2832e3895fbd0490c2d520338c2632b266f76ff (diff) | |
Implement the missing APIs in BinaryNinja::Metadata
| -rw-r--r-- | binaryninjacore.h | 23 | ||||
| -rw-r--r-- | metadata.cpp | 170 |
2 files changed, 192 insertions, 1 deletions
diff --git a/binaryninjacore.h b/binaryninjacore.h index fe5a984a..a7ec092c 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -36,7 +36,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 22 +#define BN_CURRENT_CORE_ABI_VERSION 23 // 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 @@ -5992,6 +5992,11 @@ extern "C" BINARYNINJACOREAPI BNMetadata* BNCreateMetadataRawData(const uint8_t* data, size_t size); BINARYNINJACOREAPI BNMetadata* BNCreateMetadataArray(BNMetadata** data, size_t size); BINARYNINJACOREAPI BNMetadata* BNCreateMetadataValueStore(const char** keys, BNMetadata** values, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataBooleanListData(bool* data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataUnsignedIntegerListData(uint64_t* data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataSignedIntegerListData(int64_t* data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataDoubleListData(double* data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataStringListData(const char** data, size_t size); BINARYNINJACOREAPI bool BNMetadataIsEqual(BNMetadata* lhs, BNMetadata* rhs); @@ -6007,12 +6012,23 @@ extern "C" BINARYNINJACOREAPI void BNFreeMetadataValueStore(BNMetadataValueStore* data); BINARYNINJACOREAPI void BNFreeMetadata(BNMetadata* data); BINARYNINJACOREAPI void BNFreeMetadataRaw(uint8_t* data); + BINARYNINJACOREAPI void BNFreeMetadataBooleanList(bool*, size_t); + BINARYNINJACOREAPI void BNFreeMetadataUnsignedIntegerList(uint64_t*, size_t); + BINARYNINJACOREAPI void BNFreeMetadataSignedIntegerList(int64_t*, size_t); + BINARYNINJACOREAPI void BNFreeMetadataDoubleList(double*, size_t); + BINARYNINJACOREAPI void BNFreeMetadataStringList(char**, size_t); + // Retrieve Structured Data BINARYNINJACOREAPI bool BNMetadataGetBoolean(BNMetadata* data); BINARYNINJACOREAPI char* BNMetadataGetString(BNMetadata* data); BINARYNINJACOREAPI uint64_t BNMetadataGetUnsignedInteger(BNMetadata* data); BINARYNINJACOREAPI int64_t BNMetadataGetSignedInteger(BNMetadata* data); BINARYNINJACOREAPI double BNMetadataGetDouble(BNMetadata* data); + BINARYNINJACOREAPI bool* BNMetadataGetBooleanList(BNMetadata* data, size_t *); + BINARYNINJACOREAPI char** BNMetadataGetStringList(BNMetadata* data, size_t *); + BINARYNINJACOREAPI uint64_t* BNMetadataGetUnsignedIntegerList(BNMetadata* data, size_t *); + BINARYNINJACOREAPI int64_t* BNMetadataGetSignedIntegerList(BNMetadata* data, size_t *); + BINARYNINJACOREAPI double* BNMetadataGetDoubleList(BNMetadata* data, size_t *); BINARYNINJACOREAPI uint8_t* BNMetadataGetRaw(BNMetadata* data, size_t* size); BINARYNINJACOREAPI BNMetadata** BNMetadataGetArray(BNMetadata* data, size_t* size); BINARYNINJACOREAPI BNMetadataValueStore* BNMetadataGetValueStore(BNMetadata* data); @@ -6024,6 +6040,11 @@ extern "C" BINARYNINJACOREAPI bool BNMetadataIsUnsignedInteger(BNMetadata* data); BINARYNINJACOREAPI bool BNMetadataIsSignedInteger(BNMetadata* data); BINARYNINJACOREAPI bool BNMetadataIsDouble(BNMetadata* data); + BINARYNINJACOREAPI bool BNMetadataIsBooleanList(BNMetadata* data); + BINARYNINJACOREAPI bool BNMetadataIsStringList(BNMetadata* data); + BINARYNINJACOREAPI bool BNMetadataIsUnsignedIntegerList(BNMetadata* data); + BINARYNINJACOREAPI bool BNMetadataIsSignedIntegerList(BNMetadata* data); + BINARYNINJACOREAPI bool BNMetadataIsDoubleList(BNMetadata* data); BINARYNINJACOREAPI bool BNMetadataIsRaw(BNMetadata* data); BINARYNINJACOREAPI bool BNMetadataIsArray(BNMetadata* data); BINARYNINJACOREAPI bool BNMetadataIsKeyValueStore(BNMetadata* data); diff --git a/metadata.cpp b/metadata.cpp index bd9bbdee..c52f6dd1 100644 --- a/metadata.cpp +++ b/metadata.cpp @@ -75,6 +75,56 @@ Metadata::Metadata(const std::map<std::string, Ref<Metadata>>& data) delete[] values; } +Metadata::Metadata(const std::vector<bool>& data) +{ + auto* list = new bool[data.size()]; + for (size_t i = 0; i < data.size(); i++) + list[i] = data[i]; + + m_object = BNCreateMetadataBooleanListData(list, data.size()); + delete[] list; +} + +Metadata::Metadata(const std::vector<uint64_t>& data) +{ + auto* list = new uint64_t[data.size()]; + for (size_t i = 0; i < data.size(); i++) + list[i] = data[i]; + + m_object = BNCreateMetadataUnsignedIntegerListData(list, data.size()); + delete[] list; +} + +Metadata::Metadata(const std::vector<int64_t>& data) +{ + auto* list = new int64_t[data.size()]; + for (size_t i = 0; i < data.size(); i++) + list[i] = data[i]; + + m_object = BNCreateMetadataSignedIntegerListData(list, data.size()); + delete[] list; +} + +Metadata::Metadata(const std::vector<double>& data) +{ + auto* list = new double[data.size()]; + for (size_t i = 0; i < data.size(); i++) + list[i] = data[i]; + + m_object = BNCreateMetadataDoubleListData(list, data.size()); + delete[] list; +} + +Metadata::Metadata(const std::vector<std::string>& data) +{ + auto* list = new const char*[data.size()]; + for (size_t i = 0; i < data.size(); i++) + list[i] = data[i].c_str(); + + m_object = BNCreateMetadataStringListData(list, data.size()); + delete[] list; +} + bool Metadata::operator==(const Metadata& rhs) { return BNMetadataIsEqual(m_object, rhs.m_object); @@ -90,6 +140,16 @@ Ref<Metadata> Metadata::operator[](size_t idx) return new Metadata(BNMetadataGetForIndex(m_object, idx)); } +Ref<Metadata> Metadata::Get(const std::string& key) +{ + return new Metadata(BNMetadataGetForKey(m_object, key.c_str())); +} + +Ref<Metadata> Metadata::Get(size_t index) +{ + return new Metadata(BNMetadataGetForIndex(m_object, index)); +} + bool Metadata::SetValueForKey(const string& key, Ref<Metadata> data) { return BNMetadataSetValueForKey(m_object, key.c_str(), data->m_object); @@ -133,6 +193,91 @@ double Metadata::GetDouble() const return BNMetadataGetDouble(m_object); } +std::vector<bool> Metadata::GetBooleanList() const +{ + size_t size; + auto list = BNMetadataGetBooleanList(m_object, &size); + + std::vector<bool> result; + result.reserve(size); + + for (size_t i = 0; i < size; i++) + { + result.push_back(list[i]); + } + + BNFreeMetadataBooleanList(list, size); + return result; +} + +std::vector<uint64_t> Metadata::GetUnsignedIntegerList() const +{ + size_t size; + auto list = BNMetadataGetUnsignedIntegerList(m_object, &size); + + std::vector<uint64_t> result; + result.reserve(size); + + for (size_t i = 0; i < size; i++) + { + result.push_back(list[i]); + } + + BNFreeMetadataUnsignedIntegerList(list, size); + return result; +} + +std::vector<int64_t> Metadata::GetSignedIntegerList() const +{ + size_t size; + auto list = BNMetadataGetSignedIntegerList(m_object, &size); + + std::vector<int64_t> result; + result.reserve(size); + + for (size_t i = 0; i < size; i++) + { + result.push_back(list[i]); + } + + BNFreeMetadataSignedIntegerList(list, size); + return result; +} + +std::vector<std::string> Metadata::GetStringList() const +{ + size_t size; + auto list = BNMetadataGetStringList(m_object, &size); + + std::vector<std::string> result; + result.reserve(size); + + for (size_t i = 0; i < size; i++) + { + result.push_back(list[i]); + } + + BNFreeMetadataStringList(list, size); + return result; +} + +std::vector<double> Metadata::GetDoubleList() const +{ + size_t size; + auto list = BNMetadataGetDoubleList(m_object, &size); + + std::vector<double> result; + result.reserve(size); + + for (size_t i = 0; i < size; i++) + { + result.push_back(list[i]); + } + + BNFreeMetadataDoubleList(list, size); + return result; +} + vector<uint8_t> Metadata::GetRaw() const { size_t outSize; @@ -205,6 +350,31 @@ bool Metadata::IsDouble() const return BNMetadataIsDouble(m_object); } +bool Metadata::IsBooleanList() const +{ + return BNMetadataIsBooleanList(m_object); +} + +bool Metadata::IsStringList() const +{ + return BNMetadataIsStringList(m_object); +} + +bool Metadata::IsUnsignedIntegerList() const +{ + return BNMetadataIsUnsignedIntegerList(m_object); +} + +bool Metadata::IsSignedIntegerList() const +{ + return BNMetadataIsSignedIntegerList(m_object); +} + +bool Metadata::IsDoubleList() const +{ + return BNMetadataIsDoubleList(m_object); +} + bool Metadata::IsRaw() const { return BNMetadataIsRaw(m_object); |
