From dcb35c793852e29fb4b6ecc9bd223ae435de70da Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Tue, 25 May 2021 22:15:41 -0700 Subject: [PATCH] added more profiles --- include/vmprofiler.hpp | 148 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 146 insertions(+), 2 deletions(-) diff --git a/include/vmprofiler.hpp b/include/vmprofiler.hpp index a06ab93..415d4fe 100644 --- a/include/vmprofiler.hpp +++ b/include/vmprofiler.hpp @@ -22,7 +22,13 @@ namespace vm LCONSTBZXW, LCONSTBSXDW, LCONSTDWSXQ, - LCONSTWSXQ + LCONSTWSXQ, + LCONSTDW, + + PUSHVSP, + + ADDQ, + ADDDW }; enum extention_t @@ -416,6 +422,140 @@ namespace vm instr.operands[1].reg.value == ZYDIS_REGISTER_RAX; } } + }, + vm::handler::extention_t::sign_extend + }; + + inline vm::handler::profile_t lconstdw = + { + // SUB RBP, 4 + // MOV [RBP], EAX + "LCONSTDW", LCONSTDW, 32, + { + { + // SUB RBP, 4 + [](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 == 0x4; + }, + // MOV [RBP], 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[1].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[1].reg.value == ZYDIS_REGISTER_EAX; + } + } + } + }; + + inline vm::handler::profile_t pushvsp = + { + // MOV RAX, RBP + // SUB RBP, 8 + "PUSHVSP", PUSHVSP, 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_REGISTER && + instr.operands[1].reg.value == ZYDIS_REGISTER_RBP; + }, + // SUB RBP, 8 + [](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 == 0x8; + }, + // MOV [RBP], 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[1].type == ZYDIS_OPERAND_TYPE_REGISTER && + instr.operands[1].reg.value == ZYDIS_REGISTER_RAX; + } + } + } + }; + + inline vm::handler::profile_t addq = + { + // ADD [RBP+8], RAX + // PUSHFQ + // POP [RBP] + "ADDQ", ADDQ, NULL, + { + { + // ADD [RBP+8], RAX + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_ADD && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[1].mem.base == ZYDIS_REGISTER_RBP && + 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; + } + } + } + }; + + inline vm::handler::profile_t adddw = + { + // ADD [RBP+8], EAX + // PUSHFQ + // POP [RBP] + "ADDDW", ADDDW, NULL, + { + { + // ADD [RBP+8], EAX + [](const zydis_decoded_instr_t& instr) -> bool + { + return instr.mnemonic == ZYDIS_MNEMONIC_ADD && + instr.operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY && + instr.operands[1].mem.base == ZYDIS_REGISTER_RBP && + 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; + } + } } }; @@ -425,7 +565,11 @@ namespace vm &lregq, &lregdw, - &lconstq, &lconstbzxw, &lconstbsxdw, &lconstdwsxq, &lconstwsxq + &lconstq, &lconstbzxw, &lconstbsxdw, &lconstdwsxq, &lconstwsxq, &lconstdw, + + &pushvsp, + + &addq, &adddw }; } }