Форум: "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