Проблема при выделении виртуальной памяти из Ring0

Тема в разделе "WASM.WIN32", создана пользователем valinor, 23 июн 2005.

  1. valinor

    valinor New Member

    Публикаций:
    0
    Регистрация:
    7 май 2005
    Сообщения:
    27
    Я делаю хукер WinAPI, работающий в RING0.

    Диспетчер хуков вешаю на свободный слот N в IDT и затем в каждый процесс записываю процедуру-перехватчик, а на перехватываемый адрес - инструкцию int N. Диспетчер выясняет, в каком мы процессе и по какому адресу сработал int и подменяет адрес возврата на адрес перехватчика.

    Столкнулся с такой проблемой. Все работает на _существующих_ процессах. Когда же int срабатывает в _новом_ процессе (DLL шарятся между процессами и int попадает в новые процессы автоматически), диспетчер, понятное дело, не находит установленного перехватчика и размещает его on-the-fly.

    При этом происходит сбой при выделении виртуальной памяти: ZwAllocateVirtualMemory отрабатывает и возвращает STATUS_SUCCESS, а при попытке записать код по выделенному адресу возникает ошибка страницы.

    код такой:
    Код (Text):
    1.  
    2. addr = 0; // разместить вирт. память по любому адресу
    3. result = ZwAllocateVirtualMemory(
    4.  (HANDLE)-1, // свой процесс
    5.  (void**)&addr, 0, (PSIZE_T)&size,
    6.  MEM_COMMIT, PAGE_READWRITE);
    7. if(result==STATUS_SUCCESS)
    8.  memcpy((void*)addr, code, size); // memcpy в новых процессах - вылетает page fault
    9.  




    Причем когда я вызываю этот код для существующих процессов, все ОК. Сбой происходит только на новых процессах.



    Подскажите что я делаю не так? Есть ли другой способ решить проблему?