Ms Rem, CARDINAL перехвата ZwCreateFile мягко говоря недостаточно чтобы контролировать доступ к файлам со стороны юзермодных приложений.
NeuronViking + NtOpenFile Я когда делал, то перехватывал эти 3 ф-ции: NtQueryDirectoryFile, NtCreateFile, NtOpenFile, и все четко пашет.
так нельзя делать уже хотябы потому что есть случаи когда ObjectAttributes.FileName показывает на вот такую UNICODE_STRING -> {DW 0, DW 0, DD 0} и на команде "cmp word ptr[eax+6],03Ah" ты получишь AV SEH обязателен, иначе будешь падать, проверено
MegaZu того что ты перечислил тоже недостаточно ) и вообще, перехват системных сервисов это только верхушка айсберга. причем речь идет об обычных юзермодных приложениях.
NeuronViking А если с ним перехватывать еще ZwOpenFile то достаточно. И вобще, где тут шла речь о контроле доступа к файлам юзермодных приложений? К чему это ты?
Ну, я знаю что к файлам можно получить доступ используя копирование хендла из другого процесса, загружая драйвер и прочими обходными путями, но для контроля обычных программ этого вполне достаточно.
Ms Rem, CARDINAL еще раз повторяю - перехвата системных сервисов недостаточно для контроля обычных программ
А ты не повторяй, а обьясни свою точку зрения. Я могу свою точку зрения аргументировать так: Обычные программы перед работой с файлами открывают их с помощью CreateFile и OpenFile (копирование хендлов, прямой доступ к тому и.т.п. трюки они не используют), а эти функции сводятся к системным вызовам ZwCreateFile и ZwOpenFile. Ты же говоришь что их перехвата недостаточно. Пожалуйста обьясни почему.
приведу один пример - если папку с файлами расшарить и залезть на нее как на сетевой ресурс, то перехват сервисов SSDT желаемого результата не даст. что проконтролировать эту, конкретно взятую, ситуацию необходимо перехватывать IoCreateFile... по этой теме можешь почитать об архитектуре CIFS.
...речь идет естественно об обычных программах использующих CreateFile и OpenFile без всяких ухищрений...
Ну дык если ведеться контроль за приложениями запущеными на этой машине, то доступ к файлам на шарак всеравно будет идти через CreateFile и OpenFile. А про контроль досупа к файлам из сети через шары мы не говорили. В таком случае вобще лучше ставить фильтр ФС.
Люди, это всё интересно, но мне не нужно работать с файлами, и также не нужно запрещать работу с файлами кому бы то ни было. Мне нужно запретить отображение файлов программами типа explorer.exe, wincmd.exe и т.п. Ms Rem Не понял аргументации Берем обычную программу - explorer.exe. Идем в C:\Windows\system32\ В этой папке 3000 файлов. Значит ли это, что при отображении в листвью проводника списка файлов будет 3000 раз вызвана CreateFile и 3000 раз вызвана OpenFile и 3000 раз вызвана CloseHandle ? И ещё, о перехвате ZwQueryDirectoryFile: мне не нужен код перехвата. Мне интересно понять, почему последний приведенный мной код выводит все поля структуры FILE_BOTH_DIRECTORY, кроме поля FileName?
Код (Text): FILE_BOTH_DIRECTORY_INFORMATION struct NextEntryOffset dd ? Unknown dd ? CreationTime LARGE_INTEGER <> LastAccessTime LARGE_INTEGER <> LastWriteTime LARGE_INTEGER <> ChangeTime LARGE_INTEGER <> EndOfFile LARGE_INTEGER <> AllocationSize LARGE_INTEGER <> FileAttributes dd ? FileNameLength dd ? EaInformationLength dd ? AlternateNameLength db ? AlternateName dw 12 dup (?) FileName dw ? FILE_BOTH_DIRECTORY_INFORMATION ends Переделано со справочника Неббета. Оригинал: Код (Text): typedef struct _FILE_BOTH_DIRECTORY_INFORMATION { // Information Class 3 ULONG NextEntryOffset; ULONG Unknown; LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; LARGE_INTEGER EndOfFile; LARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG FileNameLength; ULONG EaInformationLength; UCHAR AlternateNameLength; WCHAR AlternateName[12]; WCHAR FileName[1]; } FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION; При открытии папок структура содержит количество итемов, совпадающее с количеством объектов в папке (с учетом "." и ".."). По FileNameLength проверяю длины имён - все совпадают, вместо самих имен - ерунда типа "???????". Грешил на DbgPrint - сделал с RtlUnicodeStringToAnsiString и затем вывод анси строки - та же картина.
У тебя структура ошибочна. Вот правильная структура. Код (Text): typedef struct _FILE_BOTH_DIRECTORY_INFORMATION { ULONG NextEntryOffset; ULONG Unknown; LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; LARGE_INTEGER EndOfFile; LARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG FileNameLength; ULONG EaInformationLength; USHORT AlternateNameLength; WCHAR AlternateName [12]; WCHAR FileName [1]; } FILE_BOTH_DIRECTORY_INFORMATION,*PFILE_BOTH_DIRECTORY_INFORMATION;
Ага, уже заметил. Ёперный неббет Решил посмотреть FileName в HEX-виде - видно, что там есть юникод-символы (коды символов чередуются с нулями), и случайно обратил внимание, что нули стоят на четных позициях(0,2,4,6), а должны на нечетных... Хотя до сих пор никаких ошибок у него не встречал. Спасибо. В т.ч. и за глобальные. Окончательно выглядит так: Код (Text): NewZwQueryDirectory proc hDir:DWORD,Event:DWORD,pApcR:DWORD,pApcC:DWORD,pIO:DWORD,pOut:DWORD,cb Out:DWORD,iClass:DWORD,bSingle:DWORD,pwName:DWORD,bRestart:DWORD LOCAL uStr :UNICODE_STRING LOCAL aStr :ANSI_STRING LOCAL retValue :DWORD push bRestart push pwName push bSingle push iClass push cbOut push pOut push pIO push pApcC push pApcR push Event push hDir call dword ptr trueZwQueryDirectory mov retValue,eax .if (!eax) .if (iClass==3) .if (pOut) push ebx mov ebx,pOut assume ebx : ptr FILE_BOTH_DIRECTORY_INFORMATION _loop: mov eax,[ebx].FileNameLength mov uStr._Length,ax inc eax mov uStr.MaximumLength,ax lea eax,[ebx].FileName mov uStr.Buffer,eax invoke RtlUnicodeStringToAnsiString, addr aStr, addr uStr, TRUE .if (!eax) invoke DbgPrint, $CTA0("%s"), aStr.Buffer invoke RtlFreeAnsiString, addr aStr .endif cmp [ebx].NextEntryOffset,0 je @F add ebx,[ebx].NextEntryOffset jmp _loop @@: assume ebx : nothing pop ebx .endif .endif .endif mov eax,retValue ret NewZwQueryDirectory endp