From 65c1ab279b34f11070a450de993886df9c7353ec Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Thu, 20 Jan 2022 13:16:29 -0500 Subject: Add support for mmlil_if_available --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 2 ++ function.cpp | 15 +++++++++++++++ python/function.py | 13 +++++++++++++ python/mediumlevelil.py | 1 + 5 files changed, 33 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 0fc38edd..c9cff3cf 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -3508,6 +3508,8 @@ __attribute__ ((format (printf, 1, 2))) Ref GetMediumLevelIL() const; Ref GetMediumLevelILIfAvailable() const; + Ref GetMappedMediumLevelIL() const; + Ref GetMappedMediumLevelILIfAvailable() const; Ref GetHighLevelIL() const; Ref GetHighLevelILIfAvailable() const; Ref GetLanguageRepresentation() const; diff --git a/binaryninjacore.h b/binaryninjacore.h index eb6833a4..c28490ab 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -3469,6 +3469,8 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI void BNFreeILInstructionList(size_t* list); BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetFunctionMediumLevelIL(BNFunction* func); BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetFunctionMediumLevelILIfAvailable(BNFunction* func); + BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetFunctionMappedMediumLevelIL(BNFunction* func); + BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetFunctionMappedMediumLevelILIfAvailable(BNFunction* func); BINARYNINJACOREAPI BNHighLevelILFunction* BNGetFunctionHighLevelIL(BNFunction* func); BINARYNINJACOREAPI BNHighLevelILFunction* BNGetFunctionHighLevelILIfAvailable(BNFunction* func); BINARYNINJACOREAPI BNLanguageRepresentationFunction* BNGetFunctionLanguageRepresentation(BNFunction* func); diff --git a/function.cpp b/function.cpp index 9123c19e..a7e4c154 100644 --- a/function.cpp +++ b/function.cpp @@ -675,6 +675,12 @@ Ref Function::GetMediumLevelIL() const } +Ref Function::GetMappedMediumLevelIL() const +{ + return new MediumLevelILFunction(BNGetFunctionMappedMediumLevelIL(m_object)); +} + + Ref Function::GetMediumLevelILIfAvailable() const { BNMediumLevelILFunction* function = BNGetFunctionMediumLevelILIfAvailable(m_object); @@ -684,6 +690,15 @@ Ref Function::GetMediumLevelILIfAvailable() const } +Ref Function::GetMappedMediumLevelILIfAvailable() const +{ + BNMediumLevelILFunction* function = BNGetFunctionMappedMediumLevelILIfAvailable(m_object); + if (!function) + return nullptr; + return new MediumLevelILFunction(function); +} + + Ref Function::GetHighLevelIL() const { return new HighLevelILFunction(BNGetFunctionHighLevelIL(m_object)); diff --git a/python/function.py b/python/function.py index 8bfd2405..e328fd04 100644 --- a/python/function.py +++ b/python/function.py @@ -877,6 +877,19 @@ class Function: return None return mediumlevelil.MediumLevelILFunction(self.arch, result, self) + @property + def mmlil(self) -> 'mediumlevelil.MediumLevelILFunction': + """Function mapped medium level IL (read-only)""" + return mediumlevelil.MediumLevelILFunction(self.arch, core.BNGetFunctionMappedMediumLevelIL(self.handle), self) + + @property + def mmlil_if_available(self) -> Optional['mediumlevelil.MediumLevelILFunction']: + """Function mapped medium level IL, or None if not loaded (read-only)""" + result = core.BNGetFunctionMappedMediumLevelILIfAvailable(self.handle) + if not result: + return None + return mediumlevelil.MediumLevelILFunction(self.arch, result, self) + @property def high_level_il(self) -> 'highlevelil.HighLevelILFunction': """Function high level IL (read-only)""" diff --git a/python/mediumlevelil.py b/python/mediumlevelil.py index 1a710c85..d7903fb2 100644 --- a/python/mediumlevelil.py +++ b/python/mediumlevelil.py @@ -18,6 +18,7 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. +from abc import abstractmethod import ctypes import struct from typing import Optional, List, Union, Mapping, Generator, NewType, Tuple, ClassVar -- cgit v1.3.1