Здравствуйте, Алексей Петров, Вы писали: АП>Здравствуйте, 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);
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 делать???
Здравствуйте, Алексей Петров, Вы писали:
Пробовал так :
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;
У нас на сайте есть возможность подкрашивать синтаксис кода. Делается это с помощью тегов. Например между тэгами [ pascal] и [ /pascal] текст будет подкрашен согласно дельфевого синтаксиса. Рекмендую ими пользоваться. Это и эстетически приятно и читается легче.
Так же рекомендую всеж таки структурировать код.
... << RSDN@Home 1.0 beta 6a >>
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...