diff --git a/include/interfaces/abstract/STARSOp.h b/include/interfaces/abstract/STARSOp.h index 495c7b0d5894e84f555380c8800e7f2fd532f8c8..067c6ba8858677b28237ec69aa579cdcef3834d8 100644 --- a/include/interfaces/abstract/STARSOp.h +++ b/include/interfaces/abstract/STARSOp.h @@ -71,6 +71,12 @@ class STARS_op_t virtual bool IsFarPointer(void) const = 0; virtual bool HasSegReg(void) const = 0; // Has a segment register + // Printing methods. + virtual void MDPrintSIBByte(void) = 0; // print x86 Scale/Indexreg/Basereg byte + + // Analysis methods. + virtual void MDExtractMemAddressFields(int &BaseReg, int &IndexReg, uint16_t &Scale, STARS_ea_t &Offset); + }; #endif diff --git a/include/interfaces/idapro/STARSOp.h b/include/interfaces/idapro/STARSOp.h index d221340adcd2c81281f2baeb6843d8eae385a9ee..5eaf2d154d086a4df53d90f98f30fde1a14cbaa1 100644 --- a/include/interfaces/idapro/STARSOp.h +++ b/include/interfaces/idapro/STARSOp.h @@ -87,7 +87,13 @@ class STARS_IDA_op_t : public STARS_op_t bool MDIsSpecialRegOpType(void) const { return ((m_Opnd.type >= o_trreg) && (m_Opnd.type <= o_ymmreg)); }; bool HasSegReg(void) const { return is_segreg(GetSegReg()); }; // Has a segment register - protected: + // Printing methods. + virtual void MDPrintSIBByte(void); // print x86 Scale/Indexreg/Basereg byte + + // Analysis methods. + virtual void MDExtractMemAddressFields(int &BaseReg, int &IndexReg, uint16_t &Scale, STARS_ea_t &Offset); + +protected: op_t m_Opnd; private: diff --git a/include/interfaces/irdb/STARSOp.h b/include/interfaces/irdb/STARSOp.h index 665f9af03b70f47a9eccead757eaa826d99bed39..647ee36b358f3350dd610324d0c404c4fafeca6b 100644 --- a/include/interfaces/irdb/STARSOp.h +++ b/include/interfaces/irdb/STARSOp.h @@ -229,6 +229,9 @@ class STARS_IRDB_op_t : public STARS_op_t } + // Printing methods. + virtual void MDPrintSIBByte(void); // print x86 Scale/Indexreg/Basereg byte + private: diff --git a/src/base/SMPDataFlowAnalysis.cpp b/src/base/SMPDataFlowAnalysis.cpp index 8cf77931bee52d1ada07e2a48fe52b1bd231d3b2..ce02591e86f7fa7b30dce4ffb2c3e5b1fb2a8f48 100644 --- a/src/base/SMPDataFlowAnalysis.cpp +++ b/src/base/SMPDataFlowAnalysis.cpp @@ -340,10 +340,10 @@ bool IsEqOp(const STARSOpndTypePtr &Opnd1, const STARSOpndTypePtr &Opnd2) // truth table: // // O1 O2 O1<O2 !(O1<O2) O2<O1 !(O2<O1) !(O1<O2)&&!(O2<O1) == - // 0 0 0 1 0 1 1 1 - // 0 1 1 0 0 0 0 0 - // 1 0 0 1 1 0 0 0 - // 1 1 0 1 0 0 1 1 + // 0 0 0 1 0 1 1 1 + // 0 1 1 0 0 0 0 0 + // 1 0 0 1 1 0 0 0 + // 1 1 0 1 0 0 1 1 return !(*Opnd1 < *Opnd2) && !(*Opnd2 < *Opnd1); } // end of function IsEqOp() @@ -672,23 +672,7 @@ void PrintDefUse(unsigned long feature, int OpNum) { // DEBUG print SIB info for an operand. void PrintSIB(const STARSOpndTypePtr &Opnd) { - int BaseReg; - int IndexReg; - uint16_t ScaleFactor; - STARS_ea_t offset; -#define NAME_LEN 5 - char BaseName[NAME_LEN] = {'N', 'o', 'n', 'e', '\0'}; - char IndexName[NAME_LEN] = {'N', 'o', 'n', 'e', '\0'}; - - MDExtractAddressFields(Opnd, BaseReg, IndexReg, ScaleFactor, offset); - - if (BaseReg != STARS_x86_R_none) - SMP_strncpy(BaseName, RegNames[BaseReg], NAME_LEN - 1); - - if (IndexReg != STARS_x86_R_none) { - SMP_strncpy(IndexName, RegNames[IndexReg], NAME_LEN -1); - } - SMP_msg(" Base %s Index %s Scale %d Flag4 %d", BaseName, IndexName, ScaleFactor, Opnd->GetSpecFlag4()); + Opnd->MDPrintSIBByte(); } // end PrintSIB() // Annotations: concisely print SIB info for an operand. diff --git a/src/interfaces/idapro/STARSIDAOp.cpp b/src/interfaces/idapro/STARSIDAOp.cpp index d740f3e50ea7ceac5c4fd69afdd58a3ceb3c191c..f78f26d7eeb480ff02013f670924c81972110734 100644 --- a/src/interfaces/idapro/STARSIDAOp.cpp +++ b/src/interfaces/idapro/STARSIDAOp.cpp @@ -211,3 +211,59 @@ void STARS_IDA_op_t::SetReg(uint16_t NewReg) { this->m_Opnd.reg = NewReg; this->SetByteWidth(GetRegSize(NewReg)); }; + +// DEBUG print SIB info for an operand. +void STARS_IDA_op_t::MDPrintSIBByte(void) { + int BaseReg; + int IndexReg; + uint16_t ScaleFactor; + STARS_ea_t offset; +#define NAME_LEN 5 + char BaseName[NAME_LEN] = { 'N', 'o', 'n', 'e', '\0' }; + char IndexName[NAME_LEN] = { 'N', 'o', 'n', 'e', '\0' }; + + this->MDExtractMemAddressFields(BaseReg, IndexReg, ScaleFactor, offset); + + if (BaseReg != STARS_x86_R_none) + SMP_strncpy(BaseName, RegNames[BaseReg], NAME_LEN - 1); + + if (IndexReg != STARS_x86_R_none) { + SMP_strncpy(IndexName, RegNames[IndexReg], NAME_LEN - 1); + } + SMP_msg(" Base %s Index %s Scale %d Flag4 %d", BaseName, IndexName, ScaleFactor, this->GetSpecFlag4()); +} // end PrintSIB() + +// Extract the base and index registers and scale factor and displacement from the +// memory operand. +void STARS_IDA_op_t::MDExtractMemAddressFields(int &BaseReg, int &IndexReg, uint16_t &Scale, STARS_ea_t &Offset) { + assert(this->IsMemOp()); + + Scale = 0; + BaseReg = STARS_x86_R_none; + IndexReg = STARS_x86_R_none; + Offset = this->GetAddr(); + + if (this->HasSIBByte()) { + BaseReg = this->MDGetSIBBaseReg(); + IndexReg = (int) this->MDGetSIBIndexReg(); + if (MD_STACK_POINTER_REG == IndexReg) // signifies no index register + IndexReg = STARS_x86_R_none; + if (STARS_x86_R_none != IndexReg) { + Scale = (uint16_t) this->GetSIBScaleFactor(); + } + if (STARS_x86_R_none != BaseReg) { + if ((BaseReg == MD_FRAME_POINTER_REG) && this->IsStaticMemOp()) { + BaseReg = STARS_x86_R_none; + // **!!** BaseReg allowed for o_mem with SIB byte??? + } + } + } + else { // no SIB byte; can have base reg but no index reg or scale factor + BaseReg = (int) this->GetReg(); // cannot be STARS_x86_R_none for no SIB case + if (this->IsStaticMemOp()) { + BaseReg = STARS_x86_R_none; // no Base register for o_mem operands + } + } + + return; +} // end of MDExtractMemAddressFields() diff --git a/src/interfaces/irdb/STARS_IRDB_Op.cpp b/src/interfaces/irdb/STARS_IRDB_Op.cpp index cf15cb62b108f6e1d84a953a8e12b564a77d423c..0bd99ac8f22fc14f0710c1fda7a1a14325b6624d 100644 --- a/src/interfaces/irdb/STARS_IRDB_Op.cpp +++ b/src/interfaces/irdb/STARS_IRDB_Op.cpp @@ -1,4 +1,5 @@ - +#include "base/SMPDataFlowAnalysis.h" +#include "interfaces/SMPDBInterface.h" #include "interfaces/irdb/STARSOp.h" #include <libIRDB-core.hpp> @@ -312,3 +313,58 @@ void STARS_IRDB_op_t::SetSIB(char value) operand.mem.scale=(STARS_RegNo)0; } +// DEBUG print SIB info for an operand. +void STARS_IRDB_op_t::MDPrintSIBByte(void) { + int BaseReg; + int IndexReg; + uint16_t ScaleFactor; + STARS_ea_t offset; +#define NAME_LEN 5 + char BaseName[NAME_LEN] = { 'N', 'o', 'n', 'e', '\0' }; + char IndexName[NAME_LEN] = { 'N', 'o', 'n', 'e', '\0' }; + + this->MDExtractMemAddressFields(BaseReg, IndexReg, ScaleFactor, offset); + + if (BaseReg != STARS_x86_R_none) + SMP_strncpy(BaseName, RegNames[BaseReg], NAME_LEN - 1); + + if (IndexReg != STARS_x86_R_none) { + SMP_strncpy(IndexName, RegNames[IndexReg], NAME_LEN - 1); + } + SMP_msg(" Base %s Index %s Scale %d ", BaseName, IndexName, ScaleFactor); +} // end PrintSIB() + +// Extract the base and index registers and scale factor and displacement from the +// memory operand. +void STARS_IRDB_op_t::MDExtractMemAddressFields(int &BaseReg, int &IndexReg, uint16_t &Scale, STARS_ea_t &Offset) { + assert(this->IsMemOp()); + + Scale = 0; + BaseReg = STARS_x86_R_none; + IndexReg = STARS_x86_R_none; + Offset = this->GetAddr(); + + if (this->HasSIBByte()) { + BaseReg = this->MDGetSIBBaseReg(); + IndexReg = (int) this->MDGetSIBIndexReg(); + if (MD_STACK_POINTER_REG == IndexReg) // signifies no index register + IndexReg = STARS_x86_R_none; + if (STARS_x86_R_none != IndexReg) { + Scale = (uint16_t) this->GetSIBScaleFactor(); + } + if (STARS_x86_R_none != BaseReg) { + if ((BaseReg == MD_FRAME_POINTER_REG) && this->IsStaticMemOp()) { + BaseReg = STARS_x86_R_none; + // **!!** BaseReg allowed for o_mem with SIB byte??? + } + } + } + else { // no SIB byte; can have base reg but no index reg or scale factor + BaseReg = (int) this->GetReg(); // cannot be STARS_x86_R_none for no SIB case + if (this->IsStaticMemOp()) { + BaseReg = STARS_x86_R_none; // no Base register for o_mem operands + } + } + + return; +} // end of MDExtractMemAddressFields()