Здравствуйте! Делаю перехват IoCreateFile сплайсингом, дабы ограничить доступ к определенной папке, код перехватчика: Код (Text): NewIoCreateFile proc mov eax,[esp+3*4];3-i parameter or eax,eax jz NoThisDirectoryPath mov eax,[eax+OBJECT_ATTRIBUTES.ObjectName] or eax,eax jz NoThisDirectoryPath mov eax,[eax+UNICODE_STRING.Buffer] or eax,eax jz NoThisDirectoryPath invoke _wcsnicmp,eax,addr wcsDirectoryPath,wcsDirectoryPathLen or eax,eax jnz NoThisDirectoryPath KdPrint <$CTA0("DesiredAccess = %08X \n IoStatusBlock = %08X \nDisposition=%08X"),dword ptr[ebp+0ch],dword ptr[ebp+14h],dword ptr[ebp+24h]> mov eax,STATUS_ACCESS_VIOLATION ret 38h NoThisDirectoryPath: push ebp mov ebp,esp mov eax,IoCreateFileAddr lea eax,[eax+5] push eax ret 0h NewIoCreateFile endp wcsDirectoryPath - путь к папке, доступ к которой ограничен должен быть KdPrint выводится правильно (только при доступе к любому файлу в папке), но вот полностью доступ не ограничивается! Изменять файлы нельзя, а вот переименовывать, удалять и запускать можно!?? Хотя если сделать так: Код (Text): NewIoCreateFile proc mov eax,STATUS_ACCESS_VIOLATION ret 38h NewIoCreateFile endp то доступ ко всей файловой системе ограничивается (то есть, система не падает, а просто при попытке что либо с диска прочитать выдает сообщение об ошибке) Так почему тогда к одной папке так сделать не получается?? отрабатывает все правильно, в отладчике смотрел, а вот доступ при первом варианте ограничивается как то не полностью??
Да это не важно, читал по форуму, что ты против перехвата.. Конкретно интересует именно этот метод, дабы он не получается.. Эмм.. что то не озорило меня.. там все ок вроде, в Код (Text): invoke _wcsnicmp,eax,addr wcsDirectoryPath,wcsDirectoryPathLen eax - именно что нужно в стек ложится (адрес на строку - имя файл) addr wcsDirectoryPath - адрес на эталонную строку wcsDirectoryPathLen - размер эталонной строки Вот еще что беспокоит: _wcsnicmp - изменяет строку!!! - после вызова _wcsnicmp строка(первый параметр) уже измененная (урезаная) до длинны wcsDirectoryPathLen?? Возможно это и есть причина?
Всем спасибо, все решил.. просто переменная wcsDirectoryPathLen некорректные значения имела.. Вот и подумал, что так как в памяти поверх строки налаживались..
Есть еще один вопрос: урезаю права в IoCreateFile Код (Text): mov dword ptr[esp+4*8],FILE_OPEN ;eax - восьмой параметр IoCreateFile (Disposition) ;00010000h ;DELETE ;00020000h ;READ_CONTROL ;00040000h ;WRITE_DACL ;00080000h ;WRITE_OWNER ;00100000h ;SYNCHRONIZE ;01000000h ;ACCESS_SYSTEM_SECURITY ;02000000h ;MAXIMUM_ALLOWED ;10000000h ;GENERIC_ALL ;20000000h ;GENERIC_EXECUTE ;04000000h ;GENERIC_WRITE ;80000000h ;GENERIC_READ 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) ;eax - второй параметр IoCreateFile (ACCESS_MASK DesiredAccess) В итоге со всем что есть в папке нельзя: - удалять - изменять атрибуты - переименовывать - создавать файлы\папки Но почему можно: - дописывать в файл (или просто все удалить из файла и сохранить) - заменить файл ???? Вообще хочу так, что бы можно было читать\выполнять, но ничего не изменять и не добавлять. Есть вариант поставить атрибут только для чтения, атрибуты менять нельзя, так что дописывать и изменять не получится.. но так не очень нравится.
Вероятно, ты урезаешь права доступа к папке, поэтому и можно ковыряться в содержимом файлов. Надо урезать права доступа к каждому файлу.
нет, урезаю таким образом права доступа для каждого отдельного файла/папки в этой папке, путь сверяю так: Код (Text): invoke _wcsnicmp,eax,addr wcsDirectoryPath,wcsDirectoryPathLen