атрибут PAGE_READONLY - траблы со сменой.

Тема в разделе "WASM.WIN32", создана пользователем JohnSmith, 31 янв 2007.

  1. JohnSmith

    JohnSmith New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    41
    Всем привет

    Модифицирую память другого процесса функцией WriteProcessMemory.
    Перечисляю все аллокированные регионы, отбрасываю все что не MEM_COMMIT.

    Далее на накоторых регионах при попытке записи получаю
    Код (Text):
    1. ERROR_INVALID_PARAMETER (00000057)
    Выясняется, что они имеют атрибут PAGE_READONLY.
    Пытаюсь сменить атрибуты:
    Код (Text):
    1. VirtualProtectEx(hProcess,
    2.   BaseAddress,
    3.   RegionSize,
    4.   PAGE_READWRITE,
    5.   &OldProtect
    6. );
    и получаю опять же ERROR_INVALID_PARAMETER (00000057)

    если менять не на PAGE_READWRITE а на PAGE_WRITECOPY, то атрибуты меняются успешно, но при попытке записи опять получим ERROR_INVALID_PARAMETER

    Скажите, это вообще возможно, чтобы писать в PAGE_READONLY, если да, то где я туплю?

    Спасибо
     
  2. amitophia

    amitophia New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2004
    Сообщения:
    44
    Проверь, чему равны BaseAddress и размер буфера
     
  3. JohnSmith

    JohnSmith New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    41
    amitophia, спасибо за ответ,

    Base Addess: 0x001D0000
    RegionSize : 0x0003D000

    если перечислить у notepad'a XP'ного регионы, то такой будет там. с READ_ONLY атрибутом.

    а писать пытаюсь, например по адресу 0x209DDE , как видим адрес из этого региона.


    Я вообще склоняюсь к мысли, что изменить PAGE_READONLY и писать туды нельзя. (
     
  4. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Если я правильно понял, вот сдесь:
    В них нельзя писать по определению. Кстати просто так сбрасывать этот флаг тож нельзя.

    ЗЫ: PAGE_WRITECOPY его не сбрасывает.
     
  5. JohnSmith

    JohnSmith New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    41
    _Serega_
    мне кажется ты не совсем прав.

    смотри, если почитать описание структуры MEMORY_BASIC_INFORMATION, то MEM_COMMIT это одно из значений поля State, которое определяет состояние региона памяти,
    конкретно MEM_COMMIT означает, что память аллокирована и может использоваться для чтения/записи/выполнения.
    а уж Protect как раз определяет чего с регионом конкретно можно творить, так вот мне нужно из рид онли, сделать его еще и писабельным :)
     
  6. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    К счастью, не совсем ))), а просто не так понял.
    1. С какими параметрами вызываешь VirtualProtectEx() для того адреса?
    2. Есть ли антивири фаеры и пр?
     
  7. JohnSmith

    JohnSmith New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    41
    _Serega_
    1. см первый пост, hProcess - вылиден(открыт с PROCESS_ALL_ACCESS), Base Addess = 0x001D0000, RegionSize = 0x0003D000.
    2. есть только фаер sygate, но он молчит.
     
  8. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Переменная OldProtect и буфер который пишешь выравнены на границу двойного слова?
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    JohnSmith
    Если посмотреть Memory map в OllyDbg, то увидим, что этот регион не просто READ_ONLY, а особый Mapped регион (у меня в XP-SP2 - это проекция windows\system32\locale.nls). Простое тыкание в OllyDbg, показывает что изменить атрибуты любого Map-региона не получается - ОС не разрешает, а вот любые приватные регионы или образы модулей - пожалуйста
     
  10. JohnSmith

    JohnSmith New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    41
    leo
    спасибо! я действительно забыл про memory map в olly.
    у меня в xp sp2 этот регион тоже mapped и является проекцией locale.nls

    выходит что писать легальными способами туда нельзя.
    винхексовский редактор памяти тоже обламывается.

    ну и ладно, просто значит просто отброшу MEM_MAPPED регионы,
    благо MEMORY_BASIC_INFORMATION.type такую информацию предоставляет.

    Всем помогавшим спасибо! ;)