Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.11;
Скачать: [xml.tar.bz2];

Вниз

Опять 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 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.05.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
2-1207839420
Vanis
2008-04-10 18:57
2008.05.11
Отрисовка картинок


2-1207832097
Polar
2008-04-10 16:54
2008.05.11
Направление текста в QRLabel


15-1206524725
capkoh
2008-03-26 12:45
2008.05.11
Изучение SQL. Сколько времени?


4-1188755239
PIG
2007-09-02 21:47
2008.05.11
синхронизация времени


2-1208263641
AlexanderMS
2008-04-15 16:47
2008.05.11
Реально ли такой код перевести с C++ на Delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский