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

Вниз

ReadProcessMemory   Найти похожие ветки 

 
EndDie   (2002-09-10 12:43) [0]

Доброго времени суток Вам, гуру!
Прочитал статью 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-10 14:48) [1]

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

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

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

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

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

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

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

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


 
EndDie   (2002-09-12 17:10) [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-12 18:00) [3]

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

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

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

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

вот это вот:

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

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



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

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

Наверх





Память: 0.46 MB
Время: 0.008 c
3-78218
Rom Shell
2002-10-04 11:18
2002.10.24
Переиндексация


4-78735
lds78
2002-07-18 10:08
2002.10.24
PopupMenu


1-78510
msdn1
2002-10-13 22:10
2002.10.24
Richedit


14-78623
Alibaba
2002-10-03 13:44
2002.10.24
Есть предложение.


3-78244
Uran
2002-10-02 11:13
2002.10.24
Редактирование таблицы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский