Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

Защитить от записи страницы памяти

24.01.2013, 11:37. Показов 2327. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некая задачка где просят получить память под массив, установить некоторые значения, а потом защитить этот кусок памяти от записи и показать что туда ничего нельзя записать.
Делаю на винапи (хотя там в posix тоже что-то есть, но я тоже не смог это заставить работать у себя под виндой), раньше с такого рода задачами никогда не сталкивался. Как правильно защитить от записи страницы памяти?

Набросал абстрактный пример:
C++
1
2
3
4
5
6
7
8
9
int main()
{
    int* ppt = new int[100];
    ppt[10]=100;
    cout<<ppt[10]<<endl;
    cout<<"status of lock: "<<VirtualLock(ppt,sizeof(int)*100)<<endl; //блокирую память под массив
    ppt[10]=10; // по прежнему могу менять значение (память не заблокирована от записи)
    cout<<ppt[10]<<endl;//получаю новое значение (10)
}
Но не смотря на то что статус блокировки != 0 (msdn говорит что если ответ не 0 то значит всё хорошо и память заблокирована) я всё равно могу установить ppt[10] новое значение и получить это новое значение, а как я понял предо мной ставят задачу чтобы я это сделать не смог пока не разблокирую память. Подскажите пожалуйста что и как в этом случае делать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.01.2013, 11:37
Ответы с готовыми решениями:

Как защитить Dll от редакторов памяти?
Всем привет, у меня есть dll мне нужно защитить данную dll от редакторов памяти таких как MegaDumper Cheat Engine и т.д Каким образом можно...

Как защитить скрипт от обновления страницы?
Есть скрипт который выполняет какое-либо действие. Но при просто обновлении страницы скрипт снова выполняется. Каким образом можно это...

Защитить от записи флешку с Windows 7
Может кто подскажет как записанный установщик винды на флешке защитить от любых изменений??

14
 Аватар для define undef
33 / 33 / 6
Регистрация: 19.01.2013
Сообщений: 33
24.01.2013, 11:48
А нельзя ли с помощью new привести массив к типу const int ?
0
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 809
24.01.2013, 11:51
Gepar, VirtualLock закрепляет виртуальную память в физической, т.е. запрещает скидывать страницу в своп.
Для изменения защиты страницы памяти нужно использовать VirtualProtect. Т.к. защита действует на всю страницу - нельзя лочить память в общей куче. Используй VirtualAlloc для выделения памяти (т.к. выделяет постранично) и потом настраивай доступ с помощью VirtualProtect.
1
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
24.01.2013, 11:56
C++
1
2
int *ptr = new int [20];
const int *cptr = ptr;
Чем не выход?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
24.01.2013, 12:59  [ТС]
Kgfq, да не знаю, это же не защита памяти, этоя сам от себя спрятался

WhiteP, видимо не так понял я msdn, а последнее моё общение с VirtualAlloc не очень было удачно и я в тот раз обошёлся без него. Ну чтоже, придётся попробовать пообщаться с ним ещё разок, может на этот раз более успешно.
0
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 809
24.01.2013, 13:25
Цитата Сообщение от Gepar Посмотреть сообщение
а последнее моё общение с VirtualAlloc не очень было удачно и я в тот раз обошёлся без него. Ну чтоже, придётся попробовать пообщаться с ним ещё разок, может на этот раз более успешно.
А что там может быть неудачного?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <windows.h>
#include <iostream>
 
