Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.23;
Скачать: CL | DM;

Вниз

получить значение из процесса   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2002.12.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
14-74945
Marconi
2002-12-02 20:31
2002.12.23
а как? возможно юзеры задают слишком много вопросов!


1-74764
Иванов Сергей
2002-12-10 20:24
2002.12.23
как заставить D5 сохранять изменения в *.dfm


1-74843
Сатир
2002-12-11 18:47
2002.12.23
Drag & Drop in TListView


1-74758
Спрашивающий
2002-12-15 01:36
2002.12.23
Как возвести вещественное число в степень.


1-74834
vilfred
2002-12-10 16:49
2002.12.23
с неимоверной силой лезут 255 в данные