Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ReadProcessMemory [D6, Win2k]


EndDie ©   (2002-09-10 12:43:00) 

Доброго времени суток Вам, гуру!
Прочитал статью http://delphi.mastak.ru/articles/Dapi/index.html,
но там немного не то что мне необходимо.
Проблема заключается в следующем:
Нужно написать программу, которая могла бы читать из чужого процесса информацию... информация эта посылается на сервер программой - пакетами, у которых известны заголовки (например $72) начиная с этого байта нужно считать известное число байт, и вывести например в Мемо.
Хэндл процесса я знаю так как клиент запускаю сам
Createprocess(nil,pChar(comLine),nil,nil,
false,CREATE_DEFAULT_ERROR_MODE,nil,nil,si,p);

затем: ReadProcessMemory(p.hProcess, SAddress, Buffer, Sizeof(Buffer), NumberOfBytesRead);
Теперь вопросы:
1. Чему должен быть равен SAddress? (или чем его можно найти)?
2. Buffer: PByteArray;- как в Мемо вывести сами байты (а не chr(buffer[i]) например)?
3. Если поток таких данных не постоянный, и приходит уходит не ч/з одинаковое время, то как узнать что пришло/ушло новое количество байт (где ловить/обрабатывать-то? т.е. TTimer-не подходит)?
4. Можно ли прочитать и то, что отвечает сервер?
пока вроде все
Заранее большое Спасибо!


Digitman   (2002-09-12 18:00:00) [1]

>>эта самая мессяга

Ты что-нибудь слышал о GetLastError() ?

>>считывать пакеты с данными которые она отправляет/посылает

Любопытно, откуда тебе известен адрес в ВАП чужого процесса, по которому располагаются данные, интересующие тебя ?

вот это вот:

GetSystemInfo(SInf);
SAddress:=SInf.lpMinimumApplicationAddress;

совершенно из другой оперы !
с чего ты взял, что значение SAddress будет равно интересующему тебя адресу ?


EndDie   (2002-09-12 17:10:00) [2]

Вот код которым я пытаюсь запустить программу и считывать пакеты с данными которые она отправляет/посылает:
procedure TForm1.exec(const comLine:string);
var
si: Tstartupinfo;
p: Tprocessinformation;
Buffer : PByteArray;//Pointer;
NumOfBRead,i : LongWord;
SInf : TSystemInfo;
SAddress : Pointer;
MBI: _MEMORY_BASIC_INFORMATION;
begin
fillChar(Si,SizeOf(Si),0);
with Si do begin
cb:= SizeOf( Si);
dwFlags:= startf_UseShowWindow;
wShowWindow:= 4;
end;
if not Createprocess(nil,pChar(comLine),nil,nil,false,
CREATE_DEFAULT_ERROR_MODE,nil,nil,si,p) then begin
ShowMessage("CreateProcess failed..");
Exit;
end;
GetSystemInfo(SInf);
SAddress:=SInf.lpMinimumApplicationAddress;
GetMem(Buffer,1024);
hHandle:=OpenProcess(PROCESS_ALL_ACCESS,false,p.dwProcessId);
if not ReadProcessMemory(hHandle,SAddress,Buffer,Sizeof(Buffer),NumOfBRead) then
begin
ShowMessage("!!!");
Exit;
end;
for i:=0 to NumOfBRead do begin
Memo1.Lines.Add("$"+IntToHex(byte(Buffer[i]),2));
end;
FreeMem(Buffer);
end;


Но!
- во первых считывает она 1 раз, при запуске соответственно, а если выношу (hHandle - делаю глобальным):
if not ReadProcessMemory(hHandle,SAddress,Buffer,Sizeof(Buffer),NumOfBRead) then
begin
ShowMessage("!!!");
Exit;

то появляется эта самая мессяга=!!!, т.е. ReadProcessMemoryне выпоняется.
Не могу понять как же работают пакетные перехватчики, например WPE Pro: http://membres.lycos.fr/tsearch/wpeproalpha.zip
ведь работает же и корректно, и с чужими программами (ето правда решается openprocessом)!!!


Digitman   (2002-09-10 14:48:00) [3]

1. Чему должен быть равен SAddress? (или чем его можно найти)?

SAddress - значение адреса в ВАП целевого процесса, по которому находятся интересующие тебя данные

2. Buffer: PByteArray; - как в Мемо вывести сами байты (а не chr(buffer[i]) например)?

Memo.Lines.Add(IntToHex(byte(buffer[i]), 2));

3. Если поток таких данных не постоянный, и приходит уходит не ч/з одинаковое время, то как узнать что пришло/ушло новое количество байт (где ловить/обрабатывать-то? т.е. TTimer-не подходит)?

О каком потоке идет речь ? В твоем фрагменте кода нет ничего похожего на поток

4. Можно ли прочитать и то, что отвечает сервер?

Если твой сервер "умеет" читать то, что ему посылает твой клиент, то почему твой клиент не "умеет" читать и понимать серверные сообщения ? ПИО - твой собственный ? Или чужой ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо