- Статус
- Оффлайн
- Регистрация
- 15 Фев 2020
- Сообщения
- 279
- Реакции
- 60
шапка, установка UC_CPU_X86_SKYLAKE_SERVER, установка OSXSAVE в 1, а также установка EM в 0, привели к тому что CPUID с параметром 1 возвращает ECX=0xced82203, что по идее означает поддержку AVX/AVX2. но после попытки выполнения инструкции VMOVAPS ymm0, ymm1 происходит краш инструкцией int 29h где-то в vcruntime140d.dll
P.S. если попытаться выполнить обычную инструкцию, например MOV RAX, RCX, то выполнение всё равно крашнет также в vcruntime140d.dll, но в hook_code будет видно, что инструкция выполнилась, в случае же с VMOVAPS YMM0, YMM1 такого не происходит.
C++:
void emulate( )
{
auto uc = static_cast< uc_engine * >( 0 );
uc_open( UC_ARCH_X86, UC_MODE_64, &uc );
auto err = uc_ctl_set_cpu_model( uc, UC_CPU_X86_SKYLAKE_SERVER );
auto code_hook = uc_hook( );
uc_hook_add( uc, &code_hook, UC_HOOK_CODE, hook_code, 0, 1, 0 );
uc_mem_map( uc, 0x10000, 0x1000, UC_PROT_ALL );
uc_mem_write( uc, 0x10000, "\xC5\xFC\x28\xC1", 4 );
auto cr4 = uint64_t( ), cr0 = uint64_t( );
uc_reg_read( uc, UC_X86_REG_CR4, &cr4 );
cr4 |= ( 1ull << 18 );
uc_reg_write( uc, UC_X86_REG_CR4, &cr4 );
uc_reg_read( uc, UC_X86_REG_CR0, &cr0 );
cr0 &= ~( 1ull << 2 );
uc_reg_write( uc, UC_X86_REG_CR0, &cr0 );
uc_emu_start( uc, 0x10000, 0, 0, 0 );
uc_close( uc );
}