Уязвимость в драйвере 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 вообще? Я не могу придумать ни одной причины, почему вы захотите сделать это в режиме ядра, если вы не являетесь частью ОС. Которым вы не являетесь.
В любом случае, я надеюсь, что это даст вам возможность продолжить. Мне не нравится этот вопрос, потому что нет достаточно близкого контекста, и поэтому я проголосовал за его закрытие (хотя я не проголосовал за него, потому что он действительно интересует меня).