 |
|
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 куда должно занестись значение выдыдаёт какуето ерунду что не так где ошибки?
|
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 - двухбайтовый.
|
Код:
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), а в памяти всегда разный.
|
DjDram, во-первых, вы пользуетесь отладчиком,чтобы отладить всё это?
Цитата:
Цитата DjDram
но в программе не отображается изменённое значение, а показывает старое... »
|
...подробнее?
Цитата:
Цитата DjDram
и ещё как узнать адрес моего слова в памяти чтоб не вводить его постоянно ipBase:=ptr($0152BD82) »
|
...поиском в памяти,стало быть.
|
нет отладчиком я непользуюсь, пишу плагин к программе на Delphi
Цитата:
но в программе не отображается изменённое значение, а показывает старое... »
...подробнее?
|
вообщем есть программа,
в программе есть слово которое отображается в edit-e на форме
его и надо изменить
в моей процедуре идёт замена этого слова на новое
но в результате слова в памяти меняется а в edit-e остаётся тоже
...поиском в памяти,стало быть.
то есть у него нет постоянного адреса в памяти, каким образом можно найти адрес слова в памяти?
|
Цитата:
Цитата DjDram
но в результате слова в памяти меняется а в edit-e остаётся тоже »
|
...дык,правильно.Если слово уже отображено в EDIT'е,то его не изменишь,просто исправив в образе целевой программы в памяти.
Для этого ищете окно целевой программы с помощью FindWindow,далее находите нужный EDIT с помощью FindWindowEx.Получив описатель этого EDIT'а,отправляете этому окну сообщение WM_SETTEXT:
Код:
invoke SendMessage, hEditControl, WM_SETTEXT, 0, pYourText
За подробностями функций дуйте на MSDN.Это всё WinAPI.Никаких дельфийских приблуд.
P.S. Если вы серьёзно что-то пишете,то отладчик - это must-have.
|
Для Delphi есть компонент TMemoryInspector для работы с "чужими" процессами. Может, пригодится.
|
Время: 02:44.
© OSzone.net 2001-