На компьютере был изменён файл(папка) на файл неопределённого типа, в котором хранились учебные материалы: книги, видеокурсы и справочники. компьютер показывает что эти типы файлов присутствуют на компьютере. Как можно вручную поменять тип файла? К примеру hex-редактором отредактировать файловую таблицу.
Нужно больше собственных непонятно на чем основанных выводов и меньше формализованной понятной всем инфы давать. Тогда точно догадаются, что тебе надо отредактировать нех-редактором. ЗЫ: как выглядит папкофайл в файловом менеджере (скриншот), пкм-свойства папкофайла (скриншот), менюшка или оснастка, глядя в которую ты решил, что виндос что-то определяет и распознаёт (скриншот).
Забей в ком.строке команду "DIR", и найдёшь все папки по их атрибутам. Но если файлы без расширения, то только читать их сигнатуры (первые 8-байтов). Можно в HEX-редакторе открывать каждый файл, а можно написать простую утилиту. В примере ниже перечисляются все папки/файлы в текущей директории, а так-же читаются из файлов по 16-байт, чтобы определить сигнатуры "Magic". Если хочешь, сам собери исходник fasm'ом, или возьми готовый EXE в скрепке: Code (ASM): format pe console include 'win32ax.inc' entry start ;//---------- .data wfd WIN32_FIND_DATAA hndl dd 0 strLen dd 0 buff rb 64 signature rb 64 ;//---------- .code start: invoke FindFirstFile,<'*.*',0>,wfd mov [hndl],eax @scan: invoke _lopen,wfd.cFileName,0 ;// открываем файл на чтение push eax invoke _lread,eax,buff,16 pop eax invoke _lclose,eax invoke CryptBinaryToString,buff,16,5,0,strLen ;// форматируем сигнатуру в виде дампа invoke CryptBinaryToString,buff,16,5,signature,strLen invoke CharToOem,wfd.cFileName,wfd.cFileName ;// если имя в кириллице cinvoke printf,<10,' File name : %s',\ 10,' Attributes: %04xh',\ 10,' Signature : %s',0>,wfd.cFileName,\ [wfd.dwFileAttributes],\ signature mov edi,buff ;// зачистить буферы.. xor eax,eax mov ecx,128/4 rep stosd invoke FindNextFile,[hndl],wfd ;// сл.файл.. or eax,eax jnz @scan invoke CloseHandle,[hndl] @exit: cinvoke _getch cinvoke exit,0 ;//---------- section '.idata' import data readable library msvcrt, 'msvcrt.dll', kernel32,'kernel32.dll',crypt32,'crypt32.dll',user32,'user32.dll' import crypt32,CryptBinaryToString,'CryptBinaryToStringA' include 'api\user32.inc' include 'api\kernel32.inc' include 'api\msvcrt.inc' Маска с атрибутами комбинируется, например 0016h это "DIR + SYSTEM + HIDDEN". У файлов обычно атрибут "20h = ARCHIVE", а у папок "10h = DIRECTORY" (лень было парсить в строки): Code (ASM): FILE_ATTRIBUTE_READONLY = 0001h FILE_ATTRIBUTE_HIDDEN = 0002h FILE_ATTRIBUTE_SYSTEM = 0004h FILE_ATTRIBUTE_DIRECTORY = 0010h FILE_ATTRIBUTE_ARCHIVE = 0020h FILE_ATTRIBUTE_ENCRYPTED = 0040h FILE_ATTRIBUTE_NORMAL = 0080h FILE_ATTRIBUTE_TEMPORARY = 0100h FILE_ATTRIBUTE_SPARSE_FILE = 0200h FILE_ATTRIBUTE_REPARSE_POINT = 0400h FILE_ATTRIBUTE_COMPRESSED = 0800h FILE_ATTRIBUTE_OFFLINE = 1000h FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 2000h
Программа ScanDir показывает атрибут "normal(0080h)". Через редактор-HxD открыл файл, там пусто. Как задать файлу атрибут директории(0010h)?
rinvio, 80h - это файл без атрибутов, выставить его программно можно функцией SetFileAttributes(). может есть софт готовый - хз, я не встречал. а в свойствах размер есть вообще? --- Сообщение объединено, Aug 19, 2023 --- блин сейчас посмотрел, оказывается SetFileAttributes() не может выставлять атрибут 10h - нужно искать другие методы.
Тотал не находит файлы(pdf,djvu и т.д.) которые там были, а вот ос windows видит параметр>система>память>"использование памяти на другом дисках" определяет размер доков 32 гига.
покажите скрин папки с "странными файлами" нажмите F3 на одном из них перейдите в режим Hex (кнопка 3) и снова покажите скрин
Вангую, что здесь глюк на уровне файловой системы. Во первых нужно понять, в результате чего произошёл крах. Если исключить малварь, то может просто лог.ошибка в секторах диска, которая затёрла атрибут в файловой записи NTFS - тогда chkdsk.exe из консоли. В противном случае нужна тяжёлая артиллерия, и как вариант - ручная правка в редакторе WinHex, записи каталога в $MFT.
Нашёл у себя в закромах инклуд "NTFS.INC", которым можно написать парсер записей "Record", в таблице $MFT. Зачем это нужно? Да просто данный тред навеял, и выбрав пару минут свободного времени, я решил вытащить инфу о записи каталога прямо из NTFS. Когда как у ТС атрибуты папки слетают, то юм функциями вроде нельзя их восстановить, и приходится править запись в ручную. Но для начала небольшой ликбез по теме.. В строках таблицы $MFT указываются имена буквально всех файлов на диске, а в столбцах их т.н. "Атрибуты". Всего имеется 16 атрибутов, которые оформлены в виде соответствующих структур (см.спеку на NTFS). Папка - это тоже файл, только чуть с иными атрибутами. Совокупность данных в одной строке $MFT и 16-ти её столбцах, представляют одну файловую запись "Record". Spoiler: NTFS attribute list Code (ASM): aStandardInformation = 0x10 ; присутствует в каждой записи aAttributeList = 0x20 aFileName = 0x30 ; присутствует в каждой записи aObjectId = 0x40 aSecurityDescriptor = 0x50 aVolumeName = 0x60 ; только для томов/разделов aVolumeInformation = 0x70 aData = 0x80 ; только для файлов (#кластера с данными) aIndexRoot = 0x90 ; только для папок (описывает содержимое) aIndexAllocation = 0xA0 aBitmap = 0xB0 aReparsePoint = 0xC0 aEAInformation = 0xD0 ; NTFS-потоки, только для файлов (Ext.Attr) aEA = 0xE0 aPropertySet = 0xF0 aLoggedUtilityStream = 0x100 aEnd = 0xFFFFFFFF ; маркер последнего атрибута в файловой записи Чтобы программно найти Record произвольного файла, нужно обойти все строки в таблице $MFT, которых может быть сотни тысяч (по числу файлов/папок на диске). При поиске, имя файла берётся из атрибута "FILE_NAME=30h" записи. Указатель на саму $MFT лежит в первом секторе раздела по смещению 30h, а её размер в 38h (оба поля qword в кластерах). В спеках на NTFS этот сектор известен как метафайл $Boot. У каждого раздела диска свой бутсектор и своя $MFT. Соответственно прочитать $Boot и найти в нём линк на $MFT можно просто дёрнув за CreateFile(). Приведённый ниже пример это не готовый парсер $MFT, а лишь небольшой его фрагмент, чтобы продемонстрировать вывод данных из записей "FILE_RECORD". Поскольку процедура поиска файловой записи в таблице поглотит всю полезную нагрузку кода, программа ожидает на входе уже готовый файл образа Record с именем "dump.bin". Снять его в WinHex можно примерно так: Выбираем в проводнике WinHex (верхнее окно) любую папку, и попадаем в начало какого-то сектора. Если в нижнем окне дампа сектор начинается с сигнатуры "FILE", то перед нами файловая запись (см.скрин выше). Если-же нарвались на сигнатуру "INDX", значит папка расположена в корне диска, например в C:\Temp - такие записи обрабатываются по иному, и в примере не реализованы. Значит нашли любой сектор с сигнатурой "FILE". Выделяем его мышью до сл.разделителя в окне. Одна запись Record может занимать в $MFT несколько секторов (причём разбросанных при дефрагментации), но чтобы вытащить базовую инфу из записи, хватит и одного. Выделили.. теперь топаем в меню "Правка -> CopyBlock -> Hex-значения". Открываем редактор "HxD", создаём в нём новый файл, и в бинарную часть [Ctrl+V] из буфера. Сохранить -> dump.bin Кладём дамп файловой записи рядом с EXE и запускаем последний. Code (ASM): format pe console include 'win32ax.inc' include 'equates\ntfs.inc' entry start ;//---------- .data stm SYSTEMTIME fSize dd 0 fName rb 64 buff rb 2048 ;//---------- .code start: invoke _lopen,<'dump.bin',0>,0 cmp eax,-1 jnz @f cinvoke printf,<' Error! dump.bin not found!',0> jmp @exit ;//----------------------- @@: push eax eax invoke GetFileSize,eax,fSize ;// читаем дамп в буфер pop ebx invoke _lread,ebx,buff,eax pop eax invoke _lclose,eax cinvoke printf,<10," $MFT record signature: '%.4s'",10,0>,buff cmp dword[buff],'FILE' ;// это точно файловая запись? jz @f cinvoke printf,<' Error! This is not $MFT file record!',0> jmp @exit ;//----------------------- @@: mov esi,buff mov eax,[esi+FILE_RECORD.MftRecordNum] movzx ebx,[esi+FILE_RECORD.HardLinkCount] movzx ecx,[esi+FILE_RECORD.Flags] mov edx,[esi+FILE_RECORD.fRecordRealSize] movzx ebp,[esi+FILE_RECORD.upsNumber] cinvoke printf,<10,' FILE_RECORD INFO',\ 10,' This record in MFT....: #%010d',\ 10,' Hard link count.......: %d',\ 10,' Record status flags...: %-11x (0=Deleted, 1=Active, 2=Dir)',\ 10,' Record size...........: %d byte',\ 10,' Update sequency word..: 0x%04x',10,0>,\ eax,ebx,ecx,edx,ebp ;//----------------------- mov esi,buff add esi,sizeof.FILE_RECORD ;// все атрибуты располагаются впритык, push esi esi ;// ..сразу за главной структурой. movzx eax,[esi+ATTR_STD_INFO_10.Header.AttrId] cinvoke printf,<10," ATTRIBUTE 'STANDART'",\ 10,' Attribute type........: 0x%x',\ 10,' Attribute ID..........: 0x%04x',\ 10,' Security ID..........: 0x%04x',\ 10,' File permission mask..: 0x%-9x (Hidden,Archive,etc)',0>,\ dword[esi+ATTR_STD_INFO_10.Header],\ eax,\ [esi+ATTR_STD_INFO_10.SecurityId],\ [esi+ATTR_STD_INFO_10.fPermissions] pop eax add eax,ATTR_STD_INFO_10.mftChangedTime ;// узнаем время, когда у папки накрылись юм.атрибуты invoke FileTimeToSystemTime,eax,stm ;// ..получить время последнего мода данной записи в MFT movzx eax,[stm.wDay] movzx ebx,[stm.wMonth] movzx ecx,[stm.wYear] movzx edx,[stm.wHour] movzx ebp,[stm.wMinute] cinvoke printf,<10,' Record changed time...: %02d.%02d.%d %02d:%02d',10,0>,\ eax,ebx,ecx,edx,ebp ;//----------------------- pop esi add esi,sizeof.ATTR_STD_INFO_10 push esi movzx eax,[esi+ATTR_FILE_NAME_30.Header.AttrId] movzx ebx,[esi+ATTR_FILE_NAME_30.Header.IndexedFlag] cinvoke printf,<10," ATTRIBUTE 'FILE_NAME'",\ 10,' Attribute type........: 0x%x',\ 10,' Attribute ID..........: 0x%04x',\ 10,' File indexed flag.....: %d',\ 10,' File attribute mask..: 0x%08x (0x10000000 = Dir)',0>,\ dword[esi+ATTR_FILE_NAME_30.Header],\ eax,ebx,\ [esi+ATTR_FILE_NAME_30.FileFlags] pop esi movzx ecx,byte[esi+ATTR_FILE_NAME_30.FileNameLen] add esi,ATTR_FILE_NAME_30.FileName ;// строки в структурах Unicode, без терминального нуля. mov edi,fName ;// делаем из них szAscii. @@: lodsw stosb loop @b invoke CharToOem,fName,fName cinvoke printf,<10,' File name.............: %s',10,0>,fName @exit: cinvoke _getch cinvoke exit,0 ;//---------- section '.idata' import data readable library msvcrt, 'msvcrt.dll', kernel32,'kernel32.dll',user32,'user32.dll' include 'api\user32.inc' include 'api\kernel32.inc' include 'api\msvcrt.inc' Когда файловая запись валидна и описывает каталог, флаг в структуре "FILE_RECORD" будет равен(3), что соответствует комбинации 1+2. Если-же Record описывает файл, FS выставляет этому флагу значение(1). Но основным признаком папки является флаг в структуре атрибута "FILE_NAME". В прототипе юзер-функции GetFileAttribute() папке присваивается маска(10h). Так-вот в NTFS она уже не действительна - здесь дир определяет значение 0х10000000, причём все остальные биты вероятно сбрасываются в нуль, как в поле "PermissionFlags" атрибута записи "STANDART". Таким образом, проникнув в файловую запись каталога можно восстановить доступ к нему при условии, что секторы физически не повреждены. Если кто знает, как из прикладного уровня средствами WinAPI сделать аналогичное, прошу поделиться. Для DeviceIoControl() есть вроде код "FSCTL_GET_RETRIEVAL_POINTERS", но он возвращает номер кластера, где хранятся уже полезные данные файла, а не файловая запись в $MFT. PS//. Почитать по теме: Брайн Кэрриер "Криминалистический анализ FS", бесплатно в djvu на русском можно стянуть от сюда: https://rouse.drkb.ru/books.php#carrier В скрепку положил файл для тестов, и инклуд fasm'a "ntfs.inc" (требуются дополнения из сишного хидера ntfs.h).
А вдруг щас Марс упадёт на Землю? ТС запускал предыдущий код и говорил, что получил от папки атрибуты 80h. Значит винда и если под ней FAT, то это нонсенс.
А если переименовать файл задав ему уникальное сложное длинное имя. тогда поиск в таблице может привести к одной записи. И да можно провести эксперимент создать папку и сменить атрибуты с 10h на 80h и обратно. ps:файловая система NTFS. --- Сообщение объединено, Aug 21, 2023 --- А можно в windows создать в реестре новый тип файла(папки) и переименовать файл задав ему новые атребуты?
да.. если переименовать файл/папку, то номер записи в MFT остаётся прежний, а меняются только поля в структурах. Вот пример где видно, что модифицировался "FILE_RECORD" под номером #087359: Это как? лично я никогда не занимался подобным. Вы пробовали загрузить дамп записи о вашей папке без доступа в этот код? Какой результат?
rinvio, начинать надо с малёхо иных Вопросов.. 1. как подрублен диск к компу (сата/юсб/псай). 2. тип диска. 3. здоровье. 4. процент заполненности. 5. режимы работы. ====== от неустойчивой схемы использования фс кладётся на УРА