diff options
| author | KyleMiles <krm504@nyu.edu> | 2022-10-04 15:27:43 -0400 |
|---|---|---|
| committer | KyleMiles <krm504@nyu.edu> | 2022-10-04 16:53:41 -0400 |
| commit | e8ed4b8e75fc6d8dd050a5a6804e9691706317c8 (patch) | |
| tree | cfadb2011031aaa312f29ccf0c25258b77f5e7f3 | |
| parent | 3104042adab833e73a71738f57070ab881ade615 (diff) | |
Add API bindings for `BNBinaryViewGetDefaultLoadSettings` for force API actions to load default load settings
| -rw-r--r-- | binaryninjaapi.h | 11 | ||||
| -rw-r--r-- | binaryninjacore.h | 11 | ||||
| -rw-r--r-- | binaryview.cpp | 30 | ||||
| -rw-r--r-- | python/binaryview.py | 24 | ||||
| -rw-r--r-- | rust/src/binaryview.rs | 24 |
5 files changed, 72 insertions, 28 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index b58db5cb..46e3fedf 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -4297,6 +4297,7 @@ namespace BinaryNinja { std::vector<std::string> GetLoadSettingsTypeNames(); Ref<Settings> GetLoadSettings(const std::string& typeName); void SetLoadSettings(const std::string& typeName, Ref<Settings> settings); + Ref<Settings> GetDefaultLoadSettings(const std::string& typeName, Ref<Settings> settings = nullptr); BNAnalysisParameters GetParametersForAnalysis(); void SetParametersForAnalysis(BNAnalysisParameters params); @@ -4407,11 +4408,11 @@ namespace BinaryNinja { class BinaryData : public BinaryView { public: - BinaryData(FileMetadata* file); - BinaryData(FileMetadata* file, const DataBuffer& data); - BinaryData(FileMetadata* file, const void* data, size_t len); - BinaryData(FileMetadata* file, const std::string& path); - BinaryData(FileMetadata* file, FileAccessor* accessor); + BinaryData(FileMetadata* file, bool setDefaultLoadSettings = false); + BinaryData(FileMetadata* file, const DataBuffer& data, bool setDefaultLoadSettings = false); + BinaryData(FileMetadata* file, const void* data, size_t len, bool setDefaultLoadSettings = false); + BinaryData(FileMetadata* file, const std::string& path, bool setDefaultLoadSettings = false); + BinaryData(FileMetadata* file, FileAccessor* accessor, bool setDefaultLoadSettings = false); }; class Platform; diff --git a/binaryninjacore.h b/binaryninjacore.h index e49a020b..f7d1a75f 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -3378,11 +3378,11 @@ extern "C" BINARYNINJACOREAPI BNRegisterValueWithConfidence BNGetGlobalPointerValue(BNBinaryView* view); // Raw binary data view - BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataView(BNFileMetadata* file); - BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromBuffer(BNFileMetadata* file, BNDataBuffer* buf); - BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromData(BNFileMetadata* file, const void* data, size_t len); - BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromFilename(BNFileMetadata* file, const char* filename); - BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromFile(BNFileMetadata* file, BNFileAccessor* accessor); + BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataView(BNFileMetadata* file, bool setDefaultLoadSettings); + BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromBuffer(BNFileMetadata* file, BNDataBuffer* buf, bool setDefaultLoadSettings); + BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromData(BNFileMetadata* file, const void* data, size_t len, bool setDefaultLoadSettings); + BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromFilename(BNFileMetadata* file, const char* filename, bool setDefaultLoadSettings); + BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromFile(BNFileMetadata* file, BNFileAccessor* accessor, bool setDefaultLoadSettings); // Creation of new types of binary views BINARYNINJACOREAPI BNBinaryView* BNCreateCustomBinaryView( @@ -6182,6 +6182,7 @@ extern "C" 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); + BINARYNINJACOREAPI BNSettings* BNBinaryViewGetDefaultLoadSettings(BNBinaryView* view, const char* typeName, BNSettings* settings); // Relocation object methods BINARYNINJACOREAPI BNRelocation* BNNewRelocationReference(BNRelocation* reloc); diff --git a/binaryview.cpp b/binaryview.cpp index b8dd7c1a..8b1fad53 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -4042,6 +4042,16 @@ void BinaryView::SetLoadSettings(const string& typeName, Ref<Settings> settings) } +Ref<Settings> BinaryView::GetDefaultLoadSettings(const string& typeName, Ref<Settings> settings) +{ + BNSettings* defaultSettings = + BNBinaryViewGetDefaultLoadSettings(m_object, typeName.c_str(), settings ? settings->GetObject() : nullptr); + if (!defaultSettings) + return nullptr; + return new Settings(defaultSettings); +} + + BNAnalysisParameters BinaryView::GetParametersForAnalysis() { return BNGetParametersForAnalysis(m_object); @@ -4189,26 +4199,28 @@ Ref<Symbol> Relocation::GetSymbol() const } -BinaryData::BinaryData(FileMetadata* file) : BinaryView(BNCreateBinaryDataView(file->GetObject())) {} +BinaryData::BinaryData(FileMetadata* file, bool setDefaultLoadSettings) : + BinaryView(BNCreateBinaryDataView(file->GetObject(), setDefaultLoadSettings)) +{} -BinaryData::BinaryData(FileMetadata* file, const DataBuffer& data) : - BinaryView(BNCreateBinaryDataViewFromBuffer(file->GetObject(), data.GetBufferObject())) +BinaryData::BinaryData(FileMetadata* file, const DataBuffer& data, bool setDefaultLoadSettings) : + BinaryView(BNCreateBinaryDataViewFromBuffer(file->GetObject(), data.GetBufferObject(), setDefaultLoadSettings)) {} -BinaryData::BinaryData(FileMetadata* file, const void* data, size_t len) : - BinaryView(BNCreateBinaryDataViewFromData(file->GetObject(), data, len)) +BinaryData::BinaryData(FileMetadata* file, const void* data, size_t len, bool setDefaultLoadSettings) : + BinaryView(BNCreateBinaryDataViewFromData(file->GetObject(), data, len, setDefaultLoadSettings)) {} -BinaryData::BinaryData(FileMetadata* file, const string& path) : - BinaryView(BNCreateBinaryDataViewFromFilename(file->GetObject(), path.c_str())) +BinaryData::BinaryData(FileMetadata* file, const string& path, bool setDefaultLoadSettings) : + BinaryView(BNCreateBinaryDataViewFromFilename(file->GetObject(), path.c_str(), setDefaultLoadSettings)) {} -BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor) : - BinaryView(BNCreateBinaryDataViewFromFile(file->GetObject(), accessor->GetCallbacks())) +BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor, bool setDefaultLoadSettings) : + BinaryView(BNCreateBinaryDataViewFromFile(file->GetObject(), accessor->GetCallbacks(), setDefaultLoadSettings)) {} diff --git a/python/binaryview.py b/python/binaryview.py index 02b1cc53..02255b95 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -1956,7 +1956,7 @@ class BinaryView: binaryninja._init_plugins() if file_metadata is None: file_metadata = filemetadata.FileMetadata() - _handle = core.BNCreateBinaryDataView(file_metadata.handle) + _handle = core.BNCreateBinaryDataView(file_metadata.handle, True) self._file = filemetadata.FileMetadata(handle=core.BNNewFileReference(file_metadata.handle)) else: binaryninja._init_plugins() @@ -2223,11 +2223,11 @@ class BinaryView: if isinstance(src, fileaccessor.FileAccessor): if file_metadata is None: file_metadata = filemetadata.FileMetadata() - view = core.BNCreateBinaryDataViewFromFile(file_metadata.handle, src._cb) + view = core.BNCreateBinaryDataViewFromFile(file_metadata.handle, src._cb, True) else: if file_metadata is None: file_metadata = filemetadata.FileMetadata(str(src)) - view = core.BNCreateBinaryDataViewFromFilename(file_metadata.handle, str(src)) + view = core.BNCreateBinaryDataViewFromFilename(file_metadata.handle, str(src), True) if view is None: return None return BinaryView(file_metadata=file_metadata, handle=view) @@ -2238,12 +2238,12 @@ class BinaryView: if file_metadata is None: file_metadata = filemetadata.FileMetadata() if data is None: - view = core.BNCreateBinaryDataView(file_metadata.handle) + view = core.BNCreateBinaryDataView(file_metadata.handle, True) elif isinstance(data, databuffer.DataBuffer): - view = core.BNCreateBinaryDataViewFromBuffer(file_metadata.handle, data.handle) + view = core.BNCreateBinaryDataViewFromBuffer(file_metadata.handle, data.handle, True) else: buf = databuffer.DataBuffer(data) - view = core.BNCreateBinaryDataViewFromBuffer(file_metadata.handle, buf.handle) + view = core.BNCreateBinaryDataViewFromBuffer(file_metadata.handle, buf.handle, True) if view is None: return None return BinaryView(file_metadata=file_metadata, handle=view) @@ -7808,6 +7808,18 @@ class BinaryView: settings = settings.handle core.BNBinaryViewSetLoadSettings(self.handle, type_name, settings) + def get_default_load_settings(self, type_name: str, settings: settings.Settings) -> None: + """ + ``get_default_load_settings`` retrieve a :py:class:`Settings` object which defines the load settings for the given :py:class:`BinaryViewType` ``type_name`` + + :param str type_name: the :py:class:`BinaryViewType` name + :param Settings settings: the load settings + :rtype: :py:class:`Settings`, or ``None`` + """ + if settings is not None: + settings = settings.handle + core.BNBinaryViewGetDefaultLoadSettings(self.handle, type_name, settings) + def parse_expression(self, expression: str, here: int = 0) -> int: r""" Evaluates a string expression to an integer value. diff --git a/rust/src/binaryview.rs b/rust/src/binaryview.rs index fa770b52..bee5914a 100644 --- a/rust/src/binaryview.rs +++ b/rust/src/binaryview.rs @@ -690,6 +690,24 @@ pub trait BinaryViewExt: BinaryViewBase { }; } + fn get_default_load_settings<S: BnStrCompatible>(&self, view_type_name: S, settings: &Settings) -> Result<Ref<Settings>>{ + let view_type_name = view_type_name.into_bytes_with_nul(); + + let settings_handle = unsafe { + BNBinaryViewGetDefaultLoadSettings( + self.as_ref().handle, + view_type_name.as_ref().as_ptr() as *mut _, + settings.handle, + ) + }; + + if settings_handle.is_null() { + Err(()) + } else { + Ok(unsafe { Settings::from_raw(settings_handle) }) + } + } + /// Creates a new [TagType] and adds it to the view. /// /// # Arguments @@ -912,7 +930,7 @@ impl BinaryView { let file = filename.into_bytes_with_nul(); let handle = unsafe { - BNCreateBinaryDataViewFromFilename(meta.handle, file.as_ref().as_ptr() as *mut _) + BNCreateBinaryDataViewFromFilename(meta.handle, file.as_ref().as_ptr() as *mut _, true) }; if handle.is_null() { @@ -924,7 +942,7 @@ impl BinaryView { pub fn from_accessor(meta: &FileMetadata, file: &mut FileAccessor) -> Result<Ref<Self>> { let handle = - unsafe { BNCreateBinaryDataViewFromFile(meta.handle, &mut file.api_object as *mut _) }; + unsafe { BNCreateBinaryDataViewFromFile(meta.handle, &mut file.api_object as *mut _, true) }; if handle.is_null() { return Err(()); @@ -935,7 +953,7 @@ impl BinaryView { pub fn from_data(meta: &FileMetadata, data: &[u8]) -> Result<Ref<Self>> { let handle = unsafe { - BNCreateBinaryDataViewFromData(meta.handle, data.as_ptr() as *mut _, data.len()) + BNCreateBinaryDataViewFromData(meta.handle, data.as_ptr() as *mut _, data.len(), true) }; if handle.is_null() { |
