|
|
@ -5,9 +5,8 @@ profiler_t vmexit = {
|
|
|
|
"VMEXIT",
|
|
|
|
"VMEXIT",
|
|
|
|
mnemonic_t::vmexit,
|
|
|
|
mnemonic_t::vmexit,
|
|
|
|
{{// MOV RSP, VSP
|
|
|
|
{{// MOV RSP, VSP
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_MOV &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_MOV &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RSP &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RSP &&
|
|
|
@ -15,129 +14,113 @@ profiler_t vmexit = {
|
|
|
|
instr.operands[1].reg.value == vsp;
|
|
|
|
instr.operands[1].reg.value == vsp;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP R13
|
|
|
|
// POP R13
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R13;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R13;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP RCX
|
|
|
|
// POP RCX
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RCX;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RCX;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP RBP
|
|
|
|
// POP RBP
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RBP;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RBP;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP R8
|
|
|
|
// POP R8
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R8;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R8;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP R15
|
|
|
|
// POP R15
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R15;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R15;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP RDX
|
|
|
|
// POP RDX
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RDX;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RDX;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP RDI
|
|
|
|
// POP RDI
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RDI;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RDI;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP R11
|
|
|
|
// POP R11
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R11;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R11;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP RAX
|
|
|
|
// POP RAX
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RAX;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RAX;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP R9
|
|
|
|
// POP R9
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R9;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R9;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP RSI
|
|
|
|
// POP RSI
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RSI;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_RSI;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP R14
|
|
|
|
// POP R14
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R14;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R14;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP R12
|
|
|
|
// POP R12
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R12;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R12;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POP R11
|
|
|
|
// POP R11
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POP &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R11;
|
|
|
|
instr.operands[0].reg.value == ZYDIS_REGISTER_R11;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// POPFQ
|
|
|
|
// POPFQ
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POPFQ;
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_POPFQ;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// RET
|
|
|
|
// RET
|
|
|
|
[&](const zydis_reg_t vip,
|
|
|
|
[](const zydis_reg_t vip, const zydis_reg_t vsp,
|
|
|
|
const zydis_reg_t vsp,
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
const zydis_decoded_instr_t& instr) -> bool {
|
|
|
|
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_RET;
|
|
|
|
return instr.mnemonic == ZYDIS_MNEMONIC_RET;
|
|
|
|
}}},
|
|
|
|
}}},
|
|
|
|
[&](zydis_reg_t& vip, zydis_reg_t& vsp, hndlr_trace_t& hndlr)
|
|
|
|
[](zydis_reg_t& vip, zydis_reg_t& vsp, hndlr_trace_t& hndlr)
|
|
|
|
-> std::optional<vinstr_t> { return vinstr_t{mnemonic_t::vmexit}; }};
|
|
|
|
-> std::optional<vinstr_t> { return vinstr_t{mnemonic_t::vmexit}; }};
|
|
|
|
}
|
|
|
|
}
|