summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXusheng <xusheng@vector35.com>2022-06-27 15:48:32 +0800
committerXusheng <xusheng@vector35.com>2022-06-30 10:21:21 +0800
commit6e282b0e11fa15e9aacddf52f0fedb5ab2f13bbc (patch)
treec6254cad3f10bb1c8e41ac0733a6eac252cd80f6
parenta2832e3895fbd0490c2d520338c2632b266f76ff (diff)
Implement the missing APIs in BinaryNinja::Metadata
-rw-r--r--binaryninjacore.h23
-rw-r--r--metadata.cpp170
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);