Использую sgdt/sidt для определения адреса GDT/IDT. Но вот проблема: вызываю 1 раз возвращается норм. значение 8003F400. Вызываю другой раз возвращается другое значение - F9515560. Одно из этих 2х значений. Делал дамп памяти по этим адресам, память различается несколькими байтами.
В 98-ой idt меняется, если я ничего не забыл. И тот, кто что-то перехватывает, вынужден обрабатывать сообщения от vmm в своем коде.
Ну и пусть себе меняется... Ты что делаешь ? Если перехват какого-нибудь int, то раз она меняется, то и тебе придется обработчик какой-то вешать. Так не только я делал, в реальной защите такое видел.
n0name Когда происходит попытка записи в область памяти ядра происходит Copy-On-Write, измененый модуль целиком копируется в область памяти "наглово" процесса.
Wolfgang 1. Хукать исключение(защита от записи) 2. В цикле смотреть не изменилось ли чего 2й способ помойму единственный в ринге 3
Ядро меняет соответствующие адреса с помощью lidt, lgdt. Соответственно надо эти комманды поискать и поставить бряки на них, иначе действительно только в цикле ждать изменения.
На самом деле на многопроцессорных системах у каждого проца своя таблица IDT. То есть вместо того, чтобы что-то хучить, достаточно определить, каким процом выполняется данный поток.
А не может быть это из-за использования HT? Я сразу не подумал. Вель для Винды это 2 проца. Возникает вопрос - для каждого процессора - своя GDT?
Можно проверить, задав через SetProcessAffinityMask чтобы процесс работал только на первом процессе, другое дело что сомнительно что таблицы IDT разных процессоров так "далеко" друг от друга отстоят, да и на GDT указатель в таком случае не должен менятся.