Форум: "WinAPI";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
ВнизЧтение из блока памяти, выделенной в чужом адр. пространстве Найти похожие ветки
← →
Volia (2003-09-12 01:31) [0]Не получается читать из буфера, расположенного в адресном пространстве чужого процесса
Вот часть программы:
var ProcHndl,ProcID,i: dword;
pMyAddress: pointer;
Str1,Str2: String;
begin
ProcID:=xyz //Идентификатор нужного процесса
str1:="AAAAAAAA";
str2:="BBBBBBBB";
prochndl:=openprocess(PROCESS_ALL_ACCESS,TRUE,ProcID);
pMyAddress:=VirtualAllocEx(ProcHndl,nil,50,MEM_RESERVE+MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(ProcHndl,pMyAddress,pchar(Str1),50,i);
ReadProcessMemory(ProcHndl,pMyAddress,pchar(Str2),50,i);
Содержание Str2 не меняется, ReadProcessMemory возвращает FALSE, GetLastError- ошибку 998 (Invalid access to memory location. ERROR_NOACCESS ). При этом WriteProcessMemory возвращает TRUE.
В чем может быть ошибка?
← →
Digitman (2003-09-12 09:53) [1]var ProcHndl,ProcID,i: dword;
pMyAddress: pointer;
Str1,Str2: String;
begin
ProcID:=xyz //Идентификатор нужного процесса
str1:="AAAAAAAA";
SetLength(str2, Length(Str1)); // !!!!!!!!!!!!!!!!!!!!!!
prochndl:=openprocess(PROCESS_ALL_ACCESS,TRUE,ProcID);
pMyAddress:=VirtualAllocEx(ProcHndl,nil,Length(Str1),MEM_RESERVE+MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(ProcHndl,pMyAddress,pchar(Str1),Length(Str1),i);
ReadProcessMemory(ProcHndl,pMyAddress,pchar(Str2),Length(Str1),i);
← →
VMcL (2003-09-12 13:28) [2]Или так:
Str2 := "BBBBBBBB";
UniqueString(Str2);
← →
guest (2003-09-13 14:34) [3]помни, что тебе нужны привилегии для чтения из процесса
если ты SYSTEM то их можно слммзить с WinLogon :)
← →
(3223)jab (2003-09-29 17:40) [4]В 98 винде у меня всё работало так:
procedure TForm1.Button5Click(Sender: TObject);
var
ProcessHandle:THandle;
ProcessID,Address:Integer;
TheWindow:HWND;
buf:array [0..3] of Byte;
Size:Word;
im:DWORD;
begin
TheWindow:=FindWindow(nil, PChar(Edit1.Text));
GetWindowThreadProcessID(TheWindow,@ProcessID);
ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
Address:=StrToInt("$"+Edit2.Text);
buf[0]:=StrToInt("$"+Edit4.Text);
buf[1]:=StrToInt("$"+Edit6.Text);
buf[2]:=StrToInt("$"+Edit7.Text);
buf[3]:=StrToInt("$"+Edit8.Text);
Size:=sizeof(buf);
im:=0;
WriteProcessMemory(ProcessHandle,Pointer(Address),@buf,Size,im);
CloseHandle(ProcessHandle);
end;
Может поможет чем поможет....
← →
VMcL (2003-10-02 14:28) [5]>(3223)jab (29.09.03 17:40) [4]
Не совсем по теме.
У Volia © (12.09.03 01:31) была проблема вот в этом:
str2:="BBBBBBBB";
То есть переменная Str2 указывала на данные, находящиеся в странице с запретом на изменение (например, PAGE_READONLY мли PAGE_EXECUTE_READ).
← →
Verg (2003-10-02 14:51) [6]
> str2:=" BBBBBBBB";
> prochndl:=openprocess(PROCESS_ALL_ACCESS,TRUE,ProcID);
> pMyAddress:=VirtualAllocEx(ProcHndl,nil,50,MEM_RESERVE+MEM_COMMIT,PAGE_READWRITE);
> WriteProcessMemory(ProcHndl,pMyAddress,pchar(Str1),50,i);
> ReadProcessMemory(ProcHndl,pMyAddress,pchar(Str2), 50,i);
Размер str2 - 8 байтов, а читать в нее пытаешься аж 50
← →
VMcL (2003-10-16 18:33) [7]>Verg © (02.10.03 14:51) [6]
И это тоже.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c