diff options
| author | Brian Potchik <brian@vector35.com> | 2021-01-20 10:53:04 -0500 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2021-01-20 10:53:04 -0500 |
| commit | f1166563f54d28a745eb781dfe27c13a099bb7d9 (patch) | |
| tree | 7d34521fa7189085cd193bf45ca05ad1f9e91753 | |
| parent | 13f6e450824dbce2e73b9139dc7283ef903210d1 (diff) | |
Add get_lifted_ils_at API.
| -rw-r--r-- | binaryninjaapi.h | 1 | ||||
| -rw-r--r-- | binaryninjacore.h | 1 | ||||
| -rw-r--r-- | function.cpp | 14 | ||||
| -rw-r--r-- | python/function.py | 23 |
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() |
