Pull to refresh

Comments 35

в линуксе достаточно набрать, где myfile — имя неопознанного файла
file myfile

делать такой сервис не более одного дня
Это при условии что файл просто с неизвестным расширением.

Если это бинарный мусор (например образ pgp-диска), то определять придётся очень долго и нужны будут думающие анализаторы. Что сделать будет крайне трудно или даже невозможно
спасибо. не помог. unknown для любых моих файлов
Хм… Странный у вас файл.
lite@lite:~/Photos/2009/01/01$ file 100_0053.jpg
100_0053.jpg: JPEG image data, EXIF standard 2.21
это был мой раскодированный непонятный файл с расширением jpg
В Вашем случае: закодируйте несколько различных картинок. Как мне кажется, првые символы AgFTS2 (и, возможно, несколько последующих символов) не являются частью шифра, а содержат что-то вроде алгоритма сжатия или описания типа содержимого.
Судя по этой ссылке: www.forum.mista.ru/topic.php?id=338411
И все же закодируйте несколько картинок, может, найдем что-то общее. (Если, конечно, проблема Вам еще интересна)
Да, это было бы полезно. И, плюс к этому, ведь картинки-то загружаются в базу пользователем, и есть оригинал этой картинки. Имело бы смысл посмотреть еще на него и сравнить с тем что в базе.
сделал. обнаружил общий префикс, но толку нет. см по ссылке
сделал. обнаружил общий префикс, но толку нет. см по ссылке
С учетом того, что картинка неплохо жмется WinRar по алгоритму ZIP до 25 кб, вполне возможно, и даже вероятно, что внутри лежит префикс (AgFTS2) и base-64-закодированные данные архива (непонятно какого формата, но думаю что из популярных). Выложите еще несколько ккартинок в том же виде для анализа.

PS> а в саму 1С не пробовали звонить? :-)
Естественно жмется, потому как там текстовые данные в 64 символах. Если base64-декодировать результат, так получается 24кб.
Я JPEG жал, а не base64-кодированный файл. (картинка по ссылке внизу — изображение калькулятора). То есть ZIP с картинкой примерно равен восстановленному из base64 файлу, что дает плюс докадке о том, что там какой-то архив (и возможно еще немного каких-то данных).
А, действительно. пардон, что-то я картинку не заметил, новый год, чтоли )
Тогда действительно там скорее всего какойто распространенный способ сжатися. Может GZip/ZLib, плюс какието свои заголовки?
у zlib и gzip вполне стандартные заголовки, file их опознаёт
Тут еще что-то в начале файла есть, видимо.
Кстати, попробовал убрать первые 1..20 символов, потом получившееся закинуть из base64 в нормальный формат в файл .gz. Ни один не открыл.
Возможно, префикс. Можно попробовать отрезать 1, 2, или 3 байта, ибо 4 байта b64 отрезать = отрезать 3 байта распакованных данных. Причём, если между числом данных и числом знаков = в конце кодированных данных не будет соответствия, до трёх последних байт данных могут быть забракованы как повреждённые. Это будет, если мы добавили в начало число символов, не кратное 4.

Вообще, file вот так определяет, если мы префиксы не добавляли:
merlin@fathers ~ $ file linux.jpg
linux.jpg: JPEG image data, JFIF standard 1.01, comment: «CREATOR: gd-jpeg v1.0 (using IJ»
merlin@fathers ~ $ gzip linux.jpg
merlin@fathers ~ $ file linux.jpg.gz
linux.jpg.gz: gzip compressed data, was «linux.jpg», from Unix, last modified: Thu Jan 1 16:00:04 2009
merlin@fathers ~ $ mv linux.jpg.gz file.bin
merlin@fathers ~ $ file file.bin
file.bin: gzip compressed data, was «linux.jpg», from Unix, last modified: Thu Jan 1 16:00:04 2009
merlin@fathers ~ $ base64 file.bin > file64.bin
merlin@fathers ~ $ file file64.bin
file64.bin: ASCII text

далее к файлу file64.bin была прицеплена спереди строка «prefix»
И теперь пытаемся отрезать по байту, распаковывать base64 и смотреть утилитой file:
head file64.bin
prefixH4sICFS+XEkAA2xpbnV4LmpwZwCc/FVYHM8btosOTtAQJDgECA7BXYO7u7vL4K7BYXCHQQeX4O7u

merlin@fathers ~ $ base64 -d file64.bin > file-test.bin
base64: неверный ввод
merlin@fathers ~ $ file file-test.bin
file-test.bin: data

head file64.bin
efixH4sICFS+XEkAA2xpbnV4LmpwZwCc/FVYHM8btosOTtAQJDgECA7BXYO7u7vL4K7BYXCHQQeX4O7u
merlin@fathers ~ $ base64 -d file64.bin > file-test.bin
merlin@fathers ~ $ file file-test.bin
file-test.bin: data
merlin@fathers ~ $ mv file-test.bin file-test.gz
merlin@fathers ~ $ gzip -d file-test.gz

gzip: file-test.gz: not in gzip format


В последнем случае base64 распаковалось, но в результате получился gzip с тремя лишними байтами мусора в начале (результат base64-распаковки строки efix). И утилита file не заметила никакого gzip-а в этих данных. Сама gzip тоже ничего не распознала. (zcat тоже не распознаёт)

Короче, мораль такова: отрезать по байту, пока base64 не начнёт распаковываться без ошибок, а затем отрезать по четыре байта, каждый раз тестируя распакованные данные утилитой file. Таким образом, если там встретится что-то знакомое, она это наконец распознает.
Если это зашифрованый файл, и без специфических для той или иной методики шифрования заголовков, распознать что это такое практически невозможно. Ибо правильный шифр должен делать невозможным не только расшифрование, но и получение какой-либо статистической информации об исходных данных.

А насчет других случаев — насколько часто вам такое понадобится?? я вижу только единичные случаи, в которых разобраться можно будет самому.
Попробуйте так:
Берем данные «вроде base64-encoded». Отрезаем первый символ, декодируем из base64 в обычный вид, пишем файл. Скорее всего это сжатый файл, а не архив с кучей файлов.

Судя по ru.wikipedia.org/wiki/Zlib в 1C используется zLib для сжатия файлов баз. Думаю, тут используется оно же. Пробуйте :-)
Начните не с картинки, а с простых и коротких файлов — например, файл из 1 байта, файл из 256 одинаковых байт, файл с последователностью символов A,B,C,D,… С такими данными получить ответ на вопрос о заголовках, сжатии и примитивном шифровании должно быть проще, чем с файлами на дцать килобайт.
Коммерческие перспективы такого проекта малы, я считаю. Мало у кого возникают такие сложности, большинство пользователей интернета работают с компьютером на бытовом уровне, а в таком случае врядли возникает вопрос определения вида/типа абстрактного файла.
действительно… программист — настолько редкая профессия, что даже на хабре я давненько их не встречал
Такие программы актуальны для рыбаков на спутнике, и есть уже готовые.
действительно… программист — настолько редкая профессия, что даже на хабре я давненько их не встречал
наверное имелось ввиду что нить типа smartsorter
Давно есть, стоит только поискать. Называется file.net.
Please enter a filename: VIRUS
варианты: «virus.exe; описание: deletes my hard drive» )))))
$ man file
file — determine file type

