Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2012, 22:50   #1
Maincore
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 51
По умолчанию Чтение памяти процесса

Вообщем можно ли реализовать следующее?
Нужно найти следующий текст в памяти чужого процесса "DataX DataY"
так вот текст DataX мне известен, а DataY нет и его мне нужно узнать.
если сделать так найти адрес с текстом DataX и прочитать рядом стоящие адреса? Я получу ли текст DataY?

Пример текста: 'Получено 48 байт'
Maincore вне форума Ответить с цитированием
Старый 10.08.2012, 07:49   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Я получу ли текст DataY?
Может да, а может и нет...

Цитата:
'Получено 48 байт'
Скорее всего в памяти лежит заготовка для "принтфа" - 'Получено %d байт', а счетчик подставляется. Ну может и слово байт тоже быть параметром.
p51x вне форума Ответить с цитированием
Старый 10.08.2012, 09:52   #3
Maincore
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 51
По умолчанию

Цитата:
Скорее всего в памяти лежит заготовка для "принтфа" - 'Получено %d байт', а счетчик подставляется. Ну может и слово байт тоже быть параметром.
То есть в данном случаем
Цитата:
48
будет находиться совсем в другом адресе?


-------------------------------------------------------------------------------
Код:
var
  Form1: TForm1;
  hProc, PID, numberRead : DWORD;
  hWnd : THandle;
  IpBuf : string; 
  ipBase: ^dword;


procedure TForm1.Button1Click(Sender: TObject);
begin
hWnd:=findwindow('#32770','Programm');
GetWindowThreadProcessId(hWnd, @PID); 
hProc:=OpenProcess(PROCESS_VM_READ, False, PID);
ipBase:=ptr($7FFDF22C); 
ReadProcessMemory(hProc, ipBase, Addr(ipbuf), 100, numberRead); 

ShowMessage (Pansichar(ipbuf));

end;
Цитата:
ShowMessage (Pansichar(ipbuf));
Почему вылетает ошибка
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0040404B in module 'Project1.exe'. Read of address 043E041B'. Process stopped. Use Step or Run to continue.


А если убрать ShowMessage то ошибка не вылетает.

Последний раз редактировалось Maincore; 10.08.2012 в 11:14.
Maincore вне форума Ответить с цитированием
Старый 10.08.2012, 11:54   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
будет находиться совсем в другом адресе?
А может и в регистре.

Код:
IpBuf : string;
Вы уверены, что стринг просто набор байтов? Вы уверены, что он не юникодовский?

РидПроцесс успешно завершился? Прав хватило? Читали ли вы из 32битного 64битны? ...
p51x вне форума Ответить с цитированием
Старый 10.08.2012, 21:53   #5
Maincore
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А может и в регистре.

Код:
IpBuf : string;
Вы уверены, что стринг просто набор байтов? Вы уверены, что он не юникодовский?

РидПроцесс успешно завершился? Прав хватило? Читали ли вы из 32битного 64битны? ...
Собственно нужно нужно прочитать адрес в котором содержатся текст Unicode. Какой тиg буфера нужно использовать?
Maincore вне форума Ответить с цитированием
Старый 11.08.2012, 00:29   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Сообщение от Maincore Посмотреть сообщение
То есть в данном случаем будет находиться совсем в другом адресе?


-------------------------------------------------------------------------------
Код:
var
  Form1: TForm1;
  hProc, PID, numberRead : DWORD;
  hWnd : THandle;
  IpBuf : string; 
  ipBase: ^dword;


procedure TForm1.Button1Click(Sender: TObject);
begin
hWnd:=findwindow('#32770','Programm');
GetWindowThreadProcessId(hWnd, @PID); 
hProc:=OpenProcess(PROCESS_VM_READ, False, PID);
ipBase:=ptr($7FFDF22C); 
ReadProcessMemory(hProc, ipBase, Addr(ipbuf), 100, numberRead); 

ShowMessage (Pansichar(ipbuf));

end;

Почему вылетает ошибка
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0040404B in module 'Project1.exe'. Read of address 043E041B'. Process stopped. Use Step or Run to continue.


А если убрать ShowMessage то ошибка не вылетает.
1. ReadProcessMemory возвращает BOOL, проверяйте, читает ли вообще что-то.
2. Если читает, то под область чтения нужно выделить память.
Человек_Борща вне форума Ответить с цитированием
Старый 11.08.2012, 22:26   #7
Maincore
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
1. ReadProcessMemory возвращает BOOL, проверяйте, читает ли вообще что-то.
Да да возвращает true;

Цитата:
2. Если читает, то под область чтения нужно выделить память.
GetMem?

А вообще какой алгоритм поиск текста в памяти процесса?
1)получить пид процесса (GetWindowThreadProcessId)
2)открыть процесс (OpenProcess)
а дальше что? ReadProcessMemory?
Maincore вне форума Ответить с цитированием
Старый 11.08.2012, 23:04   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Для начала неплохо бы получить нужные права и разрешения...
p51x вне форума Ответить с цитированием
Старый 11.08.2012, 23:16   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Ну вот близкая по духу тема уже обсуждалась, вкратце "сброс памяти процесса в файл". Сообщение с решением(44-е сообщение), дальше только срачь.

Открыть процесс пробежаться по страницам памяти и найти все строки...
Как же хранятся строки в памяти, эмм ну в блоге GUnSmooker'а много написано и на эту тему. Затем в резултате найти или руками или регулярным ыражением, сабж.
Человек_Борща вне форума Ответить с цитированием
Старый 13.08.2012, 14:42   #10
Maincore
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 51
По умолчанию

Человек_Борща, функция что надо только вот не могу записать данные в MapFile.

делаю так:
Код:
if ReadProcessMemory(hProcess, MBI.BaseAddress, Buff, MBI.RegionSize, RecivedBytes) then
              begin
              StrCopy(form1.MapFilePointer,Pansichar(Buff));
              end
не подскажете?
Maincore вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение значения из памяти запущенного процесса padsyukin Помощь студентам 2 09.03.2012 15:39
Редактирование памяти процесса Dima DDM Общие вопросы Delphi 0 25.12.2010 16:54
Защита памяти процесса. worldhero Фриланс 2 25.07.2010 11:15
Чтение данных из памяти процесса (need help) lexastik Win Api 10 26.02.2009 20:50
Редактирование памяти процесса Air Win Api 6 16.02.2008 20:15