#include 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; } } }