StartService возвращает 0xC0000002.

Тема в разделе "WASM.BEGINNERS", создана пользователем nitrotoluol, 16 май 2007.

  1. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Не пойму почему...

    Вот код драйвера
    #include <winnt\ntoskrnl.h>

    Код (Text):
    1. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
    2. {
    3.  
    4.     __asm
    5.     {
    6.             nop
    7.             nop
    8.             nop
    9.     };
    10.     return 0;
    11. };
    Вот настройки линкера в VC6

    Вот настройка компилятора

    Почему не грузится дров..?
     
  2. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Еще глюк...
    Если не импортировать ntdll.lib - все прекрасно запускается... что это может быть? глюк?
    И может ли кто-то выложить тут ntdll.lib ?
     
  3. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    зачем интересно тебе в драйвере ntdll?
     
  4. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
  5. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    пиплы, у меня скоро паника начнется.
    Нужно импортировать несколько функций из ntdll.dll

    Когда в линкере прописываю ntdll.lib , драйвер просто отказывается грузится, хотя если те же операции проделать в асме, - никаких сложностей. Все запускается. Блин.

    В студии в настройках что-то не так. но что?? Под дизасемблером все окей. точка входа тоже указывает на нужное место. Но StartService возвращает ошибку.!!!
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Пока будешь линковать юзер-модную либу, твой драйвер не запустится. Убери её, все необходимое есть в ntoskrnl
     
  7. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    cresta
    NtEnumerateKey остутствует в ядре. Есть только Zw. Тогда Как перехватить функцию??

    Рекурсия получается... :\
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    А что по твоему есть NtEnumerateKey ? Всего лишь оболочка для ZwEnumerateKey.
    Как перехватить? Способов много. Например заменить указатель в таблице KeServiceDescriptorTable, соответствующий ZwEnumerateKey на твой обработчик.
     
  9. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Хотя лучше создам новую ветку... С этой вроде разобрался...
     
  10. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Хм. А как же буффер? Ведь для вызова оригинала прийдется входные данные куда-то копировать, или я не прав..?
     
  11. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    ХХХххххххххххххааааааа!!!!!!!!!!!!!
    Тема закрыта.

    ЗЫ:
    cresta
    Уважуха. Респект и Уважуха. Я на форуме Майкрософт этот же вопрос задал... И там всю неделю никто по сути ответить не мог, гадали, в чем же дело.... Блин ))))) А тут так все просто...
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Зачем их копировать? Они пусть лежат себе там, где и лежали - в стеке. Когда из своего обработчика вызываешь настоящую ZwEnumerateKey, запихиваешь эти параметры опять же в стек. На примере ZwOpenFile:
    Код (Text):
    1. NTSTATUS NewZwOpenFile(PHANDLE FileHandle,
    2.                                 ACCESS_MASK DesiredAccess,
    3.                                 POBJECT_ATTRIBUTES ObjectAttributes,
    4.                                 PIO_STATUS_BLOCK IoStatusBlock,
    5.                                 ULONG ShareAccess,
    6.                                 ULONG OpenOptions){
    7.  
    8.     NTSTATUS                            Status=STATUS_OBJECT_NAME_NOT_FOUND;
    9.     PVOID                               eProcess;
    10.  
    11.     if  (g_Trusded){
    12.         eProcess = IoGetCurrentProcess();
    13.         if (g_Trusded == *((ULONG*)((PCHAR)eProcess+g_pidOffset))) goto _call;
    14.     }
    15.  
    16.     if (g_Suspend) goto _call;
    17.    
    18.     if (ToHide_1(ObjectAttributes->ObjectName)){
    19.         IoStatusBlock->Information = FILE_DOES_NOT_EXIST;
    20.         *(FileHandle)=0;
    21.         return Status;
    22.     }
    23.  
    24.     _call:
    25.     //вот тут входные параметры из стека снова прописываются в стек.
    26.     //для передачи в оригинальную функцию
    27.     _asm {
    28.         push    dword ptr [ebp+28]
    29.         push    dword ptr [ebp+24]
    30.         push    dword ptr [ebp+20]
    31.         push    dword ptr [ebp+16]
    32.         push    dword ptr [ebp+12]
    33.         push    dword ptr [ebp+8]
    34.         call    dword ptr [TrueZwOpenFile]
    35.         mov     [Status],eax
    36.     }
    37.  
    38.     return Status;
    39.  
    40. }