VirtualProtect

Эта функция устанавливает атрибуты на блоки памяти.

BOOL VirtualProtect
(
LPVOID lpAddress,// адрес региона для установки флага
DWORD dwSize,// размер региона
DWORD flNewProtect,// флаг
PDWORD lpflOldProtect// адрес для сохранения старых флагов
);

Какие бывают флаги ???

#define PAGE_NOACCESS 0x01 
#define PAGE_READONLY 0x02
#define PAGE_READWRITE 0x04
#define PAGE_WRITECOPY 0x08
#define PAGE_EXECUTE 0x10
#define PAGE_EXECUTE_READ 0x20
#define PAGE_EXECUTE_READWRITE 0x40
#define PAGE_EXECUTE_WRITECOPY 0x80
#define PAGE_GUARD 0x100
#define PAGE_NOCACHE 0x200

Я думаю, что имена их более менее понятны. Нет доступа или только для чтения. Давайте попробуем.

// TestPrivate.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DWORD* dwPointer;
DWORD old;
dwPointer =new DWORD;
*dwPointer=2;

if (VirtualProtect(dwPointer, sizeof(DWORD), PAGE_READONLY, &old))
{
MessageBox(NULL,"Protected","Info",MB_OK);
}

//*dwPointer=10; // Error Protected

DWORD test;
test=*dwPointer;

if (VirtualProtect(dwPointer, sizeof(DWORD), old, &old))
{
MessageBox(NULL,"Not Protected","Info",MB_OK);
}

*dwPointer=*dwPointer+10;
delete dwPointer;
return 0;
}

Код такой. Заводим переменную типа DWORD и размещаем ее в памяти. Присваиваем значения и потом закрываем доступ. Можно только читать. В конце возвращаем старые сохраненные значения из old, куда помещаются ранее установленные флаги на этой странице. Можно и писать после этого. Можете раскомментировать строку:

//*dwPointer=10; // Error Protected.

Что будет догадываетесь ? Windows вам про незаконные операции расскажет.

Пользоваться этой функцией нельзя в диапазоне:

0xBFFFFFFF 
0x80000000

Кстати она BOOL и если Вам не удастся поменять атрибуты памяти, то можно будет это обработать. Этот пример хорошо работает под Windows9x для NT я не смотрел и не проверял.

 
« Предыдущая статья   Следующая статья »