добрый вечер. начал читать тут некоторые статьи о драйверах режима ядра и возник вопрос имеет ли смысл писать драйверы (чтобы, например, отключить антивирус=)), разве нельзя попасть в ринг0 с помощью sysenter и вызывать нативАпи ?...в чем проблема?
Нет нельзя. Внимательно почитай про архитектуру Windows, уровни привилегий. А так вопрос из рубрики "Юмор".
На самом деле вопрос автора не лишен смысла и ответ - можно =) Через одну функцию юзермодную можно установить MSR, заведующий SYSENTER'ом, любым значением, в том числе и адресом своего кода, в котором уже делать что угодно. Драйвер не нужен.
rei3er Ну естественно =) Ну в принципе аналог написания драйвера.. только драйвер лишний не светится. А по привилегиям так же
ну код то будет работать в адресном пространстве процесса, а не ядра и все адреса функций придется искать вручную или нет? (я просто не очень вкурсе внутреннего устройства Windows и в частности написания драйверов)
Это да. Зато селектор CS будет ядерный =) Ну это тоже да =) Ну а что в этом такого =) Можно заранее перед переключением вычислить все смещения через LoadLibrary/GetProcAddress, а там просто надыбать базу ядра и сложить смещения с ней. Надыбать базу ядра как-нибудь через FS, значение которого в ядре другое.
однако FS автоматом при sysenter не меняется поэтому еще нужно знать значение соответствующего селектора
+ как мы узнаем адрес стека ядра текущего потока? Или при переключении потоков меняется MSR для ESP? да, еще один вопрос, в стеке ядра потока лежит какая-нибудь важная системная информация? (если проводить аналогию с Linux, то там непосредственно перед стеком лежит структура thread_info, отвечающая за идентификацию процесса, и доступ к ней идет как раз через ESP (ESP & ~KSTACK_SIZE), KSTACK_SIZE = 4096 или 8192)
Но зато оно фиксировано =) При SYSENTER стек меняется, естественно =) Ээ это надо методом тыка изучать =)
гы, если задачу решать в общем случае, такой вариант не пойдет, ну то есть где брать селектор даже если он фиксирован? я не это имею в виду естественно SS и ESP меняются на те значения, которые лежат в соответствующих MSR-ах вопрос в том, меняются ли сами значения в MSR-ах при переключении потоков (чтобы после sysenter из любого потока попасть куда надо)
Например прочитать оригинальный обработчик, он должен его как-то ставить?) Ну или просто забить, насколько я помню, он от версии к версии не меняется А зачем менять значения в MSRах?
ну как, смотри если ESP в соответствующем MSR не меняется, то как мы узнаем адрес стека ядра потока после sysenter? нет, если в нем ничего важного не хранится, то да, ESP не критичен и можно без него обойтись, в противном случае (как в Linux) рано или поздно жестко зависним (kernel panic)
На время работы в ядре лучше запретить переключение потоков =) С этим всегда проблемы в таких делах мб адрес пользовательского стека все-атки?
все, насчет адресов стеков ядра решение нашел в исходниках Linux Код (Text): sysenter_entry: mov esp, dword [esp + TSS_sysenter_esp0] ... видно есть некий кусок памяти, где находится некоторая системная информация адрес этой области помещается в MSR ESP, по некоторому смещению в ней (TSS_sysenter_esp0) находится адрес стека ядра процесса, который меняется при переключении контекста ну это легко Код (Text): push eax mov eax, esp sysenter
Насчет того же в винде мне ничего не известно =) Нужно смотреть стек ядра под отладчиком и ковырять истинный обработчик sysenter Да уж =)