|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Cчитать строку из памяти процесса запущенной программы. |
|
Delphi - Cчитать строку из памяти процесса запущенной программы.
|
Новый участник Сообщения: 3 |
Профиль | Отправить PM | Цитировать
Не могу решить задачку нужно считать строку из памяти процесса запущенной программы.
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
|
Профиль | Отправить PM | Цитировать ReadProcessMemory(hProc, ipBase, ipbuf[1], 4, numberRead); - может так?
А что вы там получаете? Если же открыть эту же область памяти WinHex, то коды должны совпасть. Проверяйте так. http://www.xakep.ru/post/22263/default.asp - здесь есть пример, правда я его не проверял. Цитата DjDram:
P.S.Delphi какой? В 2009 string - двухбайтовый. |
|
------- Отправлено: 22:26, 24-07-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 3
|
Профиль | Отправить 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 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать DjDram, во-первых, вы пользуетесь отладчиком,чтобы отладить всё это?
Цитата DjDram:
Цитата DjDram:
|
||
------- Отправлено: 12:55, 26-07-2009 | #4 |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать нет отладчиком я непользуюсь, пишу плагин к программе на Delphi
Цитата:
в программе есть слово которое отображается в edit-e на форме его и надо изменить в моей процедуре идёт замена этого слова на новое но в результате слова в памяти меняется а в edit-e остаётся тоже ...поиском в памяти,стало быть. то есть у него нет постоянного адреса в памяти, каким образом можно найти адрес слова в памяти? |
||
Отправлено: 13:32, 26-07-2009 | #5 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Цитата DjDram:
Для этого ищете окно целевой программы с помощью FindWindow,далее находите нужный EDIT с помощью FindWindowEx.Получив описатель этого EDIT'а,отправляете этому окну сообщение WM_SETTEXT: За подробностями функций дуйте на MSDN.Это всё WinAPI.Никаких дельфийских приблуд. P.S. Если вы серьёзно что-то пишете,то отладчик - это must-have. |
|
------- Последний раз редактировалось DillerInc, 27-07-2009 в 17:07. Причина: Грамматика Отправлено: 16:58, 27-07-2009 | #6 |
Старожил Сообщения: 181
|
Профиль | Отправить PM | Цитировать Для Delphi есть компонент TMemoryInspector для работы с "чужими" процессами. Может, пригодится.
|
Отправлено: 23:36, 28-07-2009 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
.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 |
|