![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение из памяти другой программы [D7]
_white_ © (2006-03-14 09:16:00)Вопросо у меня следующий: Имеется
программа,
которая вносит данные в память, требуется другой программой
эти данные
прочитать (адрес известен), видимо нужно вначале найти
процесс (его
адресное пространство) и затем работать уже с адресным
пространством
найденого процесса. Пожалуйста помогите советом и если
можно небольшим
примером
kaZaNoVa (2006-03-14 19:43:00) [1]Игорь Шевченко © (14.03.06 18:10) [13]
Нет, к содержимому постов
ок ничего не буду писать ..
Игорь Шевченко (2006-03-14 18:10:00) [2]kaZaNoVa © (14.03.06 15:52) [11]
> у Вас предвзятое мнение к моему нику????
Нет, к содержимому постов
kaZaNoVa (2006-03-14 15:54:00) [3]
function GetNameByPid(Pid: dword): string;
var
hProcess, Bytes: dword;
Info: PROCESS_BASIC_INFORMATION;
ProcessParametres: pointer;
ImagePath: TUnicodeString;
ImgPath: array[0..MAX_PATH] of WideChar;
begin
Result := '';
ZeroMemory(@ImgPath, MAX_PATH * SizeOf(WideChar));
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, Pid);
if ZwQueryInformationProcess(hProcess, ProcessBasicInformation, @Info,
SizeOf(PROCESS_BASIC_INFORMATION), nil) = STATUS_SUCCESS then
begin
if ReadProcessMemory(hProcess, pointer(dword(Info.PebBaseAddress) + $10),
@ProcessParametres, SizeOf(pointer), Bytes) and
ReadProcessMemory(hProcess, pointer(dword(ProcessParametres) + $38),
@ImagePath, SizeOf(TUnicodeString), Bytes) and
ReadProcessMemory(hProcess, ImagePath.Buffer, @ImgPath,
ImagePath.Length, Bytes) then
begin
Result := ExtractFileName(WideCharToString(ImgPath));
end;
end;
CloseHandle(hProcess);
end;
kaZaNoVa (2006-03-14 15:52:00) [4]Игорь Шевченко © (14.03.06 12:36) [9]
я что-то не то написал?
что-то плохое?
у Вас предвзятое мнение к моему нику????
viman (2006-03-14 12:53:00) [5]_white_, уточнение. Вы желаете читать данные из чужой программы, которую не можете изменить или же вам просто нужно огранизовать обмен данными между своими программами(или копиями одной и той же)?
В 1-ом случае вам поможет ReadProcessMemory, как и было описано.
Во 2-ом - разделяемая память, например через Mapping file.
Игорь Шевченко (2006-03-14 12:36:00) [6]kaZaNoVa © (14.03.06 12:16) [7]
Если у тебя есть фонтан - заткни его, дай отдохнуть и фонтану.
Сергей М. (2006-03-14 12:24:00) [7]
> _white_ (14.03.06 10:21) [5]
http://www.torry.net/vcl/misc/games/memcheater.zip
kaZaNoVa (2006-03-14 12:16:00) [8]а для чего тебе читать его память? может есть более простое и рациональное решение задачи?
а если просто хочется узнать что-нить из памяти процесса - идеальна прога Artmoney
balepa (2006-03-14 10:31:00) [9]Ты все таки зайди на MSDN там тоже примеры есть (на С конечно, но разобраться можно)
_white_ (2006-03-14 10:21:00) [10]Я вижу что Вы проффессионал в своём деле, и наверняка что-то подобное делали, я был бы вам благодарен если бы вы мне оказали одолжение приведя пример, который как вы сами знаете является куда более удобной вещью нежели перерывание кучи литературы в поисках ответа, ведь слово знающего человека важнее.
_white_ (2006-03-14 10:21:00) [11]Я вижу что Вы проффессионал в своём деле, и наверняка что-то подобное делали, я был бы вам благодарен если бы вы мне оказали одолжение приведя пример, который как вы сами знаете является куда более удобной вещью нежели перерывание кучи литературы в поисках ответа, ведь слово знающего человека важнее.
Сергей М. (2006-03-14 10:08:00) [12]
> где лучше посмотреть описание данных функций
В стандартной справке либо на msdn.microsoft.com.
> как узнать PID
NT - см. EnumProcesses() в модуле psapi.pas
_white_ (2006-03-14 09:48:00) [13]А где лучше посмотреть описание данных функций, и как узнать PID
Сергей М. (2006-03-14 09:32:00) [14]
> нужно вначале найти
> процесс
Точнее - открыть процесс по известному PID.
См. OpenProcess()
> работать уже с адресным
> пространством
> найденого процесса
См. ReadProcessMemory()