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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2013, 22:14   #31
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Вот весь код программы, конечная цель добраться до 'qwerty', и поменять это значение в памяти

Код:
procedure ReadWrite;
var
  lpBuffer:TMemoryBasicInformation;
  StartScan:integer;
  dwLength:integer;
  a:integer;
  s:string;
begin
  dwLength:=1;
  StartScan:=0;
  while (dwLength<>0) do begin
    dwLength:=VirtualQuery(ptr(StartScan),lpBuffer,SizeOf(lpBuffer));
    if (dwLength=0) then Break;
    StartScan:=integer(lpBuffer.BaseAddress)+lpBuffer.RegionSize;
    if (lpBuffer.Protect=PAGE_READWRITE)or(lpBuffer.Protect = PAGE_READONLY) then begin
      a:=0;
      s:='';
      while (a<lpBuffer.RegionSize) do begin
        if (Pchar(ptr(integer(lpBuffer.BaseAddress)+a))='q') then begin //Вот тут если ставить бряк, ошибки нет, но цикл большой
          if (Pchar(ptr(integer(lpBuffer.BaseAddress)+a+1))='w') then begin //А до этого бряка не доходит, если убрать предыдущий (AV, ошибка чтения)
            if (Pchar(ptr(integer(lpBuffer.BaseAddress)+a+2))='e') then begin
              MessageBox(0,Pchar(ptr(integer(lpBuffer.BaseAddress)+a)),'',0);

            end;
          end;
        end;
        inc(a);
      end;
    end;
  end;
end;

begin
  ReadWrite;
  MessageBox(0,'qwerty','',0);
end.

Последний раз редактировалось lollollollol; 02.07.2013 в 22:17.
lollollollol вне форума Ответить с цитированием
Старый 02.07.2013, 23:56   #32
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А вы уверены, что не выходите за пределы региона в следующий?
a<lpBuffer.RegionSize
а потом есть a + 1 и a + 2.
Что будет, когда дойдем до конца блока?
waleri вне форума Ответить с цитированием
Старый 03.07.2013, 00:20   #33
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Ну вероятность этого очень мала, ведь для того чтобы выйти за границы последний символ должен быть 'q', или 'qw'.

В строке
Код:
  while (a<lpBuffer.RegionSize) do begin
Сделал
while (a<lpBuffer.RegionSize-1) do begin
и ошибка ушла, но оно не находит даже последовательность из первых двух символов, что очень странно.

Да и непонимаю, почему с lpBuffer.RegionSize-1 работает.
Допустим lpBuffer.RegionSize = 2.
В этом случае цикл выполнится как и положено, 2 раза. (a=0, a=1), а сейчас у меня цикл выполняться на один раз меньше
lollollollol вне форума Ответить с цитированием
Старый 03.07.2013, 00:44   #34
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от lollollollol Посмотреть сообщение
Ну вероятность этого очень мала, ведь для того чтобы выйти за границы последний символ должен быть 'q', или 'qw'.

В строке
Код:
  while (a<lpBuffer.RegionSize) do begin
Сделал
while (a<lpBuffer.RegionSize-1) do begin
и ошибка ушла, но оно не находит даже последовательность из первых двух символов, что очень странно.

Да и непонимаю, почему с lpBuffer.RegionSize-1 работает.
Допустим lpBuffer.RegionSize = 2.
В этом случае цикл выполнится как и положено, 2 раза. (a=0, a=1), а сейчас у меня цикл выполняться на один раз меньше
вас не интересует то что лежит на границе региона, там точно не будет вашей константы целиком.
REgionSize кратно 4096 будет.

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

WinHexом посмотрел точный адрес, и как результат этот код выдаёт ошибку

Код:
i:=pointer(000029128);
VirtualQuery(i,lpBuffer,SizeOf(lpBuffer));
MessageBox(0,Pchar(i),'',0); //Ошибка чтения, как и прежде, почему?
Адрес проверил, верный, но не могу прочитать lpBuffer заполняется, это видно при трассировке кода
ну и в довесок, то что пишет в переменную VirtualQuery
lpBuffer.State =65536
lpBuffer.Protect=1


или я совсем торможу, винхекс адрес в ехе на диске показывает, а не в памяти


как можно адрес в памяти посмотреть?

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

Цитата:
как можно адрес в памяти посмотреть?
отладчиком рзве что.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.07.2013, 08:39   #37
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от lollollollol Посмотреть сообщение
Да и непонимаю, почему с lpBuffer.RegionSize-1 работает.
Задача:
Размер блока - 4096 байт.
Последний байт блока равен 'q'.
Первый вопрос - чему будет равно а, когда мы найдем 'q'?
Второй вопрос - чему будет равно смещение при проверке на 'w'?
Третий вопрос - где будет находится предполагаемый адрес, где лежит 'w'?
Четвертый вопрос - почему приведенный вами пример (RegionSize - 1) неправильный?
Пятый вопрос - почему вы решили, что q и w будут в двух последовательных байтах памяти? Что такое Unicode знаете?

Напишите процедуру поиска в памяти отдельно, отладьте и настройте чтоб работала и только потом читайте блоки памяти. Сейчас вы не можете понять где у вас ошибка - в поиске текста или в обходе блоков памяти.

Последний раз редактировалось waleri; 03.07.2013 в 08:43.
waleri вне форума Ответить с цитированием
Старый 03.07.2013, 10:39   #38
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Первый вопрос - 4095?
Второй вопрос - а разве одна строка может по частям находиться в разных блоках?
Третий вопрос - по идеи +1 байт, или нет? как быть с юникодом?
Четвертый вопрос - незнаю
Пятый вопрос - я так решил потому что это одна строка, про юникод даже не думал

А можно заранее узнать адрес который нужно изменит? чтобы он везде при запуске был один?
lollollollol вне форума Ответить с цитированием
Старый 03.07.2013, 12:12   #39
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от lollollollol Посмотреть сообщение
А можно заранее узнать адрес который нужно изменит? чтобы он везде при запуске был один?
Предлагаю хотя бы минимально ознакомиться с организацией памяти в Windows, образами PE и их отображением. Без этих знаний разговор беспредметный.
Vapaamies вне форума Ответить с цитированием
Старый 03.07.2013, 20:12   #40
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от lollollollol Посмотреть сообщение
Третий вопрос - по идеи +1 байт, или нет?
Угу... а на каком адресе будут лежать e, r, t, и т.д. Напишите абсолютные адреса, а не +1, +2 и т.д. За основу берите адрес q который, как мы уже знаем из первого вопроса находится по адресу 4095. Неужели все еще не понятно в чем проблема?
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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