Перехват NtQueryDirectoryFile через SDT

Тема в разделе "WASM.WIN32", создана пользователем Vol4oK, 10 май 2006.

  1. Vol4oK

    Vol4oK New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    15
    Написал перехват на SDT, по идее всё правильно, но почему то возникает STOP 0x000000D1 при поиске файлов, указывая на строку (!) И ещё мне пришлось поставить cli...sti чтобы устранить STOP 0x0000008E который тож указывает на эту же строку. Хотелось бы знать в чём сдесь ошибка и как её устранить.

    Вот код:

    NewNtQueryDirectoryFile:

    mov eax, [esp+18h]

    mov lpFileInformation, eax

    mov eax, [esp+20h]

    mov dwFileInformationClass, eax

    pop QDF_OldRet

    push offset QDF_NewRet

    jmp OldNtQueryDirectoryFile

    QDF_NewRet:

    test eax,eax

    jnz QDF_Exit

    cmp dwFileInformationClass, FileBothDirectoryInformation

    jnz QDF_Exit

    push ebx

    push ecx

    push edx

    push esi

    push edi

    push eax

    cli

    mov eax, lpFileInformation

    xor edx,edx

    assume eax:ptr FILE_BOTH_DIRECTORY_INFORMATION

    assume edx:ptr FILE_BOTH_DIRECTORY_INFORMATION

    QDF_loop:

    mov ecx, [eax].FileNameLength (!)

    shr ecx,1

    cmp dwFileNameLength, ecx

    jne QDF_Next

    lea esi, [eax].FileName

    mov edi, offset uszFileName

    repe cmpsw

    test ecx,ecx

    jnz QDF_Next

    test edx,edx

    jnz QDF_Modify

    mov ebx,[eax].NextEntryOffset

    test ebx,ebx

    jz QDF_ModifyOne

    mov esi,eax

    mov edi,eax

    mov ecx,ebx

    add esi,ecx

    rep movsb

    add [eax].NextEntryOffset,ebx

    jmp QDF_loop

    QDF_ModifyOne:

    mov dword ptr [esp+4], STATUS_NO_SUCH_FILE

    jmp QDF_Exitloop

    QDF_Modify:

    mov ebx,[eax].NextEntryOffset

    test ebx,ebx

    jz QDF_ModifyLast

    add [edx].NextEntryOffset,ebx

    add eax,[eax].NextEntryOffset

    jmp QDF_loop

    QDF_ModifyLast:

    mov [edx].NextEntryOffset,0

    jmp QDF_Exitloop

    QDF_Next:

    mov edx,eax

    add eax,[eax].NextEntryOffset

    cmp eax,edx

    jne QDF_loop

    QDF_Exitloop:

    assume eax:nothing

    assume edx:nothing

    sti

    pop eax

    pop edi

    pop esi

    pop edx

    pop ecx

    pop ebx

    QDF_Exit:

    jmp QDF_OldRet
     
  2. Pele

    Pele New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2006
    Сообщения:
    7
    Vol4oK

    Проблема видимо та же что и у всех кто пишет перехват NtQueryDirectoryFile, смотри правильную структуру FILE_BOTH_DIRECTORY_INFORMATION, вопрос поднимался на форуме неоднократно
     
  3. Vol4oK

    Vol4oK New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    15
    Нет проблема не в этом, я знаю что в документации есть опечптка с UCHAR, я уже нашёл и испрвил этот баг и у меня всё сходиться байт в байт...
     
  4. Win2k3

    Win2k3 New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    9
    кароча
    такая же херня с перехватом

    1. что касаеца структур - оин должны быть выровнены наскока я понимаю по 4 байта (кароча по скока там C++ выравнивает по умолчанию? - вот по столько, ошибок в определениях никаких нет, правильные версии - в NTIFS.H из Widnows IFS Kit)

    2. DRIVER_IRQL_NOT_LESS_OR_EQUAL (0x000000D1)

    The system attempted to access pageable memory using a kernel process IRQL that was too high. The most typical cause is a bad device driver (one that uses improper addresses). It can also be caused by caused by faulty or mismatched RAM, or a damaged pagefile
    (а если по русски, это значит что ты шото не то спамятью творишь и при это у тя слишком высокий уровень IRQ, уменьши его - KeLowerIrq(), скорее всего ты просто обращаешься к неверным адресам памяти)

    3. cli/sti реально спасают
     
  5. MaDF

    MaDF New Member

    Публикаций:
    0
    Регистрация:
    10 май 2005
    Сообщения:
    83
    При отчаянии найти баг, я ставлю int 3 в коде, и в SoftIce анализирую каждую выполненую команду. Чего и тебе советую
     
  6. Vol4oK

    Vol4oK New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    15
    по поводу DRIVER_IRQL_NOT_LESS_OR_EQUAL (0x000000D1) я знаю, но откуда там может быть неверный адрес, данные копируються из стка, потом вызываеться true функция и в случае успеха этот код получает управления, следовательно там не может быть неверного адреса... По поводу IRQL, то теоретически он должен быть всегда passive, поэтмоу куда уж понижать не знаю...
    Сайсом отладить баг не получаеться ошибка возникаетвы лучшем случае 1/1000, как её отследить я не знаю...
     
  7. Vol4oK

    Vol4oK New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    15
    наконец до меня дошло в чём фишка, всем спс)))
     
  8. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    Vol4oK
    так может и нам расскажешь? :)
     
  9. Win2k3

    Win2k3 New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    9
    Нука, нука, в чём???
     
  10. Vol4oK

    Vol4oK New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    15
    вобщем ошибка была в том что я хранил некоторые данные в глобальных переменных, и если например данный код прерывает другой поток и вызывает эту ф-ию то он затирает значения переменной предыдущего потока, а когда возвращаеться управление прежнему потоку то там уже не те адреса и возникает бсод...
    поэтому для хранения переменных нужно использовать стэк, при переключении потоков переключаються стеки в том числе и стеки ядра, и таких проблем уже произойти не может)) Вобщем терь у меня всё работает, уже 3ий день драйверок в памяти весит никаких тормозов и бсодов))