You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
#include <vmprofiler.hpp>
|
|
|
|
|
|
|
|
namespace vm
|
|
|
|
{
|
|
|
|
namespace calc_jmp
|
|
|
|
{
|
|
|
|
bool get(const zydis_routine_t& vm_entry, zydis_routine_t& calc_jmp)
|
|
|
|
{
|
|
|
|
auto result = std::find_if(vm_entry.begin(), vm_entry.end(),
|
|
|
|
[](const zydis_instr_t& instr_data) -> bool
|
|
|
|
{
|
|
|
|
// mov/movsx/movzx rax/eax/ax/al, [rsi]
|
|
|
|
if (instr_data.instr.operand_count > 1 &&
|
|
|
|
(instr_data.instr.mnemonic == ZYDIS_MNEMONIC_MOV ||
|
|
|
|
instr_data.instr.mnemonic == ZYDIS_MNEMONIC_MOVSX ||
|
|
|
|
instr_data.instr.mnemonic == ZYDIS_MNEMONIC_MOVZX) &&
|
|
|
|
instr_data.instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER &&
|
|
|
|
util::reg::to64(instr_data.instr.operands[0].reg.value) == ZYDIS_REGISTER_RAX &&
|
|
|
|
instr_data.instr.operands[1].type == ZYDIS_OPERAND_TYPE_MEMORY &&
|
|
|
|
instr_data.instr.operands[1].mem.base == ZYDIS_REGISTER_RSI)
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
if (result == vm_entry.end())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
calc_jmp.insert(calc_jmp.end(), result, vm_entry.end());
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|