Code: |
// Поиск значения типа DWORD в указанном процессе // Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. // 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. |
а вот программа, в которой ведем поиск для примера:
Code: |
program someprog;
{$APPTYPE CONSOLE}
uses SysUtils;
var SomeValue: Integer; begin SomeValue := 12345; WriteLn('One variable of this program has a value ' + IntToStr(SomeValue)); WriteLn('Press any key to exit'); ReadLn; end. |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!