VirtualProtect access_violation

Тема в разделе "WASM.WIN32", создана пользователем M0rg0t, 27 дек 2021.

  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Странная ошибка, или где-то затупил или что. Есть простой код
    Код (C++):
    1. LPVOID lpFunc = GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "CreateFileW");
    2. DWORD dwProtect = PAGE_READWRITE;
    3. VirtualProtect(lpFunc, 5, dwProtect, &dwProtect);
    который ес-но работает норм. Но - если поменять на NTDLL.NtCreateFile, файл падает в access_violation именно на вызове VirtualProtect. Причем, такое только в ЕХЕ, скомпилированном студией, на масме все гуд. WriteProcessMemory помогает, но все же, интересно что это за мистика.
    В аттаче оба ехе файла, код такой

    Код (C):
    1. #include <windows.h>
    2. int e_p()
    3. {
    4. LPVOID lpFunc = GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "NtCreateFile");
    5. DWORD dwProtect = PAGE_READWRITE;
    6. VirtualProtect(lpFunc, 5, dwProtect, &dwProtect);
    7. // WriteProcessMemory(GetCurrentProcess(), lpFunc, "abc", 3, &dwProtect);
    8. ExitProcess(1);
    9. }
    Как собирать - без разницы, хоть с командной строки хоть со студии, один черт падает.
    --- Сообщение объединено, 27 дек 2021 ---
    Думаю ошибка в том, что VirtualProtect не 5 байтов, которые мне надо, меняет права, а на целую страницу. И какие-то натив апи функции из-за этого не работают.
    Однако странно, что в масм все норм, NTDLL же в обоих процессах одинаков.
     

    Вложения:

    • nt.zip
      Размер файла:
      1,3 КБ
      Просмотров:
      165
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Вероятно при обработке каких-нибудь структур цэ-ехешника при завершении процесса таки вызывается NtCreateFile, которому ты PAGE_READWRITE (вместо PAGE_EXECUTE_READWRITE) запретил исполняться.
     
  3. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    f13nd, оно крешится именно на вызове VirtualProtect.
    Потом я возвращаю oldProtect, но до того не доходит.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Ну вот этот кажется вполне логичным вариантом. Так ты посмотри, попадает ли адрес, на котором случается аксес вайолейшн, в твою страницу.
     
    M0rg0t нравится это.
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Я заменяю на ntdll.dll/NtCreateFile и VirtualProtect возвращает 1 и ERROR_SUCCESS. Зато какой-то анус в ExitProcess происходит.
     
    M0rg0t нравится это.
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    M0rg0t, изменяются атрибуты всей страницы в этом и проблема. Ты меняешь атрибуты и при возврате из функции NtProtectVirtualMemory (если это WOW64) или сервиса если это syscall/sysenter начинают исполняться инструкции на RW странице. В этом и ошибка.
    --- Сообщение объединено, 27 дек 2021 ---
    Добавлю что оба exe с ошибкой валяться, второй валится в недрах ExitProcess по той же причине.
     
    M0rg0t нравится это.
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Спасибо всем за ответы. Все решается флагом PAGE_EXECUTE_READWRITE либо WriteProcessMemory (хотя эта функция вроде как тоже юзает VirtualProtect внутри ?).
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Так а зачем тебе WriteProcessMemory вообще, ты же память собственного процесса пишешь, не? Мог бы и memcpy сделать, или просто байты по указателю проставить.
     
  9. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Rel, там страница read_only, точнее EXECUTE_READ, потому и юзал VirtualProtect. А WriteProcessMemory может писать по таким страницам , т.к. внутри себя вызывает VirtualProtect.
     
  10. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    NtProtectVirtualMemory, но она юзает с умом, передает флаг PAGE_EXECUTE_READWRITE. Также вызывает NtFlushInstructionCache.
     
    Aiks и M0rg0t нравится это.