diff --git a/libtransform/include/transform.hpp b/libtransform/include/transform.hpp index fbd8e639eb906787212a08eb56defd11a97affb1..fc9e0bc79d06cb8c7e057e2a8d5b62ee4af077dd 100644 --- a/libtransform/include/transform.hpp +++ b/libtransform/include/transform.hpp @@ -7,12 +7,14 @@ #include <libIRDB-core.hpp> -using namespace std; -using namespace libIRDB; #include "MEDS_InstructionCheckAnnotation.hpp" #include "VirtualOffset.hpp" +using namespace std; +using namespace libIRDB; +using namespace MEDS_Annotation; + namespace libTransform { @@ -21,13 +23,10 @@ class Transform { public: Transform(VariantID_t *, VariantIR_t *, std::map<VirtualOffset, MEDS_InstructionCheckAnnotation> *p_annotations, set<std::string> *p_filteredFunctions); - protected: - enum Register { EAX, EBX, ECX, EDX, AX, BX, CX, DX }; - protected: void addInstruction(Instruction_t *p_instr, string p_dataBits, Instruction_t *p_fallThrough, Instruction_t *p_target); - void addPushRegister(Instruction_t *p_instr, Register, Instruction_t *p_fallThrough); - void addPopRegister(Instruction_t *p_instr, Register, Instruction_t *p_fallThrough); + void addPushRegister(Instruction_t *p_instr, Register::RegisterName, Instruction_t *p_fallThrough); + void addPopRegister(Instruction_t *p_instr, Register::RegisterName, Instruction_t *p_fallThrough); Instruction_t* addCallbackHandler(string p_detector, Instruction_t *p_instr); @@ -37,8 +36,8 @@ class Transform { VariantID_t* getVariantID() { return m_variantID; } VariantIR_t* getVariantIR() { return m_variantIR; } - std::map<VirtualOffset, MEDS_InstructionCheckAnnotation>* getAnnotations(); - set<std::string>* getFilteredFunctions();; + std::map<VirtualOffset, MEDS_InstructionCheckAnnotation>* getAnnotations() { return m_annotations; } + set<std::string>* getFilteredFunctions() { return m_filteredFunctions; } private: VariantID_t *m_variantID; diff --git a/libtransform/src/integertransform.cpp b/libtransform/src/integertransform.cpp index 5e1d97bd7048bdbdd87e53f46068915d128e240d..bdaee13e7aec04406605935826889a973db9c2f4 100644 --- a/libtransform/src/integertransform.cpp +++ b/libtransform/src/integertransform.cpp @@ -144,8 +144,8 @@ void IntegerTransform::addTruncationCheck32to16(Instruction_t *p_instruction, co Instruction_t* pop_eax_i = allocateNewInstruction(fileID, func); // start instrumentation - addPushRegister(push_ecx_i, ECX, push_eax_i); - addPushRegister(push_eax_i, EAX, movzx_i); + addPushRegister(push_ecx_i, Register::ECX, push_eax_i); + addPushRegister(push_eax_i, Register::EAX, movzx_i); // movzx ecx, word [esp + 2] ; copy upper 16 bits into ecx (zero-extend) dataBits.resize(7); @@ -180,10 +180,10 @@ void IntegerTransform::addTruncationCheck32to16(Instruction_t *p_instruction, co addInstruction(jecxz2_i, dataBits, addCallbackHandler(string(TRUNCATION_DETECTOR), pop_eax_i), pop_eax_i); // pop eax ; restore eax - addPopRegister(pop_eax_i, EAX, pop_ecx_i); + addPopRegister(pop_eax_i, Register::EAX, pop_ecx_i); // pop ecx ; restore ecx - addPopRegister(pop_ecx_i, ECX, p_instruction); + addPopRegister(pop_ecx_i, Register::ECX, p_instruction); } else if (p_annotation.isUnsigned()) { diff --git a/libtransform/src/transform.cpp b/libtransform/src/transform.cpp index 4acae47bda3d1b279bd6ec2ac8efc0f08a794b60..8aecae77fcc075caa23d1065ba7565f45444b383 100644 --- a/libtransform/src/transform.cpp +++ b/libtransform/src/transform.cpp @@ -1,6 +1,7 @@ #include "transform.hpp" using namespace libTransform; +using namespace MEDS_Annotation; Transform::Transform(VariantID_t *p_variantID, VariantIR_t *p_variantIR, std::map<VirtualOffset, MEDS_InstructionCheckAnnotation> *p_annotations, set<std::string> *p_filteredFunctions) { @@ -23,25 +24,25 @@ void Transform::addInstruction(Instruction_t *p_instr, string p_dataBits, Instru m_variantIR->GetInstructions().insert(p_instr); } -void Transform::addPushRegister(Instruction_t *p_instr, Register p_reg, Instruction_t *p_fallThrough) +void Transform::addPushRegister(Instruction_t *p_instr, Register::RegisterName p_reg, Instruction_t *p_fallThrough) { string dataBits; dataBits.resize(2); dataBits[0] = 0x66; - if (p_reg == EAX) + if (p_reg == Register::EAX) { dataBits[1] = 0x50; } - else if (p_reg == EBX) + else if (p_reg == Register::EBX) { dataBits[1] = 0x53; } - else if (p_reg == ECX) + else if (p_reg == Register::ECX) { dataBits[1] = 0x51; } - else if (p_reg == EDX) + else if (p_reg == Register::EDX) { dataBits[1] = 0x52; } @@ -53,25 +54,25 @@ void Transform::addPushRegister(Instruction_t *p_instr, Register p_reg, Instruct addInstruction(p_instr, dataBits, p_fallThrough, NULL); } -void Transform::addPopRegister(Instruction_t *p_instr, Register p_reg, Instruction_t *p_fallThrough) +void Transform::addPopRegister(Instruction_t *p_instr, Register::RegisterName p_reg, Instruction_t *p_fallThrough) { string dataBits; dataBits.resize(2); dataBits[0] = 0x66; - if (p_reg == EAX) + if (p_reg == Register::EAX) { dataBits[1] = 0x58; } - else if (p_reg == EBX) + else if (p_reg == Register::EBX) { dataBits[1] = 0x5b; } - else if (p_reg == ECX) + else if (p_reg == Register::ECX) { dataBits[1] = 0x59; } - else if (p_reg == EDX) + else if (p_reg == Register::EDX) { dataBits[1] = 0x5a; } diff --git a/libtransform/tests/Makefile b/libtransform/tests/Makefile index fc072935610f08102e806ff1c4015293a2be4d19..d838f24543177920f713c07995e2d1a4b74385f7 100644 --- a/libtransform/tests/Makefile +++ b/libtransform/tests/Makefile @@ -17,7 +17,7 @@ all: env_check ${exes} .o.exe: # ${PEASOUP_HOME}/tools/ps_link.sh $< -o $@ - gcc $< -o $@ + gcc -g $< -o $@ ${PEASOUP_HOME}/tools/ps_analyze.sh $@ $@ --step ilr=off --step concolic=off --step p1transform=off .c.o: diff --git a/libtransform/tests/mul.c b/libtransform/tests/mul.c index dcd54426f323972d0ddea78c63428fe0e45a648b..2b8adb3fa079b92fc2a08ba364c35d6eb29ec7b8 100644 --- a/libtransform/tests/mul.c +++ b/libtransform/tests/mul.c @@ -1,12 +1,11 @@ + int main(int argc, char **argv) { - int a = atoi(argv[1]); - int b = atoi(argv[2]); - - int c = a * b; + unsigned a = (unsigned) atoi(argv[1]); + unsigned b = (unsigned) atoi(argv[2]); + unsigned d = a * b; + printf("%u * %u = %u\n", a, b, d); - printf("%d * %d = %d\n", a, b, c); + printf("hello, how are you?"); - unsigned d = (unsigned)a * (unsigned)b; - printf("%u * %u = %u\n", (unsigned)a, (unsigned)b, d); }