summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2017-11-10 17:42:28 -0500
committerPeter LaFosse <peter@vector35.com>2017-11-10 17:42:46 -0500
commit382b1353649472bc2088598b3b8b60c096c1e201 (patch)
treeceee64ee4d9f6561d4d314479d34ffae3f51268c
parentc4d8b6f18c094d98df4448bdaf14faa86b33cc86 (diff)
Add 'relocatable' property to BinaryView class
-rw-r--r--binaryninjaapi.h3
-rw-r--r--binaryninjacore.h2
-rw-r--r--binaryview.cpp19
-rw-r--r--python/binaryview.py26
4 files changed, 50 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index a6276b00..5f3aace7 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -1088,6 +1088,7 @@ namespace BinaryNinja
virtual uint64_t PerformGetEntryPoint() const { return 0; }
virtual bool PerformIsExecutable() const { return false; }
virtual BNEndianness PerformGetDefaultEndianness() const;
+ virtual bool PerformIsRelocatable() const;
virtual size_t PerformGetAddressSize() const;
virtual bool PerformSave(FileAccessor* file);
@@ -1115,6 +1116,7 @@ namespace BinaryNinja
static uint64_t GetEntryPointCallback(void* ctxt);
static bool IsExecutableCallback(void* ctxt);
static BNEndianness GetDefaultEndiannessCallback(void* ctxt);
+ static bool IsRelocatableCallback(void* ctxt);
static size_t GetAddressSizeCallback(void* ctxt);
static bool SaveCallback(void* ctxt, BNFileAccessor* file);
@@ -1181,6 +1183,7 @@ namespace BinaryNinja
void SetDefaultPlatform(Platform* platform);
BNEndianness GetDefaultEndianness() const;
+ bool IsRelocatable() const;
size_t GetAddressSize() const;
bool IsExecutable() const;
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 870c2de3..45e6310c 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -935,6 +935,7 @@ extern "C"
uint64_t (*getEntryPoint)(void* ctxt);
bool (*isExecutable)(void* ctxt);
BNEndianness (*getDefaultEndianness)(void* ctxt);
+ bool (*isRelocatable)(void* ctxt);
size_t (*getAddressSize)(void* ctxt);
bool (*save)(void* ctxt, BNFileAccessor* accessor);
};
@@ -1777,6 +1778,7 @@ extern "C"
BINARYNINJACOREAPI BNPlatform* BNGetDefaultPlatform(BNBinaryView* view);
BINARYNINJACOREAPI void BNSetDefaultPlatform(BNBinaryView* view, BNPlatform* platform);
BINARYNINJACOREAPI BNEndianness BNGetDefaultEndianness(BNBinaryView* view);
+ BINARYNINJACOREAPI bool BNIsRelocatable(BNBinaryView* view);
BINARYNINJACOREAPI size_t BNGetViewAddressSize(BNBinaryView* view);
BINARYNINJACOREAPI bool BNIsViewModified(BNBinaryView* view);
diff --git a/binaryview.cpp b/binaryview.cpp
index 213be79a..0a082458 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -288,6 +288,7 @@ BinaryView::BinaryView(const std::string& typeName, FileMetadata* file, BinaryVi
view.getEntryPoint = GetEntryPointCallback;
view.isExecutable = IsExecutableCallback;
view.getDefaultEndianness = GetDefaultEndiannessCallback;
+ view.isRelocatable = IsRelocatableCallback;
view.getAddressSize = GetAddressSizeCallback;
view.save = SaveCallback;
@@ -431,6 +432,13 @@ BNEndianness BinaryView::GetDefaultEndiannessCallback(void* ctxt)
}
+bool BinaryView::IsRelocatableCallback(void* ctxt)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->PerformIsRelocatable();
+}
+
+
size_t BinaryView::GetAddressSizeCallback(void* ctxt)
{
BinaryView* view = (BinaryView*)ctxt;
@@ -494,6 +502,11 @@ BNEndianness BinaryView::PerformGetDefaultEndianness() const
}
+bool BinaryView::PerformIsRelocatable() const
+{
+ return false;
+}
+
size_t BinaryView::PerformGetAddressSize() const
{
Ref<Architecture> arch = GetDefaultArchitecture();
@@ -836,6 +849,12 @@ BNEndianness BinaryView::GetDefaultEndianness() const
}
+bool BinaryView::IsRelocatable() const
+{
+ return BNIsRelocatable(m_object);
+}
+
+
size_t BinaryView::GetAddressSize() const
{
return BNGetViewAddressSize(m_object);
diff --git a/python/binaryview.py b/python/binaryview.py
index e6cb5b04..9f149ba8 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -583,6 +583,7 @@ class BinaryView(object):
self._cb.getEntryPoint = self._cb.getEntryPoint.__class__(self._get_entry_point)
self._cb.isExecutable = self._cb.isExecutable.__class__(self._is_executable)
self._cb.getDefaultEndianness = self._cb.getDefaultEndianness.__class__(self._get_default_endianness)
+ self._cb.isRelocatable = self._cb.isRelocatable.__class__(self._is_relocatable)
self._cb.getAddressSize = self._cb.getAddressSize.__class__(self._get_address_size)
self._cb.save = self._cb.save.__class__(self._save)
self.file = file_metadata
@@ -839,6 +840,11 @@ class BinaryView(object):
return Endianness(core.BNGetDefaultEndianness(self.handle))
@property
+ def relocatable(self):
+ """Boolean - is the binary relocatable (read-only)"""
+ return core.BNIsRelocatable(self.handle)
+
+ @property
def address_size(self):
"""Address size of the binary (read-only)"""
return core.BNGetViewAddressSize(self.handle)
@@ -1202,6 +1208,13 @@ class BinaryView(object):
log.log_error(traceback.format_exc())
return Endianness.LittleEndian
+ def _is_relocatable(self, ctxt):
+ try:
+ return self.perform_is_relocatable()
+ except:
+ log.log_error(traceback.format_exc())
+ return False
+
def _get_address_size(self, ctxt):
try:
return self.perform_get_address_size()
@@ -1494,6 +1507,19 @@ class BinaryView(object):
"""
return Endianness.LittleEndian
+ def perform_is_relocatable(self):
+ """
+ ``perform_is_relocatable`` implements a check which returns true if the BinaryView is relocatable. Defaults to
+ True.
+
+ .. note:: This method **may** be implemented for custom BinaryViews that are relocatable.
+ .. warning:: This method **must not** be called directly.
+
+ :return: True if the BinaryView is relocatable, False otherwise
+ :rtype: boolean
+ """
+ return True
+
def create_database(self, filename, progress_func=None):
"""
``create_database`` writes the current database (.bndb) file out to the specified file.