Показать сообщение отдельно
  #1  
Старый 15.07.2010, 17:19
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка Чтение значения из памяти запущенного процесса

Приветствую, необходимо считать данные из памяти игрушки с определенной позиции, в качестве "определенной позиции" выступает некое слово, например, "live", так вот, есть сурс, но никак нехочет отрабатывать, но слово точно находит, а текст из памяти после слова "live" (конкретно "live" отображается), не отображает, под ХП привилегии не потребовались, под 7 возможно понадобятся:

Код:
function FindString(ProcessID: DWORD; RangeFrom, RangeTo: DWORD; StringToFind: AnsiString): AnsiString;
const
  BufferSize = 1000;
var
  hProcess : DWORD;
  BytesRead : DWORD;
  BytesToRead : DWORD;
  I : DWORD;
  Buffer : Array Of AnsiChar;
  OldProtect : DWORD;
begin
  If (RangeTo - RangeFrom) < 1 Then
    begin
    ShowMessage('Invalid Ranges');
    Exit;
  end;
  hProcess := OpenProcess(PROCESS_VM_READ,False,ProcessID);
  If hProcess = 0 Then
    begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  Try
    SetLength(Buffer,BufferSize);
    Try
      I := RangeFrom;
      While I < RangeTo Do
        begin
        BytesToRead := BufferSize;
        If (RangeTo - I) < BytesToRead Then
          begin
          BytesToRead := RangeTo - I;
        end;
        VirtualProtectEx(hProcess,Pointer(I),BytesToRead,PAGE_READWRITE,OldProtect);
        ReadProcessMemory(hProcess,Pointer(I),@Buffer[0],BytesToRead,BytesRead);
        VirtualProtectEx(hProcess,Pointer(I),BytesToRead,OldProtect,OldProtect);
        If Pos(StringToFind,AnsiString(Buffer)) > 0 Then
          begin
          SetLength(Result,100);
          Move(Buffer[Pos(StringToFind,AnsiString(Buffer)) - 1],Result[1],100);
          Break;
        end;
        Inc(I,BytesToRead);
      end;
    Finally
      Buffer := nil;
    end;
  Finally
    CloseHandle(hProcess);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(FindString(strtoint(edit1.text),$0034686C, $003468BC, 'live'));
end;
Ответить с цитированием