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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2013, 19:36   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вы внутри себя, зачем это?
нужны лишь указатели.
Очевидно конечная цель - другой процесс.
waleri вне форума Ответить с цитированием
Старый 01.07.2013, 19:58   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Очевидно конечная цель - другой процесс.
смысл не меняется, все равно нужно знать что менять, а не наугад.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.07.2013, 20:05   #13
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Конечная цель мой процесс, move выдаёт run time error

Почему вы говорите что я меняю "наугад"?
Я получаю значение блока
readResult:=ReadProcessMemory(Proce ssHandle,lpBuffer.BaseAddress, @Buf,lpBuffer.RegionSize, lpBuffer.RegionSize);
и знаю что он начинается с lpBuffer.BaseAddress, и имеет длину lpBuffer.RegionSize

Потом в переменной я меню искомое значение на нужное, и записываю в этот же адрес, такой же длины.
lollollollol вне форума Ответить с цитированием
Старый 01.07.2013, 20:17   #14
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Код:
        ZeroMemory(@Buf, sizeof(Buf));
        move(lpBuffer.BaseAddress,Buf,lpBuffer.RegionSize);  //Тут Access violation
        SetString(r,PChar(@Buf),lpBuffer.RegionSize);
        if (Pos(Testsss+'oa1',r)<>0) then begin
          r:=ReplaceSub(r,Testsss+'oa1','eeee');
 move(lpBuffer.BaseAddress,r[1],lpBuffer.RegionSize);
Запарился совсем, ткните носом что делаю не так
lollollollol вне форума Ответить с цитированием
Старый 01.07.2013, 20:49   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Потом в переменной я меню искомое значение на нужное, и записываю в этот же адрес, такой же длины.
для чтения из самого себя ReadProcessMemory не нужен.
а ошибка с move говорит о том что у вас нет доступа к нужной страницы.

нука скиньте всю процедуру текущую версию, посмотрю-ка откуда там и что берете.
я так и не увидел откуда взят вывод что данные лежат именно в той страницы, и причем в её начале.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.07.2013, 21:05   #16
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Код:
procedure ReadBytesss;
var
  SysInfo:TSystemInfo;
  lpBuffer:TMemoryBasicInformation;
  dwLength:DWORD;
  Buf:array[0..999999] of byte;
   r:string;
begin
  GetSystemInfo(SysInfo);
  dwLength:=1;
  while (dwLength<>0) do begin
    dwLength:=VirtualQuery(SysInfo.lpMinimumApplicationAddress,lpBuffer,SizeOf(lpBuffer));
    SysInfo.lpMinimumApplicationAddress:=Pointer(longint(SysInfo.lpMinimumApplicationAddress)+lpBuffer.RegionSize);
    if (integer(SysInfo.lpMinimumApplicationAddress)>integer(SysInfo.lpMaximumApplicationAddress)) then Break;
    if (lpBuffer.State = MEM_COMMIT) and ((lpBuffer.Protect<>PAGE_NOACCESS)and(lpBuffer.Protect<>PAGE_NOACCESS)) then begin
      //Условие, что строкой выше, проверят доступна ли память для чтения
      try
        ZeroMemory(@Buf, sizeof(Buf));
        move(lpBuffer.BaseAddress,Buf,lpBuffer.RegionSize);  //Вот тут ошибка, но не всегда
        SetString(r,PChar(@Buf),lpBuffer.RegionSize);
        if (Pos(Testsss+'oa1',r)<>0) then begin //Если в блоке есть нужная информация
          r:=ReplaceSub(r,Testsss+'oa1','eeee'); //Отредактирую её, заменив Testsss+'oa1' на 'eeee'
          move(lpBuffer.BaseAddress,r[1],lpBuffer.RegionSize); //И запишу по тому же адресу что и читал
        end;
      except
      end;
    end;
  end;
end;

Последний раз редактировалось lollollollol; 01.07.2013 в 21:09.
lollollollol вне форума Ответить с цитированием
Старый 01.07.2013, 21:23   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы сами видите что меняете?
вы по сути меняете лишь минимальный адрес в вашем приложении, не более.
меняете чтото наугад внутри себя.*
а проверять надо еще и на то, есть ли права на запись, а то проверяете флаг NOACCESS, что имеет иной смысл.

почитали бы хелпу по функциям чтоль.

*вы не ищете значение внутри себя, а просто берете адрес от других функций.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.07.2013, 21:30   #18
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Что значит
Цитата:
вы по сути меняете лишь минимальный адрес в вашем приложении, не более.
? я ведь вначале записываю весь блок начиная с минимальнго адреса. Или я не правильно понимаю значения функций?

Код:
    dwLength:=VirtualQuery(SysInfo.lpMinimumApplicationAddress,lpBuffer,SizeOf(lpBuffer));
Цитата:
//Функция VirtualQuery возвращает информацию о диапазоне страниц виртуального адресного пространства вызывающего процесса
SysInfo.lpMinimumApplicationAddress:=Pointer(longint(SysInfo.lpMinimumApplicationAddress)+lpBuffer.RegionSize); //Указываю на следующий блок данных, или это лишнее? я так понял что оно в lpBuffer.RegionSize записывает размер области данных, но это не вся память процесса, и если добавить это значение к начальноу блоку, то получу инфу о след блоке, верно? if (integer(SysInfo.lpMinimumApplicationAddress)>integer(SysInfo.lpMaximumApplicationAddress)) then Break; //Тут я проверяю, если блок данных выше максимального, то выхожу из цыкла. if (lpBuffer.State = MEM_COMMIT) and ((lpBuffer.Protect<>PAGE_NOACCESS)and(lpBuffer.Protect<>PAGE_NOACCESS)) then begin //А какая проверка должна быть? try ZeroMemory(@Buf, sizeof(Buf)); //Обнуляю память move(lpBuffer.BaseAddress,Buf,lpBuffer.RegionSize); //Ну и читаю весь регион в переменную, или не правильно? В чём ошибка? SetString(r,PChar(@Buf),lpBuffer.RegionSize); //Записываю то что прочитал в строку
lollollollol вне форума Ответить с цитированием
Старый 01.07.2013, 21:37   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

оно возвращает информацию о диапазоне страниц, но не о том что находится в них.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.07.2013, 22:07   #20
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Хорошо, я получил информацию о диапазоне страниц, какие должны быть следующие действия? Разве не чтения блока данных страницы?
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