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

Вниз

память под процесс   Найти похожие ветки 

 
slipper   (2002-10-03 19:03) [0]

как опредилить по каким адрессам хранятся в памяти значения выбираемого процесса,т.е имея значения опредилить все адресса содержащие эти значения в данном процессе


 
paul_shmakov   (2002-10-03 20:18) [1]

т.е. иначе переформулируя вопрос: "имею значение 12345 типа DWORD, нужно найти все виртуальные адреса, по которым в заданном процессе лежит значение 12345 типа DWORD". так?
если так, то нужно открыть процесс (OpenProcess с PROCESS_VM_READ и, возможно, PROCESS_VM_OPERATION), с помощью VirtualQueryEx перебрать все регионы в памяти, выделенные процессом. читать каждый регион блоками с помощью ReadProcessMemory, сначала проверив, что он доступен для чтения.
если регион для чтения недоступен, то, в зависимости от задачи, можно на время чтения поменять атрибуты региона, а потом восстановить оригинальные.
вот и все, только не забыть в конце нужные CloseHandle вызвать.


 
slipper   (2002-10-05 17:02) [2]

спасибо за ответ,но я ни как не могу найти описания VirtualQueryEx ,так что если кто-нибудь знает ссылку или само описание большая просьба ответить,и еще очень хотелось бы какой-нибудь пример


 
slipper   (2002-10-06 17:12) [3]

да блин ничего неполучается,может кто знает расскажите механизм по которому работают эти функции(какой начальный адресс региона и т.д)и пожалуйста подробней,пример лучше всего
Заранее благодарен slippery


 
paul_shmakov   (2002-10-08 18:53) [4]

//
// Поиск значения типа DWORD в указанном процессе
// paul_shmakov@mail.ru
//
program search;

{$APPTYPE CONSOLE}

uses Windows, SysUtils;

var
ProcessID: DWord;
ProcessHandle: THandle;
Mbi: TMemoryBasicInformation;
Addr: DWord;
Value: DWord;
I: Cardinal;
Buf: PChar;
BytesRead: DWord;
begin
if ParamCount < 2 then
begin
WriteLn("Usage: search.exe processid value");
Exit;
end;

ProcessID := StrToInt(ParamStr(1));
WriteLn("Process id: " + IntToStr(ProcessID));

Value := StrToInt(ParamStr(2));
WriteLn("Value to search: " + IntToStr(Value));

//
// Открываем процесс
//
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or
PROCESS_VM_OPERATION, false, ProcessID);

if ProcessHandle <> 0 then
try
Addr := 0;

//
// Перечисляем все регионы виртуальной памяти процесса
//
while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
begin
// Uncomment чтобы увидеть список регионов, найденых в адресном пространстве
// WriteLn("region: " + IntToHex(Integer(Mbi.BaseAddress), 8) +
// " size: " + IntToStr(Mbi.RegionSize));

//
// Если региону выделена память, и регион не является "сторожевым" (как вершина стека),
// то читаем этот регион
//
if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
begin
//
// Это демонстрационная программа, поэтому здесь выделяется буфер под весь регион.
// Регион может быть достаточно большим, поэтому лучше читать его блоками для экономии
// памяти. Но здесь для простоты алгоритма вся оптимизация похерена.
//
GetMem(Buf, Mbi.RegionSize);
try
//
// Читаем весь регион в выделенный буфер
//
if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf,
Mbi.RegionSize, BytesRead) then
begin
//
// Ищем значение типа DWORD в буфере
//
for I := 0 to BytesRead - SizeOf(Value) do
begin
if PDWord(@Buf[I])^ = Value then
// Найдено, выводим
WriteLn("Value " + IntToStr(Value) + " found at " +
IntToHex(Integer(Cardinal(Mbi.BaseAddress) + I), 8));
end;
end
else
WriteLn("Failed to read process memory " + IntToStr(GetLastError));

finally
FreeMem(Buf);
end;
end;

