Доброго времени суток! Объясните мне, дураку, одну вешь... Возьмем ОС windows. В неи используется плоская модель памяти. т.е. существует, положим, четыре сегмента, два на уровне ядра, два на уровне пользователя... Когды мы "запускаем" две пользовательские программы, то что происходит? Имеющие сегменты уровня пользователя разделяются на два - по одному для каждой программы? Но тогда это будет мультисегментная модель... Если нет, то получается, что сегменты двух программ совпадают... "Несовпадение" адресов в данном случае обеспечивается страничной адресацией... Если я что пишу не так, исправляйте )) Воторой момент, как запущенный процесс определяет его это страница или нет? Ведь у свойств страницы есть только бит чтения\записи и бит пользователя\ядра. Где же реализуется защита страниц одного процесса от воздействия на них страниц другого процесса? Получается что не на аппаратном уровне? Но где же? Возможный вариант.. как я это понимаю... У каждого процесса есть своя таблица страниц... можно "свои" страницы пометить как доступные по чтению\записи. Страницы других процессов пометить доступные только по чтению и пометить их как отсутствующие в памяти... Далее при попытке обратиться к страницам другого процесса вызывается исключение, обработчик которого определяет, что такая страница пренадлежит другому процессу и запрещает доступ... Схема хорошая, но дико тормозная... Жду ваши комментарии по этому поводу! С уважением, Горячев Игорь Александрович.
Меняется cr3, таким образом для каждого процесса своя таблица страниц. по первой половине вопроса ты кажется селекторы с сегментами напутал.
Именно так. А помечать страницы другого процесса не надо никаким образом. К ним просто нет доступа, потому что в текущей таблице страниц их нет. Эти страницы присутствуют в физической памяти, но процесс не может получить к ним доступа, потому что ни для одному виртуальному адресу этого процесса не соответствует данная физическая страница.
Спасибо за ответы!!! Теперь я понял, что такое защита IA-32... осталось математическую модель написать ))
дам, конечно! Это мой диплом - математическая модель защищенной распределенной операциооной системы на IA-32...
Еще один вопрос. В записи страницы в таблице страниц присутствуют три бита (с 9 по 11) называемые в имеющейся у меня документации "доступными для системного программиста". Вопрос: что означает эта доступность и могу ли я использовать эти три бита с целью построения системы защиты?
Gagar IMHO имелись ввиду системные программисты, пишущие операционные системы. Если память мне не изменяет эти три бита доступны в режиме ядра и абстрактная ОС может их использовать для своих нужд...
Windows вроде бы их не использует. Простейший способ проверки - выставить их в 1 и ждать бсод ЗЫ: Поправка! Бит 9 - Copy-On-Write
Неплохо? От них толку ноль. На них процессор никак не реагирует. Не проще ли выделить в памяти, доступной только в ринг0 целую таблицу битовых полей и там плясать на всю катушку ))?
А в моей модели защиты вовсе не нужно чтоб процессор на них реагировал в виде исключений... На этих двух битах можно так наплясаться, что голова закружится )) Мне реально один бит нужен, чтоб реализовать достаточную систему защиты Мне всего лишь нужно различать страницы, какие можно передавать другим процессам, а какие нельзя. Плюс у меня есть волшебные битики чтения\записи и присутствия\отсутствия.
А можно ведь сделать свой битовый массив и вообще не зависеть ни от системы, ни от таких-же программистов, которые решили эти два несчастных бита использовать для своих нужд.
Стоп!!! А вот теперь я не понял одной важной вещи! В Windows есть така программа ArtMoney. Она сканирует адресное пространство выбранного процесса (игрушки) и позволяет менять найденные значения. Я сам не раз таким образом увеличивал себе деньги в Героях )) По логике вещей память другого процесса не должна быть доступна! Возникает вопрос как же это работает и можно ли от такого хака защититься?
Gagar Можешь написать драйвер, который будет устанавливать эти биты на защищенных страницах. Хотя толку ноль, от взлома со стороны программ пользовательского режима можно защититься и стандартными средствами NT, а от кода режима ядра это не спасет )
В юзер-моде - ReadProcessMemoryEx или ZwReadVirtualMemory. Защититься можно, если перехватить в SDT ZwReadVirtualMemory и блокировать доступ к памяти других процессов всех, кроме csrss.exe. Outpost - тому пример, орет аларм при попытке записи. На уровне ядра - KeAttachProcess или KeStackAttachProcess; плюс есть возможность вручную преобразовывать адреса и получить доступ куда угодно вообще без вызова системных функций. Защиты нет.
Первый раз слышу про такое =) Как правильно сказал glig, сделать такую защиту, чтоб даже из r0 не было доступа это трудно, может быть даже невозможно. Ибо никто не мешает вручную перевести логические адреса в физические.
На любую защиту найдется хак. А из ринг 0 можно сделать что угодно. Никто и никогда не защитит инфу от доступа на ринг 0. Находясь в кольце 0, ты - БОГ, а от бога не спасет никакая, даже самая навороченная защита.