Не могу найти ошибку NtQuerySystemInformation

Тема в разделе "WASM.NT.KERNEL", создана пользователем Aids, 15 май 2008.

  1. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Пишу так:
    Код (Text):
    1. long Error;
    2. PSYSTEM_PROCESSES SI,TempSI;
    3. long Result=0,Temp=0;
    4. UNICODE_STRING UnicodeFindName;
    5.     Error=ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,0,0,&Result);
    6. SI=ExAllocatePool(NonPagedPool,Result);
    7. if (SI==0) return -1;
    8. RtlZeroMemory(SI,Result);
    9. Error=ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,SI,Result,&Temp);
    всё работает, но как только заменяю на NtQuerySystemInformation.Функция буфер не передаёт. Не могу найти ошибку. Пробовал заменять на NtQuerySystemInformation и обе функции и только вторую. Результат тотже. Ошибка 0xС0000005

    Пробовал выполнять следующий код, где Return - это ID кальтулятора.
    Код (Text):
    1. cl.UniqueProcess=Return;
    2. cl.UniqueThread=0;
    3.  
    4. Error=ZwOpenProcess(&hProcess,PROCESS_TERMINATE,&oa,&cl);
    5.  
    6. if (Error!=0) return -1;
    7.  
    8. Error=ZwTerminateProcess(hProcess,0);
    9.  
    10. if (Error!=0) return -1;
    11. ZwClose(hProcess);
    работает нормально калькулятор убиваю, но когда заменяю на NtOpenProcess возвращает ошибку. Вчём дело?
     
  2. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    Ты ядерный код пишешь, зачем заменять Zw на Nt ?
    Из ядра вызывать сервисы можно только через обертки Zw, там чекаются всякие PreviousMode и прочая фигня. Либо через int 2e.
     
  3. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Так получается напрямую нет возможности вызвать NtQuerySystemInformation?
     
  4. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    А я голову чуть не сломал. Пробовал просматривать в отладчике ZwQuerySystemInformation. В ней вызывается NtQuerySystemInformation с такими же параметрами. Только предварительно какие-то действия.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    на форуме темка проскакивала чем различаются Nt* и Zw*, там ссылку хорошую давали, все по полочкам разложено.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ох сколько таких вопросов..
    объясняю последний раз.

    В ядре сам код сервисов содержится в Nt* функциях, но напрямую вызывать их не нужно (и часто это закончится неудачей) - они рассчитывают на то, что у потока установлен предыдущий режим доступа (PreviousMode т.н.) и другие штучки.
    А Zw* - это переходники, которые косвенно вызывают сервисы через KiSystemService, делая все нужное для их запуска.

    Следовательно, когда ты хочешь вызвать сервис, нужно вызывать Zw* функцию.
    Когда ты хочешь похукать сервис, то хукать надо Nt* функцию.


    ЗЫ. По-другому дело обстоит в ntdll. Там оба имени указывают на один код, выполняющий sysenter/int2e в ядро
     
  7. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Спасибо за разъяснение. А то я для скрытия процесса как раз использовал NtQuerySystemInformation. И думал по аналогии можно вызывать эту функцию на прямую.
     
  8. Clerk

    Clerk Забанен

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