Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651

Ограничение доступа к памяти

27.04.2019, 10:44. Показов 4701. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Нужно ограничить доступ программе к памяти с помощью работы с реестром. Не очень понимаю, в каком именно направлении копать. Не подскажите?)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.04.2019, 10:44
Ответы с готовыми решениями:

Ограничение доступа в IE.
Активирован этот компонент, нет доступа вообще ни на какой сайт, требует ввести пароль, а где его взять если пароли НЕ устанавливались....

Ограничение доступа
Можно ли как то с помощью Visual Basic.NET ограничить доступ к процессу программы ?

Ограничение доступа
Здравствуйте! Прошу вас помочь мне с решением одной поставленной мне задачи. Есть локальная сеть(беспроводная). В сети есть компьютер,...

57
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
30.04.2019, 16:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Т.е. драйвер отлавливает запуск процесса и блокирует его?
Ага, с любым процессом можно делать все, что душе угодно.

Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Не очень понял как использовать ее.
Использовать нужно так, как описано в документации. Создаешь функцию с указанной сигнатурой, передаешь указатель на нее в PsSetCreateProcessNotifyRoutine в качестве параметра. Далее при создании каждого процесса система будет вызвать твою функцию.

Тут сложно сказать более подробно. Если тебе действительно надо именно это, то советую начать читать литературу по разработке драйверов.
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
19.05.2019, 02:03  [ТС]
В продолжение темы. Есть вот такая вещь: https://rsdn.org/forum/asm/2308423.1

1) Раздела Session Manager нет. Пытался его создать - безуспешно (т.е. раздел создается, но нельзя изменить его название)
2) Нужно ли грузить dll в самой программе? Насколько понимаю, нет

На всякий случай код dll:
block.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <Windows.h>
#include "block.h"
 
#define STATUS_SUCCESS         ((NTSTATUS)0x00000000L) 
#define STATUS_UNSUCCESSFUL    ((NTSTATUS)0xC0000001L) 
 
#define APPCERT_IMAGE_OK_TO_RUN   0x00000001L
 
extern "C" NTSTATUS __stdcall CreateProcessNotify(LPCWSTR lpApplicationName, ULONG uReason) 
{ 
    switch(uReason) 
    {
        case APPCERT_IMAGE_OK_TO_RUN:
        {           
            return STATUS_UNSUCCESSFUL;
        }  
    } 
}


block.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
#ifdef BUILD_DLL
   #define EXPORT __declspec(dllexport)
#else
   #define EXPORT __declspec(dllimport)
#endif


Добавлено через 2 минуты
Это, значит, контроль доступа. Еще идея - получить PID и по нему запретить запуск

Добавлено через 18 минут
Или же еще: запрет выделения ресурсов для процесса. Это возможно?
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
19.05.2019, 13:44  [ТС]
Актуально
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
19.05.2019, 16:59
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Есть вот такая вещь
Да, есть. Использует недокументированный функционал.

Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Раздела Session Manager нет.
У меня он есть и на Win7, и на Win10. Может ты не там ищешь? У меня он расположен по пути "Computer\HKEY_LOCAL_MACHINE\SYSTEM\Curr entControlSet\Control\Session Manager".

Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
запрет выделения ресурсов для процесса
Внедряешь свою dll в процесс и через нее перехватываешь вызов функций, выделяющих интересующие тебя ресурсы. Поищи библиотеки по установке трамплинов.
1
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
19.05.2019, 17:20  [ТС]
Да, действительно, не там искал. Раздела AppCertDlls не оказалось - создал. В нем лежит ключ AppSecDll со значением %SystemRoot%\system32\block.dll Никакой реакции при запуске приложения нет. Странно. Ведь, по идее, если в CreateProcessNotify вернуть STATUS_UNSUCCESSFUL, то процесс не должен запуститься
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
19.05.2019, 17:30
Zwelenewskiy, возможно загрузка dll блокируется из-за отсутствия корректной цифровой подписи.

Проверь через Process Explorer, загрузилась ли она куда-либо. Советую все операции проводить на виртуальной машине с включенным режимом отладки.
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
19.05.2019, 18:55  [ТС]
Process Explorer мою dll не нашел. Цифровую подпись можно сделать только с помощью SignTool?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
19.05.2019, 19:57
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Цифровую подпись можно сделать только с помощью SignTool?
Я плохо эту тему знаю, и не уверен, что сейчас проблема именно в отсутствии сертификата. Ты уже пробовал все это делать в режиме отладки? Если правильно помню, WinDbg в режиме отладки ядра отображает ошибки загрузки dll, связанные с некорректным сертификатом.

