Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
MAGIC(5)		       File Formats Manual			MAGIC(5)

NAME
     magic -- file command's magic pattern file

DESCRIPTION
     This manual page documents the format of magic files as used by the file(1)
     command,  version	5.46.  The file(1) command identifies the type of a file
     using, among other tests, a test for  whether  the  file  contains  certain
     "magic  patterns".   The  database of these "magic patterns" is usually lo-
     cated in a binary file in /usr/local/share/file/magic.mgc or a directory of
     source text magic pattern fragment  files	in  /usr/local/share/file/magic.
     The  database specifies what patterns are to be tested for, what message or
     MIME type to print if a particular pattern is found, and additional  infor-
     mation to extract from the file.

     The  format  of the source fragment files that are used to build this data-
     base is as follows: Each line of a fragment file specifies  a  test  to  be
     performed.  A test compares the data starting at a particular offset in the
     file with a byte value, a string or a numeric value.  If the test succeeds,
     a message is printed.  The line consists of the following fields:

     offset   A  number  specifying  the  offset (in bytes) into the file of the
	      data which is to be tested.  This offset can be a negative  number
	      if it is:
	      *   The  first  direct  offset of the magic entry (at continuation
		  level 0), in which case it is interpreted an offset  from  end
		  end  of the file going backwards.  This works only when a file
		  descriptor to the file is available and it is a regular file.
	      *   A continuation offset relative to the end of the last up-level
		  field (&).
	      If the offset starts with the symbol "+", then all offsets are in-
	      terpreted as from the beginning of the file (the default).

     type     The type of the data to be tested.  The possible values are:

	      byte	  A one-byte value.

	      short	  A two-byte value in this machine's native byte order.

	      long	  A four-byte value in this machine's native byte order.

	      quad	  An eight-byte value in this machine's native byte  or-
			  der.

	      float	  A  32-bit  single precision IEEE floating point number
			  in this machine's native byte order.

	      double	  A 64-bit double precision IEEE floating  point  number
			  in this machine's native byte order.

	      string	  A  string of bytes.  The string type specification can
			  be optionally followed by a /<width>	option	and  op-
			  tionally  followed  by  a  set of flags /[bCcftTtWw]*.
			  The width  limits  the  number  of  characters  to  be
			  copied.   Zero  means  all  characters.  The following
			  flags are supported:
			      b  Force binary file test.
			      C  Use upper case insensitive matching: upper case
				 characters in the magic match	both  lower  and
				 upper	case  characters  in the target, whereas
				 lower case characters in the magic  only  match
				 upper case characters in the target.
			      c  Use lower case insensitive matching: lower case
				 characters  in  the  magic match both lower and
				 upper case characters in  the	target,  whereas
				 upper	case  characters in the magic only match
				 upper case characters in the target.  To  do  a
				 complete  case  insensitive match, specify both
				 "c" and "C".
			      f  Require that the matched string is a full word,
				 not a partial word match.
			      T  Trim the  string,  i.e.  leading  and	trailing
				 whitespace
			      t  Force text file test.
			      W  Compact  whitespace  in  the target, which must
				 contain at least one whitespace character.   If
				 the  magic has n consecutive blanks, the target
				 needs at least n consecutive blanks to match.
			      w  Treat every blank in the magic as  an	optional
				 blank.    is	deleted  before  the  string  is
				 printed.

	      pstring	  A Pascal-style string where the  first  byte/short/int
			  is interpreted as the unsigned length.  The length de-
			  faults  to  byte  and  can be specified as a modifier.
			  The following modifiers are supported:
			      B  A byte length (default).
			      H  A 2 byte big endian length.
			      h  A 2 byte little endian length.
			      L  A 4 byte big endian length.
			      l  A 4 byte little endian length.
			      J  The length includes itself in its count.
			  The string is not NUL terminated.  "J" is used  rather
			  than the more valuable "I" because this type of length
			  is a feature of the JPEG format.

	      date	  A four-byte value interpreted as a UNIX date.

	      qdate	  An eight-byte value interpreted as a UNIX date.

	      ldate	  A  four-byte	value  interpreted as a UNIX-style date,
			  but interpreted as local time rather than UTC.

	      qldate	  An eight-byte value interpreted as a UNIX-style  date,
			  but interpreted as local time rather than UTC.

	      qwdate	  An  eight-byte  value  interpreted  as a Windows-style
			  date.

	      msdosdate   A two-byte value interpreted as FAT/DOS-style date.

	      msdostime   A two-byte value interpreted as FAT/DOS-style time.

	      beid3	  A 32-bit ID3 length in big-endian byte order.

	      beshort	  A two-byte value in big-endian byte order.

	      belong	  A four-byte value in big-endian byte order.

	      bequad	  An eight-byte value in big-endian byte order.

	      befloat	  A 32-bit single precision IEEE floating  point  number
			  in big-endian byte order.

	      bedouble	  A  64-bit  double precision IEEE floating point number
			  in big-endian byte order.

	      bedate	  A four-byte value in	big-endian  byte  order,  inter-
			  preted as a Unix date.

	      beqdate	  An  eight-byte  value in big-endian byte order, inter-
			  preted as a Unix date.

	      beldate	  A four-byte value in	big-endian  byte  order,  inter-
			  preted  as a UNIX-style date, but interpreted as local
			  time rather than UTC.

	      beqldate	  An eight-byte value in big-endian byte  order,  inter-
			  preted  as a UNIX-style date, but interpreted as local
			  time rather than UTC.

	      beqwdate	  An eight-byte value in big-endian byte  order,  inter-
			  preted as a Windows-style date.

	      bemsdosdate
			  A two-byte value in big-endian byte order, interpreted
			  as FAT/DOS-style date.

	      bemsdostime
			  A two-byte value in big-endian byte order, interpreted
			  as FAT/DOS-style time.

	      bestring16  A  two-byte  unicode (UCS16) string in big-endian byte
			  order.

	      leid3	  A 32-bit ID3 length in little-endian byte order.

	      leshort	  A two-byte value in little-endian byte order.

	      lelong	  A four-byte value in little-endian byte order.

	      lequad	  An eight-byte value in little-endian byte order.

	      lefloat	  A 32-bit single precision IEEE floating  point  number
			  in little-endian byte order.

	      ledouble	  A  64-bit  double precision IEEE floating point number
			  in little-endian byte order.

	      ledate	  A four-byte value in little-endian byte order,  inter-
			  preted as a UNIX date.

	      leqdate	  An  eight-byte  value in little-endian byte order, in-
			  terpreted as a UNIX date.

	      leldate	  A four-byte value in little-endian byte order,  inter-
			  preted  as a UNIX-style date, but interpreted as local
			  time rather than UTC.

	      leqldate	  An eight-byte value in little-endian byte  order,  in-
			  terpreted as a UNIX-style date, but interpreted as lo-
			  cal time rather than UTC.

	      leqwdate	  An  eight-byte  value in little-endian byte order, in-
			  terpreted as a Windows-style date.

	      lemsdosdate
			  A two-byte value in big-endian byte order, interpreted
			  as FAT/DOS-style date.

	      lemsdostime
			  A two-byte value in big-endian byte order, interpreted
			  as FAT/DOS-style time.

	      lestring16  A two-byte unicode  (UCS16)  string  in  little-endian
			  byte order.

	      melong	  A  four-byte	value in middle-endian (PDP-11) byte or-
			  der.

	      medate	  A four-byte value in middle-endian (PDP-11)  byte  or-
			  der, interpreted as a UNIX date.

	      meldate	  A  four-byte	value in middle-endian (PDP-11) byte or-
			  der, interpreted as a UNIX-style date, but interpreted
			  as local time rather than UTC.

	      indirect	  Starting at the given offset, consult the magic  data-
			  base	again.	 The  offset of the indirect magic is by
			  default absolute in the file, but one can  specify  /r
			  to  indicate	that the offset is relative from the be-
			  ginning of the entry.

	      name	  Define a "named" magic instance  that  can  be  called
			  from	another use magic entry, like a subroutine call.
			  Named instance direct magic offsets  are  relative  to
			  the offset of the previous matched entry, but indirect
			  offsets  are	relative to the beginning of the file as
			  usual.  Named magic entries always match.

	      use	  Recursively call the named  magic  starting  from  the
			  current  offset.  If the name of the referenced begins
			  with a ^ then the endianness of the magic is switched;
			  if the magic mentioned  leshort  for	example,  it  is
			  treated  as beshort and vice versa.  This is useful to
			  avoid duplicating the rules for different endianness.

	      regex	  A regular expression match in extended  POSIX  regular
			  expression  syntax  (like egrep).  Regular expressions
			  can take exponential time to process, and  their  per-
			  formance  is hard to predict, so their use is discour-
			  aged.  When used  in	production  environments,  their
			  performance  should be carefully checked.  The size of
			  the string to search should also be limited by  speci-
			  fying  /<length>, to avoid performance issues scanning
			  long files.  The type specification can  also  be  op-
			  tionally  followed  by /[c][s][l].  The "c" flag makes
			  the match case insensitive, while the "s" flag  update
			  the  offset  to  the start offset of the match, rather
			  than the end.  The "l" modifier, changes the limit  of
			  length  to  mean  number  of	lines  instead of a byte
			  count.  Lines are delimited by  the  platforms  native
			  line	delimiter.   When  a line count is specified, an
			  implicit byte count also computed assuming  each  line
			  is  80  characters  long.   If  neither a byte or line
			  count is specified, the search  is  limited  automati-
			  cally to 8KiB.  ^ and $ match the beginning and end of
			  individual  lines, respectively, not beginning and end
			  of file.

	      search	  A literal string search starting at the given  offset.
			  The same modifier flags can be used as for string pat-
			  terns.   The	search expression must contain the range
			  in the form /number, that is the number  of  positions
			  at  which  the  match will be attempted, starting from
			  the start offset.   This  is	suitable  for  searching
			  larger binary expressions with variable offsets, using
			  \  escapes for special characters.  The order of modi-
			  fier and number is not relevant.

	      default	  This is intended to be used with the test x (which  is
			  always  true)  and it has no type.  It matches when no
			  other test at that continuation level has matched  be-
			  fore.   Clearing that matched tests for a continuation
			  level, can be done using the clear test.

	      clear	  This test is always true and clears the match flag for
			  that continuation level.  It is intended  to	be  used
			  with the default test.

	      der	  Parse  the  file  as a DER Certificate file.	The test
			  field is used as a der type that needs to be	matched.
			  The DER types are: eoc, bool, int, bit_str, octet_str,
			  null,   obj_id,  obj_desc,  ext,  real,  enum,  embed,
			  utf8_str, rel_oid,  time,  res2,  seq,  set,	num_str,
			  prt_str,    t61_str,	 vid_str,   ia5_str,   utc_time,
			  gen_time,   gr_str,	vis_str,   gen_str,    univ_str,
			  char_str,  bmp_str,  date,  tod,  datetime,  duration,
			  oid-iri, rel-oid-iri.  These types can be followed  by
			  an  optional	numeric  size, which indicates the field
			  width in bytes.

	      guid	  A Globally Unique Identifier, parsed	and  printed  as
			  XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.   It's format is
			  a string.

	      offset	  This is a quad value indicating the current offset  of
			  the file.  It can be used to determine the size of the
			  file	or  the magic buffer.  For example the magic en-
			  tries:

				-0	offset	x	this file is %lld bytes
				-0	offset	<=100	must be more than 100 \
				    bytes and is only %lld

	      octal	  A string representing an octal number.

	      For compatibility with the Single Unix Standard, the  type  speci-
	      fiers dC and d1 are equivalent to byte, the type specifiers uC and
	      u1  are  equivalent  to  ubyte,  the type specifiers dS and d2 are
	      equivalent to short, the type specifiers uS and u2 are  equivalent
	      to  ushort,  the	type specifiers dI, dL, and d4 are equivalent to
	      long, the type specifiers uI, uL, and u4 are equivalent to  ulong,
	      the type specifier d8 is equivalent to quad, the type specifier u8
	      is  equivalent to uquad, and the type specifier s is equivalent to
	      string.  In addition, the type specifier dQ is equivalent to  quad
	      and the type specifier uQ is equivalent to uquad.

	      Each top-level magic pattern (see below for an explanation of lev-
	      els)  is classified as text or binary according to the types used.
	      Types "regex" and "search" are classified as  text  tests,  unless
	      non-printable characters are used in the pattern.  All other tests
	      are classified as binary.  A top-level pattern is considered to be
	      a test text when all its patterns are text patterns; otherwise, it
	      is  considered  to be a binary pattern.  When matching a file, bi-
	      nary patterns are tried first; if no match is found, and the  file
	      looks like text, then its encoding is determined and the text pat-
	      terns are tried.

	      The  numeric  types  may optionally be followed by & and a numeric
	      value, to specify that the value is to be AND'ed with the  numeric
	      value before any comparisons are done.  Prepending a u to the type
	      indicates that ordered comparisons should be unsigned.

     test     The  value  to  be  compared with the value from the file.  If the
	      type is numeric, this value is specified in C form;  if  it  is  a
	      string,  it is specified as a C string with the usual escapes per-
	      mitted (e.g. \n for new-line).

	      Numeric values may be preceded by a character indicating the oper-
	      ation to be performed.  It may be =, to  specify	that  the  value
	      from  the  file must equal the specified value, <, to specify that
	      the value from the file must be less than the specified value,  >,
	      to  specify  that the value from the file must be greater than the
	      specified value, &, to specify that the value from the  file  must
	      have  set  all of the bits that are set in the specified value, ^,
	      to specify that the value from the file must have clear any of the
	      bits that are set in the specified value, or ~, the  value  speci-
	      fied after is negated before tested.  x, to specify that any value
	      will  match.   If the character is omitted, it is assumed to be =.
	      Operators &, ^, and ~ don't work with floats and doubles.  The op-
	      erator ! specifies that the line matches if the test does not suc-
	      ceed.

	      Numeric values are specified in C form; e.g.  13 is  decimal,  013
	      is octal, and 0x13 is hexadecimal.

	      Numeric  operations  are	not performed on date types, instead the
	      numeric value is interpreted as an offset.

	      For string values, the string from the file must match the  speci-
	      fied  string.  The operators =, < and > (but not &) can be applied
	      to strings.  The length used for matching is that  of  the  string
	      argument	in the magic file.  This means that a line can match any
	      non-empty string (usually used to then print the string), with >\0
	      (because all non-empty strings are greater than the empty string).

	      Dates are treated as numerical values in the  respective	internal
	      representation.

	      The special test x always evaluates to true.

     message  The  message  to	be  printed  if the comparison succeeds.  If the
	      string contains a printf(3) format specification, the  value  from
	      the  file  (with any specified masking performed) is printed using
	      the message as the format string.  If the string begins with "\b",
	      the message printed is the remainder of the string with no  white-
	      space  added before it: multiple matches are normally separated by
	      a single space.

     An APPLE 4+4 character APPLE creator and type can be specified as:

	   !:apple CREATYPE

     A slash-separated list of commonly found filename extensions can be  speci-
     fied as:

	   !:ext   ext[/ext...]

     i.e.  the literal string "!:ext" followed by a slash-separated list of com-
     monly found extensions; for example for JPEG images:

	   !:ext jpeg/jpg/jpe/jfif

     A MIME type is given on a separate line, which must be the  next  non-blank
     or comment line after the magic line that identifies the file type, and has
     the following format:

	   !:mime  MIMETYPE

     i.e. the literal string "!:mime" followed by the MIME type.

     An optional strength can be supplied on a separate line which refers to the
     current magic description using the following format:

	   !:strength OP VALUE

     The  operand OP can be: +, -, *, or / and VALUE is a constant between 0 and
     255.  This constant is applied using the specified operand to the currently
     computed default magic strength.

     Some file formats contain additional information which  is  to  be  printed
     along  with  the  file  type or need additional tests to determine the true
     file type.  These additional tests are introduced by one or more >  charac-
     ters preceding the offset.  The number of > on the line indicates the level
     of the test; a line with no > at the beginning is considered to be at level
     0.   Tests  are arranged in a tree-like hierarchy: if the test on a line at
     level n succeeds, all following tests at level n+1 are performed,	and  the
     messages  printed if the tests succeed, until a line with level n (or less)
     appears.  For more complex files, one can use empty messages  to  get  just
     the "if/then" effect, in the following way:

	   0	  string    MZ
	   >0x18  uleshort  <0x40   MS-DOS executable
	   >0x18  uleshort  >0x3f   extended PC executable (e.g., MS Windows)

     Offsets  do not need to be constant, but can also be read from the file be-
     ing examined.  If the first character following the last > is a ( then  the
     string  after  the  parenthesis is interpreted as an indirect offset.  That
     means that the number after the parenthesis is used as  an  offset  in  the
     file.   The value at that offset is read, and is used again as an offset in
     the    file.     Indirect	  offsets    are     of     the     form:     (x
     [[.,][bBcCeEfFgGhHiIlmosSqQ]][+-][ y ]).  The value of x is used as an off-
     set  in the file.	A byte, id3 length, short or long is read at that offset
     depending on the [bBcCeEfFgGhHiIlLmsSqQ]  type  specifier.   The  value  is
     treated as signed if "," is specified or unsigned if "." is specified.  The
     capitalized  types  interpret the number as a big endian value, whereas the
     small letter versions interpret the number as a little endian value; the  m
     type interprets the number as a middle endian (PDP-11) value.  To that num-
     ber  the  value  of  y  is added and the result is used as an offset in the
     file.  The default type if one is not specified  is  long.   The  following
     types are recognized:

	   Type    Sy Mnemonic	 Sy Endian Sy Size
	   bcBC    Byte/Char	 N/A	   1
	   efg	   Double	 Little    8
	   EFG	   Double	 Big	   8
	   hs	   Half/Short	 Little    2
	   HS	   Half/Short	 Big	   2
	   i	   ID3		 Little    4
	   I	   ID3		 Big	   4
	   l	   Long 	 Little    4
	   L	   Long 	 Big	   4
	   m	   Middle	 Middle    4
	   o	   Octal	 Textual   Variable
	   q	   Quad 	 Little    8
	   Q	   Quad 	 Big	   8

     That way variable length structures can be examined:

	   # MS Windows executables are also valid MS-DOS executables
	   0	       string	MZ
	   >0x18       uleshort <0x40  MZ executable (MS-DOS)
	   # skip the whole block below if it is not an extended executable
	   >0x18       uleshort >0x3f
	   >>(0x3c.l)  string	PE\0\0 PE executable (MS-Windows)
	   >>(0x3c.l)  string	LX\0\0 LX executable (OS/2)

     This  strategy  of  examining  has  a drawback: you must make sure that you
     eventually print something, or users may get empty  output  (such	as  when
     there is neither PE\0\0 nor LE\0\0 in the above example).

     If  this  indirect  offset cannot be used directly, simple calculations are
     possible: appending [+-*/%&|^]number inside parentheses allows one to  mod-
     ify the value read from the file before it is used as an offset:

	   # MS Windows executables are also valid MS-DOS executables
	   0	       string	MZ
	   # sometimes, the value at 0x18 is less that 0x40 but there's still an
	   # extended executable, simply appended to the file
	   >0x18       uleshort <0x40
	   >>(4.s*512) leshort	0x014c	COFF executable (MS-DOS, DJGPP)
	   >>(4.s*512) leshort	!0x014c MZ executable (MS-DOS)

     Sometimes you do not know the exact offset as this depends on the length or
     position  (when  indirection was used before) of preceding fields.  You can
     specify an offset relative to the end of the last up-level field using  `&'
     as a prefix to the offset:

	   0	       string	MZ
	   >0x18       uleshort >0x3f
	   >>(0x3c.l)  string	PE\0\0	  PE executable (MS-Windows)
	   # immediately following the PE signature is the CPU type
	   >>>&0       leshort	0x14c	  for Intel 80386
	   >>>&0       leshort	0x8664	  for x86-64
	   >>>&0       leshort	0x184	  for DEC Alpha

     Indirect and relative offsets can be combined:

	   0		 string   MZ
	   >0x18	 uleshort <0x40
	   >>(4.s*512)	 leshort  !0x014c MZ executable (MS-DOS)
	   # if it's not COFF, go back 512 bytes and add the offset taken
	   # from byte 2/3, which is yet another way of finding the start
	   # of the extended executable
	   >>>&(2.s-514) string   LE	  LE executable (MS Windows VxD driver)

     Or the other way around:

	   0		     string   MZ
	   >0x18	     uleshort >0x3f
	   >>(0x3c.l)	     string   LE\0\0  LE executable (MS-Windows)
	   # at offset 0x80 (-4, since relative offsets start at the end
	   # of the up-level match) inside the LE header, we find the absolute
	   # offset to the code area, where we look for a specific signature
	   >>>(&0x7c.l+0x26) string   UPX     \b, UPX compressed

     Or even both!

	   0		    string   MZ
	   >0x18	    uleshort >0x3f
	   >>(0x3c.l)	    string   LE\0\0 LE executable (MS-Windows)
	   # at offset 0x58 inside the LE header, we find the relative offset
	   # to a data area where we look for a specific signature
	   >>>&(&0x54.l-3)  string   UNACE  \b, ACE self-extracting archive

     If  you have to deal with offset/length pairs in your file, even the second
     value in a parenthesized expression can be taken from the file itself,  us-
     ing  another set of parentheses.  Note that this additional indirect offset
     is always relative to the start of the main indirect offset.

	   0		     string	  MZ
	   >0x18	     uleshort	  >0x3f
	   >>(0x3c.l)	     string	  PE\0\0 PE executable (MS-Windows)
	   # search for the PE section called ".idata"...
	   >>>&0xf4	     search/0x140 .idata
	   # ...and go to the end of it, calculated from start+length;
	   # these are located 14 and 10 bytes after the section name
	   >>>>(&0xe.l+(-4)) string	  PK\3\4 \b, ZIP self-extracting archive

     If you have a list of known values at a particular continuation level,  and
     you want to provide a switch-like default case:

	   # clear that continuation level match
	   >18	   clear   x
	   >18	   lelong  1	   one
	   >18	   lelong  2	   two
	   >18	   default x
	   # print default match
	   >>18    lelong  x	   unmatched 0x%x

SEE ALSO
     file(1) - the command that reads this file.

BUGS
     The  formats  long,  belong, lelong, melong, short, beshort, and leshort do
     not depend on the length of the C data types short and long  on  the  plat-
     form, even though the Single Unix Specification implies that they do.  How-
     ever,  as OS X Mountain Lion has passed the Single Unix Specification vali-
     dation suite, and supplies a version of file(1) in which they do not depend
     on the sizes of the C data types and that is built for a 64-bit environment
     in which long is 8 bytes rather than 4  bytes,  presumably  the  validation
     suite  does  not  test whether, for example long refers to an item with the
     same size as the C data type long.  There should  probably  be  type  names
     int8,  uint8,  int16,  uint16, int32, uint32, int64, and uint64, and speci-
     fied-byte-order variants of them, to make it clearer that those types  have
     specified widths.

FreeBSD ports 15.quarterly	November 27, 2024			MAGIC(5)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=magic&sektion=5&manpath=FreeBSD+Ports+15.1.quarterly>

home | help