From ae7753487db7e3cbd4d4c5b0f464a6868da42817 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Mon, 11 Jul 2016 04:44:55 -0400 Subject: Add APIs for querying data and code before address, and add settings parameter to linear disassembly position API --- binaryninjaapi.h | 5 ++++- binaryninjacore.h | 5 ++++- binaryview.cpp | 24 ++++++++++++++++++++++-- python/__init__.py | 17 ++++++++++++++--- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index cc17f56c..a3aba4b5 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -854,8 +854,11 @@ namespace BinaryNinja uint64_t GetNextFunctionStartAfterAddress(uint64_t addr); uint64_t GetNextBasicBlockStartAfterAddress(uint64_t addr); uint64_t GetNextDataAfterAddress(uint64_t addr); + uint64_t GetPreviousFunctionStartBeforeAddress(uint64_t addr); + uint64_t GetPreviousStartOfDataBeforeAddress(uint64_t addr); + uint64_t GetPreviousDataBeforeAddress(uint64_t addr); - LinearDisassemblyPosition GetLinearDisassemblyPositionForAddress(uint64_t addr); + LinearDisassemblyPosition GetLinearDisassemblyPositionForAddress(uint64_t addr, DisassemblySettings* settings); std::vector GetPreviousLinearDisassemblyLines(LinearDisassemblyPosition& pos, DisassemblySettings* settings); std::vector GetNextLinearDisassemblyLines(LinearDisassemblyPosition& pos, diff --git a/binaryninjacore.h b/binaryninjacore.h index e559ec9a..bed5c0d0 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -1394,9 +1394,12 @@ extern "C" BINARYNINJACOREAPI uint64_t BNGetNextFunctionStartAfterAddress(BNBinaryView* view, uint64_t addr); BINARYNINJACOREAPI uint64_t BNGetNextBasicBlockStartAfterAddress(BNBinaryView* view, uint64_t addr); BINARYNINJACOREAPI uint64_t BNGetNextDataAfterAddress(BNBinaryView* view, uint64_t addr); + BINARYNINJACOREAPI uint64_t BNGetPreviousFunctionStartBeforeAddress(BNBinaryView* view, uint64_t addr); + BINARYNINJACOREAPI uint64_t BNGetPreviousStartOfDataBeforeAddress(BNBinaryView* view, uint64_t addr); + BINARYNINJACOREAPI uint64_t BNGetPreviousDataBeforeAddress(BNBinaryView* view, uint64_t addr); BINARYNINJACOREAPI BNLinearDisassemblyPosition BNGetLinearDisassemblyPositionForAddress(BNBinaryView* view, - uint64_t addr); + uint64_t addr, BNDisassemblySettings* settings); BINARYNINJACOREAPI void BNFreeLinearDisassemblyPosition(BNLinearDisassemblyPosition* pos); BINARYNINJACOREAPI BNLinearDisassemblyLine* BNGetPreviousLinearDisassemblyLines(BNBinaryView* view, BNLinearDisassemblyPosition* pos, BNDisassemblySettings* settings, size_t* count); diff --git a/binaryview.cpp b/binaryview.cpp index 437c57a6..03beb3db 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1118,9 +1118,29 @@ uint64_t BinaryView::GetNextDataAfterAddress(uint64_t addr) } -LinearDisassemblyPosition BinaryView::GetLinearDisassemblyPositionForAddress(uint64_t addr) +uint64_t BinaryView::GetPreviousFunctionStartBeforeAddress(uint64_t addr) { - BNLinearDisassemblyPosition pos = BNGetLinearDisassemblyPositionForAddress(m_object, addr); + return BNGetPreviousFunctionStartBeforeAddress(m_object, addr); +} + + +uint64_t BinaryView::GetPreviousStartOfDataBeforeAddress(uint64_t addr) +{ + return BNGetPreviousStartOfDataBeforeAddress(m_object, addr); +} + + +uint64_t BinaryView::GetPreviousDataBeforeAddress(uint64_t addr) +{ + return BNGetPreviousDataBeforeAddress(m_object, addr); +} + + +LinearDisassemblyPosition BinaryView::GetLinearDisassemblyPositionForAddress(uint64_t addr, + DisassemblySettings* settings) +{ + BNLinearDisassemblyPosition pos = BNGetLinearDisassemblyPositionForAddress(m_object, addr, + settings ? settings->GetObject() : nullptr); LinearDisassemblyPosition result; result.function = pos.function ? new Function(pos.function) : nullptr; diff --git a/python/__init__.py b/python/__init__.py index cdced08c..ab45dfc0 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -1551,8 +1551,19 @@ class BinaryView(object): def get_next_data_after(self, addr): return core.BNGetNextDataAfterAddress(self.handle, addr) - def get_linear_disassembly_position_at(self, addr): - pos = core.BNGetLinearDisassemblyPositionForAddress(self.handle, addr) + def get_previous_function_start_before(self, addr): + return core.BNGetPreviousFunctionStartBeforeAddress(self.handle, addr) + + def get_previous_start_of_data_before(self, addr): + return core.BNGetPreviousStartOfDataBeforeAddress(self.handle, addr) + + def get_previous_data_before(self, addr): + return core.BNGetPreviousDataBeforeAddress(self.handle, addr) + + def get_linear_disassembly_position_at(self, addr, settings): + if settings is not None: + settings = settings.handle + pos = core.BNGetLinearDisassemblyPositionForAddress(self.handle, addr, settings) func = None block = None if pos.function: @@ -1622,7 +1633,7 @@ class BinaryView(object): self.settings = settings def __iter__(self): - pos = self.view.get_linear_disassembly_position_at(self.view.start) + pos = self.view.get_linear_disassembly_position_at(self.view.start, self.settings) while True: lines = self.view.get_next_linear_disassembly_lines(pos, self.settings) if len(lines) == 0: -- cgit v1.3.1