Я пишу код AC с встроенным кодом ассемблера, чтобы прочитать MSR, но не удалось
Я использую следующий код для чтения MSR, но он разбился при запуске. Я не знаю почему.
#include <stdio.h>
#include <stdlib.h>
int main()
{
register long ecx asm("%ecx");
register long eax asm("%eax");
register long edx asm("%edx");
asm("mov %1, %0":"=r"(ecx):"i"(0x1B0));
asm("rdmsr");
/*
asm("xor %1, %0":"+r"(eax):"r"(eax));
asm("xor %1, %0":"+r"(edx):"r"(edx));
asm("mov %1, %0":"=r"(eax):"i"(0x01));
printf("%ld %ld %ld",ecx,eax,edx);
*/
}
1 ответ
Вы можете использовать существующие WinRing0.sys
(32-разрядный) и WinRing0x64.sys
(64-разрядные) драйверы для разрешения доступа MSR из пространства пользователя. Вы можете найти копию здесь с открытой и разрешительной лицензией ("лицензия WinRing0").
В конечном итоге это предлагает вам IOCTL для чтения и записи сообщений из пространства пользователя. Вы можете найти код C#, который использует его здесь, но есть много других пользователей WinRing0
поэтому не должно быть недостатка в примерах.
Вы также можете написать свой собственный драйвер или скомпилировать один из нескольких других доступных, которые предлагают аналогичный доступ, но преимущество WinRin0
является то, что он уже подписан, процесс больше не доступен для отдельных лиц и, конечно, не является бесплатным.