diff --git a/src/analyzer/main.cpp b/src/analyzer/main.cpp index 8e977b8f..27b854ee 100644 --- a/src/analyzer/main.cpp +++ b/src/analyzer/main.cpp @@ -492,8 +492,10 @@ namespace const auto& exe = *win_emu->mod_manager.executable; win_emu->emu().hook_instruction(x86_hookable_instructions::cpuid, [&] { - const auto rip = win_emu->emu().read_instruction_pointer(); - const auto leaf = win_emu->emu().reg(x86_register::eax); + auto& emu = win_emu->emu(); + + const auto rip = emu.read_instruction_pointer(); + const auto leaf = emu.reg(x86_register::eax); const auto mod = get_module_if_interesting(win_emu->mod_manager, options.modules, rip); if (mod.has_value() && (!concise_logging || context.cpuid_cache.insert({rip, leaf}).second)) @@ -502,6 +504,17 @@ namespace (*mod) ? (*mod)->name.c_str() : ""); } + if (leaf == 1) + { + // NOTE: We hard-code these values to disable SSE4.x + emu.reg(x86_register::eax, 0x000906EA); + emu.reg(x86_register::ebx, 0x00100800); + emu.reg(x86_register::ecx, 0xFFE2F38F); + emu.reg(x86_register::edx, 0xBFEBFBFF); + + return instruction_hook_continuation::skip_instruction; + } + return instruction_hook_continuation::run_instruction; });