![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение из памяти другой программы
Хинт © (2005-08-31 17:55:00)Необходимо прочитать 2 байта из памяти другой программы. Нашел нужный адрес. В процессе работы программы он остается неизменным (изменяю в программе значение, смотрю в памяти и значения совпадают). Перезапустив программу, замечаю, что адрес уже изменился и нужные мне значения лежат уже в другом месте. Возможно ли как-нибудь определять нужный адрес? Ведь программа как-то узнает откуда ей брать значения своих переменных? Насколько я понимаю мне надо найти указатель, но как это сделать я не знаю... Помогите разобраться.
Defunct (2005-08-31 19:30:00) [21]> Не проще ли воспользоваться функцией FindWindow для определения PID?
Может быть, только в цикле imho есть свои прелести как например возможность использования LowerCase.
> Только оказалось, что адрес меняется :(
Меняется локальный адрес переменной внутри процесса?
Piter (2005-08-31 19:29:00) [22]Хинт © (31.08.05 17:55)
объясни, зачем тебе нужно читать значения из памяти другого процесса?
Tonich (2005-08-31 19:29:00) [23]
> Хинт © (31.08.05 19:22) [4]
опередил )))
Piter (2005-08-31 19:28:00) [24]Defunct © (31.08.05 19:19) [3]
Возможно, тут есть народ кто знает как получить указатель на память процесса имея его Id.
:)))
Tonich (2005-08-31 19:28:00) [25]ну читать из чужого АП можно так
BOOL READProcessMemory( HANDLE hProcess, PVOID pvAddressRemote, PVOTD pvBufferLocal, DWOHD dwSize, PDWORD pdwNumBytesWritten);
где hProcess хендел чужого процесса
hProcess = OpenProcess(
PROCESS_CREATE THREAD or // для CreateRemoteThread
PROCESS_VM_OPERATION or // для VirtualAllocEx/VirtualFreeEx
PROCESS_VM_READ, // для READProcessMemory
FALSE, dwProcessId);
а вот pvAddressRemote и есть адрес блока данных (ну которые хочешь прочитать)
Хинт (2005-08-31 19:22:00) [26]Спасибо за участие в проблеме, но все это я уже сделал, в том числе считывание переменных. Только оказалось, что адрес меняется :(
PS: Не проще ли воспользоваться функцией FindWindow для определения PID?
Defunct (2005-08-31 19:19:00) [27]Ясно.
Могу помочь только отыскать Id процесса. Дальше к сожалению, я не углублялся. Возможно, тут есть народ кто знает как получить указатель на память процесса имея его Id.
function GetProcessIdByWndCaption( ACaption : String ): Cardinal;
var
Hw : HWND;
S : String;
I : Integer;
begin
Result := 0;
HW := GetActiveWindow;
HW := GetWindow(HW, GW_HWNDFIRST);
repeat
SetLength( S, 256 );
HW:=GetWindow(HW, GW_HWNDNEXT);
GetWindowText(HW, @S[1], 256);
if Pos( ACaption, S) <> 0 then
begin
GetWindowThreadProcessId( HW, Result );
Break
end;
until HW = 0;
end;
Хинт (2005-08-31 18:18:00) [28]Чужая. Исходных кодов нет. Только EXE файл.
Defunct (2005-08-31 18:15:00) [29]Хинт © (31.08.05 17:55)
Программа ваша или чужая?