LONG ExcFilter(PDWORD oldProtection, int*n)
{
    if(VirtualProtect(n, 10*sizeof(int), *oldProtection, oldProtection))
    {
        std::cout<<"Protection disabled in exception filter"<<std::endl;
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    return EXCEPTION_EXECUTE_HANDLER;
}
 
int main()
{
    int * n = (int*) VirtualAlloc(0, 10*sizeof(int), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
    for(int i=0;i < 10; i++)
        n[i]=i;
    DWORD oldProtection = 0;
    if(VirtualProtect(n, 10*sizeof(int), PAGE_READONLY, &oldProtection))
        std::cout<<"Protection PAGE_READONLY enabled"<<std::endl;
    __try
    {
        for(int i=0;i < 10; i++)
            n[i]=i;
    }
    __except(ExcFilter(&oldProtection, n))
    {
        std::cout<<"In exception handler"<<std::endl;
    }
 
    VirtualFree(n, 10*sizeof(int), MEM_RELEASE);
    return 0;
}
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
24.01.2013, 21:40  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
А что там может быть неудачного?
Да там старая неприязнь когда он у меня там с чтением из файла грызься в том виде что так и не получилось нифига тогда считать в память выделенную этим VirtualAlloc винапишными же функциями для чтения. Я тогда просто сишными функциями воспользовался и забил на это дело, по скорости моя шифровалка всё равно проходила же ... кстати думал запостить свой код по DES и забыл, надо бы собраться да написть или в блог сообщение или что-то такое. Я пока искал готовый пример в инете то так ничего хорошего из ооп-решений и не находил, всюду то демонстрация шифрования строчки то и ещё чего. Но это я отвлёкся.

Спасибо за хороший пример, я так понимаю эксепшены оно бросает только эти хитрые винапишные и просто в стиле с++ try / catch здесь сделать не получиться, да ?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
24.01.2013, 22:25
Цитата Сообщение от Gepar Посмотреть сообщение
Спасибо за хороший пример, я так понимаю эксепшены оно бросает только эти хитрые винапишные и просто в стиле с++ try / catch здесь сделать не получиться, да ?
В ВинАпи исключение не совсем те исключения, которые вы думаете.
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
24.01.2013, 22:33
если проектик в студии собирать с флагом /EHa, то можно будет их ловить catch (...)
еще вроде можно трансляторы ставить и ловить что-то более конкретное.
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
24.01.2013, 22:48
DU, исключения могут генерироваться аппаратно. ИМХО, вы предлагаете не лучший вариант.
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
24.01.2013, 22:59
в том то и дело, что этот флаг заставляет студию генерить код так, чтобы и аппаратные исключения ловились. только ловится они будут в catch (...) и ни в каком другом блоке. при наличии транслятора эти аппаратные транслируются в какой-то тип и можно уже кетчи ставить на именно аппаратные, а не абы какие, которые не словились раньше.
Что имеется в виду под аппаратными? деление на ноль - оно? если да, то оно таким макаром ловится.
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
25.01.2013, 01:07  [ТС]
Цитата Сообщение от go Посмотреть сообщение
В ВинАпи исключение не совсем те исключения, которые вы думаете.
Ну вот я же к тому и говорю что умеет оно плеваться только этими винапишными которые MS понапридумывал в те времена, я если честно так и не научился ими до конца пользоваться. Помню ещё что там можно ещё хитро с двойной вложенностью в try / finally закопаться что даже можно разименование null'а ловить


DU, а можно, подробнее, просто интересно. На практике я не могу сказать "вот тебе исходник, вон там вон галочку поставишь и оно соберётся и заработает тогда...", но мне самому попробовать интересно. Те просто поставить флаг /EHa и можно делать блок try(){ } catch(...){ } ? Но получается тогда потеряется возможность узнать а что вообще произошло и где именно.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
25.01.2013, 01:26
я это все узнавал в книге Джеффри Рихтера:
Windows. Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows.
Часть 5, главы 23, 24, 25
+ в сети то там, то сям инфа всякая.
Ищите инфу по структурной обработке исключений, они же SEH frames (Structured Exception Handling)
http://msdn.microsoft.com/en-u... s.85).aspx
1
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 809
25.01.2013, 06:59
Еще есть векторная обработка исключений. Там даже во фрейм как таковой оборачивать не надо. И вызываются обработчики до SEH обработчиков и раскрутки стека.
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
26.01.2013, 17:26  [ТС]
WhiteP, что-то там и примеров нету ни одного, но если я всё правильно понял то читать код с таким перехватом исключений всё равно что читать код с goto
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2013, 17:26
Помогаю со студенческими работами здесь

Защитить переменную класса от записи
Имеется класс: public static class MyClass { int my_field; public void setMyField(int value) { my_field = value; ...

Как защитить global.asa уложенный в корень страницы?
Как защитить global.asa уложенный в корень страницы. Он почемуто доступен для чтения. Почему ? Как его скрыть ?

Защитить папку от удаления в сильно ограниченной учетной записи
Кто знает как защитить папку от удаления (в частности админом) в сильно ограниченной учетной записи? Предпологается создание в домашних...

Ошибка отсутствия страницы в памяти/сек
Здравствуйте прошу о помощи решения данной проблемы. Купил однажды себе оперативную память HyperX 8gb 1600mhz. Как только начал...

Ошибка доступа записи памяти
Здравствуйте,возникла проблема с циклом: как только начинается выполнения цикла,то возникает ошибка доступа записи памяти.Если что, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru