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

Вниз

Как найти все сегменты памяти чужого процесса, для чтения из них?   Найти похожие ветки 

 
catcher   (2002-09-13 11:20) [0]

Используя FindWindow, GetWindowThreadProcessId, OpenProcess, ReadProcessMemory
я добрался до памяти другого процесса, далее мне понадобилось
найти все сегменты памяти чужого процесса, для дальнейшего их анализа.
Для этого я написал следующую сканирующую функцию.
Но она работает более 15 минут.
Может есть более быстрый способ?
Или как-нибудь ускорить процесс сканирования?
Обязательно ли начало блока будет выровнено на границу 4K и размер кратен 4K?
Прошу простить если я спрашиваю очевидные вещи, но я только сегодня сел разбираться.

Procedure ScanProcessMemoryByPID(PID:Cardinal);
Var hPr:THandle;
R,L:Cardinal;
F:PChar;

function _DetectFirstBlock(P:PChar):PChar; stdcall;
Var X:Byte;
M:Integer;
Begin
M:=10000;
{Аккуратно взглянем на ближайшие 10000 байт}
while (M>0) and (P<>nil) and not ReadProcessMemory(hPr,P,@X,1,R)
do begin inc(P); dec(M); end;
if M=0
then begin
{Нет? Будем рассматривать каждый 243 байт - так быстрее}
while (P<>nil) and not ReadProcessMemory(hPr,P,@X,1,R)
do asm
mov EAX,P;
Add EAX,243;
jnc @1;
xor EAX,EAX;
@1: mov P,EAX;
end;
if P<>nil
then Begin
{Кажется проморгали начало блока. Вернемся.}
P:=P-243;
{Точное позиционирование на начало блока}
while (P<>nil) and not ReadProcessMemory(hPr,P,@X,1,R) do inc(P);
End;
End;
_DetectFirstBlock:=P;
End;

function _DetectBlockSize(P:PChar):Cardinal; stdcall;
Var Start : PChar;
Buff: array [0..1023] of Char;
Begin
Start:=P;
if (P=nil) and ReadProcessMemory(hPr,P,@Buff[0],1,R) then inc(P);
if ReadProcessMemory(hPr,P,@Buff[0],SizeOf(Buff),R)
then Begin {Если можно читать килобайтами, будем читать ими}
repeat
asm
mov EAX,P;
Add EAX,1024;
jnc @1;
xor EAX,EAX;
@1: mov P,EAX;
end
until (P=nil) or not ReadProcessMemory(hPr,P,@Buff[0],SizeOf(Buff),R);
{Кажется проморгали конец блока. Вернемся.}
if P<>nil then P:=P-SizeOf(Buff);
End;
{Теперь по байтам}
While (P<>nil) and ReadProcessMemory(hPr,P,@Buff[0],1,R) do inc(P);
_DetectBlockSize:=P-Start;
End;

Begin
{Очистим TListBox, результат сканирования}
fDesktop.lbProc.Items.clear;
hPr := OpenProcess(PROCESS_VM_OPERATION, False, PID);
if hPr=0
then fDesktop.lbProc.Items.Add("Не могу открыть процесс "+inttostr(PID))
else Begin
F:=_DetectFirstBlock(nil);
repeat
L:=_DetectBlockSize(F);
fDesktop.lbProc.Items.Add(Format("$%x, %d",[Cardinal(F),L]));
fDesktop.lbProc.Repaint;
F :=F+L;
F:=_DetectFirstBlock(F);
until (F=nil);
CloseHandle(hPr);
End;
fDesktop.lbProc.Items.SaveToFile("a.txt")
End;


 
Игорь Шевченко   (2002-09-13 11:26) [1]

Читайте Рихтера - источник знаний.

IMHO, то, что здесь написано, вызывает некоторые сомнения...


 
catcher   (2002-09-13 11:33) [2]

Игорь, функция хоть и кривая, но она работает. Буду искать Рихтера.


 
Игорь Шевченко   (2002-09-13 11:41) [3]

А что такое "все сегменты памяти чужого процесса" ?


 
catcher   (2002-09-13 12:00) [4]

Игорь, сознаюсь сразу, я не владею терминологией. И поэтому сегментами памяти я обозвал те промежутки аргумента P функции ReadProcessMemory(hPr,P,@X,1,R), при которых она возвращает истину. Т.е. что-нибудь прочитала.



 
Игорь Шевченко   (2002-09-13 12:17) [5]

Копать в сторону VirtualQueryEx. И Рихтера зубрить наизусть
Джеффри Рихтер: "Windows для профессионалов", 4-ое издание, 565 рублей


 
catcher   (2002-09-13 12:57) [6]

Ух, ты! Спасибо Игорь! Это то, что нужно! VirtualQueryEx! Вопрос закрыт.



 
слон   (2002-09-13 13:15) [7]

Кхе, лучше я свои 565р. заначу и качну Рихтера на халяву

http://mbo88.chat.ru/rchtbook.zip
http://mbo88.chat.ru/smth.zip



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

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

Наверх





Память: 0.47 MB
Время: 0.008 c
1-92533
Behemoth
2002-10-16 09:24
2002.10.28
Как передать фокус нужному элементу на TabSheet?


3-92339
vis79
2002-10-04 09:57
2002.10.28
все тот же QReport


1-92423
Valek
2002-10-16 10:14
2002.10.28
excel numberformat


1-92488
Стивенс
2002-10-18 09:52
2002.10.28
Delphi 7 + int64


14-92704
bassa
2002-10-08 14:30
2002.10.28
IBM





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