Через SignTool подпись делается довольно просто, главное сертификат раздобыть (Думаю, будет достаточно самоподписанного, главное добавить его в список доверенных).
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
20.05.2019, 14:34  [ТС]
Появилось конкретное задание. Блок ставится на доступ к виртуальному адресному пространству процесса. Как вариант:
1) Создать дочерний процесс
2) Получить указатель на начало адресного пространства процесса и завершить дочерний процесс
3) Установить блок на доступ к адресному пространству по минимальному смещению
4) Попытаться еще раз запустить дочерний процесс
По идее, при этом должна выйти ошибка. Не пойму, как получить указатель на адресное пространство процесса. Ну, и, соответственно, как блокировать доступ к адресному пространству
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
21.05.2019, 00:21  [ТС]
Актуально
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
21.05.2019, 00:48
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Появилось конкретное задание.
Странное "конкретное" задание без какой-либо конкретики.

Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
как блокировать доступ к адресному пространству
Изучи вот этот проект.
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
21.05.2019, 01:01  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
без какой-либо конкретики
Почему?

Цитата Сообщение от nonedark2008 Посмотреть сообщение
этот проект
Ведь здесь речь ведется о получении доступа к адресному пространству, но не о его блокировке...
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
21.05.2019, 08:45
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
но не о его блокировке
Там описан подход, который в частности позволяет контролировать доступ к памяти: вместо записи в лог можно и программу завершить с сообщением об ошибке.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
23.05.2019, 00:35
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
как получить указатель на адресное пространство процесса
CreateToolhelp32Snapshot

Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Ну, и, соответственно, как блокировать доступ к адресному пространству
ответ давал на первой странице
1
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
24.05.2019, 02:03  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
CreateToolhelp32Snapshot
Ф-я возвращает Handle. Это и есть указатель? =)
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
24.05.2019, 09:19
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Это и есть указатель?
в данном случае нет.
вам нужно: CreateToolhelp32Snapshot(TH32CS_SNAPMODU LE) -> Module32First(&MODULEENTRY32) -> MODULEENTRY32::modBaseAddr (для нужно вам модуля, он же процесс запущенного exe)
2
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
25.05.2019, 11:12  [ТС]
Кликните здесь для просмотра всего текста
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
HANDLE thread;
HANDLE tmp;
MODULEENTRY32 modulInfo;
 
...
 
DWORD WINAPI thread2(LPVOID t)
{   
    modulInfo = {0};
    modulInfo.dwSize  = sizeof(modulInfo);
    
    Module32First(tmp, &modulInfo);
    Module32Next(tmp, &modulInfo);
    
    return 0;
}
 
...
 
tmp = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetPID());
printf("Handle = %d\n", tmp);       
hread = CreateThread(NULL, 0, &thread2, NULL, 0, NULL);
 
WaitForSingleObject(thread, INFINITE);          
printf("BaseAdr = 0x%x\n", modulInfo.modBaseAddr);
 
if(VirtualProtect(modulInfo.modBaseAddr, sizeof(DWORD), PAGE_NOACCESS, &lpflOldProtect))
    cout << "OK" << endl;
else
    cout << "ERROR" << endl;
 
CreateThread(NULL, 0, &thread2, NULL, 0, NULL);
WaitForSingleObject(thread, INFINITE);          
printf("BaseAdr = 0x%x\n", modulInfo.modBaseAddr);


Результат на скрине. Не могу понять две вещи:
1) Почему указатель на адресное пространство второго процесса всегда одинаковое
2) Почему после блокировки адресное пространство все еще доступно
Миниатюры
Ограничение доступа к памяти  
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
26.05.2019, 00:07  [ТС]
Актуально
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.05.2019, 19:19
Zwelenewskiy, ты некорректно воспользовался функциями CreateToolhelp32Snapshot, Module32First, Module32Next. Посмотри пример.
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
16.06.2019, 17:53  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Посмотри пример.
Оттуда и брал)

