From c69b76dd1a7e1985f58f71c07dfc8b7b0657f57a Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Sat, 3 Aug 2019 22:40:47 -0400 Subject: Add data flow query options --- mediumlevelil.cpp | 94 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 75 insertions(+), 19 deletions(-) (limited to 'mediumlevelil.cpp') diff --git a/mediumlevelil.cpp b/mediumlevelil.cpp index 6ce556f4..ce37f7e0 100644 --- a/mediumlevelil.cpp +++ b/mediumlevelil.cpp @@ -544,23 +544,37 @@ RegisterValue MediumLevelILFunction::GetExprValue(const MediumLevelILInstruction } -PossibleValueSet MediumLevelILFunction::GetPossibleSSAVarValues(const SSAVariable& var, size_t instr) -{ - BNPossibleValueSet value = BNGetMediumLevelILPossibleSSAVarValues(m_object, &var.var, var.version, instr); +PossibleValueSet MediumLevelILFunction::GetPossibleSSAVarValues(const SSAVariable& var, size_t instr, + const set& options) +{ + BNDataFlowQueryOption* optionArray = new BNDataFlowQueryOption[options.size()]; + size_t idx = 0; + for (auto i : options) + optionArray[idx++] = i; + BNPossibleValueSet value = BNGetMediumLevelILPossibleSSAVarValues(m_object, &var.var, var.version, instr, + optionArray, options.size()); + delete[] optionArray; return PossibleValueSet::FromAPIObject(value); } -PossibleValueSet MediumLevelILFunction::GetPossibleExprValues(size_t expr) +PossibleValueSet MediumLevelILFunction::GetPossibleExprValues(size_t expr, + const set& options) { - BNPossibleValueSet value = BNGetMediumLevelILPossibleExprValues(m_object, expr); + BNDataFlowQueryOption* optionArray = new BNDataFlowQueryOption[options.size()]; + size_t idx = 0; + for (auto i : options) + optionArray[idx++] = i; + BNPossibleValueSet value = BNGetMediumLevelILPossibleExprValues(m_object, expr, optionArray, options.size()); + delete[] optionArray; return PossibleValueSet::FromAPIObject(value); } -PossibleValueSet MediumLevelILFunction::GetPossibleExprValues(const MediumLevelILInstruction& expr) +PossibleValueSet MediumLevelILFunction::GetPossibleExprValues(const MediumLevelILInstruction& expr, + const set& options) { - return GetPossibleExprValues(expr.exprIndex); + return GetPossibleExprValues(expr.exprIndex, options); } @@ -608,16 +622,30 @@ RegisterValue MediumLevelILFunction::GetRegisterValueAfterInstruction(uint32_t r } -PossibleValueSet MediumLevelILFunction::GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr) +PossibleValueSet MediumLevelILFunction::GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr, + const set& options) { - BNPossibleValueSet value = BNGetMediumLevelILPossibleRegisterValuesAtInstruction(m_object, reg, instr); + BNDataFlowQueryOption* optionArray = new BNDataFlowQueryOption[options.size()]; + size_t idx = 0; + for (auto i : options) + optionArray[idx++] = i; + BNPossibleValueSet value = BNGetMediumLevelILPossibleRegisterValuesAtInstruction(m_object, reg, instr, + optionArray, options.size()); + delete[] optionArray; return PossibleValueSet::FromAPIObject(value); } -PossibleValueSet MediumLevelILFunction::GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr) +PossibleValueSet MediumLevelILFunction::GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr, + const set& options) { - BNPossibleValueSet value = BNGetMediumLevelILPossibleRegisterValuesAfterInstruction(m_object, reg, instr); + BNDataFlowQueryOption* optionArray = new BNDataFlowQueryOption[options.size()]; + size_t idx = 0; + for (auto i : options) + optionArray[idx++] = i; + BNPossibleValueSet value = BNGetMediumLevelILPossibleRegisterValuesAfterInstruction(m_object, reg, instr, + optionArray, options.size()); + delete[] optionArray; return PossibleValueSet::FromAPIObject(value); } @@ -636,16 +664,30 @@ RegisterValue MediumLevelILFunction::GetFlagValueAfterInstruction(uint32_t flag, } -PossibleValueSet MediumLevelILFunction::GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr) +PossibleValueSet MediumLevelILFunction::GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr, + const set& options) { - BNPossibleValueSet value = BNGetMediumLevelILPossibleFlagValuesAtInstruction(m_object, flag, instr); + BNDataFlowQueryOption* optionArray = new BNDataFlowQueryOption[options.size()]; + size_t idx = 0; + for (auto i : options) + optionArray[idx++] = i; + BNPossibleValueSet value = BNGetMediumLevelILPossibleFlagValuesAtInstruction(m_object, flag, instr, + optionArray, options.size()); + delete[] optionArray; return PossibleValueSet::FromAPIObject(value); } -PossibleValueSet MediumLevelILFunction::GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr) +PossibleValueSet MediumLevelILFunction::GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr, + const set& options) { - BNPossibleValueSet value = BNGetMediumLevelILPossibleFlagValuesAfterInstruction(m_object, flag, instr); + BNDataFlowQueryOption* optionArray = new BNDataFlowQueryOption[options.size()]; + size_t idx = 0; + for (auto i : options) + optionArray[idx++] = i; + BNPossibleValueSet value = BNGetMediumLevelILPossibleFlagValuesAfterInstruction(m_object, flag, instr, + optionArray, options.size()); + delete[] optionArray; return PossibleValueSet::FromAPIObject(value); } @@ -664,16 +706,30 @@ RegisterValue MediumLevelILFunction::GetStackContentsAfterInstruction(int32_t of } -PossibleValueSet MediumLevelILFunction::GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr) +PossibleValueSet MediumLevelILFunction::GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr, + const set& options) { - BNPossibleValueSet value = BNGetMediumLevelILPossibleStackContentsAtInstruction(m_object, offset, len, instr); + BNDataFlowQueryOption* optionArray = new BNDataFlowQueryOption[options.size()]; + size_t idx = 0; + for (auto i : options) + optionArray[idx++] = i; + BNPossibleValueSet value = BNGetMediumLevelILPossibleStackContentsAtInstruction(m_object, offset, len, instr, + optionArray, options.size()); + delete[] optionArray; return PossibleValueSet::FromAPIObject(value); } -PossibleValueSet MediumLevelILFunction::GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr) +PossibleValueSet MediumLevelILFunction::GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr, + const set& options) { - BNPossibleValueSet value = BNGetMediumLevelILPossibleStackContentsAfterInstruction(m_object, offset, len, instr); + BNDataFlowQueryOption* optionArray = new BNDataFlowQueryOption[options.size()]; + size_t idx = 0; + for (auto i : options) + optionArray[idx++] = i; + BNPossibleValueSet value = BNGetMediumLevelILPossibleStackContentsAfterInstruction(m_object, offset, len, instr, + optionArray, options.size()); + delete[] optionArray; return PossibleValueSet::FromAPIObject(value); } -- cgit v1.3.1