summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-02-25 00:25:36 -0500
committerRusty Wagner <rusty@vector35.com>2017-02-25 00:25:36 -0500
commit57a3ea491d2d819ab5415d8d7bdf7e9e505808fc (patch)
tree5c516eed341b1d0022cfb8c35f1e783874fde5a2
parentba4bb6dbee0476d5c30d942ae978621af790d518 (diff)
Add APIs to access SSA-based data flow
-rw-r--r--binaryninjaapi.h6
-rw-r--r--binaryninjacore.h7
-rw-r--r--function.cpp22
-rw-r--r--lowlevelil.cpp21
-rw-r--r--python/lowlevelil.py22
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):