From 741fb0538e0ac6ab14928f78697196803dbd2ed5 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Thu, 19 Dec 2019 16:04:11 -0500 Subject: LLIL_JUMP_TO/MLIL_JUMP_TO now contain mappings from address to destination instruction --- lowlevelilinstruction.h | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) (limited to 'lowlevelilinstruction.h') diff --git a/lowlevelilinstruction.h b/lowlevelilinstruction.h index af005943..206a51d9 100644 --- a/lowlevelilinstruction.h +++ b/lowlevelilinstruction.h @@ -158,6 +158,7 @@ namespace BinaryNinja SSARegisterStackLowLevelOperand, SSAFlagLowLevelOperand, IndexListLowLevelOperand, + IndexMapLowLevelOperand, ExprListLowLevelOperand, RegisterOrFlagListLowLevelOperand, SSARegisterListLowLevelOperand, @@ -218,7 +219,7 @@ namespace BinaryNinja OutputRegisterOrFlagListLowLevelOperandUsage, OutputSSARegisterOrFlagListLowLevelOperandUsage, SourceMemoryVersionsLowLevelOperandUsage, - TargetListLowLevelOperandUsage, + TargetsLowLevelOperandUsage, RegisterStackAdjustmentsLowLevelOperandUsage, OffsetLowLevelOperandUsage }; @@ -385,6 +386,33 @@ namespace BinaryNinja operator std::vector() const; }; + class LowLevelILIndexMap + { + struct ListIterator + { + LowLevelILIntegerList::const_iterator pos; + bool operator==(const ListIterator& a) const { return pos == a.pos; } + bool operator!=(const ListIterator& a) const { return pos != a.pos; } + bool operator<(const ListIterator& a) const { return pos < a.pos; } + ListIterator& operator++() { ++pos; ++pos; return *this; } + const std::pair operator*(); + }; + + LowLevelILIntegerList m_list; + + public: + typedef ListIterator const_iterator; + + LowLevelILIndexMap(LowLevelILFunction* func, const BNLowLevelILInstruction& instr, size_t count); + + const_iterator begin() const; + const_iterator end() const; + size_t size() const; + size_t operator[](uint64_t value) const; + + operator std::map() const; + }; + class LowLevelILInstructionList { struct ListIterator @@ -577,6 +605,7 @@ namespace BinaryNinja SSARegisterStack GetRawOperandAsPartialSSARegisterStackSource(size_t operand) const; SSAFlag GetRawOperandAsSSAFlag(size_t operand) const; LowLevelILIndexList GetRawOperandAsIndexList(size_t operand) const; + LowLevelILIndexMap GetRawOperandAsIndexMap(size_t operand) const; LowLevelILInstructionList GetRawOperandAsExprList(size_t operand) const; LowLevelILRegisterOrFlagList GetRawOperandAsRegisterOrFlagList(size_t operand) const; LowLevelILSSARegisterList GetRawOperandAsSSARegisterList(size_t operand) const; @@ -731,7 +760,7 @@ namespace BinaryNinja template LowLevelILRegisterOrFlagList GetOutputRegisterOrFlagList() const { return As().GetOutputRegisterOrFlagList(); } template LowLevelILSSARegisterOrFlagList GetOutputSSARegisterOrFlagList() const { return As().GetOutputSSARegisterOrFlagList(); } template LowLevelILIndexList GetSourceMemoryVersions() const { return As().GetSourceMemoryVersions(); } - template LowLevelILIndexList GetTargetList() const { return As().GetTargetList(); } + template LowLevelILIndexMap GetTargets() const { return As().GetTargets(); } template std::map GetRegisterStackAdjustments() const { return As().GetRegisterStackAdjustments(); } template void SetDestSSAVersion(size_t version) { As().SetDestSSAVersion(version); } @@ -796,7 +825,7 @@ namespace BinaryNinja LowLevelILRegisterOrFlagList GetOutputRegisterOrFlagList() const; LowLevelILSSARegisterOrFlagList GetOutputSSARegisterOrFlagList() const; LowLevelILIndexList GetSourceMemoryVersions() const; - LowLevelILIndexList GetTargetList() const; + LowLevelILIndexMap GetTargets() const; std::map GetRegisterStackAdjustments() const; }; @@ -828,6 +857,7 @@ namespace BinaryNinja SSARegisterStack GetSSARegisterStack() const; SSAFlag GetSSAFlag() const; LowLevelILIndexList GetIndexList() const; + LowLevelILIndexMap GetIndexMap() const; LowLevelILInstructionList GetExprList() const; LowLevelILSSARegisterList GetSSARegisterList() const; LowLevelILSSARegisterStackList GetSSARegisterStackList() const; @@ -1104,7 +1134,7 @@ namespace BinaryNinja template <> struct LowLevelILInstructionAccessor: public LowLevelILInstructionBase { LowLevelILInstruction GetDestExpr() const { return GetRawOperandAsExpr(0); } - LowLevelILIndexList GetTargetList() const { return GetRawOperandAsIndexList(1); } + LowLevelILIndexMap GetTargets() const { return GetRawOperandAsIndexMap(1); } }; template <> struct LowLevelILInstructionAccessor: public LowLevelILInstructionBase { -- cgit v1.3.1