Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Cчитать строку из памяти процесса запущенной программы.

Ответить
Настройки темы
Delphi - Cчитать строку из памяти процесса запущенной программы.

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 25-07-2009
Описание: теги [code][/code]
Не могу решить задачку нужно считать строку из памяти процесса запущенной программы.

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 куда должно занестись значение выдыдаёт какуето ерунду что не так где ошибки?

Отправлено: 22:05, 18-07-2009

 

Старожил


Сообщения: 435
Благодарности: 63

Профиль | Отправить PM | Цитировать


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 - двухбайтовый.

-------
black-eric.livejournal.com

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:26, 24-07-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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), а в памяти всегда разный.

Последний раз редактировалось Drongo, 25-07-2009 в 10:12. Причина: теги [code][/code]


Отправлено: 22:50, 24-07-2009 | #3


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


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

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:55, 26-07-2009 | #4


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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


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

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

Отправлено: 13:32, 26-07-2009 | #5


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Цитата DjDram:
но в результате слова в памяти меняется а в edit-e остаётся тоже »
...дык,правильно.Если слово уже отображено в EDIT'е,то его не изменишь,просто исправив в образе целевой программы в памяти.
Для этого ищете окно целевой программы с помощью FindWindow,далее находите нужный EDIT с помощью FindWindowEx.Получив описатель этого EDIT'а,отправляете этому окну сообщение WM_SETTEXT:
Код: Выделить весь код
invoke  SendMessage, hEditControl, WM_SETTEXT, 0, pYourText
За подробностями функций дуйте на MSDN.Это всё WinAPI.Никаких дельфийских приблуд.

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

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Последний раз редактировалось DillerInc, 27-07-2009 в 17:07. Причина: Грамматика

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:58, 27-07-2009 | #6


Старожил


Сообщения: 181
Благодарности: 43

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:36, 28-07-2009 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Cчитать строку из памяти процесса запущенной программы.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
.NET - Получение PID процесса, запущенного из программы Delirium Программирование и базы данных 2 07-12-2009 02:17
Постоянно висят 3 процесса CLI.exe в памяти Stason177 Microsoft Windows 2000/XP 7 17-11-2009 09:03
2 процесса rundll32.EXE в памяти arie Лечение систем от вредоносных программ 5 12-11-2008 22:20
[решено] 2 процесса IEXPLORE.EXE в памяти DragonLove Лечение систем от вредоносных программ 15 06-11-2008 20:14
Как из программы, запущенной как сервис, обратиться к CD? ES Microsoft Windows NT/2000/2003 6 16-02-2007 11:42




 
Переход