Почему VirtuelProtect не работает, Хотя возвращаемое значение true?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 8 авг 2010.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Вот код, трассирую в отладчике:

    Код (Text):
    1. PUSH 4020B0 //Это указатель на старые атрибуты
    2. PUSH 4 //Это новые атрибуты PAGE_READWRITE
    3. PUSH 10
    4. PUSH 408010
    5. CALL kernel32.VirtualProtect
    Тут ставлю бряк и смотрю в EAX, EAX==1, по адресу 4020B0 значение 8
    Пока всё нормально.

    Теперь дальше у меня следует такой же код, но с другими данными: (продролжаю трассировать)

    Код (Text):
    1. PUSH 4020B4 //Это указатель на старые атрибуты
    2. PUSH 8 //Это новые атрибуты PAGE_WRITECOPY
    3. PUSH 10
    4. PUSH 408010
    5. CALL kernel32.VirtualProtect
    Так, смотрю,на EAX==1, но по адресу 4020B4 значение 8! А я ожилдал там увидеть 4, т. к. перед этим успешно присвоил этому региону атрибут PAGE_READWRITE

    В чём дело, друзья?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Потомучто это файловая проекция.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Нельзя ли чуточку подробнее?
     
  4. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    MSDN
    Memory Protection
    Memory Protection Constants
    WRK
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Зачем мне эти ссылки? Чтобы они у меня были? Так они у меня есть.

    Странице присвоен атрибут PAGE_READWRITE? ПРисвоен. Теперь присваиваем новый атрибут. PAGE_READWRITE должен переписаться в указанный адрес. Не переписывается. НЕужели чисто и честно на пальцах нельзя объяснить, почему?
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    тот английский текст из #4 как раз объясняет.
     
  7. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    НЕт, не объясняет. Вот его перевод:

    PAGE_READWRITE разрешает чтение и запись в указанный регион. Если в основную секцию позволено запиывать, то позволено и копирование совместно разделяемых страниц. Иначе страницы есть совместо разделяемые для чтения или только копирования или записи.

    Ну и чё? Вопрос как был, так и остался нерешённым.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    переводчики малоактуальны для технических текстов.
     
  9. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Чё, очень смешно, да, смотреть как человек пурхается?
     
  10. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    #2 и #4 - это и есть ответ, это не приватная память а файловая проекция
     
  11. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Я правильно понял, что файловая проекция всгда должна иметь атрибуты PAGE_READWRITE?
     
  12. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    amvoz
    Смотря что указать в CreateFileMapping.
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Я не использую CreateFileMapping, в том-то и дело. ПРоцесс работает с собственной проекцией и никакие другие файлы с помощью CreateFileMapping не подгружает.
     
  14. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    в том то и дело
     
  15. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    ТАк это что значит-то?
     
  16. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    нет, в данном случае вирт странице будут выставлены права доступа PAGE_WRITECOPY, т к она относится к проекции модуля (разделяемой памяти), а не к приватной памяти
    в посте #4 уже была ссылка на статью в msdn описывающую механизм copy-on-write
     
  17. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну вот видите как всё непонятно
    Во-первых, с какой стати?
    Обыкновенный экзешник спроецирован в память. Откуда предположение, что он будет использоваться другими экзешниками? Что в его секции какой-то другой процесс будет смотреть, что-то писать? Неразумно. Но это на совести винды.

    опять плохо. В этом случае VirtualProtect могла бы как-то сигнализировать возвращаемым значением. Короче, всё плохо. Если бы не вы, друзья, я бы не разобрался.
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    amvoz
    Другие процессы тут ни причем. Экзешник не загружается в память целиком, а именно проецируется для обеспечения подкачки страниц (загрузки их с диска по мере обращения + сброса при нехватке памяти). Но если страница спроецирована с атрибутом PAGE_READWRITE, то при записи в нее эти изменения должны быть записаны на диск, что для экзешников ес-но недопустимо. Поэтому для проекций исполнямых модулей вместо атрибута READWRITE устанавливается WRITECOPY, который по сути означает то же самое (поэтому твой первый вызов VirtualProtect и не выдает ошибки) , но с той разницей, что при попытке записи создается приватная копия страницы с атрибутом READWRITE и ее изменения не отражаются на экзе-файле
     
  19. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    спасибо