Возможно ли создать «универсальный» драйвер для исполнения произвольного кода в Ring0?
Здравствуйте! Возможно ли создание "универсального" драйвера, исполняющего произвольный код в нулевом кольце? Представляю работу так: драйверу передаётся указатель на функцию, он исполняет её в нулевом кольце, возвращает результат. Если такое возможно, то как это можно осуществить?
Или, может, есть возможность совершать действия в нулевом кольце без драйвера? Например, относительно недавно нашёл библиотеку (именно библиотеку, DLL-ку) для прямого доступа к портам ввода-вывода (inpout32.dll). Что характерно, библиотека работает без *.sys-файлов, без каких-либо дополнительных телодвижений на Win8.1 x64 (значит, есть какой-то способ получить доступ к Ring0 без драйвера, ведь порты - это же нулевой уровень привилегий!)
И, если доступ к портам получен, нельзя ли каким-либо аналогичным образом получить доступ к Ring0 в целом?
Это нужно не для чего-то серьёзного, а для пары-тройки инструкций, типа RDMSR/WRMSR/IN/OUT. Чтение\запись модельно-специфичных регистров для получения внутренней информации процессора (температура и частоты), доступ к отладочным регистрам, доступ к портам (для получения температуры с датчиков материнской платы, доступ к системной пищалке).
То есть, мне драйвер нужен не для установки нового оборудования - возможно, для этих целей получится обойтись без драйвера, как в случае доступа к портам.
Сразу оговорюсь, что С/С++ совершенно не знаю, пишу в Delphi 2007 и на Flat Assembler'e, пробовал писать драйвер по инструкции из RSDN, собирал MASM'овским линкером. Как бы то ни было, *.sys-файл получался, но установить его в систему так и не получилось. Возможно, в WinXP это бы получилось (не пробовал), но в Win8.1 x64 - нет.
В общем, если кто знает, как написать подобный драйвер с установщиком в систему, чтобы при этом не нужно было отключать проверку подписей (или что там блокирует установку произвольного драйвера) - буду рад услышать рациональные предложения.
WMI давно уже не определяет ничего из того, что мне нужно. Даже название процессора выдаёт в виде AMD Family ... вместо AMD FX-8150, а про термодатчики вообще не знает. Но даже если бы и знал, с его помощью достучаться до портов и отладочных регистров не получится. А что значит "подписать самоподписанным, а самоподписанный добавить в доеверенные"? Как это сделать?