Как определить, находится ли файл в FAT-системе (чтобы увидеть, действительно ли он исполняемый) - PullRequest
3 голосов
/ 20 сентября 2011

Я работаю в независимом от ОС файловом менеджере и делю файлы на группы, как правило, на основании расширения.В Linux я проверяю, есть ли у файла разрешения на выполнение или нет, и если да, я добавляю его в группу исполняемых файлов.Это прекрасно работает для Windows или Linux, но если вы объедините их, это не так хорошо работает.Например, при использовании его в Linux и исследовании подключенного к Windows диска все файлы выглядят исполняемыми.Я пытаюсь найти способ игнорировать эти файлы и не добавлять их в группу исполняемых файлов.Мой код (в Linux) использует stat:

#ifndef WINDOWS
stat(ep->d_name, &buf);
....
if(!files_list[i].is_dir && buf.st_mode & 0111)
files_list[i].is_exe=1;
#endif

Ответы [ 3 ]

4 голосов
/ 20 сентября 2011

Первая часть ответа - найти файловую систему, в которой монтируется файл.Для этого вам нужно найти файловую систему, используя поле st_dev информации stat для файла.(Вы также можете сделать это, проверив путь к файлу, но затем вам нужно будет проверить каждый элемент пути на наличие символических ссылок).

Затем можно связать поле st_dev с таблицей монтирования в /proc/mounts используя getmntent_r().Есть пример этого в предыдущем ответе .Поле mnt_type даст вам текст типа файловой системы, и вам нужно будет сравнить строку со списком файловых систем Windows.

Как только вы найдете файловую систему, единственный способ определитьисполняемый файл по эвристике.Как и предполагали другие, вы можете посмотреть на расширение файла для исполняемых файлов Windows и посмотреть на начальные байты файла для исполняемых файлов Linux.Не забудьте исполняемые скрипты с префиксом #!, и вам может понадобиться прочитать файл Jar, чтобы узнать, содержит ли он исполняемый статический метод main().

0 голосов
/ 20 сентября 2011

Другой вариант, который я мог бы себе представить, это вызвать утилиту file и зависеть от ее вывода (может быть, этого достаточно, чтобы найти слова исполняемый файл / скрипт). Эта утилита существует / компилируется для окон (в основном она также проверяет наличие магических байтов в файлах).

0 голосов
/ 20 сентября 2011

Если вы просматриваете файлы Windows, вам нужно применить правила Windows, чтобы определить, является ли файл исполняемым.Если расширение файла .EXE, .COM, .BAT или .CMD, то это исполняемый файл.Если вы хотите более полный список, то вам следует проверить MSDN.Обратите внимание, что можно добавить записи реестра на компьютере, который делает любое расширение, которое вы хотите считать исполняемым, но лучше всего игнорировать такие вещи, когда вы просматриваете диск из сети.

Дело в том, что вы ведете тяжелую битву.Причина, по которой все файлы имеют права на выполнение, заключается в том, что драйвер файловой системы Windows в Linux позволяет указать это в качестве опции.Это маскирует, являются ли какие-либо файлы исполняемыми файлами Linux, например.

Однако вы можете заглянуть в заголовок файла для КАЖДОГО файла и посмотреть, является ли он исполняемым файлом Linux ELF (так же, как команда Linux file).

Может быть полезно начать с проверки всей информации о смонтированных файловых системах, чтобы вы знали, с чем имеете дело.Например, установлена ​​ли у вас файловая система CIFS, которая на самом деле является файловой системой Linux, обслуживаемой SAMBA?Если вы перечислите каждый бит доступной информации о смонтированной файловой системе плюс полный набор статистической информации, вы, вероятно, сможете идентифицировать комбинации, которые выступают в качестве отпечатков пальцев различных сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...