// Вычисляем адрес следуюшего региона
Addr := Addr + Mbi.RegionSize;
end;

finally
CloseHandle(ProcessHandle);
end
else
WriteLn("Failed to open process");
end.


 
paul_shmakov   (2002-10-08 18:54) [5]

сорри, лоханулся. :) вот search.dpr

//
// Поиск значения типа DWORD в указанном процессе
// paul_shmakov@mail.ru
//
program search;

{$APPTYPE CONSOLE}

uses Windows, SysUtils;

var
ProcessID: DWord;
ProcessHandle: THandle;
Mbi: TMemoryBasicInformation;
Addr: DWord;
Value: DWord;
I: Cardinal;
Buf: PChar;
BytesRead: DWord;
begin
if ParamCount < 2 then
begin
WriteLn("Usage: search.exe processid value");
Exit;
end;

ProcessID := StrToInt(ParamStr(1));
WriteLn("Process id: " + IntToStr(ProcessID));

Value := StrToInt(ParamStr(2));
WriteLn("Value to search: " + IntToStr(Value));

//
// Открываем процесс
//
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or
PROCESS_VM_OPERATION, false, ProcessID);

if ProcessHandle <> 0 then
try
Addr := 0;

//
// Перечисляем все регионы виртуальной памяти процесса
//
while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
begin
// Uncomment чтобы увидеть список регионов, найденых в адресном пространстве
// WriteLn("region: " + IntToHex(Integer(Mbi.BaseAddress), 8) +
// " size: " + IntToStr(Mbi.RegionSize));

//
// Если региону выделена память, и регион не является "сторожевым" (как вершина стека),
// то читаем этот регион
//
if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
begin
//
// Это демонстрационная программа, поэтому здесь выделяется буфер под весь регион.
// Регион может быть достаточно большим, поэтому лучше читать его блоками для экономии
// памяти. Но здесь для простоты алгоритма вся оптимизация похерена.
//
GetMem(Buf, Mbi.RegionSize);
try
//
// Читаем весь регион в выделенный буфер
//
if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf,
Mbi.RegionSize, BytesRead) then
begin
//
// Ищем значение типа DWORD в буфере
//
for I := 0 to BytesRead - SizeOf(Value) do
begin
if PDWord(@Buf[I])^ = Value then
// Найдено, выводим
WriteLn("Value " + IntToStr(Value) + " found at " +
IntToHex(Integer(Cardinal(Mbi.BaseAddress) + I), 8));
end;
end
else
WriteLn("Failed to read process memory " + IntToStr(GetLastError));

finally
FreeMem(Buf);
end;
end;

// Вычисляем адрес следуюшего региона
Addr := Addr + Mbi.RegionSize;
end;

finally
CloseHandle(ProcessHandle);
end
else
WriteLn("Failed to open process");
end.


 
paul_shmakov   (2002-10-08 18:55) [6]

а вот пример проги, в которой будем искать значение. someprog.dpr

program someprog;

{$APPTYPE CONSOLE}

uses SysUtils;

var
SomeValue: Integer;
begin
SomeValue := 1234512345;
WriteLn("One variable of this program has a value " + IntToStr(SomeValue));
WriteLn("Press any key to exit");
ReadLn;
end.


 
paul_shmakov   (2002-10-08 18:57) [7]

использовать так:
1) запустить someprog
2) посмотреть его pid в taskmanager
3) запустить search.exe pid 1234512345


 
slipper   (2002-10-08 19:02) [8]

спасибо



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
14-59356
McSimm
2002-10-29 17:09
2002.11.18
Genesis


3-59012
ev1972
2002-10-25 09:13
2002.11.18
Поддерживает ли TDBF CDX - индексы?


1-59212
Sergic
2002-11-06 14:14
2002.11.18
создание собственных типов при использовании COM


14-59382
SpiritS
2002-10-25 20:49
2002.11.18
Создание отчета в MSWord 97


14-59363
int64
2002-10-28 11:28
2002.11.18
Преферансная загадка.





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