![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к памяти процесса [D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
DeadMeat © (2003-05-11 21:55:00)Может быть я всех достану этим вопросом (в смысле может его ещё кто задавал...), но мне надо узнать (а точнее узнать у вас), как получить доступ типа Read/Write к области памяти, занимаемой моим процессом... Заранее спасибо...
DeadMeat (2003-05-13 17:58:00) [1]Большое спасибо всем кто откликнулся...
> AlexRush
Не знаю почему, но этот метод у меня срабатывает только тогда, когда я прогу запускаю из Delphi, а в отдельном *.EXE-шнике срабатывает только метод NightAngel, но с небольшими переработками...
Ещё раз спасибо...
AlexRush (2003-05-13 11:05:00) [2]В заголовке PE модуля находится таблица секций - массив структур
IMAGE_SECTION_HEADER. В поле Characteristics нужной структуры устанавливаем бит 31:
var ish:IMAGE_SECTION_HEADER;
ish.Characteristics
:= ish.Characteristics OR IMAGE_SCN_MEM_WRITE;
Любая секция становится доступной для записи. Сам делал - работает.
NightAngel (2003-05-13 02:38:00) [3]> DeadMeat © (12.05.03 14:11)
VirtualProtect(GetModuleHandle(0),Размер файла,...)
VMcL (2003-05-12 14:43:00) [4]IMHO, image base, указанный на закладке Linker в свойствах проекта (хранится в PE заголовке), но по-моему он может изменяться системой (с соответствующим изменением всех JMP, CALL и т. п.).
DeadMeat (2003-05-12 14:11:00) [5]Вообще, мне надо изменить данные в области именно исполняемого кода, а не системных библиотек. Причём не вовремя работы этой области, а до этого момента... Про VirtualProtect я почитал, и честно говоря, меня в тупик поставило лишь одно: как узнать адрес, с которого начинается исполняемый код, и размер этой области...
NightAngel (2003-05-12 03:10:00) [6]>Надо ещё постараться, чтобы найти в памяти своей же программы область с аттрибутом PAGE_READONLY
И стараться не надо. Страницы с исполняемым кодом Вашего процесса. Насчёт системных библиотек, то это только в Win9x, т.к. только в этих системах память, начиная с 2Gb, спроецирована на все контексты, присутствующие в системе и недоступна для модификации.
Morfein (2003-05-12 02:40:00) [7]Надо ещё постараться, чтобы найти в памяти своей же программы область с аттрибутом PAGE_READONLY (про область выше 0x7fffffff я не говорю - если человек хочет переписать память сист. билиотек, то в Win32 ему VirtualProtectEx не поможет)
NightAngel (2003-05-12 02:30:00) [8]> Morfein © (12.05.03 01:57)
Всё верно, вот только когда Вы выполните MOV память,регистр, и эта памятьбудет в странице с атрибутом запрещающим Write, вот тут-то Вы и получите по рукам.
Morfein (2003-05-12 01:57:00) [9]Существует такой команда процессора MOV...:
MOV регистр, память
MOV память, регистр
MOV регистр, регистр
Пример:
var
x : dword;
begin
asm
mov eax, dword ptr [$00400000]
mov x, eax
end;
А есть ещё оператор ":=" (присваивание)
Пример:
var
x : dword;
p : pointer;
begin
p:=$00400000;
x:=dword(p^);
end;
NightAngel (2003-05-12 00:45:00) [10]Если я правильно понял вопрос - VirtualProtect().