У меня возникает вот такой вопрос, можно как-то отследить перезапись idt? У меня есть идея проверки значения регистра при каждом переключении задач. Таким образом я могу отследить какой процесс изменил значение в регистре и завершить его. Но перед тем как я буду реализовывать данный метод, какие подводные камни меня могут сподкать, сможет ли процесс за выделенный интервал процессорного времени перезаписать idt и заменить деспечера задач на свой собственный, такой, который не будет возобновлять значения idt, или иным способом мог бы обойти данную проверку? Мне важно знать как можно обойти эту проверку и что нужно сделать, что это не произошло? Если у кого есть другие идеи относительно контроля idt, я буду очень благодарным если ими поделитесь!
обойти проверку конкретно всегда можно просто подправив код, в котором у тебя эта проверка осуществляется. кроме того необязательно для перехвата идт нужно менять саму таблицу когда можно например сделать jump в начале функций-обработчиков
аа ты вообще хочешь смотреть не изменилось ли содержание регистра ну это вообще твой мониторинг тогда ничего не узнает что с прерываниями в системе творится
Да, я только хочу проверять или не изменилось значение в регистре. Саму же таблица можно бросить на страницу памяти с установленными флагами только на чтение, а на запись о данной странице в каталоге страниц можно поставить отладку при записи в данную ячейку памяти. А вот за перезапись самих обработчиков прерываний я не подумал. Здесь у меня возник вопрос, возможно не по теме, но можно ли отделить сигмент кода функции и записать его на отдельную страницу памяти и вообще ли это возможно и с чем мне придется иметь дело если это возможно?
Все эти костыли снимаются точно в обратной для их установки последовательности: снять брекпоинт на запись атрибута страницы, сбросить атрибут страницы, выправить идт, вернуть все на место, к чему все эти телодвижения? Понятно было бы если б это были какие-то каверзные трюки которые еще не отгадаешь как работают, тут-то ненадо ничего отгадывать Все эти антиперехваты в известной степени костыли потому что трамплин можно вставить и в другой функции которая вызывается внутри обработчика например или внутри функции внутри функции, а можно не трамплин а например подменить импорт какой-то функции ну и т.д. т.е. защититься от перехвата idt расставив везде костыли - зачем это нужно?
С этим мне все ясно, а как на счет аппаратной виртуализации, на этом уровне можно что-то сделать. Я читал только о синей пилюле, в google я не нашел нужную мне информацию о аппаратной виртуализации, правда искал только на русском с английским у меня не очень.
Здесь к сожалению все что я могу сейчас сказать, это то что твоя программа не пойдет на моем ноутбуке, если ты решишь использовать аппаратную виртуализацию :-(
Да, можно. Более подробно - в документации от Intel и AMD соответственно. Пример продукта можно посмотреть здесь - Hypersight Rootkit Detector.