Уязвимость в драйвере Capcom: Bluescreens на физическом ПК, но не на виртуальной машине

Я изучаю античит-механизмы в компьютерных играх, используя популярный драйвер Capcom с уязвимостью.

Вы можете передавать функции пользовательского режима драйверу Capcom через вызовы DeviceIoControl(), которые затем выполняются в контексте ядра.

Теперь я столкнулся со странной проблемой:

Я запускаю вызовы DeviceIoControl(), поскольку они также успешно выполняются многими другими. В моей виртуальной машине вызовы DeviceIoControl() также работают без проблем. Однако, когда я выполняю код на своем физическом ПК, я получаю синий экран с сообщением "SYSTEM_SERVICE_EXCEPTION".

Вот код, который правильно работает в виртуальной машине, но не на моем физическом ПК:

void __stdcall EmptyTestFunction(MmGetSystemRoutineAddress_t pMmGetSystemRoutineAddress, PVOID userData) {

}
DriverLoadingTest() {
    HANDLE device = OpenDevice("Htsysm72FB");

    CapcomCodePayload* codePayload = (CapcomCodePayload*)VirtualAlloc(nullptr, sizeof(CapcomCodePayload), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    BYTE codePayloadBuf[] = {
        0xE8, 0x08, 0x00, 0x00, 0x00,                               // CALL $+8 ; Skip 8 bytes, this puts the UserFunction into RAX
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,             // UserFunction address will be here
        0x48, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // MOV RDX, userData
        0x58,                                                       // POP RAX
        0xFF, 0x20                                                  // JMP [RAX]
    };

    *(ULONGLONG*)(codePayloadBuf + 5) = (ULONGLONG)EmptyTestFunction;
    *(ULONGLONG*)(codePayloadBuf + 15) = (ULONGLONG)0;

    codePayload->pointerToPayload = codePayload->payload;

    ZeroMemory(codePayload->payload, PAYLOAD_BUFFER_SIZE);
    CopyMemory(codePayload->payload, codePayloadBuf, sizeof(codePayloadBuf));

    status = 0x0;
    DWORD bytesReturned = 0x0;
    DeviceIoControl(device, IOCTL_RunPayload64, &codePayload->pointerToPayload, sizeof(ULONG_PTR), &status, sizeof(status), &bytesReturned, 0);
    printf("DeviceIoControl returned %08x\n", status);
}

Я делаю только ограниченный прогресс с аварийным дампом, потому что мне не хватает опыта. Сбой происходит каждый раз, когда выполняется следующая инструкция:

mov cr4, rax

С rax=0000000000070678

Код исключения: c0000096

Я вешаю аварийный дамп WinDbg "! Analysis -v" в конце моего поста.

Моя главная задача - выяснить, как я могу решить проблему сейчас, чтобы решить ее. Потому что ситуация, когда один и тот же код работает на виртуальной машине, а не на моем физическом ПК, для меня совершенно новая.

ссылка на аварийный дамп

2 ответа

Оказалось, что гипервизор Hyper-V запретил запись в регистр CR4, что привело к появлению синих экранов.

Я не знаю, если это конкретно, потому что я обращаюсь к ядру из драйвера Capcom. Другие модули ядра, вероятно, также получат доступ к регистру CR4? Если да, то это конкретно связано с драйвером Capcom. Поэтому, если у кого-то возникает такая же проблема, ему следует проверить, активировали ли они службу Hyper-V Hypervisor.

CR4 - это один из управляющих регистров x86, и вы явно что-то там видите, что вызывает исключение процессора.

Этот регистр состоит из набора битов флага, как описано здесь, поэтому давайте посмотрим, какие из них вы устанавливаете:

0x70678 = 1110000011001111000b, поэтому мы имеем следующее:

0   VME Virtual 8086 Mode Extensions - OFF (sounds OK)
1   PVI Protected-mode Virtual Interrupts - OFF
2   TSD Time Stamp Disable - OFF
3   DE  Debugging Extensions - ON
4   PSE Page Size Extension - ON
5   PAE Physical Address Extension - ON
6   MCE Machine Check Exception- ON
7   PGE Page Global Enabled - OFF
8   PCE Performance-Monitoring Counter enable - OFF
9   OSFXSR  Operating system support for FXSAVE and FXRSTOR instructions - ON
10  OSXMMEXCPT  Operating System Support for Unmasked SIMD Floating-Point Exceptions - ON
11  UMIP    User-Mode Instruction Prevention - OFF
12  LA57    (none specified) - OFF
13  VMXE    Virtual Machine Extensions Enable - OFF
14  SMXE    Safer Mode Extensions Enable - OFF
16  FSGSBASE    Enables the instructions RDFSBASE, RDGSBASE, WRFSBASE, and WRGSBASE - ON
17  PCIDE   PCID Enable - ON
18  OSXSAVE XSAVE and Processor Extended States Enable - ON
20  SMEP[4] Supervisor Mode Execution Protection Enable - OFF
21  SMAP    Supervisor Mode Access Prevention Enable - OFF
22  PKE Protection Key Enable - OFF

Таким образом, один из них расстраивает корзину с яблоками, и мои деньги были бы на битах 4 и / или 5.

ТЕМ НЕ МЕНИЕ. Почему код пытается установить CR4 вообще? Я не могу придумать ни одной причины, почему вы захотите сделать это в режиме ядра, если вы не являетесь частью ОС. Которым вы не являетесь.

В любом случае, я надеюсь, что это даст вам возможность продолжить. Мне не нравится этот вопрос, потому что нет достаточно близкого контекста, и поэтому я проголосовал за его закрытие (хотя я не проголосовал за него, потому что он действительно интересует меня).

Другие вопросы по тегам