Форум: "WinAPI";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Внизполучить значение из процесса Найти похожие ветки
← →
Sergadm (2002-11-09 09:04) [0]как определить адрес процесса и выдернуть значение из процесса с определённым смещением от начального адресса
(примером может служить artmony ломалка игр)
← →
paul_shmakov (2002-11-09 14:52) [1]этот пример я сюда уже постил. первая программа ищет вхождение некоего значения типа DWORD в адресном пространстве указанного процесса.
//
// Поиск значения типа 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.
а это демострационная программа, в которой для примера идет поиск.
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.
все откомпилить и запускать
search.exe идентификатор_процесса_someprog 1234512345
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c