[?] mprotect & windows

stm7583298

Подскажите, плз, как в винде сэмулировать вызов mprotect, например такой:
mprotect( (char*)page, getpagesize PROT_READ | PROT_WRITE | PROT_EXEC )
Эмуляцию getpagesize уже нашел.

kruzer25

А чего ты хоешь в итоге?

evgen5555

VirtualProtect

stm7583298

В итоге хочу получить доступ на запись и исполнение страницы. Разбираюсь с полиморфным кодом.

stm7583298

Насколько я понял из MSDN-а, VirtualProtect работает только с явно выделенной раньше памятью, а мне нужно получить право на запись в сегмент кода.

evgen5555

Ты плохо понял. Связка [Open/Create]Process->VirtualProtectEx работает на ура.

okunek

Ну под сегмент кода тоже когда-то память выделялась.
Подсовываешь указатель на код, который хочешь изменять в VirtualProtect и устанавливаешь права на read/write/execute.

Marinavo_0507

> В итоге хочу получить доступ на запись и исполнение страницы.
В x86 это невозможно afaik.

Maurog

я в мсдн полный ноль, но мне кажется, что сделать не удастся (выставить write+execute)
однако (если вспомнить mmap) можно сделать это хаком:
мапить можно файл, причем несколько раз один файл замапить можно. но с разными доступами.
1) мапим с возможностью read+execute
2) мапим с возможностью write

stm7583298

Все получилось, комбинацией OpenProcess и WriteProcessMemory

amkharchenko

Стек исполним.

Marinavo_0507

а, перепутал

SPARTAK3959

Всегда использовал VirtualProtect и все работало. Вот образчик из недавнего:
library project1;
{всякий код}
{$ifdef fpc}
procedure fpc_do_exit;stdcall;external name 'FPC_DO_EXIT';
var
tt:integer;
p:^byte;
{$endif}
begin
{$ifdef fpc}
{$ifdef mswindows}
p:=pointer(@FPC_DO_EXIT);
VirtualProtect(p,5,PAGE_EXECUTE_READWRITE,@tt);
p^:=$C3;
{$endif}
{$endif}
end.
Оставить комментарий
Имя или ник:
Комментарий: