diff --git a/src/vmhandler.cpp b/src/vmhandler.cpp index 3b8a926..22b89fb 100644 --- a/src/vmhandler.cpp +++ b/src/vmhandler.cpp @@ -226,11 +226,11 @@ namespace vm if ( vprofile->imm_size != vm_handler->imm_size ) return false; + zydis_routine_t::iterator contains = vm_handler->instrs.begin(); + for ( auto &instr : vprofile->signature ) { - const auto contains = std::find_if( - vm_handler->instrs.begin(), vm_handler->instrs.end(), - + contains = std::find_if(contains, vm_handler->instrs.end(), [ & ]( zydis_instr_t &instr_data ) -> bool { return instr( instr_data.instr ); } ); if ( contains == vm_handler->instrs.end() ) diff --git a/src/vmprofiles/add.cpp b/src/vmprofiles/add.cpp index 8292dde..8982d8e 100644 --- a/src/vmprofiles/add.cpp +++ b/src/vmprofiles/add.cpp @@ -17,7 +17,8 @@ namespace vm []( 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[ 0 ].mem.base == ZYDIS_REGISTER_RBP && + instr.operands[ 0 ].mem.disp.value == 0x8 && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[ 1 ].reg.value == ZYDIS_REGISTER_RAX; }, @@ -43,7 +44,8 @@ namespace vm []( 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[ 0 ].mem.base == ZYDIS_REGISTER_RBP && + instr.operands[ 0 ].mem.disp.value == 0x8 && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[ 1 ].reg.value == ZYDIS_REGISTER_EAX; }, diff --git a/src/vmprofiles/mul.cpp b/src/vmprofiles/mul.cpp index d8b85e1..d1a0cf9 100644 --- a/src/vmprofiles/mul.cpp +++ b/src/vmprofiles/mul.cpp @@ -24,7 +24,7 @@ namespace vm instr.operands[ 0 ].reg.value == ZYDIS_REGISTER_RAX && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_MEMORY && instr.operands[ 1 ].mem.base == ZYDIS_REGISTER_RBP && - instr.operands[ 1 ].mem.index == 0x8; + instr.operands[ 1 ].mem.disp.value == 0x8; }, // SUB RBP, 0x8 []( const zydis_decoded_instr_t &instr ) -> bool { @@ -45,7 +45,7 @@ namespace vm 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[ 0 ].mem.disp.value == 0x8 && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[ 1 ].reg.value == ZYDIS_REGISTER_RDX; }, @@ -54,7 +54,7 @@ namespace vm 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 == 0x10 && + instr.operands[ 0 ].mem.disp.value == 0x10 && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[ 1 ].reg.value == ZYDIS_REGISTER_RAX; }, diff --git a/src/vmprofiles/nand.cpp b/src/vmprofiles/nand.cpp index f4bceca..fcbf681 100644 --- a/src/vmprofiles/nand.cpp +++ b/src/vmprofiles/nand.cpp @@ -33,7 +33,7 @@ namespace vm instr.operands[ 0 ].reg.value == ZYDIS_REGISTER_RDX && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_MEMORY && instr.operands[ 1 ].mem.base == ZYDIS_REGISTER_RBP && - instr.operands[ 1 ].mem.index == 0x8; + instr.operands[ 1 ].mem.disp.value == 0x8; }, // NOT RAX []( const zydis_decoded_instr_t &instr ) -> bool { @@ -88,7 +88,8 @@ namespace vm []( const zydis_decoded_instr_t &instr ) -> bool { return instr.mnemonic == ZYDIS_MNEMONIC_NOT && instr.operands[ 0 ].type == ZYDIS_OPERAND_TYPE_MEMORY && - instr.operands[ 0 ].size == 32 && instr.operands[ 0 ].mem.base == ZYDIS_REGISTER_RBP; + instr.operands[ 0 ].size == 32 && + instr.operands[ 0 ].mem.base == ZYDIS_REGISTER_RBP; }, // MOV AX, [RBP] []( const zydis_decoded_instr_t &instr ) -> bool { @@ -111,7 +112,7 @@ namespace vm return instr.mnemonic == ZYDIS_MNEMONIC_AND && instr.operands[ 0 ].type == ZYDIS_OPERAND_TYPE_MEMORY && instr.operands[ 0 ].mem.base == ZYDIS_REGISTER_RBP && - instr.operands[ 0 ].mem.index == 0x8 && + instr.operands[ 0 ].mem.disp.value == 0x8 && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[ 1 ].reg.value == ZYDIS_REGISTER_AX; }, diff --git a/src/vmprofiles/read.cpp b/src/vmprofiles/read.cpp index a05a92b..6a2ee42 100644 --- a/src/vmprofiles/read.cpp +++ b/src/vmprofiles/read.cpp @@ -7,20 +7,12 @@ namespace vm namespace profile { vm::handler::profile_t readq = { - // MOV RAX, [RBP] // MOV RAX, [RAX] // MOV [RBP], RAX "READQ", READQ, 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 RAX, [RAX] []( const zydis_decoded_instr_t &instr ) -> bool { return instr.mnemonic == ZYDIS_MNEMONIC_MOV && diff --git a/src/vmprofiles/shl.cpp b/src/vmprofiles/shl.cpp index a0355b8..939507f 100644 --- a/src/vmprofiles/shl.cpp +++ b/src/vmprofiles/shl.cpp @@ -32,7 +32,7 @@ namespace vm 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; + instr.operands[ 1 ].mem.disp.value == 0x8; }, // SUB RBP, 0x6 []( const zydis_decoded_instr_t &instr ) -> bool { @@ -55,7 +55,7 @@ namespace vm 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[ 0 ].mem.disp.value == 0x8 && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[ 1 ].reg.value == ZYDIS_REGISTER_RAX; }, @@ -96,7 +96,7 @@ namespace vm 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; + instr.operands[ 1 ].mem.disp.value == 0x4; }, // SUB RBP, 0x6 []( const zydis_decoded_instr_t &instr ) -> bool { @@ -119,7 +119,7 @@ namespace vm 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[ 0 ].mem.disp.value == 0x8 && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[ 1 ].reg.value == ZYDIS_REGISTER_EAX; }, diff --git a/src/vmprofiles/shr.cpp b/src/vmprofiles/shr.cpp index eadbf0c..e9ec812 100644 --- a/src/vmprofiles/shr.cpp +++ b/src/vmprofiles/shr.cpp @@ -32,7 +32,7 @@ namespace vm 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; + instr.operands[ 1 ].mem.disp.value == 0x8; }, // SUB RBP, 0x6 []( const zydis_decoded_instr_t &instr ) -> bool { @@ -55,7 +55,7 @@ namespace vm 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[ 0 ].mem.disp.value == 0x8 && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[ 1 ].reg.value == ZYDIS_REGISTER_RAX; }, diff --git a/src/vmprofiles/write.cpp b/src/vmprofiles/write.cpp index 14e4662..4c569ed 100644 --- a/src/vmprofiles/write.cpp +++ b/src/vmprofiles/write.cpp @@ -28,8 +28,8 @@ namespace vm instr.operands[ 0 ].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[ 0 ].reg.value == ZYDIS_REGISTER_RDX && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_MEMORY && - instr.operands[ 1 ].mem.base == ZYDIS_REGISTER_RBP && - instr.operands[ 1 ].mem.index == 0x8; + instr.operands[ 1 ].mem.base == ZYDIS_REGISTER_RBP && + instr.operands[ 1 ].mem.disp.value == 0x8; }, // ADD RBP, 0x10 []( const zydis_decoded_instr_t &instr ) -> bool { @@ -71,7 +71,7 @@ namespace vm instr.operands[ 0 ].reg.value == ZYDIS_REGISTER_EDX && instr.operands[ 1 ].type == ZYDIS_OPERAND_TYPE_MEMORY && instr.operands[ 1 ].mem.base == ZYDIS_REGISTER_RBP && - instr.operands[ 1 ].mem.index == 0x8; + instr.operands[ 1 ].mem.disp.value == 0x8; }, // ADD RBP, 0xC []( const zydis_decoded_instr_t &instr ) -> bool {