diff options
| author | Rusty Wagner <rusty@vector35.com> | 2017-02-25 00:25:36 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2017-02-25 00:25:36 -0500 |
| commit | 57a3ea491d2d819ab5415d8d7bdf7e9e505808fc (patch) | |
| tree | 5c516eed341b1d0022cfb8c35f1e783874fde5a2 | |
| parent | ba4bb6dbee0476d5c30d942ae978621af790d518 (diff) | |
Add APIs to access SSA-based data flow
| -rw-r--r-- | binaryninjaapi.h | 6 | ||||
| -rw-r--r-- | binaryninjacore.h | 7 | ||||
| -rw-r--r-- | function.cpp | 22 | ||||
| -rw-r--r-- | lowlevelil.cpp | 21 | ||||
| -rw-r--r-- | python/lowlevelil.py | 22 |
5 files changed, 67 insertions, 11 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 9bdaf5f5..9e8ce4c4 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1857,6 +1857,8 @@ namespace BinaryNinja int64_t value; // Offset for OffsetFromEntryValue, StackFrameOffset or RangeValue, value of register for ConstantValue uint64_t rangeStart, rangeEnd, rangeStep; // Range of register, inclusive std::vector<LookupTableEntry> table; + + static RegisterValue FromAPIObject(BNRegisterValue& value); }; class FunctionGraph; @@ -2170,6 +2172,10 @@ namespace BinaryNinja std::set<size_t> GetSSARegisterUses(uint32_t reg, size_t idx) const; std::set<size_t> GetSSAFlagUses(uint32_t flag, size_t idx) const; std::set<size_t> GetSSAMemoryUses(size_t idx) const; + + RegisterValue GetSSARegisterValue(uint32_t reg, size_t idx); + RegisterValue GetSSAFlagValue(uint32_t flag, size_t idx); + RegisterValue GetSSAStackContents(size_t memoryIndex, int64_t offset, size_t size); }; class FunctionRecognizer diff --git a/binaryninjacore.h b/binaryninjacore.h index f7fb2172..bb08c428 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2031,6 +2031,13 @@ extern "C" size_t* count); BINARYNINJACOREAPI size_t* BNGetLowLevelILSSAMemoryUses(BNLowLevelILFunction* func, size_t idx, size_t* count); + BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILSSARegisterValue(BNLowLevelILFunction* func, + uint32_t reg, size_t idx); + BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILSSAFlagValue(BNLowLevelILFunction* func, + uint32_t flag, size_t idx); + BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILSSAStackContents(BNLowLevelILFunction* func, + size_t memoryIndex, int64_t offset, size_t size); + // Types BINARYNINJACOREAPI BNType* BNCreateVoidType(void); BINARYNINJACOREAPI BNType* BNCreateBoolType(void); diff --git a/function.cpp b/function.cpp index b1d008ee..fe119c9d 100644 --- a/function.cpp +++ b/function.cpp @@ -166,7 +166,7 @@ vector<size_t> Function::GetLowLevelILExitsForInstruction(Architecture* arch, ui } -static RegisterValue GetRegisterValueFromAPIObject(BNRegisterValue& value) +RegisterValue RegisterValue::FromAPIObject(BNRegisterValue& value) { RegisterValue result; result.state = value.state; @@ -194,56 +194,56 @@ static RegisterValue GetRegisterValueFromAPIObject(BNRegisterValue& value) RegisterValue Function::GetRegisterValueAtInstruction(Architecture* arch, uint64_t addr, uint32_t reg) { BNRegisterValue value = BNGetRegisterValueAtInstruction(m_object, arch->GetObject(), addr, reg); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } RegisterValue Function::GetRegisterValueAfterInstruction(Architecture* arch, uint64_t addr, uint32_t reg) { BNRegisterValue value = BNGetRegisterValueAfterInstruction(m_object, arch->GetObject(), addr, reg); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } RegisterValue Function::GetRegisterValueAtLowLevelILInstruction(size_t i, uint32_t reg) { BNRegisterValue value = BNGetRegisterValueAtLowLevelILInstruction(m_object, i, reg); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } RegisterValue Function::GetRegisterValueAfterLowLevelILInstruction(size_t i, uint32_t reg) { BNRegisterValue value = BNGetRegisterValueAfterLowLevelILInstruction(m_object, i, reg); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } RegisterValue Function::GetStackContentsAtInstruction(Architecture* arch, uint64_t addr, int64_t offset, size_t size) { BNRegisterValue value = BNGetStackContentsAtInstruction(m_object, arch->GetObject(), addr, offset, size); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } RegisterValue Function::GetStackContentsAfterInstruction(Architecture* arch, uint64_t addr, int64_t offset, size_t size) { BNRegisterValue value = BNGetStackContentsAfterInstruction(m_object, arch->GetObject(), addr, offset, size); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } RegisterValue Function::GetStackContentsAtLowLevelILInstruction(size_t i, int64_t offset, size_t size) { BNRegisterValue value = BNGetStackContentsAtLowLevelILInstruction(m_object, i, offset, size); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } RegisterValue Function::GetStackContentsAfterLowLevelILInstruction(size_t i, int64_t offset, size_t size) { BNRegisterValue value = BNGetStackContentsAfterLowLevelILInstruction(m_object, i, offset, size); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } @@ -251,7 +251,7 @@ RegisterValue Function::GetParameterValueAtInstruction(Architecture* arch, uint6 { BNRegisterValue value = BNGetParameterValueAtInstruction(m_object, arch->GetObject(), addr, functionType ? functionType->GetObject() : nullptr, i); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } @@ -259,7 +259,7 @@ RegisterValue Function::GetParameterValueAtLowLevelILInstruction(size_t instr, T { BNRegisterValue value = BNGetParameterValueAtLowLevelILInstruction(m_object, instr, functionType ? functionType->GetObject() : nullptr, i); - return GetRegisterValueFromAPIObject(value); + return RegisterValue::FromAPIObject(value); } diff --git a/lowlevelil.cpp b/lowlevelil.cpp index d09db62c..999e35ee 100644 --- a/lowlevelil.cpp +++ b/lowlevelil.cpp @@ -739,3 +739,24 @@ set<size_t> LowLevelILFunction::GetSSAMemoryUses(size_t idx) const BNFreeLowLevelILInstructionList(instrs); return result; } + + +RegisterValue LowLevelILFunction::GetSSARegisterValue(uint32_t reg, size_t idx) +{ + BNRegisterValue value = BNGetLowLevelILSSARegisterValue(m_object, reg, idx); + return RegisterValue::FromAPIObject(value); +} + + +RegisterValue LowLevelILFunction::GetSSAFlagValue(uint32_t flag, size_t idx) +{ + BNRegisterValue value = BNGetLowLevelILSSAFlagValue(m_object, flag, idx); + return RegisterValue::FromAPIObject(value); +} + + +RegisterValue LowLevelILFunction::GetSSAStackContents(size_t memoryIndex, int64_t offset, size_t size) +{ + BNRegisterValue value = BNGetLowLevelILSSAStackContents(m_object, memoryIndex, offset, size); + return RegisterValue::FromAPIObject(value); +} diff --git a/python/lowlevelil.py b/python/lowlevelil.py index 564fef34..6c664cb4 100644 --- a/python/lowlevelil.py +++ b/python/lowlevelil.py @@ -1386,6 +1386,28 @@ class LowLevelILFunction(object): core.BNFreeLowLevelILInstructionList(instrs) return result + def get_ssa_reg_value(self, reg, index): + if isinstance(reg, str): + reg = self.arch.regs[reg].index + value = core.BNGetLowLevelILSSARegisterValue(self.handle, reg, index) + result = function.RegisterValue(self.arch, value) + core.BNFreeRegisterValue(value) + return result + + def get_ssa_flag_value(self, flag, index): + if isinstance(flag, str): + flag = self.arch.get_flag_by_name(flag) + value = core.BNGetLowLevelILSSAFlagValue(self.handle, flag, index) + result = function.RegisterValue(self.arch, value) + core.BNFreeRegisterValue(value) + return result + + def get_ssa_stack_contents(self, memory_index, offset, size): + value = core.BNGetLowLevelILSSAStackContents(self.handle, memory_index, offset, size) + result = function.RegisterValue(self.arch, value) + core.BNFreeRegisterValue(value) + return result + class LowLevelILBasicBlock(basicblock.BasicBlock): def __init__(self, view, handle, owner): |
