Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Cчитать строку из памяти процесса запущенной программы. (http://forum.oszone.net/showthread.php?t=145537)

DjDram 18-07-2009 22:05 1171554

Cчитать строку из памяти процесса запущенной программы.
 
Не могу решить задачку нужно считать строку из памяти процесса запущенной программы.

RVA строки $0036D0C8 нужен ведь RVA не VA

Процедура выглядит следующим образом, для проверки значений заносил их в edit

Код:

procedure TForm1.Button1Click(Sender: TObject);
var
hProc, PID, numberRead : DWORD;
hWnd : THandle; // Хэндл окна чата
IpBuf : string; // буфер куда поместиться наше значение
ipBase: ^dword; // точка входа в памяти
begin
hWnd:=findwindow('TfChatClient',nil); /// получаем хэндл окна программы
 Edit1.Text:=inttostr(hWnd); // заносим в edit Handle
GetWindowThreadProcessId(hWnd, @PID); //получаем pid зная хэндл окошка интересующей нас программы
 Edit2.Text:=inttostr(PID); // заносим в edit ID
hProc:=OpenProcess(PROCESS_VM_READ, False, PID); // подключаемся к процессу зная его ID
try
  if hProc <> 0 then // условие проверки подключения к процессу
          begin
Edit3.Text:=inttostr(hProc); // заносим в edit Process
ipbuf:=' '; // очищаем буфер
            SetLength(ipbuf, 4); // устанавливаем длинну буфера
            ipBase:=ptr($0036D0C8); // RVA слова в памяти
            ReadProcessMemory(hProc, ipBase, Addr(ipbuf), 4, numberRead); // чтение из памяти строки
            Edit4.Text:=PCHAR(ipbuf); // заносим в edit Buffer
          end;
finally
CloseHandle(hProc); // отсоединяемся от процесса
end;
end;



В результате получилось следующее хэндл, pid process считываються идеально, а вот переменная ipbuf куда должно занестись значение выдыдаёт какуето ерунду что не так где ошибки?

BlackEric 24-07-2009 22:26 1176991

ReadProcessMemory(hProc, ipBase, ipbuf[1], 4, numberRead); - может так?

А что вы там получаете? Если же открыть эту же область памяти WinHex, то коды должны совпасть. Проверяйте так.

http://www.xakep.ru/post/22263/default.asp - здесь есть пример, правда я его не проверял.

Цитата:

Цитата DjDram
Edit4.Text:=PCHAR(ipbuf); // заносим в edit Buffer »

- у вас уже string. Зачем его к PChar приводить?

P.S.Delphi какой? В 2009 string - двухбайтовый.

DjDram 24-07-2009 22:50 1177007

Код:

procedure TForm1.Button1Click(Sender: TObject);
var
hProc, PID, numberRead : DWORD;
hWnd : THandle; // Хэндл окна
IpBuf : PWideChar; // буфер куда поместиться наше значение
len : integer;
ipBase: ^dword; // точка входа в памяти
Buf : PChar;
Write:cardinal;
New:string; // новое значение
begin
hWnd:=Findwindow('TfChatClient',nil); // получаем хэндл окна программы
Edit1.Text:=inttostr(hWnd); // заносим в edit Handle
GetWindowThreadProcessId(hWnd, @PID); //получаем pid зная хэндл окошка интересующей нас программы
Edit2.Text:=inttostr(PID); // заносим в edit ID
hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, PID); // подключаемся к процессу зная его ID
if hProc <> 0 then // условие проверки подключения к процессу
try
len := 200;
ipBuf :=AllocMem(len);
Edit3.Text:=inttostr(hProc); // заносим в edit Process
ipBase:=ptr($0152BD82); // адрес слова в памяти как его узнать ?
ReadProcessMemory(hProc, ipBase, ipBuf, len, numberRead); // чтение из памяти строки
Edit4.Text:=WideCharToString(ipbuf); // заносим в edit Buffer
New:=Edit5.Text; // присваевываем наше слово переменной
StringToWideChar(New, ipBuf, len); // заносим в буфер
WriteProcessMemory(hProc, ipBase, ipBuf, 15, write); //меняем старое значения слова на новое
finally
CloseHandle(hProc); // отсоединяемся от процесса
FreeMem(ipBuf); // освобождаем память
end;
end;


Вот вроде работает нормально теперь вопрос встал о записи в память
значение в памяти меняет но в программе не отображается изменённое значение, а показывает старое...

и ещё как узнать адрес моего слова в памяти чтоб не вводить его постоянно ipBase:=ptr($0152BD82);
если открыть exe hiew то адрес моего слова 0036D0C8 (RVA) и .0076D0C8 (VA), а в памяти всегда разный.

DillerInc 26-07-2009 12:55 1177949

DjDram, во-первых, вы пользуетесь отладчиком,чтобы отладить всё это?
Цитата:

Цитата DjDram
но в программе не отображается изменённое значение, а показывает старое... »

...подробнее?
Цитата:

Цитата DjDram
и ещё как узнать адрес моего слова в памяти чтоб не вводить его постоянно ipBase:=ptr($0152BD82) »

...поиском в памяти,стало быть.

DjDram 26-07-2009 13:32 1177966

нет отладчиком я непользуюсь, пишу плагин к программе на Delphi

Цитата:

но в программе не отображается изменённое значение, а показывает старое... »

...подробнее?
вообщем есть программа,
в программе есть слово которое отображается в edit-e на форме
его и надо изменить
в моей процедуре идёт замена этого слова на новое
но в результате слова в памяти меняется а в edit-e остаётся тоже


...поиском в памяти,стало быть.

то есть у него нет постоянного адреса в памяти, каким образом можно найти адрес слова в памяти?

DillerInc 27-07-2009 16:58 1179075

Цитата:

Цитата DjDram
но в результате слова в памяти меняется а в edit-e остаётся тоже »

...дык,правильно.Если слово уже отображено в EDIT'е,то его не изменишь,просто исправив в образе целевой программы в памяти.
Для этого ищете окно целевой программы с помощью FindWindow,далее находите нужный EDIT с помощью FindWindowEx.Получив описатель этого EDIT'а,отправляете этому окну сообщение WM_SETTEXT:
Код:

invoke  SendMessage, hEditControl, WM_SETTEXT, 0, pYourText
За подробностями функций дуйте на MSDN.Это всё WinAPI.Никаких дельфийских приблуд.

P.S. Если вы серьёзно что-то пишете,то отладчик - это must-have.

Alexej77 28-07-2009 23:36 1180193

Для Delphi есть компонент TMemoryInspector для работы с "чужими" процессами. Может, пригодится.


Время: 02:44.

Время: 02:44.
© OSzone.net 2001-