15.07.2010, 17:19
|
|
Исполняемый Ретровирус
|
|
Регистрация: 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;
|