Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Изменить значение по адресу в памяти.


Автор: Гость_Sergey89 25.12.2004, 21:50
Как из программы изменить значение по известному мне адресу для определённого процесса?

Автор: p0s0l 26.12.2004, 13:48
Так:
Код
hProcess := OpenProcess (PROCESS_VM_WRITE or PROCESS_VM_OPERATION, False, ProcessID);
WriteProcessMemory (hProcess, Pointer(Адрес в чужом процесса), Pointer(Адрес записываемых данных), <Число записываемых байт>, WrittenBytes);
CloseHandle (hProcess);

Автор: p0s0l 26.12.2004, 13:49
Перенесенно из раздела Delphi

Автор: Guest 26.12.2004, 14:39
Цитата(p0s0l @ 26.12.2004, 13:48)
ProcessID

Это что за переменная?

Автор: p0s0l 26.12.2004, 15:54
Цитата(Guest @ 26.12.2004, 14:39)
Это что за переменная?

Идентификатор процесса...

Как программно определить ProcessID по каким-либо признакам (имя окна, имя .exe или еще что) - это уже другой вопрос, который задавался на форуме не раз smile

Автор: Sergey89 29.12.2004, 16:35
Чёт у меня не выходит, нельзя конкретный пример?

Автор: _hunter 29.12.2004, 16:50
а поиск на что?
http://forum.vingrad.ru/index.php?showtopic=6224

Автор: Sergey89 29.12.2004, 18:00
Допустим мне известен IDПроцесса и он равен 1340 дальше известен адрес $0034062A.
Как мне записать в эту ячейку десятичное число 255?

Автор: _hunter 29.12.2004, 18:03
ты статью читал? в чем проблема?

Автор: Sergey89 29.12.2004, 18:38
Я НЕ ЗНАЮ C++!!!

Автор: _hunter 29.12.2004, 18:47
только щас увидел что тебе p0s0l ответил.... теперь вообще не понимаю в чем проблема...

Автор: Sergey89 29.12.2004, 19:12
Код

function GetIDProcess(AName : PChar ) : Cardinal; StdCall;
var
lSnapHandle, lProcHandle: THandle;
ProcStruct : PROCESSENTRY32;
lProcessPath : Pchar;
PID : Cardinal;
begin
Result := 0;
lSnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if lSnapHandle = 0 then
 exit;
ProcStruct.dwSize := sizeof( PROCESSENTRY32 );
if Process32First(lSnapHandle, ProcStruct) then
begin
 try
   repeat
     lProcessPath := ProcStruct.szExeFile;
     if uppercase(lProcessPath) = uppercase(AName) then
     begin
       PID := ProcStruct.th32ProcessID;
       Result := PID;
       Break;
     end;
   until not Process32Next(lSnapHandle, ProcStruct);
 finally
   CloseHandle(lSnapHandle);
 end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 ProcessID,hProcess, WritenByte: Cardinal;

begin
 ProcessID:= GetIDProcess('spm2.exe');
 hProcess := OpenProcess(PROCESS_VM_WRITE or PROCESS_VM_OPERATION, False, ProcessID);
 WritenByte:= 10;
 WriteProcessMemory(hProcess, Pointer($004282A2), Pointer($004282A2),  2, WritenByte);
 CloseHandle(hProcess);
end;

10 не записывается, появляется 64 вместо 10 smile
Вот я и хотел узнать, как правильно использовать функцию.

Автор: _hunter 29.12.2004, 19:14
а зачем два одинаковых адреса?
и пишеш ты явно не два а четыре байта

Автор: Sergey89 29.12.2004, 19:18
Цитата(_hunter @ 29.12.2004, 19:14)
а зачем два одинаковых адреса?

Смори выше, где p0ps0l постил

Цитата(_hunter @ 29.12.2004, 19:14)
и пишеш ты явно не два а четыре байта

Вот что исправить я и хочу услышать smile

Автор: p0s0l 30.12.2004, 00:50
Немного неправильно понял, что я сказал...
Код

var
 Buf : word;
 WrittenBytes : cardinal;
begin
... hProcess := ...;
Buf := 10;
WriteProcessMemory(hProcess, Pointer($004282A2), @Buf, SizeOf(Buf), WrittenBytes);


Автор: _hunter 30.12.2004, 01:40
Цитата
Смори выше, где p0ps0l постил

посмотрел.
с чего ты взял что адрес буффера == адресу в чужом потоке понять до сих пор не могу...
Добавлено @ 01:44
и в догонку
по справке:
Код
BOOL WriteProcessMemory(
 HANDLE hProcess,
 LPVOID lpBaseAddress,
 LPCVOID lpBuffer,
 SIZE_T nSize,
 SIZE_T* lpNumberOfBytesWritten
);

последний параметр -- указатель. или в Delphi такое катит?

Автор: p0s0l 30.12.2004, 22:07
Цитата(_hunter @ 30.12.2004, 01:40)
последний параметр -- указатель. или в Delphi такое катит?

Он объявлен в параметрах как var, если мне память не изменяет...

Автор: _hunter 31.12.2004, 00:42
понятно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)