перехват IoCreateFile

Тема в разделе "WASM.NT.KERNEL", создана пользователем Kot, 12 май 2011.

  1. Kot

    Kot New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2009
    Сообщения:
    5
    Здравствуйте!

    Делаю перехват IoCreateFile сплайсингом, дабы ограничить доступ к определенной папке, код перехватчика:

    Код (Text):
    1. NewIoCreateFile proc
    2.  
    3.     mov eax,[esp+3*4];3-i parameter
    4.     or eax,eax
    5.     jz NoThisDirectoryPath
    6.    
    7.     mov eax,[eax+OBJECT_ATTRIBUTES.ObjectName]
    8.     or eax,eax
    9.     jz NoThisDirectoryPath
    10.    
    11.     mov eax,[eax+UNICODE_STRING.Buffer]
    12.     or eax,eax
    13.     jz NoThisDirectoryPath
    14.  
    15.     invoke _wcsnicmp,eax,addr wcsDirectoryPath,wcsDirectoryPathLen
    16.     or eax,eax
    17.     jnz NoThisDirectoryPath
    18.  
    19.     KdPrint <$CTA0("DesiredAccess = %08X \n IoStatusBlock = %08X \nDisposition=%08X"),dword ptr[ebp+0ch],dword ptr[ebp+14h],dword ptr[ebp+24h]>
    20.  
    21.     mov eax,STATUS_ACCESS_VIOLATION
    22.     ret 38h
    23.    
    24. NoThisDirectoryPath:
    25.  
    26.     push ebp
    27.     mov ebp,esp
    28.     mov eax,IoCreateFileAddr
    29.     lea eax,[eax+5]
    30.     push eax
    31.    
    32.     ret 0h
    33. NewIoCreateFile endp
    wcsDirectoryPath - путь к папке, доступ к которой ограничен должен быть

    KdPrint выводится правильно (только при доступе к любому файлу в папке), но вот полностью доступ не ограничивается! Изменять файлы нельзя, а вот переименовывать, удалять и запускать можно!??

    Хотя если сделать так:

    Код (Text):
    1. NewIoCreateFile proc
    2.  
    3.     mov eax,STATUS_ACCESS_VIOLATION
    4.     ret 38h
    5.  
    6. NewIoCreateFile endp
    то доступ ко всей файловой системе ограничивается (то есть, система не падает, а просто при попытке что либо с диска прочитать выдает сообщение об ошибке)

    Так почему тогда к одной папке так сделать не получается??
    отрабатывает все правильно, в отладчике смотрел, а вот доступ при первом варианте ограничивается как то не полностью??
     
  2. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    KdPrint перед invoke, и тебя озорит, єто как магия только еще круче!
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Почему не фильтр?

    С какой целью? Зачем это всё?
     
  4. Kot

    Kot New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2009
    Сообщения:
    5
    Да это не важно, читал по форуму, что ты против перехвата..
    Конкретно интересует именно этот метод, дабы он не получается..

    Эмм.. что то не озорило меня.. там все ок вроде, в

    Код (Text):
    1. invoke _wcsnicmp,eax,addr wcsDirectoryPath,wcsDirectoryPathLen
    eax - именно что нужно в стек ложится (адрес на строку - имя файл)
    addr wcsDirectoryPath - адрес на эталонную строку
    wcsDirectoryPathLen - размер эталонной строки


    Вот еще что беспокоит:
    _wcsnicmp - изменяет строку!!! - после вызова _wcsnicmp строка(первый параметр) уже измененная (урезаная) до длинны wcsDirectoryPathLen??
    Возможно это и есть причина?
     
  5. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    Код (Text):
    1. int _wcsnicmp( const wchar_t *string1, const wchar_t *string2, size_t count );
     
  6. Kot

    Kot New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2009
    Сообщения:
    5
    Всем спасибо, все решил..
    просто переменная wcsDirectoryPathLen некорректные значения имела..

    Вот и подумал, что
    так как в памяти поверх строки налаживались..
     
  7. Kot

    Kot New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2009
    Сообщения:
    5
    Есть еще один вопрос:

    урезаю права в IoCreateFile

    Код (Text):
    1.     mov dword ptr[esp+4*8],FILE_OPEN ;eax - восьмой параметр IoCreateFile (Disposition)
    2.  
    3. ;00010000h  ;DELETE
    4. ;00020000h  ;READ_CONTROL
    5. ;00040000h  ;WRITE_DACL
    6. ;00080000h  ;WRITE_OWNER
    7. ;00100000h  ;SYNCHRONIZE
    8. ;01000000h  ;ACCESS_SYSTEM_SECURITY
    9. ;02000000h  ;MAXIMUM_ALLOWED
    10. ;10000000h  ;GENERIC_ALL
    11. ;20000000h  ;GENERIC_EXECUTE
    12. ;04000000h  ;GENERIC_WRITE
    13. ;80000000h  ;GENERIC_READ
    14.  
    15.     and eax,not(00010000h or 04000000h or 00040000h or 00080000h or FILE_WRITE_DATA or FILE_APPEND_DATA or FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA)
    16. ;eax - второй параметр IoCreateFile (ACCESS_MASK DesiredAccess)
    В итоге со всем что есть в папке нельзя:
    - удалять
    - изменять атрибуты
    - переименовывать
    - создавать файлы\папки

    Но почему можно:
    - дописывать в файл (или просто все удалить из файла и сохранить)
    - заменить файл ????

    Вообще хочу так, что бы можно было читать\выполнять, но ничего не изменять и не добавлять.

    Есть вариант поставить атрибут только для чтения, атрибуты менять нельзя, так что дописывать и изменять не получится.. но так не очень нравится.
     
  8. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    Вероятно, ты урезаешь права доступа к папке, поэтому и можно ковыряться в содержимом файлов. Надо урезать права доступа к каждому файлу.
     
  9. Kot

    Kot New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2009
    Сообщения:
    5
    нет, урезаю таким образом права доступа для каждого отдельного файла/папки в этой папке, путь сверяю так:

    Код (Text):
    1. invoke _wcsnicmp,eax,addr wcsDirectoryPath,wcsDirectoryPathLen