Программа для изменения тип файла на жёстком диске.

Тема в разделе "WASM.SOFTWARE", создана пользователем rinvio, 18 авг 2023.

  1. rinvio

    rinvio New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2023
    Сообщения:
    6
    На компьютере был изменён файл(папка) на файл неопределённого типа, в котором хранились учебные материалы: книги, видеокурсы и справочники. компьютер показывает что эти типы файлов присутствуют на компьютере. Как можно вручную поменять тип файла? К примеру hex-редактором отредактировать файловую таблицу.
     
  2. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    156
    А кто изменил? Вирус? Тогда вероятно они зашифрованы
     
  3. rinvio

    rinvio New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2023
    Сообщения:
    6
    Виндос определяет тип данных на диске, это значит он их определяет и распознаёт.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    Нужно больше собственных непонятно на чем основанных выводов и меньше формализованной понятной всем инфы давать. Тогда точно догадаются, что тебе надо отредактировать нех-редактором.

    ЗЫ: как выглядит папкофайл в файловом менеджере (скриншот), пкм-свойства папкофайла (скриншот), менюшка или оснастка, глядя в которую ты решил, что виндос что-то определяет и распознаёт (скриншот).
     
    Последнее редактирование: 18 авг 2023
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Ох уж это Венда... вечно все типы файлов возьмёт и попутает...
     
    Vapaamies и mantissa нравится это.
  6. rinvio

    rinvio New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2023
    Сообщения:
    6
    Вам вопрос как виндос определяет, что перед ним файл или папка?
     
  7. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    На прикладном уровне - по флагу FILE_ATTRIBUTE_DIRECTORY.
     
  8. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    Забей в ком.строке команду "DIR", и найдёшь все папки по их атрибутам.
    Но если файлы без расширения, то только читать их сигнатуры (первые 8-байтов). Можно в HEX-редакторе открывать каждый файл, а можно написать простую утилиту. В примере ниже перечисляются все папки/файлы в текущей директории, а так-же читаются из файлов по 16-байт, чтобы определить сигнатуры "Magic". Если хочешь, сам собери исходник fasm'ом, или возьми готовый EXE в скрепке:

    Код (ASM):
    1. format   pe console
    2. include 'win32ax.inc'
    3. entry    start
    4. ;//----------
    5. .data
    6. wfd        WIN32_FIND_DATAA
    7. hndl       dd  0
    8. strLen     dd  0
    9. buff       rb  64
    10. signature  rb  64
    11. ;//----------
    12. .code
    13. start:   invoke  FindFirstFile,<'*.*',0>,wfd
    14.          mov     [hndl],eax
    15.  
    16. @scan:   invoke  _lopen,wfd.cFileName,0   ;// открываем файл на чтение
    17.          push    eax
    18.          invoke  _lread,eax,buff,16
    19.          pop     eax
    20.          invoke  _lclose,eax
    21.      
    22.          invoke  CryptBinaryToString,buff,16,5,0,strLen       ;// форматируем сигнатуру в виде дампа
    23.          invoke  CryptBinaryToString,buff,16,5,signature,strLen
    24.  
    25.          invoke  CharToOem,wfd.cFileName,wfd.cFileName        ;// если имя в кириллице
    26.         cinvoke  printf,<10,' File name :  %s',\
    27.                          10,' Attributes:  %04xh',\
    28.                          10,' Signature :  %s',0>,wfd.cFileName,\
    29.                                                  [wfd.dwFileAttributes],\
    30.                                                   signature
    31.          mov     edi,buff    ;// зачистить буферы..
    32.          xor     eax,eax
    33.          mov     ecx,128/4
    34.          rep     stosd
    35.  
    36.          invoke  FindNextFile,[hndl],wfd  ;// сл.файл..
    37.          or      eax,eax
    38.          jnz     @scan
    39.          invoke  CloseHandle,[hndl]
    40.  
    41. @exit:  cinvoke  _getch
    42.         cinvoke  exit,0
    43. ;//----------
    44. section '.idata' import data readable
    45. library  msvcrt, 'msvcrt.dll', kernel32,'kernel32.dll',crypt32,'crypt32.dll',user32,'user32.dll'
    46. import   crypt32,CryptBinaryToString,'CryptBinaryToStringA'
    47. include 'api\user32.inc'
    48. include 'api\kernel32.inc'
    49. include 'api\msvcrt.inc'
    ScanDir.png

    Маска с атрибутами комбинируется, например 0016h это "DIR + SYSTEM + HIDDEN".
    У файлов обычно атрибут "20h = ARCHIVE", а у папок "10h = DIRECTORY" (лень было парсить в строки):

    Код (ASM):
    1. FILE_ATTRIBUTE_READONLY            = 0001h
    2. FILE_ATTRIBUTE_HIDDEN              = 0002h
    3. FILE_ATTRIBUTE_SYSTEM              = 0004h
    4. FILE_ATTRIBUTE_DIRECTORY           = 0010h
    5. FILE_ATTRIBUTE_ARCHIVE             = 0020h
    6. FILE_ATTRIBUTE_ENCRYPTED           = 0040h
    7. FILE_ATTRIBUTE_NORMAL              = 0080h
    8. FILE_ATTRIBUTE_TEMPORARY           = 0100h
    9. FILE_ATTRIBUTE_SPARSE_FILE         = 0200h
    10. FILE_ATTRIBUTE_REPARSE_POINT       = 0400h
    11. FILE_ATTRIBUTE_COMPRESSED          = 0800h
    12. FILE_ATTRIBUTE_OFFLINE             = 1000h
    13. FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 2000h
     

    Вложения:

    • ScanDir.zip
      Размер файла:
      897 байт
      Просмотров:
      142
    Jenya, mantissa и Mikl___ нравится это.
  9. rinvio

    rinvio New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2023
    Сообщения:
    6
    Программа ScanDir показывает атрибут "normal(0080h)". Через редактор-HxD открыл файл, там пусто.
    Как задать файлу атрибут директории(0010h)?
     
  10. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    rinvio, 80h - это файл без атрибутов,
    выставить его программно можно функцией SetFileAttributes().
    может есть софт готовый - хз, я не встречал.

    а в свойствах размер есть вообще?
    --- Сообщение объединено, 19 авг 2023 ---
    блин сейчас посмотрел, оказывается SetFileAttributes() не может выставлять атрибут 10h - нужно искать другие методы.
     
  11. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
  12. rinvio

    rinvio New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2023
    Сообщения:
    6
    Тотал не находит файлы(pdf,djvu и т.д.) которые там были, а вот ос windows видит параметр>система>память>"использование памяти на другом дисках" определяет размер доков 32 гига.
     
  13. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    покажите скрин папки с "странными файлами"
    нажмите F3 на одном из них
    перейдите в режим Hex (кнопка 3) и снова покажите скрин
     
  14. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    Вангую, что здесь глюк на уровне файловой системы.
    Во первых нужно понять, в результате чего произошёл крах. Если исключить малварь, то может просто лог.ошибка в секторах диска, которая затёрла атрибут в файловой записи NTFS - тогда chkdsk.exe из консоли. В противном случае нужна тяжёлая артиллерия, и как вариант - ручная правка в редакторе WinHex, записи каталога в $MFT.
     
  15. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    Нашёл у себя в закромах инклуд "NTFS.INC", которым можно написать парсер записей "Record", в таблице $MFT. Зачем это нужно? Да просто данный тред навеял, и выбрав пару минут свободного времени, я решил вытащить инфу о записи каталога прямо из NTFS. Когда как у ТС атрибуты папки слетают, то юм функциями вроде нельзя их восстановить, и приходится править запись в ручную. Но для начала небольшой ликбез по теме..

    В строках таблицы $MFT указываются имена буквально всех файлов на диске, а в столбцах их т.н. "Атрибуты". Всего имеется 16 атрибутов, которые оформлены в виде соответствующих структур (см.спеку на NTFS). Папка - это тоже файл, только чуть с иными атрибутами. Совокупность данных в одной строке $MFT и 16-ти её столбцах, представляют одну файловую запись "Record".

    Код (ASM):
    1. aStandardInformation = 0x10   ; присутствует в каждой записи
    2. aAttributeList       = 0x20
    3. aFileName            = 0x30   ; присутствует в каждой записи
    4. aObjectId            = 0x40
    5. aSecurityDescriptor  = 0x50
    6. aVolumeName          = 0x60   ; только для томов/разделов
    7. aVolumeInformation   = 0x70
    8. aData                = 0x80   ; только для файлов (#кластера с данными)
    9. aIndexRoot           = 0x90   ; только для папок  (описывает содержимое)
    10. aIndexAllocation     = 0xA0
    11. aBitmap              = 0xB0
    12. aReparsePoint        = 0xC0
    13. aEAInformation       = 0xD0   ; NTFS-потоки, только для файлов (Ext.Attr)
    14. aEA                  = 0xE0
    15. aPropertySet         = 0xF0
    16. aLoggedUtilityStream = 0x100
    17. aEnd                 = 0xFFFFFFFF ; маркер последнего атрибута в файловой записи

    Чтобы программно найти Record произвольного файла, нужно обойти все строки в таблице $MFT, которых может быть сотни тысяч (по числу файлов/папок на диске). При поиске, имя файла берётся из атрибута "FILE_NAME=30h" записи. Указатель на саму $MFT лежит в первом секторе раздела по смещению 30h, а её размер в 38h (оба поля qword в кластерах). В спеках на NTFS этот сектор известен как метафайл $Boot. У каждого раздела диска свой бутсектор и своя $MFT. Соответственно прочитать $Boot и найти в нём линк на $MFT можно просто дёрнув за CreateFile().

    Boot.png

    Приведённый ниже пример это не готовый парсер $MFT, а лишь небольшой его фрагмент, чтобы продемонстрировать вывод данных из записей "FILE_RECORD". Поскольку процедура поиска файловой записи в таблице поглотит всю полезную нагрузку кода, программа ожидает на входе уже готовый файл образа Record с именем "dump.bin". Снять его в WinHex можно примерно так:
    1. Выбираем в проводнике WinHex (верхнее окно) любую папку, и попадаем в начало какого-то сектора.
    2. Если в нижнем окне дампа сектор начинается с сигнатуры "FILE", то перед нами файловая запись (см.скрин выше). Если-же нарвались на сигнатуру "INDX", значит папка расположена в корне диска, например в C:\Temp - такие записи обрабатываются по иному, и в примере не реализованы.
    3. Значит нашли любой сектор с сигнатурой "FILE". Выделяем его мышью до сл.разделителя в окне. Одна запись Record может занимать в $MFT несколько секторов (причём разбросанных при дефрагментации), но чтобы вытащить базовую инфу из записи, хватит и одного.
    4. Выделили.. теперь топаем в меню "Правка -> CopyBlock -> Hex-значения".
    5. Открываем редактор "HxD", создаём в нём новый файл, и в бинарную часть [Ctrl+V] из буфера. Сохранить -> dump.bin
    6. Кладём дамп файловой записи рядом с EXE и запускаем последний.
    Код (ASM):
    1. format   pe console
    2. include 'win32ax.inc'
    3. include 'equates\ntfs.inc'
    4. entry    start
    5. ;//----------
    6. .data
    7. stm      SYSTEMTIME
    8. fSize    dd  0
    9. fName    rb  64
    10. buff     rb  2048
    11. ;//----------
    12. .code
    13. start:   invoke  _lopen,<'dump.bin',0>,0
    14.          cmp      eax,-1
    15.          jnz      @f
    16.         cinvoke   printf,<' Error! dump.bin not found!',0>
    17.          jmp      @exit
    18. ;//-----------------------
    19. @@:      push     eax eax
    20.          invoke   GetFileSize,eax,fSize   ;// читаем дамп в буфер
    21.          pop      ebx
    22.          invoke  _lread,ebx,buff,eax
    23.          pop      eax
    24.          invoke  _lclose,eax
    25.         cinvoke   printf,<10," $MFT record signature: '%.4s'",10,0>,buff
    26.  
    27.          cmp      dword[buff],'FILE'      ;// это точно файловая запись?
    28.          jz       @f
    29.         cinvoke   printf,<' Error! This is not $MFT file record!',0>
    30.          jmp      @exit
    31. ;//-----------------------
    32. @@:      mov      esi,buff
    33.          mov      eax,[esi+FILE_RECORD.MftRecordNum]
    34.          movzx    ebx,[esi+FILE_RECORD.HardLinkCount]
    35.          movzx    ecx,[esi+FILE_RECORD.Flags]
    36.          mov      edx,[esi+FILE_RECORD.fRecordRealSize]
    37.          movzx    ebp,[esi+FILE_RECORD.upsNumber]
    38.         cinvoke   printf,<10,' FILE_RECORD INFO',\
    39.                           10,'     This record in MFT....:  #%010d',\
    40.                           10,'     Hard link count.......:  %d',\
    41.                           10,'     Record status flags...:  %-11x (0=Deleted, 1=Active, 2=Dir)',\
    42.                           10,'     Record size...........:  %d byte',\
    43.                           10,'     Update sequency word..:  0x%04x',10,0>,\
    44.                           eax,ebx,ecx,edx,ebp
    45. ;//-----------------------
    46.          mov      esi,buff
    47.          add      esi,sizeof.FILE_RECORD    ;// все атрибуты располагаются впритык,
    48.          push     esi esi                   ;// ..сразу за главной структурой.
    49.  
    50.          movzx    eax,[esi+ATTR_STD_INFO_10.Header.AttrId]
    51.         cinvoke   printf,<10," ATTRIBUTE 'STANDART'",\
    52.                           10,'     Attribute type........:  0x%x',\
    53.                           10,'     Attribute ID..........:  0x%04x',\
    54.                           10,'     Security  ID..........:  0x%04x',\
    55.                           10,'     File permission mask..:  0x%-9x (Hidden,Archive,etc)',0>,\
    56.                      dword[esi+ATTR_STD_INFO_10.Header],\
    57.                            eax,\
    58.                           [esi+ATTR_STD_INFO_10.SecurityId],\
    59.                           [esi+ATTR_STD_INFO_10.fPermissions]
    60.  
    61.          pop      eax
    62.          add      eax,ATTR_STD_INFO_10.mftChangedTime  ;// узнаем время, когда у папки накрылись юм.атрибуты
    63.          invoke   FileTimeToSystemTime,eax,stm         ;// ..получить время последнего мода данной записи в MFT
    64.          movzx    eax,[stm.wDay]
    65.          movzx    ebx,[stm.wMonth]
    66.          movzx    ecx,[stm.wYear]
    67.          movzx    edx,[stm.wHour]
    68.          movzx    ebp,[stm.wMinute]
    69.         cinvoke   printf,<10,'     Record changed time...:  %02d.%02d.%d  %02d:%02d',10,0>,\
    70.                           eax,ebx,ecx,edx,ebp
    71. ;//-----------------------
    72.          pop      esi
    73.          add      esi,sizeof.ATTR_STD_INFO_10
    74.          push     esi
    75.  
    76.          movzx    eax,[esi+ATTR_FILE_NAME_30.Header.AttrId]
    77.          movzx    ebx,[esi+ATTR_FILE_NAME_30.Header.IndexedFlag]
    78.         cinvoke   printf,<10," ATTRIBUTE 'FILE_NAME'",\
    79.                           10,'     Attribute type........:  0x%x',\
    80.                           10,'     Attribute ID..........:  0x%04x',\
    81.                           10,'     File indexed flag.....:  %d',\
    82.                           10,'     File attribute  mask..:  0x%08x  (0x10000000 = Dir)',0>,\
    83.                      dword[esi+ATTR_FILE_NAME_30.Header],\
    84.                            eax,ebx,\
    85.                           [esi+ATTR_FILE_NAME_30.FileFlags]
    86.  
    87.          pop      esi
    88.          movzx    ecx,byte[esi+ATTR_FILE_NAME_30.FileNameLen]
    89.          add      esi,ATTR_FILE_NAME_30.FileName   ;// строки в структурах Unicode, без терминального нуля.
    90.          mov      edi,fName                        ;// делаем из них szAscii.
    91. @@:      lodsw
    92.          stosb
    93.          loop     @b
    94.          invoke   CharToOem,fName,fName
    95.         cinvoke   printf,<10,'     File name.............:  %s',10,0>,fName
    96.  
    97. @exit:  cinvoke  _getch
    98.         cinvoke  exit,0
    99. ;//----------
    100. section '.idata' import data readable
    101. library  msvcrt, 'msvcrt.dll', kernel32,'kernel32.dll',user32,'user32.dll'
    102. include 'api\user32.inc'
    103. include 'api\kernel32.inc'
    104. include 'api\msvcrt.inc'
    Log.png

    Когда файловая запись валидна и описывает каталог, флаг в структуре "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).
     

    Вложения:

    • MFT.ZIP
      Размер файла:
      4,5 КБ
      Просмотров:
      118
    Mikl___ и mantissa нравится это.
  16. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    А вдруг у ТС не NTFS??
     
  17. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    А вдруг щас Марс упадёт на Землю?
    ТС запускал предыдущий код и говорил, что получил от папки атрибуты 80h.
    Значит винда и если под ней FAT, то это нонсенс.
     
  18. rinvio

    rinvio New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2023
    Сообщения:
    6
    А если переименовать файл задав ему уникальное сложное длинное имя. тогда поиск в таблице может привести к одной записи. И да можно провести эксперимент создать папку и сменить атрибуты с 10h на 80h и обратно.
    ps:файловая система NTFS.
    --- Сообщение объединено, 21 авг 2023 ---
    А можно в windows создать в реестре новый тип файла(папки) и переименовать файл задав ему новые атребуты?
     
  19. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    197
    да.. если переименовать файл/папку, то номер записи в MFT остаётся прежний, а меняются только поля в структурах.
    Вот пример где видно, что модифицировался "FILE_RECORD" под номером #087359:

    Rename.png
    Это как? лично я никогда не занимался подобным.

    Вы пробовали загрузить дамп записи о вашей папке без доступа в этот код? Какой результат?
     
  20. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    rinvio, начинать надо с малёхо иных Вопросов..

    1. как подрублен диск к компу (сата/юсб/псай).
    2. тип диска.
    3. здоровье.
    4. процент заполненности.
    5. режимы работы.
    ======
    от неустойчивой схемы использования фс кладётся на УРА :)