Работа с памятью
От: SammIk  
Дата: 17.04.03 16:52
Оценка:
Доброго времени.
------------------------

Делаю так :
var
 p:pbyte;
begin
 p:=@Какая-то процедура;
 p^:=45;
 //или так
 MoveMemory(@Какая-то процедура,p,1);

Сдесь вылетает ошибка доступа к памяти.
Как с этим воевать?
И можно ли вообще?
Re: Работа с памятью
От: jhfrek Россия  
Дата: 18.04.03 07:35
Оценка: +1
Здравствуйте, SammIk, Вы писали:

SI>
SI> p:=@Какая-то процедура;
SI> p^:=45;
SI>


А что ты этими двумя строчками хотел добиться-то
Re[2]: Работа с памятью
От: VVP Россия 67524421
Дата: 18.04.03 08:06
Оценка:
Здравствуйте, jhfrek, Вы писали:

J>А что ты этими двумя строчками хотел добиться-то

Видимо он хотел добиться какого-то грязного хака.
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...
Re: Работа с памятью
От: Аноним  
Дата: 18.04.03 08:14
Оценка:
Здравствуйте, SammIk, Вы писали:

SI>Доброго времени.

SI>------------------------

SI>Делаю так :

SI>
SI>var
SI> p:pbyte;
SI>begin
SI> p:=@Какая-то процедура;
SI> p^:=45;
SI> //или так
SI> MoveMemory(@Какая-то процедура,p,1);
SI>

SI>Сдесь вылетает ошибка доступа к памяти.
SI>Как с этим воевать?
SI>И можно ли вообще?

Помнится в JEDI в одной из старых версий подменяли обработчик Exception-ов на свой.
Копай в эту сторону.
Re: Работа с памятью
От: Алексей Петров Россия  
Дата: 18.04.03 08:15
Оценка:
Здравствуйте, SammIk, Вы писали:

SI>Сдесь вылетает ошибка доступа к памяти.


Здесь проблема в том, что код находится в сегменте, доступном только для чтения и исполнения. Писать туда нельзя.

Чтобы стало можно — поможет VirtualProtect
Re[2]: Работа с памятью
От: SammIk  
Дата: 18.04.03 10:18
Оценка:
Здравствуйте, Алексей Петров, Вы писали:
АП>Здравствуйте, SammIk, Вы писали:
SI>Сдесь вылетает ошибка доступа к памяти.
АП>Здесь проблема в том, что код находится в сегменте, доступном только для чтения и исполнения. Писать туда нельзя.
АП>Чтобы стало можно — поможет VirtualProtect
Сразу возник вопрос.
Первый параметр — handle, это тот что
получаем из openprocess()?

Если да то всеравно ошибку выдает.
var
 p:pbyte;
begin
p:=@Какая-то процедура;
h:=openprocess(windows.PROCESS_ALL_ACCESS,false,GetCurrentProcessId);
VirtualProtectEx(h,p,40,PAGE_READWRITE or PAGE_WRITECOPY,nil);
  p^:=45;
 //или так
 MoveMemory(@Какая-то процедура,p,1);
Re[3]: Работа с памятью
От: Алексей Петров Россия  
Дата: 18.04.03 10:56
Оценка:
Здравствуйте, SammIk, Вы писали:

1. Кто за тебя будет проверять результаты выполнения функций. А если не сработает? И не сработала ведь!


lpAddress
Pointer to the base address of the region of pages whose access protection attributes are to be changed. All pages in the specified region must have been allocated in a single call to the VirtualAlloc function. The pages cannot span adjacent regions that were allocated by separate calls to VirtualAlloc.


А ты туда p передал — который явно не в начале сегмента. Помотри еще VirtualQuery, чтоб вычислить нужный адрес.

и атрибут PAGE_READWRITE or PAGE_WRITECOPY друг другу противоречат — уж выбери что-то одно.

И к тому-же восстановить атрибуты не забудь потом...

2. Ну и извращенец: есть функция без Ex — ей Handle не нужен. И есть GetCurrentProcess — зачем OpenProcess делать???
Re[4]: Работа с памятью
От: SammIk  
Дата: 19.04.03 15:20
Оценка:
Здравствуйте, Алексей Петров, Вы писали:
Пробовал так :

l:=virtualalloc(@XXX,40,MEM_commit,PAGE_READWRITE);
if VirtualProtect(l,40,PAGE_READWRITE,nil)then begin
caption:=inttostr((integer(@w)-integer(@q)))+'  '+inttohex(integer(@q)+(integer(@w)-integer(@q)-1),8);
for i:=0 to (integer(@w)-integer(@q)-1)do begin
edit1.Text:=edit1.Text+'_$'+inttohex(PByte(integer(@q)+i)^,2);
p:=PByte(integer(@q)+i);
if PByte(integer(@q)+i)^=$cc then windows.Beep(400,20);
p^:=30;
end;
end;

НО virtualalloc возвращает nil(
от модератора
От: _MarlboroMan_ Россия  
Дата: 19.04.03 15:43
Оценка:
Здравствуйте, SammIk.

У нас на сайте есть возможность подкрашивать синтаксис кода. Делается это с помощью тегов. Например между тэгами [ pascal] и [ /pascal] текст будет подкрашен согласно дельфевого синтаксиса. Рекмендую ими пользоваться. Это и эстетически приятно и читается легче.
Так же рекомендую всеж таки структурировать код.
... << RSDN@Home 1.0 beta 6a >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.