From bce6c88c9eb1ae1aa33ef0affdb7dbda8814cf88 Mon Sep 17 00:00:00 2001 From: Brian Potchik Date: Thu, 14 Nov 2019 19:11:42 -0500 Subject: Initial dynamic rebasing support. --- binaryninjaapi.h | 3 +++ binaryninjacore.h | 3 +++ filemetadata.cpp | 14 ++++++++++++++ python/binaryview.py | 14 ++++++++++++++ ui/filecontext.h | 1 + 5 files changed, 35 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index fc225316..94bfb8cc 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -909,6 +909,9 @@ __attribute__ ((format (printf, 1, 2))) bool SaveAutoSnapshot(BinaryView* data, const std::function& progressCallback); + bool Rebase(BinaryView* data, uint64_t address); + bool Rebase(BinaryView* data, uint64_t address, const std::function& progressCallback); + void BeginUndoActions(); void CommitUndoActions(); diff --git a/binaryninjacore.h b/binaryninjacore.h index a9dae964..bd66661d 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2200,6 +2200,9 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI bool BNSaveAutoSnapshotWithProgress(BNBinaryView* data, void* ctxt, void (*progress)(void* ctxt, size_t progress, size_t total)); + BINARYNINJACOREAPI bool BNRebase(BNBinaryView* data, uint64_t address); + BINARYNINJACOREAPI bool BNRebaseWithProgress(BNBinaryView* data, uint64_t address, void* ctxt, void (*progress)(void* ctxt, size_t progress, size_t total)); + BINARYNINJACOREAPI char* BNGetOriginalFilename(BNFileMetadata* file); BINARYNINJACOREAPI void BNSetOriginalFilename(BNFileMetadata* file, const char* name); diff --git a/filemetadata.cpp b/filemetadata.cpp index d1d2ed2b..a10071c5 100644 --- a/filemetadata.cpp +++ b/filemetadata.cpp @@ -330,6 +330,20 @@ bool FileMetadata::SaveAutoSnapshot(BinaryView* data, } +bool FileMetadata::Rebase(BinaryView* data, uint64_t address) +{ + return BNRebase(data->GetObject(), address); +} + + +bool FileMetadata::Rebase(BinaryView* data, uint64_t address, const function& progressCallback) +{ + DatabaseProgressCallbackContext cb; + cb.func = progressCallback; + return BNRebaseWithProgress(data->GetObject(), address, &cb, DatabaseProgressCallback); +} + + void FileMetadata::BeginUndoActions() { BNBeginUndoActions(m_object); diff --git a/python/binaryview.py b/python/binaryview.py index 2663b677..4aa245d2 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -4870,6 +4870,20 @@ class BinaryView(object): """ core.BNReanalyzeAllFunctions(self.handle) + def rebase(self, address, progress_func = None): + """ + ``rebase`` rebase the binary view at the specified virtual address + + :param int address: virtual address of the start of the binary view + :return: boolean True on success, False on failure. + :rtype: bool + """ + if progress_func is None: + return core.BNRebase(self.handle, address) + else: + return core.BNRebaseWithProgress(self.handle, address, None, ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.c_ulonglong, ctypes.c_ulonglong)( + lambda ctxt, cur, total: progress_func(cur, total))) + def show_plain_text_report(self, title, contents): core.BNShowPlainTextReport(self.handle, title, contents) diff --git a/ui/filecontext.h b/ui/filecontext.h index 007dcfc4..6a4f13ee 100644 --- a/ui/filecontext.h +++ b/ui/filecontext.h @@ -56,6 +56,7 @@ public: BinaryViewRef createDataView(const QString& type); BinaryViewRef getDataView(const QString& type, bool createView = false); std::vector getAllDataViews(); + void refreshDataViewCache(); void setCurrentViewFrame(ViewFrame* view); -- cgit v1.3.1