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.
vmemu/vmemu/vmemu_t.cpp

43 lines
1.0 KiB

#include "vmemu_t.hpp"
namespace vm
{
emu_t::emu_t(std::uint32_t vm_entry_rva,
std::uintptr_t image_base, std::uintptr_t module_base)
:
module_base(module_base),
image_base(image_base),
vm_entry_rva(vm_entry_rva)
{
auto err = uc_open(UC_ARCH_X86, UC_MODE_64, &uc);
if (err)
throw std::exception("failed to init unicorn", err);
const auto image_size =
NT_HEADER(module_base)->OptionalHeader.SizeOfImage;
const auto vm_entry = vm_entry_rva + module_base;
constexpr auto stack_addr = 0x1000000;
// allocate space for module...
uc_mem_map(uc, module_base, image_size, UC_PROT_ALL);
// allocate 6 pages for stack...
uc_mem_map(uc, stack_addr, 0x1000 * 6, UC_PROT_READ | UC_PROT_WRITE);
// write the module into memory...
uc_mem_write(uc, module_base, reinterpret_cast<void*>(module_base), image_size);
// set vm_entry into RIP...
uc_reg_write(uc, UC_X86_REG_RIP, &vm_entry);
// set stack address up...
uc_reg_write(uc, UC_X86_REG_RSP, &stack_addr);
}
emu_t::~emu_t()
{
uc_close(uc);
}
}