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