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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2013, 23:05   #21
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы итак можете обратится к этому адресу, вы же внутри себя.

вам надо сканировать память процесса вашего, в поисках нужных данных.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.07.2013, 05:49   #22
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Например, у меня в приложении, собранном в Delphi 6, PAnsiChar($00400050) возвращает 'This program must be run under Win32'#13#10'$' -- известную строчку из DOS-заглушки.

В современных версиях Windows вместо жестко прописанного $00400000 придется узнавать свою текущую Image Base, если включена рандомизация памяти процесса и exe-шник имеет перемещаемые символы.
Vapaamies вне форума Ответить с цитированием
Старый 02.07.2013, 09:16   #23
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Цитата:
вам надо сканировать память процесса вашего, в поисках нужных данных.
Т.е. вначале мне нужно получить начальный адрес памяти процесса, а после этого начать сканировать память, но как мне это делать? в цикле проверять
if (PAnsiChar($00400050)='a'), потом
if (PAnsiChar($00400051)='a'), так?
А границы памяти узнаются с помощью GetSystemInfo?
lollollollol вне форума Ответить с цитированием
Старый 02.07.2013, 11:33   #24
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от lollollollol Посмотреть сообщение
Т.е. вначале мне нужно получить начальный адрес памяти процесса, а после этого начать сканировать память, но как мне это делать? в цикле проверять
if (PAnsiChar($00400050)='a'), потом
if (PAnsiChar($00400051)='a'), так?
А границы памяти узнаются с помощью GetSystemInfo?
границы exe-шника узнаются через его заголовки, GetSystemInfo дает другие границы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.07.2013, 12:40   #25
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Спасибо за терпение и разъяснения, подскажи пожалуйста ещё, где подробнее можно почитать про поиск границ через заголовки?
lollollollol вне форума Ответить с цитированием
Старый 02.07.2013, 17:06   #26
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

В поиске не могу ничего найти про границ памяти exe
lollollollol вне форума Ответить с цитированием
Старый 02.07.2013, 17:44   #27
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Память процесса начинается с адреса 0х00000000 и до 0хFFFFFFFF.

Вызывайте VirtualQuery с адреса 0, потом берите размер блока и вычисляйте начало следующего блока.

Внимательно прочитайте содержание структуры MEMORY_BASIC_INFORMATION - это важно! Там все параметры блока памяти.
waleri вне форума Ответить с цитированием
Старый 02.07.2013, 19:06   #28
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

У меня возникает ошибка
Read of address 00414000.

Делаю вот такую проверку
Код:
    if (lpBuffer.Protect=PAGE_READWRITE)and(lpBuffer.State = MEM_COMMIT) and ((lpBuffer.Protect<>PAGE_NOACCESS)and(lpBuffer.Protect<>PAGE_NOACCESS)) then begin
А проверяю , нужная ли информация в памяти так
Код:
if (Pchar(ptr(integer(lpBuffer.BaseAddress)+a))='q') then begin
lollollollol вне форума Ответить с цитированием
Старый 02.07.2013, 20:06   #29
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Странная проверка... если lpBuffer.Protect равен PAGE_READWRITE тогда он никак не может быть PAGE_NOACCESS, причем дважды. Да еще и скобки както странно выглядять...

Проверяйте лучше:
protect = PAGE_READWRITE or protect = PAGE_READONLY or protect + PAGE_READ...
т.е. проверяйте явно на права чтения.
waleri вне форума Ответить с цитированием
Старый 02.07.2013, 22:13   #30
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Странно, сделал проверку
Код:
    if (lpBuffer.Protect=PAGE_READWRITE)or(lpBuffer.Protect = PAGE_READONLY) then begin
Ошибка прежняя, EAccessViolation, Read of address 01BE4000.
lollollollol вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi XE2 работа с памятью процесса YCA4 Win Api 2 18.02.2012 19:26
Работа с памятью mufesto Win Api 1 30.01.2012 15:13
Смертоубийство своего процесса Johnson Win Api 7 23.08.2011 19:29
Работа с памятью процесса JRcoker Win Api 10 18.07.2009 22:22
Работа с памятью запущенного процесса DeniCPP Общие вопросы C/C++ 2 09.04.2009 12:38