diff --git a/include/vmprofiler.hpp b/include/vmprofiler.hpp index f2e5fad..4de31aa 100644 --- a/include/vmprofiler.hpp +++ b/include/vmprofiler.hpp @@ -38,6 +38,9 @@ namespace vm ADDQ, ADDDW, + SHLQ, + SHLDW, + MULQ, DIVQ, @@ -87,6 +90,9 @@ namespace vm extern vm::handler::profile_t addq; extern vm::handler::profile_t adddw; + extern vm::handler::profile_t shlq; + extern vm::handler::profile_t shldw; + extern vm::handler::profile_t nandq; extern vm::handler::profile_t nanddw; @@ -116,6 +122,8 @@ namespace vm &divq, + &shlq, &shldw, + &writeq, &writedw, &readq, diff --git a/src/vmprofiles/shl.cpp b/src/vmprofiles/shl.cpp new file mode 100644 index 0000000..a8b9aa7 --- /dev/null +++ b/src/vmprofiles/shl.cpp @@ -0,0 +1,160 @@ +#include "../../include/vmprofiler.hpp" + +namespace vm +{ + namespace handler + { + namespace profile + { + vm::handler::profile_t shlq = + { + // MOV RAX, [RBP] + // MOV CL, [RBP+0x8] + // SUB RBP, 0x6 + // SHL RAX, CL + // MOV [RBP+0x8], RAX + // PUSHFQ + // POP [RBP] + "SHLQ", SHLQ, NULL, + { + { + // MOV RAX, [RBP] + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_MOV && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[0].reg.value == ZYDIS_REGISTER_RAX && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[1].mem.base == ZYDIS_REGISTER_RBP; + }, + // MOV CL, [RBP+0x8] + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_MOV && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[0].reg.value == ZYDIS_REGISTER_CL && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[1].mem.base == ZYDIS_REGISTER_RBP && + instr.operands[1].mem.index == 0x8; + }, + // SUB RBP, 0x6 + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_SUB && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[0].reg.value == ZYDIS_REGISTER_RBP && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE && + instr.operands[1].imm.value.u == 0x6; + }, + // SHL RAX, CL + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_SHL && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[0].reg.value == ZYDIS_REGISTER_RAX && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[1].reg.value == ZYDIS_REGISTER_CL; + }, + // MOV [RBP+0x8], RAX + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_MOV && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[0].mem.base == ZYDIS_REGISTER_RBP && + instr.operands[0].mem.index == 0x8 && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[1].reg.value == ZYDIS_REGISTER_RAX; + }, + // PUSHFQ + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_PUSHFQ; + }, + // POP [RBP] + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_POP && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[0].mem.base == ZYDIS_REGISTER_RBP; + } + } + } + }; + + vm::handler::profile_t shldw = + { + // MOV EAX, [RBP] + // MOV CL, [RBP+0x4] + // SUB RBP, 0x6 + // SHL EAX, CL + // MOV [RBP+0x8], EAX + // PUSHFQ + // POP [RBP] + "SHLQ", SHLQ, NULL, + { + { + // MOV EAX, [RBP] + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_MOV && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[0].reg.value == ZYDIS_REGISTER_EAX && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[1].mem.base == ZYDIS_REGISTER_RBP; + }, + // MOV CL, [RBP+0x4] + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_MOV && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[0].reg.value == ZYDIS_REGISTER_CL && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[1].mem.base == ZYDIS_REGISTER_RBP && + instr.operands[1].mem.index == 0x4; + }, + // SUB RBP, 0x6 + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_SUB && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[0].reg.value == ZYDIS_REGISTER_RBP && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE && + instr.operands[1].imm.value.u == 0x6; + }, + // SHL EAX, CL + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_SHL && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[0].reg.value == ZYDIS_REGISTER_EAX && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[1].reg.value == ZYDIS_REGISTER_CL; + }, + // MOV [RBP+0x8], EAX + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_MOV && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[0].mem.base == ZYDIS_REGISTER_RBP && + instr.operands[0].mem.index == 0x8 && + instr.operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[1].reg.value == ZYDIS_REGISTER_EAX; + }, + // PUSHFQ + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_PUSHFQ; + }, + // POP [RBP] + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_POP && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[0].mem.base == ZYDIS_REGISTER_RBP; + } + } + } + }; + } + } +} \ No newline at end of file