From 1c3762b59af1b949234cc9cc12a42a8fb3765b14 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Wed, 25 May 2016 02:02:00 -0400 Subject: Extending register value system to include ranges and lookup table values --- function.cpp | 45 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) (limited to 'function.cpp') diff --git a/function.cpp b/function.cpp index b8429998..7cc30351 100644 --- a/function.cpp +++ b/function.cpp @@ -143,27 +143,56 @@ vector Function::GetLowLevelILExitsForInstruction(Architecture* arch, ui } -BNRegisterValue Function::GetRegisterValueAtInstruction(Architecture* arch, uint64_t addr, uint32_t reg) +static RegisterValue GetRegisterValueFromAPIObject(BNRegisterValue& value) +{ + RegisterValue result; + result.state = value.state; + result.reg = value.reg; + result.value = value.value; + result.rangeStart = value.rangeStart; + result.rangeEnd = value.rangeEnd; + result.rangeStep = value.rangeStep; + if (value.state == LookupTableValue) + { + for (size_t i = 0; i < (size_t)value.rangeEnd; i++) + { + LookupTableEntry entry; + entry.fromValues.insert(entry.fromValues.end(), &value.table[i].fromValues[0], + &value.table[i].fromValues[value.table[i].fromCount]); + entry.toValue = value.table[i].toValue; + result.table.push_back(entry); + } + } + BNFreeRegisterValue(&value); + return result; +} + + +RegisterValue Function::GetRegisterValueAtInstruction(Architecture* arch, uint64_t addr, uint32_t reg) { - return BNGetRegisterValueAtInstruction(m_object, arch->GetObject(), addr, reg); + BNRegisterValue value = BNGetRegisterValueAtInstruction(m_object, arch->GetObject(), addr, reg); + return GetRegisterValueFromAPIObject(value); } -BNRegisterValue Function::GetRegisterValueAfterInstruction(Architecture* arch, uint64_t addr, uint32_t reg) +RegisterValue Function::GetRegisterValueAfterInstruction(Architecture* arch, uint64_t addr, uint32_t reg) { - return BNGetRegisterValueAfterInstruction(m_object, arch->GetObject(), addr, reg); + BNRegisterValue value = BNGetRegisterValueAfterInstruction(m_object, arch->GetObject(), addr, reg); + return GetRegisterValueFromAPIObject(value); } -BNRegisterValue Function::GetRegisterValueAtLowLevelILInstruction(size_t i, uint32_t reg) +RegisterValue Function::GetRegisterValueAtLowLevelILInstruction(size_t i, uint32_t reg) { - return BNGetRegisterValueAtLowLevelILInstruction(m_object, i, reg); + BNRegisterValue value = BNGetRegisterValueAtLowLevelILInstruction(m_object, i, reg); + return GetRegisterValueFromAPIObject(value); } -BNRegisterValue Function::GetRegisterValueAfterLowLevelILInstruction(size_t i, uint32_t reg) +RegisterValue Function::GetRegisterValueAfterLowLevelILInstruction(size_t i, uint32_t reg) { - return BNGetRegisterValueAfterLowLevelILInstruction(m_object, i, reg); + BNRegisterValue value = BNGetRegisterValueAfterLowLevelILInstruction(m_object, i, reg); + return GetRegisterValueFromAPIObject(value); } -- cgit v1.3.1