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

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

память под процесс [D5, D6, Win95/98, Win2k]


slipper ©   (2002-10-03 19:03:00) 

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


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

спасибо


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

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


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

а вот пример проги, в которой будем искать значение. 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:54:00) [4]

сорри, лоханулся. :) вот 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:53:00) [5]

//
// Поиск значения типа 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.


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

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


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

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


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

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


Наверх

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