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