Хорошо, полностью скопировал код. Результат - на скрине. Как я понимаю, первый модуль - и есть второй запущенный поток.
Кликните здесь для просмотра всего текста
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
35
36
37
38
39
40
41
BOOL ListProcessModules(DWORD dwPID) 
{ 
  HANDLE hModuleSnap = INVALID_HANDLE_VALUE; 
  MODULEENTRY32 me32; 
  
  hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);   
  me32.dwSize = sizeof(MODULEENTRY32); 
  
  do 
  { 
    printf("\n\n     MODULE NAME:     %s",             me32.szModule); 
    printf("\n     executable     = %s",             me32.szExePath); 
    printf("\n     process ID     = 0x%08X",         me32.th32ProcessID); 
    printf("\n     ref count (g)  =     0x%04X",     me32.GlblcntUsage); 
    printf("\n     ref count (p)  =     0x%04X",     me32.ProccntUsage); 
    printf("\n     base address   = 0x%08X",        me32.modBaseAddr); 
    printf("\n     base size      = %d",             me32.modBaseSize); 
    
  } while(Module32Next( hModuleSnap, &me32 )); 
 
  printf("\n");
  
  CloseHandle(hModuleSnap); 
  return TRUE; 
} 
 
DWORD WINAPI thread2(LPVOID t)
{       
    printf("PID_2 = %d\n", GetCurrentProcessId());
        
    ListProcessModules(GetCurrentProcessId());  
    
    return 0;   
}
 
...
 
printf("PID_1 = %d\n", GetCurrentProcessId());
            
HANDLE = thread = CreateThread(NULL, 0, &thread2, NULL, 0, NULL);               
WaitForSingleObject(thread, INFINITE);


Заметил, что если убрать вывод PID'a в thread2, то начальный адрес второго потока = 0. Почему - не понимаю

Запомним только информацию о первом модуле и сделаем глобальную переменную:
Кликните здесь для просмотра всего текста
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
35
36
37
38
39
40
41
42
43
44
45
46
MODULEENTRY32 module;//глобальная переменная
 
BOOL ListProcessModules(DWORD dwPID) 
{ 
  HANDLE hModuleSnap = INVALID_HANDLE_VALUE; 
  MODULEENTRY32 me32; 
  
  hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);   
  module.dwSize = sizeof(MODULEENTRY32); 
  
  do 
  { 
    printf("\n\n     MODULE NAME:     %s",             module.szModule); 
    printf("\n     executable     = %s",             module.szExePath); 
    printf("\n     process ID     = 0x%08X",         module.th32ProcessID); 
    printf("\n     ref count (g)  =     0x%04X",     module.GlblcntUsage); 
    printf("\n     ref count (p)  =     0x%04X",     module.ProccntUsage); 
    printf("\n     base address   = 0x%08X",        module.modBaseAddr); 
    printf("\n     base size      = %d",             module.modBaseSize); 
    
    return TRUE;
  } while(Module32Next( hModuleSnap, &module )); 
 
  printf("\n");
  
  CloseHandle(hModuleSnap); 
  return TRUE; 
} 
 
DWORD WINAPI thread2(LPVOID t)
{       
    printf("PID_2 = %d\n", GetCurrentProcessId());
        
    ListProcessModules(GetCurrentProcessId());  
    
    return 0;   
}
 
...
 
printf("PID_1 = %d\n", GetCurrentProcessId());
            
thread = CreateThread(NULL, 0, &thread2, NULL, 0, NULL);                
WaitForSingleObject(thread, INFINITE);              
 
printf("\n\nBaseAdr = 0x%08X\n", module.modBaseAddr);


Результат на втором скрине. Почему теперь не берется информация о первом модуле - не пойму
Миниатюры
Ограничение доступа к памяти   Ограничение доступа к памяти  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2019, 17:53

Ограничение доступа
А вот как сделать ограничение в базе данных для некоторых пользователей? Иерархия состоит из трех категорий пользователей и как правильно...

Ограничение доступа
На компе установлена Windows 7.Нужно следующее:Что-бы можно было оставить компьютер включенным и быть уверенным что никто его не испортит в...

Ограничение доступа
Создал роль для просмотра некоторых справочников и отчета ОСВ по счету. Как можно ограничить доступ к ОСВ, чтоб пользователь мог выбрать...

Ограничение Доступа По Ip
Возможно ли на domino 6 настройками разрешить пользователю подключаться к серверу только с определённого IP-адреса? Или как-то фильтровать...

ограничение доступа
Как ограничить доступ к одной из папок на сервере таким образом, чтобы к файлам и поддиректориям этой папки имели доступ только скрипты...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru