Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.13;
Скачать: CL | DM;

Вниз

Работа с ReadProcessMemory, как прочитать данные ячейки?   Найти похожие ветки 

 
nofical   (2011-07-26 18:34) [0]

Добрый день уважаемые, подскажите пожалуйста как считать данные из ячейки памяти чужого приложения, перегуглил множество страниц, нашел только функцию ReadProcessMemory, но разобраться никак с ней не могу.

Задача очень проста: Имеется адрес типа 014B6A44, надо прочитать его значение.

Заранее благодарен :)


 
Игорь Шевченко ©   (2011-07-26 18:37) [1]


> но разобраться никак с ней не могу


что именно непонятно ?


 
nofical   (2011-07-26 19:00) [2]

procedure TForm1.Button4Click(Sender: TObject);
var
 wBuff: byte;
 wHandle: integer;
 tHandle, ProcessID, pHandle, temp: cardinal;
begin
 wHandle := FindWindow(nil, "Áåçûìÿííûé - Áëîêíîò");
 if wHandle <> 0 then
 begin
   tHandle := GetWindowThreadProcessId(wHandle, @ProcessID);
   pHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
   WriteProcessMemory(pHandle, ptr($014B6A44), @wBuff, 4, temp);
   //
   CloseHandle(pHandle);
 end
   else
     ShowMessage("not handle");
end;


Из того что я понял, данные заносятся в wBuff, только вот как вытащить из нее данные в обычну переменную типа string или integer, не понимаю.


 
nofical   (2011-07-26 19:02) [3]

Опечатка WriteProcessMemory на ReadProcessMemory


 
Игорь Шевченко ©   (2011-07-26 20:41) [4]


> Из того что я понял, данные заносятся в wBuff


Как же 4 байта могут поместиться в 1 байт ?


> ReadProcessMemory(pHandle, ptr($014B6A44), @wBuff, 4, temp);


здесь заказано чтение четырех байт


> var
>  wBuff: byte;


здесь объявлен один байт. Нестыковка.


> только вот как вытащить из нее данные в обычну переменную
> типа string или integer, не понимаю


Если Integer, то и переменную, куда читаешь, нужно объявить как Integer.

например,
var
 wBuff: Integer;

если "типа string", то изучить функцию SetLength, узнать длину строки в памяти чужого процесса, ну и, собственно, читать в PChar(string_var)


 
nofical   (2011-07-26 21:19) [5]

спасибо разобрался "кто гуглит тот всегда найдет" (С) :)

const
Offset = $00000000;

var
Wnd: HWND;
ThreadId, ProcessId, Hdl: Cardinal;
BytesRead: Cardinal;
Value: Integer;

...

Wnd := FindWindow(nil, "Имя программы");
ThreadId := GetWindowThreadProcessId(Wnd, @ProcessId);
Hdl := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
ReadProcessMemory(Hdl, Pointer(Offset), @Value, 4, BytesRead);

// вывод
ShowMessage(IntToStr(value));

CloseHandle(hdl);


Выкладываю код, может кому пригодится ...


 
Игорь Шевченко ©   (2011-07-26 21:43) [6]


> может кому пригодится ...


никому не пригодится



Страницы: 1 вся ветка

Текущий архив: 2011.11.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
15-1310467018
Дмитрий С
2011-07-12 14:36
2011.11.13
Как правильно показывать длительный процесс?


2-1311321505
ixen
2011-07-22 11:58
2011.11.13
Как узнать тип поля?


2-1311682692
Fr
2011-07-26 16:18
2011.11.13
Как работать с svg в Делфи?


3-1266257536
GEN001
2010-02-15 21:12
2011.11.13
MSSQL и поле типа TEXT


2-1311063552
Ш-К
2011-07-19 12:19
2011.11.13
Толстые и тонкие клиенты