summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2021-01-20 10:53:04 -0500
committerBrian Potchik <brian@vector35.com>2021-01-20 10:53:04 -0500
commitf1166563f54d28a745eb781dfe27c13a099bb7d9 (patch)
tree7d34521fa7189085cd193bf45ca05ad1f9e91753
parent13f6e450824dbce2e73b9139dc7283ef903210d1 (diff)
Add get_lifted_ils_at API.
-rw-r--r--binaryninjaapi.h1
-rw-r--r--binaryninjacore.h1
-rw-r--r--function.cpp14
-rw-r--r--python/function.py23
4 files changed, 39 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 28c5fed3..337a226f 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -3063,6 +3063,7 @@ __attribute__ ((format (printf, 1, 2)))
Ref<LowLevelILFunction> GetLiftedIL() const;
Ref<LowLevelILFunction> GetLiftedILIfAvailable() const;
size_t GetLiftedILForInstruction(Architecture* arch, uint64_t addr);
+ std::set<size_t> GetLiftedILInstructionsForAddress(Architecture* arch, uint64_t addr);
std::set<size_t> GetLiftedILFlagUsesForDefinition(size_t i, uint32_t flag);
std::set<size_t> GetLiftedILFlagDefinitionsForUse(size_t i, uint32_t flag);
std::set<uint32_t> GetFlagsReadByLiftedILInstruction(size_t i);
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 8069a549..30b4d18b 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -3110,6 +3110,7 @@ __attribute__ ((format (printf, 1, 2)))
BINARYNINJACOREAPI BNLowLevelILFunction* BNGetFunctionLiftedIL(BNFunction* func);
BINARYNINJACOREAPI BNLowLevelILFunction* BNGetFunctionLiftedILIfAvailable(BNFunction* func);
BINARYNINJACOREAPI size_t BNGetLiftedILForInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr);
+ BINARYNINJACOREAPI size_t* BNGetLiftedILInstructionsForAddress(BNFunction* func, BNArchitecture* arch, uint64_t addr, size_t* count);
BINARYNINJACOREAPI size_t* BNGetLiftedILFlagUsesForDefinition(BNFunction* func, size_t i, uint32_t flag, size_t* count);
BINARYNINJACOREAPI size_t* BNGetLiftedILFlagDefinitionsForUse(BNFunction* func, size_t i, uint32_t flag, size_t* count);
BINARYNINJACOREAPI uint32_t* BNGetFlagsReadByLiftedILInstruction(BNFunction* func, size_t i, size_t* count);
diff --git a/function.cpp b/function.cpp
index 805e9560..80f55fe6 100644
--- a/function.cpp
+++ b/function.cpp
@@ -558,6 +558,20 @@ size_t Function::GetLiftedILForInstruction(Architecture* arch, uint64_t addr)
}
+set<size_t> Function::GetLiftedILInstructionsForAddress(Architecture* arch, uint64_t addr)
+{
+ size_t count;
+ size_t* instrs = BNGetLiftedILInstructionsForAddress(m_object, arch->GetObject(), addr, &count);
+
+ set<size_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(instrs[i]);
+
+ BNFreeILInstructionList(instrs);
+ return result;
+}
+
+
set<size_t> Function::GetLiftedILFlagUsesForDefinition(size_t i, uint32_t flag)
{
size_t count;
diff --git a/python/function.py b/python/function.py
index 3cf27dc3..0c85ed19 100644
--- a/python/function.py
+++ b/python/function.py
@@ -2243,6 +2243,29 @@ class Function(object):
return self.lifted_il[idx]
+ def get_lifted_ils_at(self, addr, arch=None):
+ """
+ ``get_lifted_ils_at`` gets the Lifted IL Instruction(s) corresponding to the given virtual address
+
+ :param int addr: virtual address of the function to be queried
+ :param Architecture arch: (optional) Architecture for the given function
+ :rtype: list(LowLevelILInstruction)
+ :Example:
+
+ >>> func = bv.functions[0]
+ >>> func.get_lifted_ils_at(func.start)
+ [<il: push(rbp)>]
+ """
+ if arch is None:
+ arch = self.arch
+ count = ctypes.c_ulonglong()
+ instrs = core.BNGetLiftedILInstructionsForAddress(self.handle, arch.handle, addr, count)
+ result = []
+ for i in range(0, count.value):
+ result.append(self.lifted_il[instrs[i]])
+ core.BNFreeILInstructionList(instrs)
+ return result
+
def get_lifted_il_flag_uses_for_definition(self, i, flag):
flag = self.arch.get_flag_index(flag)
count = ctypes.c_ulonglong()