Здраствуйте! У меня вот такой вопрос, мне нужно защитить страницу памяти в защищенном режиме в нулевом кольце. Для страничной памяти предусмотрены права доступа на чтение и запись, но насколько я понял они действуют только для разных уровней превилегий, на нулевом все и всем разрешено как на чтение так и на запись, возможна я и ошибаюсь, но вопрос от этого не меняется, можно защитить страницу на запись?
5.6.4 Write Protect (CR0.WP) Bit The ability to write to read-only pages is governed by the processor mode and whether write protection is enabled. If write protection is not enabled, a processor running at CPL 0, 1, or 2 can write to any physical page, even if it is marked as readonly. Enabling write protection prevents supervisor code from writing into read-only pages, including read-only user-level pages. A page-fault exception (#PF) occurs if software attempts to write (at any privilege level) into a read-only page while write protection is enabled.
Этим способом можно защитить страницу от записи, но можно ли защитить таблицу? Можно ли запретить на запись те страницы в которых находятся таблицы, или атрибуты таблицы страниц памяти изменяются командами процессора, если да - то которыми?
qman Если ты в CR0 поставишь этот бит, то даже программы работающие в 0м кольце будут обламываться с записью в страницы, для которые бит R/W=0 хотя бы в одной из таблиц страниц. Если тебе нужно защитить таблицы страниц, то ты можешь вообще оставить их вне линейного адресного пространства, тогда их даже прочитать никто не сможет.
Информация о страницах памяти (exp 4кб \ 4 мб) хранится в соответсвующих записях каталога таблиц\каталогов страниц. Если страница присутствует в памяти, то в записи выставляется бит (present = 1). Можно самому выставить биты (present = 0) в тех страницах в которых загружена защищаемая информация. Каталог таблиц\каталоги страниц размещены в страницах памяти, им можно выставить (present = 0) и отлавливать #PF (хук в таблице IDT, которая тоже расположена в страницах памяти). Таким образом можно подменять страницы и управлять доступом к памяти. Это реализовано в рутките SHADOW WALKER. http://www.securityfocus.com/infocus/1851
Всем спасибо за помощь, буду приступать к практической реализации, но у меня еще одна просьба, возможно уже где-то описаны практические реализации данных методов или работа со страничной памятью ( я только но открываю для себя PM ), поделитесь ссылками, и простите за такой глупый вопрос, в googlе я не нашел, возможно плохо искал и SHADOW WALKER также не нашел!
qman описана в книге Шрайбер С. Недокументированные возможности Windows 2000 (+CD-ROM), 2002 в архиве ещё примеры к книге _http://webfile.ru/2445274 смотри w2k_spy.h Теория www.intel.com/products/processor/manuals Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide Medstrax "Memory pages containing SSDT and IDT are set to read-only in the page table"[1] Антируткитное средство может котролировать изменения регистра IDTR [2] Автор при реализации сам выберет путь. 1. Лекции Хоглунда и Батлера www.thefengs.com/wuchang/work/courses/cs592_spring2007/Lecture05.ppt 2. packetstormsecurity.org/papers/bypass/bypassEPA.pdf по всем вопросам пиши
Изменение IDTR без виртуализации не детектится. Единственный способ - трейс каждой инструкции. Но этот способ итак снимает все вопросы по отслеживанию записи каталогов страниц и пр.
Выполнение каждой инструкции в пошаговом режиме. Выполнили, посмотрели на следующую. Если нам кажется что это какая то бяка (пишет/читает не то, в регистры лезет ненужные и далее в таком духе), то мы ее пропустим, где то запомнив, что же она такое нехорошее хотела сделать А если на наш суровый взгляд инструкция невинная, то и х..й с ней, пусть выполняется. Если реализуешь - памятник обеспечен))) Ну не пямятник, но скиллы свои поднимешь до нехилых высот ))
В периодах между проверками можно успеть изменить IDTR, поиметь систему во все щелочки и вернуть все обратно.