Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2016, 23:26   #11
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Предлагаю немного подискутировать на эту тему.
Появилась в голове небольшая догадка причины введения этого региона. В общем случае, получается, что доступ к WriteProcessMemory мы получаем через шлюз вызова. В качестве сегмента назначения указывается селектор нашего текущего сегмента (хотя это скорее всего это не совсем так, ниже по тексту я опишу свое предположение). Делать проверку внутри шлюза при КАЖДОЙ попытке записи слишком накладно. Ну какой смысл ее осуществлять если в большинстве случаев все вызовы легальны? Проще выделить этот самый маленький регион, через который нельзя будет переступить.
Но в таком случае, интересно как же в Windows обстоит отлов попыток записи в само ядро (если бы использовался полноценно механизм сегментного распределения - вопросов совершенно нет). Логические адреса свыше 0x80000000 все равно ведь входят в текущий сегмент (дескриптор №4):

Дескрипторы 1 и 2 содержат DPL 0. Полагаю, что именно селектор на этот дескриптор (№2) кладется каким то волшебным образом на стек перед вызовом шлюза вызова. Получается, что перед самим вызовов шлюза есть какая-то заглушка, которая проверяет входные логические адреса и кладет нужный селектор на стек. Это было бы логично. Но опять, возвращаемся все к той же проверке при каждом вызове (какой именно селектор класть - дескриптора № 2 или №4)
А если есть проверка, то нужен ли в таком случае этот граничный регион? Наверное все-таки нужен, потому что это ДОПОЛНИТЕЛЬНАЯ проверка, помимо той которая уже осуществляется.
Как считаете?

Последний раз редактировалось Базиля; 26.01.2016 в 23:35.
Базиля вне форума Ответить с цитированием
Старый 27.01.2016, 08:47   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Все дескрипторы имеют базу 0 и размер 2^32.
Контроль доступа осуществляется через механизм страницирования (paging).

Скорее всего, реализация WriteProcessMemory работает в контексте ядра а там ограничения на запись нет. Отсюда следует, что надо проверять адреса, причем надо проверить и начало и конец и переполнение - три проверки. Создав запрещенный регион на границе нам надо будет только проверить начало - одна проверка. Все сказанное является спекуляцией.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перезаписать один файл размером 5 Гб в другой размером 5Гб Ланулечка Помощь студентам 0 28.05.2013 12:59
Задана матрица размером n x m и вектор размером m Alexan88 Общие вопросы C/C++ 3 20.12.2010 16:01
Как залесть на закрытый форум? Монгол Свободное общение 12 15.08.2009 19:07
Как наложить иконку с исходным размером 16х16 на битмап с размером 32х32? SkAndrew Мультимедиа в Delphi 1 26.04.2008 14:44