Вниз
Скачать: CL | DM;

Опять ReadProcessMemory :( теперь у всех процессов одни данные?   Найти похожие ветки 

 
Chorniy   (2008-04-10 13:32) [0]

Есть листбокс со списком ID всех процессов. Читаю вот такой процедурой

procedure TForm1.Button15Click(Sender: TObject);
var sID: string;
   HProcess: THandle;
   BlockAddr, Bytes, BlockSize: DWord;
   Block: array of byte;
   i: integer;
   s: string;
begin
   if ListBox2.ItemIndex < 0 then exit;
   sID := ListBox2.Items[ListBox2.ItemIndex];  
   HProcess := OpenProcess(PROCESS_VM_READ,False,StrToInt(sID));
   if HProcess = 0 then
   begin
     ShowMessage("Нечитабельный процесс");
     exit;
   end;
   BlockAddr := StrToInt(Edit30.Text);
   BlockSize := StrToInt(Edit31.Text);
   SetLength(Block, BlockSize);
   ReadProcessMemory(HProcess,Pointer(BlockAddr),@Block[0],BlockSize,Bytes);
   if Bytes <> BlockSize then
   begin
     ShowMessage("Считано только " + IntToStr(Bytes));
     exit;
   end;
end;


Массив-буфер Block получается одинаковый для всех процессов...


 
Chorniy   (2008-04-10 13:36) [1]

Я проверял, что в процедуру OpenProcess поступают разные ID... значит она выдает хендлы РАЗНЫХ процессов... и значит с помощью ReadProcessMemory должны читаться РАЗНЫЕ данные))) ничо не пойму


 
Chorniy   (2008-04-10 14:59) [2]

Если кто-ниюудь использовал функцию ReadProcessMemory то скиньте пожалуйста кусочек кода... я мягким местом чую, что неправильно передаю ей параметры. :)))


 
Сергей М. ©   (2008-04-10 15:10) [3]


> мягким местом чую, что неправильно передаю ей параметры


А не надо "чуять", ни мягким ни твердым местами)

Надо просто внимательно изучить типы и назначения параметров функции.


 
Chorniy   (2008-04-10 15:36) [4]


>  не надо "чуять", ни мягким ни твердым местами)

а вы увидели ошибку или просто так на всякий случай написали))) вот что я знаю про эту функцию

МСДН:
BOOL WINAPI ReadProcessMemory(
 __in   HANDLE hProcess,
 __in   LPCVOID lpBaseAddress,
 __out  LPVOID lpBuffer,
 __in   SIZE_T nSize,
 __out  SIZE_T* lpNumberOfBytesRead
);


1. Хендл... тут все понятно. Получаю из OpenProcess (проверено, что в OpenProcess передаю разные ID)
2. Адрес в области памяти чужого процесса... с этим я разобрался из предыдущего поста (даже визуально заметно что данные сдвигаются на N позиций если задать Адрес + N)... тут все должно быть правильно, потому что не читаются адреса чужого процесса менее 65535 как и сказано у Рихтера. И все процессы имеют разную длину данных которые читаются.
3. указатель на буфер... сюда я помещаю указатель на первый байт массива, которому установил длину равную количеству читаемых байтов
4. Длина участка который я хочу прочитать..сюда пишу длину..тоже должно быть правильно (см. п.2)
5. Количество реально прочитанных байтов... возвращает число равное тому что я хочу прочитать.. значит функция отрабатывает без ошибок и данные переносятся...

НО почему у всех процессов по всем адресам одинаковые данные? откуда функция берет то их?))) возможно все-таки с какого-то процесса. Коль не выдает ошибку... я даже массив-буфер специально зануляю перед чтением. Один фиг)))


 
Thrasher ©   (2008-04-10 16:05) [5]

Посмотри, может хэндл один и тот же?

Попробуй вызывать функции так:

OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, false, pID);

ReadProcessMemory(HProcess,Pointer(BlockAddr),@Block,BlockSize,Bytes);


 
Сергей М. ©   (2008-04-10 16:09) [6]


> вот что я знаю про эту функцию
>


Т.е. ты знаешь, что это функция, но при этом почему-то не желаешь получать и анализировать результат, возвращаемый ею.

Почему ?
На основании чего ты уверен, что функция завершилась успешно ?
Ведь в справке черным по белому сказано:

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
The function fails if the requested read operation crosses into an area of the process that is inaccessible



> почему у всех процессов по всем адресам одинаковые данные?


По каким это "всем" ?



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.014 c
4-1188571688
istok
2007-08-31 18:48
2008.05.11
получить хендл окна...


2-1208175871
assassin8899
2008-04-14 16:24
2008.05.11
AQL запрос


15-1206524540
b z
2008-03-26 12:42
2008.05.11
Даешь русский MSDN


2-1208080633
Megatron
2008-04-13 13:57
2008.05.11
Считывать данные с реестра


2-1207926538
Снежинка
2008-04-11 19:08
2008.05.11
Запрос




   Наверх