This manual page documents version 4.26 of the file command.

file tests each argument in an attempt to classify it. There are three sets of tests, performed in this order: filesystem tests,
magic tests, and language tests. The first test that succeeds causes the file type to be printed.

The type printed will usually contain one of the words text (the file contains only printing characters and a few common control
characters and is probably safe to read on an ASCII terminal), executable (the file contains the result of compiling a program in a
form understandable to some UNIX kernel or another), or data meaning anything else (data is usually ‘binary’ or non-printable).
Exceptions are well-known file formats (core files, tar archives) that are known to contain binary data. When adding local defini‐
tions to /etc/magic, make sure to preserve these keywords. Users depend on knowing that all the readable files in a directory have
the word “text” printed. Don’t do as Berkeley did and change “shell commands text” to “shell script”.

The filesystem tests are based on examining the return from a stat(2) system call. The program checks to see if the file is empty,
or if it’s some sort of special file. Any known file types appropriate to the system you are running on (sockets, symbolic links, or
named pipes (FIFOs) on those systems that implement them) are intuited if they are defined in the system header file <sys/stat.h>.

The magic tests are used to check for files with data in particular fixed formats. The canonical example of this is a binary exe‐
cutable (compiled program) a.out file, whose format is defined in <elf.h>, <a.out.h> and possibly <exec.h> in the standard include
directory. These files have a ‘magic number’ stored in a particular place near the beginning of the file that tells the UNIX
operating system that the file is a binary executable, and which of several types thereof. The concept of a ‘magic’ has been applied
by extension to data files. Any file with some invariant identifier at a small fixed offset into the file can usually be described
in this way. The information identifying these files is read from /etc/magic and the the compiled magic file
/usr/share/file/magic.mgc, or the files in the directory /usr/share/file/magic if the compiled file does not exist. In addition, if
$HOME/.magic.mgc or $HOME/.magic exists, it will be used in preference to the system magic files.

If a file does not match any of the entries in the magic file, it is examined to see if it seems to be a text file. ASCII,
ISO-8859-x, non-ISO 8-bit extended-ASCII character sets (such as those used on Macintosh and IBM PC systems), UTF-8-encoded Unicode,
UTF-16-encoded Unicode, and EBCDIC character sets can be distinguished by the different ranges and sequences of bytes that constitute
printable text in each set. If a file passes any of these tests, its character set is reported. ASCII, ISO-8859-x, UTF-8, and
extended-ASCII files are identified as “text” because they will be mostly readable on nearly any terminal; UTF-16 and EBCDIC are only
“character data” because, while they contain text, it is text that will require translation before it can be read. In addition, file
will attempt to determine other characteristics of text-type files. If the lines of a file are terminated by CR, CRLF, or NEL,
instead of the Unix-standard LF, this will be reported. Files that contain embedded escape sequences or overstriking will also be
identified.

Once file has determined the character set used in a text-type file, it will attempt to determine in what language the file is writ‐
ten. The language tests look for particular strings (cf. <names.h> ) that can appear anywhere in the first few blocks of a file.
For example, the keyword .br indicates that the file is most likely a troff(1) input file, just as the keyword struct indicates a C
program. These tests are less reliable than the previous two groups, so they are performed last. The language test routines also
test for some miscellany (such as tar(1) archives).

Any file that cannot be identified as having been written in any of the character sets listed above is simply said to be “data”.

Так что можно просто расширить возможности уже существующей программы.
Вот столкнулся с той же проблемой на которую есть ссылка в посте — разабрать xml 1с и взять из него изображение
Решение получилось следующее
1. получаем необходимый фрагмент xml
2. отрезаем от него AgFTS2/0iI3BTqDV67a9oKcN
3. декодируем (base64)
4. декомпресия (DEFLATE) (http://www.faqs.org/rfcs/rfc1951)
5. далее с начала строки ищем заголовки JPG (http://www.codenet.ru/progr/formt/jpeg_13.php) — и с этого места наш джипег

попробывал примеры из ссылки в посте — распарсились
Sign up to leave a comment.

Articles