From 5d01e8e553280f1f9e7676ea32af183f6e23efd7 Mon Sep 17 00:00:00 2001 From: Brian Potchik Date: Wed, 11 Sep 2019 11:38:45 -0400 Subject: Add ability to open a database with options. --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 2 ++ binaryview.cpp | 14 ++++++++++++++ filemetadata.cpp | 9 +++++++++ python/binaryview.py | 13 +++++++++++-- python/filemetadata.py | 6 ++++++ 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index cc5ff914..a7d66e9b 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -886,6 +886,7 @@ namespace BinaryNinja Ref OpenExistingDatabase(const std::string& path); Ref OpenExistingDatabase(const std::string& path, const std::function& progressCallback); + Ref OpenDatabaseForConfiguration(const std::string& path); bool SaveAutoSnapshot(BinaryView* data); bool SaveAutoSnapshot(BinaryView* data, const std::function& progressCallback); @@ -1698,6 +1699,7 @@ namespace BinaryNinja std::vector GetRawMetadata(const std::string& key); uint64_t GetUIntMetadata(const std::string& key); + std::vector GetLoadSettingsTypeNames(); Ref GetLoadSettings(const std::string& typeName); void SetLoadSettings(const std::string& typeName, Ref settings); diff --git a/binaryninjacore.h b/binaryninjacore.h index 351ad61d..96184f3a 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2165,6 +2165,7 @@ extern "C" BINARYNINJACOREAPI BNBinaryView* BNOpenExistingDatabase(BNFileMetadata* file, const char* path); BINARYNINJACOREAPI BNBinaryView* BNOpenExistingDatabaseWithProgress(BNFileMetadata* file, const char* path, void* ctxt, void (*progress)(void* ctxt, size_t progress, size_t total)); + BINARYNINJACOREAPI BNBinaryView* BNOpenDatabaseForConfiguration(BNFileMetadata* file, const char* path); BINARYNINJACOREAPI bool BNSaveAutoSnapshot(BNBinaryView* data); BINARYNINJACOREAPI bool BNSaveAutoSnapshotWithProgress(BNBinaryView* data, void* ctxt, void (*progress)(void* ctxt, size_t progress, size_t total)); @@ -4032,6 +4033,7 @@ extern "C" BINARYNINJACOREAPI BNMetadata* BNBinaryViewQueryMetadata(BNBinaryView* view, const char* key); BINARYNINJACOREAPI void BNBinaryViewRemoveMetadata(BNBinaryView* view, const char* key); + BINARYNINJACOREAPI char** BNBinaryViewGetLoadSettingsTypeNames(BNBinaryView* view, size_t* count); BINARYNINJACOREAPI BNSettings* BNBinaryViewGetLoadSettings(BNBinaryView* view, const char* typeName); BINARYNINJACOREAPI void BNBinaryViewSetLoadSettings(BNBinaryView* view, const char* typeName, BNSettings* settings); diff --git a/binaryview.cpp b/binaryview.cpp index 0f693d2d..dc2212a6 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -2994,6 +2994,20 @@ uint64_t BinaryView::GetUIntMetadata(const string& key) } +vector BinaryView::GetLoadSettingsTypeNames() +{ + size_t count = 0; + char** outgoingNames = BNBinaryViewGetLoadSettingsTypeNames(m_object, &count); + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + result.push_back(outgoingNames[i]); + + BNFreeStringList(outgoingNames, count); + return result; +} + + Ref BinaryView::GetLoadSettings(const string& typeName) { BNSettings* settings = BNBinaryViewGetLoadSettings(m_object, typeName.c_str()); diff --git a/filemetadata.cpp b/filemetadata.cpp index 4823cd94..d1d2ed2b 100644 --- a/filemetadata.cpp +++ b/filemetadata.cpp @@ -306,6 +306,15 @@ Ref FileMetadata::OpenExistingDatabase(const string& path, } +Ref FileMetadata::OpenDatabaseForConfiguration(const string& path) +{ + BNBinaryView* data = BNOpenDatabaseForConfiguration(m_object, path.c_str()); + if (!data) + return nullptr; + return new BinaryView(data); +} + + bool FileMetadata::SaveAutoSnapshot(BinaryView* data) { return BNSaveAutoSnapshot(data->GetObject()); diff --git a/python/binaryview.py b/python/binaryview.py index 2732a8d7..b55f9aae 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -4749,8 +4749,8 @@ class BinaryView(object): def add_user_section(self, name, start, length, semantics = SectionSemantics.DefaultSectionSemantics, type = "", align = 1, entry_size = 1, linked_section = "", info_section = "", info_data = 0): """ - ``add_user_section`` creates a user-defined section that can help inform analysis by clarifying what types of - data exist in what ranges. Note that all data specified must already be mapped by an existing segment. + ``add_user_section`` creates a user-defined section that can help inform analysis by clarifying what types of + data exist in what ranges. Note that all data specified must already be mapped by an existing segment. :param str name: name of the section :param int start: virtual address of the start of the section @@ -4905,6 +4905,15 @@ class BinaryView(object): """ core.BNBinaryViewRemoveMetadata(self.handle, key) + def get_load_settings_type_names(self): + result = [] + count = ctypes.c_ulonglong(0) + names = core.BNBinaryViewGetLoadSettingsTypeNames(self.handle, count) + for i in range(count.value): + result.append(names[i]) + core.BNFreeStringList(names, count) + return result + def get_load_settings(self, type_name): settings_handle = core.BNBinaryViewGetLoadSettings(self.handle, type_name) if settings_handle is None: diff --git a/python/filemetadata.py b/python/filemetadata.py index 8c6b2cb7..f95c1142 100644 --- a/python/filemetadata.py +++ b/python/filemetadata.py @@ -344,6 +344,12 @@ class FileMetadata(object): return None return binaryninja.binaryview.BinaryView(file_metadata = self, handle = view) + def open_database_for_configuration(self, filename): + view = core.BNOpenDatabaseForConfiguration(self.handle, str(filename)) + if view is None: + return None + return binaryninja.binaryview.BinaryView(file_metadata = self, handle = view) + def save_auto_snapshot(self, progress_func = None): if progress_func is None: return core.BNSaveAutoSnapshot(self.raw.handle) -- cgit v1.3.1