Форум: "Начинающим";
Текущий архив: 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