NAME:

magic — file命令的魔法模式文件

DESCRIPTION

本手册页面记录了5.25版本的file(1)命令使用的魔法文件格式。file(1)命令通过测试文件是否包含某些“魔法模式”,以及其他测试来识别文件的类型。文件 /usr/share/misc/magic 指定要使用的模式测试,如果找到特定模式要打印什么消息或 MIME 类型,以及要从文件中提取的其他信息。

文件的每一行都指定了一个要执行的测试。测试将从文件中特定偏移量开始的数据与字节值、字符串或数值进行比较。如果测试成功,将打印一条消息。该行由以下字段组成:

(1)偏移量(offset):一个数字,指定要测试的数据文件中的偏移量(字节)

(2)类型(type):要测试的数据类型。可能的值是:

byte        一个字节的值。

short       本机主机字节顺的两字节值。

long        本机主机字节顺序的四字节值。

quad       本机主机字节顺序的八字节值。

float        本机主机字节顺序的32位单精度IEEE浮点数。

double    本机主机字节顺序的64位双精度IEEE浮点数。

string       一个字符串。字符串类型规范可以选择后面跟/[WwcCtbT]*。“W”标志压缩目标

中的空白,该目标必须至少包含一个空白字符。如果魔法有n个连续空格,目标

需要至少n个连续空格才能匹配。“c”标志指定不区分大小写的匹配:magic 中的

小写字符匹配目标中的小写和大写字符,而magic 中的大写字符仅匹配目标中的

大写字符。 “C”标志指定不区分大小写的匹配:magic 中的大写字符匹配目标中

的小写和大写字符,而magic 中的小写字符仅匹配目标中的大写字符。要进行完

全不区分大小写的匹配,请同时指定“c”和“C”。“t”标志强制对文本文件进行测试

,而“b”标志强制对二进制文件进行测试。 “T”标志导致字符串被修剪,即在打印

字符串之前删除前导和尾随空格。

pstring     一个 Pascal 风格的字符串,其中第一个 byte/short/int 被解释为无符号长度。

长度默认为字节,可以指定为修饰符。 支持以下修饰符:

B        一个字节长度(默认)。
                        H        一个 2 字节的大端长度。
                        h         一个 2 字节big little 长度。
                        L         一个 4 字节的大端长度。
                        l          一个4字节big little 长度。
                       J          长度包含在其计数中。

该字符串不是以 NUL 结尾的。 使用“J”而不是使用更有价值的“I”,因为这种类型的

长度是 JPEG 格式的一个特征。(该类型格式是长度+内容)

date        解释为UNIX日期的四字节值。

qdate      解释为 UNIX 日期的八字节值。

ldate       解释为 UNIX 样式日期的四字节值,但解释为本地时间而不是 UTC。

qldate     解释为 UNIX 样式日期的八字节值,但解释为本地时间而不是 UTC。

qwdate   解释为 Windows 样式日期的八字节值。

beid3      以大端字节顺序表示的32位ID3长度。(ID3是位于一个mp3文件的开头或末尾

的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息)

beshort   大端字节序的两字节值。

belong    大端字节序的四字节值。

bequad   大端字节序的八字节值。

befloat    大端字节序的 32 位单精度 IEEE 浮点数。

bedouble大端字节序的 64位双精度 IEEE 浮点数。

bedate    大端字节序的四字节值,解释为 Unix 日期。

beqdate  大端字节序的八字节值,解释为 Unix 日期。

beldate   大端字节序的四字节值,解释为 UNIX 样式的日期,但解释为本地时间而不是

UTC。

beqldate 大端字节顺序的八字节值,解释为 UNIX 样式的日期,但解释为本地时间而不是

UTC。

beqwdate大端字节顺序的八字节值,解释为 Windows 样式的日期。

bestring16大端字节序的两字节 unicode (UCS16) 字符串。

leid3        小端字节序的 32 位 ID3 长度。

leshort     小端字节序的两字节值。

lelong      小端字节序的四字节值

lequad     小端字节序的八字节值

lefloat      小端字节序的 32 位单精度 IEEE 浮点数。

ledouble  小端字节序的 64位双精度 IEEE 浮点数。

ledate      小端字节序的四字节值,解释为 Unix 日期。

leqdate    小端字节序的八字节值,解释为 Unix 日期。

leldate     小端字节序的四字节值,解释为 UNIX 样式的日期,但解释为本地时间而不是

UTC。

leqldate   小端字节序的八字节值,解释为 UNIX 样式的日期,但解释为本地时间而不是

UTC。

leqwdate 小端字节顺序的八字节值,解释为 Windows 样式的日期。

lestring16小端字节序的两字节 unicode (UCS16) 字符串。

melong    中端 (PDP-11) 字节顺序的四字节值。

medate    中端 (PDP-11) 字节顺序的四字节值,解释为 UNIX 日期。

meldate   中端 (PDP-11) 字节顺序的四字节值,解释为 UNIX 样式的日期,但解释为本地

时间而不是 UTC。

indirect    从给定的偏移量开始,再次查询魔法数据库。 indirect魔法的偏移量在文件中默认

是绝对的,但可以指定 /r 来指示偏移量是相对于条目开头的偏移量。

name      定义一个“命名”魔法实例,可以从另一个 use 魔法条目调用,如子程序调用。

命名实例直接魔法偏移量是相对于前一个匹配条目的偏移量,但间接偏移量

依旧是相对于文件开头的偏移量。 命名的魔法条目始终匹配。

use         从当前偏移量开始递归调用name魔法。 如果引用的名称以 ^ 开头,则转换魔法的

字节序;例如,如果魔法提到 leshort,则将其视为 beshort,反之亦然。 这有助于

避免重复不同字节序的规则。

regex     扩展 POSIX 正则表达式语法中的正则表达式匹配(如 egrep)。正则表达式可能需

要指数级的时间来处理,而且它们的性能很难预测,因此不鼓励使用它们。在生产环

境中使用时,应仔细检查其性能。还应通过指定 /<length> 来限制要搜索的字符串的

大小,以避免扫描长文件时出现性能问题。类型规范也可以选择后跟 /[c][s][l]。 “c”标

志使匹配大小写不敏感,而“s”标志将偏移更新为匹配的开始偏移,而不是结束。 “l”

修饰符将长度限制更改为表示行数而不是字节数。行由本地分隔符分隔。当指定行数

时,假定每行是 80 个字符长,也会计算隐式字节数。如果既未指定字节数也未指定

行数,则搜索将自动限制为 8KiB。 ^ 和 $ 分别匹配各行的开头和结尾,而不是文件

的开头和结尾。

search   从给定偏移量开始的文字字符串搜索。 可以使用与字符串模式相同的修饰符标志。

搜索表达式必须包含格式为 /number 的范围,即尝试匹配的位置数,从起始偏移量

开始。 这适用于搜索较大的具有可变偏移量的二进制表达式,对特殊字符使用 \ 转

义。修饰符和数字的顺序无关。

default   这旨在与测试 x (始终为真)一起使用,并且它没有类型。 当该延续级别的其他测

试之前没有匹配时,它会匹配。 可以使用 clear 测试清除连续级别的匹配测试。

clear      此测试始终为真,并清除该延续级别的匹配标志。 它旨在与default测试一起使用。

为了与 Single UNIX Standard 兼容,类型说明符 dC 和 d1 等效于 byte,类型说明符 uC 和 u1 等

效于 ubyte,类型说明符 dS 和 d2 等效于 short,类型说明符 uS 和 u2 等效于 ushort,类型说明

符 dI、dL 和 d4 等效于 long,类型说明符 uI、uL 和 u4 等效于 ulong,类型说明符 d8 等效于

quad,类型说明符 u8 等效于 uquad,并且 类型说明符 s 等效于字符串。 此外,类型说明符 dQ

等效于 quad,类型说明符 uQ 等效于 uquad。

根据所使用的类型,每个顶级魔法模式(参见下面的级别解释)被分类为文本或二进制。类型

“regex”和“search”会被归类为文本模式, 如果使用了不可打印的字符会被归类为二进制模式。 所有

其他测试都归类为二进制。 当一个文件的所有模式都是文本模式时,顶层模式被视为文本模式;

否则,它被认为是一个二进制模式。 匹配文件时,首先尝试二进制模式; 如果未找到匹配项,并

且文件看起来像文本,则确定其编码并尝试文本模式。

数字类型可以选择后跟 & 和一个数值,以指定在进行任何比较之前该值要与数值进行 AND 运算。

在类型前面加上 u 表示有序比较是无符号的。

(3)测试值(test):要与文件中的值进行比较的值。 如果类型为数字,则该值以 C 形式指定; 如果它

是 一个字符串,它被指定为一个 C 字符串,允许通常的转义(例如 \n 换行)。

<1>数值前面可以有一个字符,指示要执行的操作。

=,以指定文件中的值必须等于指定的值

<,以指定通知文件中的值必须小于指定值

>,指定文件中的值必须大于指定值

&,指定文件中的值必须已设置指定值中设置的所有位

^,若要指定文件中的值必须清除在指定值中设置的任何位

or ~,则在测试之前,将对之后指定的值求反

x, 指定任何值都将匹配

如果省略该字符,则假定为=。运算符&,^和~不使用浮点和双精度。

如果测试不成功,运算符!指定该行匹配。

<2>数值以 C 形式指定; 例如 13是十进制,013是八进制,0x13是十六进制。

<3>不会对日期类型执行数字运算,而是将数字值解释为偏移量。

<4>对于字符串值,文件中的字符串必须与指定的字符串匹配。 运算符 =、< 和 >(除了 not和

&)可以应用于字符串。 用于匹配的长度是魔法文件中的字符串参数的长度。 这意味着一行

使用 >\0 可以匹配任何非空字符串(通常用于然后打印字符串)(因为所有非空字符串都              大于比空字符串)。

<5>日期在各自的内部表示中被视为数值。

<6>特殊测试 x 总是评估为真。(意思就是默认匹配成功)

(4)消息(message):如果比较成功,消息会被打印。如果字符串包含 printf(3) 格式规范,则使用消

息作为格式字符串打印文件中的值(执行任何指定的掩码)。 如果字符串以“\b”开头,则打印的消

息是字符串的其余部分,前面没有添加空格:多个匹配通常由一个空格分隔。

APPLE 4+4 字符 APPLE 创建者和类型可以指定为:

!:apple CREATYPE

MIME 类型在单独的行中给出,该行必须是标识文件类型的魔术行之后的下一个非空白行或注释行,并具有以下格式:

!:mime  MIMETYPE
即文字字符串“!:mime”后跟 MIME 类型。

可以在单独的行上提供可选的强度,该行使用以下格式引用当前的魔法描述:

!:strength OP VALUE

操作数 OP 可以是:+、-、* 或 / 并且 VALUE 是一个介于 0 和 255 之间的常数。该常数使用指定的操作数应用于当前计算的默认魔法强度。

某些文件格式包含要与文件类型一起打印的附加信息,或者需要附加测试来确定真实的文件类型。 这些附加测试由偏移量前的一个或多个 > 字符引入。 该行上的>数表示测试的级别; 开头没有 > 的行被认为是在第 0 级。测试以树状层次结构排列:如果第 n 级的行上的测试成功,则执行第 n+1 级的所有后续测试,并且 如果测试成功,则打印消息,直到出现级别为 n(或更低)的行。
对于更复杂的文件,可以通过以下方式使用空消息来获得“if/then”效果:

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

偏移量不需要是常数,但也可以从正在检查的文件中读取。如果最后一个>后面的第一个字符是一个(,则括号后面的字符串被解释为间接偏移量。这意味着括号后面的数字在文件中用作偏移量。读取该偏移量处的值,并再次在文件中用作偏移量。间接偏移量的形式为:((x[.[bislBISL]][+-][y])。x的值用作文件中的偏移量。根据[bislBISLm]的不同,在该偏移量处读取一个字节(id3长度、短或长)类型说明符。大写类型将数字解释为大端值,而小写版本将数字解释为小端值;m类型将数字解释为中间端值(PDP-11)值。向该数字添加y值,结果用作文件中的偏移量。如果未指定,则默认类型为long。

b/B   byte            1个字节

i/I     ID3              4个字节

s/S   short           2个字节

m/M middle        4个字节

l/L    long            8个字节

这样就可以检查可变长度结构:

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

这种检查策略有一个缺点:您必须确保最终打印某些内容,否则用户可能会得到空输出(例如,当上面的示例中既没有 PE\0\0 也没有 LE\0\0 时)

如果这个间接偏移不能直接使用,简单的计算是可能的:在括号内附加 [+-*/%&|^]number 允许在它用作偏移之前修改从文件读取的值:

# 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       leshort <0x40
           >>(4.s*512) leshort 0x014c  COFF executable (MS-DOS, DJGPP)
           >>(4.s*512) leshort !0x014c MZ executable (MS-DOS)

有时您不知道确切的偏移量,因为这取决于前面字段的长度或位置(当之前使用间接时)。 您可以使用“&”作为偏移量的前缀来指定相对于最后一个上级字段末尾的偏移量:

0           string  MZ
           >0x18       leshort >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 0x184     for DEC Alpha
可以组合间接偏移和相对偏移:

0             string  MZ
           >0x18         leshort <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)
或者反过来:

0                 string  MZ
           >0x18             leshort >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

或者两者都有!

0                string  MZ
           >0x18            leshort >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

如果您必须处理文件中的偏移/长度对,甚至可以使用另一组括号从文件本身中获取括号表达式中的第二个值。 请注意,这个额外的间接偏移总是相对于主要间接偏移的开始。

0                 string       MZ
           >0x18             leshort      >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

如果您有一个特定延续级别的已知value列表,并且希望提供一个类似开关的默认情况:

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

SEE ALSO

file(1) - 读取此文件的命令

BUGS

格式 long、belong、lelong、melong、short、beshort 和 leshort 不依赖于平台上 C 数据类型

short 和 long 的长度,即使 Single UNIX Specification 暗示它们依赖。 但是,由于 OS X

Mountain Lion 已通过 Single UNIX Specification 验证套件,并提供一个版本的file(1),其中它

们不依赖于 C 数据类型的大小,并且是为 64 位环境构建的,其中 long 是 8 个字节而不是 4 个字

节,大概是验证套件 例如,不测试 long 是否引用与 C 数据类型 long 具有相同大小的项目。 可能

应该有类型名称 int8、uint8、int16、uint16、int32、uint32、int64 和 uint64 以及它们的指定字节

顺序变体,以更清楚地说明这些类型具有指定的宽度。

MAGIC文件格式解析相关推荐

  1. gcc 删除elf_ELF文件格式解析器 原理 + 代码

    本文为看雪论坛精华文章 看雪论坛作者ID:菜鸟m号 附件链接:[原创] ELF文件格式解析器 原理 + 代码 写在前面: 读<Linux二进制>,发现作者对 ELF文件格式部分并没有做详细 ...

  2. cfile清空文件内容_编译-链接-加载 :ELF文件格式解析

    摘要:对于C++的初学者,经常在程序的编译或者加载过程中遇到很多错误,类似undefined reference to ... 和 GLIBCXX_3.4.20 not found 等.这些错误都涉及 ...

  3. Android init.rc文件格式解析

    /****************************************************************************** Android init.rc文件格式解 ...

  4. 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )

    文章目录 一.Android 逆向方法 1.静态逆向解析 2.函数调用分析 3.动态运行跟踪 4.运行日志分析 5.文件格式解析 6.敏感信息分析 7.网络信息监控 8.软件动态调试 9.环境伪装模拟 ...

  5. mp4文件格式解析(一)

    原文地址:mp4文件格式解析(一)作者:可下人间 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准.随后MP4概念被转移到视频上,对应的是MPE ...

  6. QuickTime文件格式解析

    QuickTime文件格式解析 Peter Lee 2008-06-14 一.简介 QuickTime是Apple公司开发的一套完整的多媒体平台架构,可以用来进行多种媒体的创建,生产,和分发,并为这一 ...

  7. elf section类型_ELF文件格式解析

    ELF文件格式解析 ELF(Executable and Linking Format) 1) 可重定位的对象文件(Relocatable file) 2) 可执行的对象文件(Executable f ...

  8. .lnk文件格式解析

    .lnk文件格式解析 由于.lnk文件提供丰富的调用方式,因此在研究该文件类型格式的基础的可以发现有很多字段可以被恶意利用.下面是一个.lnk文件格式的通用结构,也就 说.lnk文件是由这样不同的节组 ...

  9. fastq与fasta文件格式解析

    fastq与fasta文件格式解析 一.fasta格式 二.fastq格式 2.1 格式说明 2.2 碱基质量计算 2.3 Quality Score简化 三.二代测序的fastq文件格式介绍 四.补 ...

最新文章

  1. 唐骏管理学之感动员工
  2. 自学python要多久才能学会-怎么自学python,大概要多久?
  3. jQuery获取Select选择的Text和 Value(转)
  4. 驱动级的自动按键_茶陵定做自动伸缩门定制,防火门厂家直销-湖南富扬门窗
  5. python中回车怎么表示_如何在python中使用读取行仅拆分回车符?
  6. 余姚中考能用计算机吗,2018年余姚中考政策有大变化,2020年取消奖励加分项目...
  7. 2017.9.27 可持久化并查集 失败总结
  8. c语言getchar在哪个头文件_c语言入门(一)
  9. iis运行html提示500错误,IIS7出现HTTP错误500.22的解决办法
  10. linux的使用 --- 虚拟机创建CentOS(Intel VT-X)
  11. 中国39所985高校省级行政区分布-web数据可视化(d3.pack包含关系图)
  12. 第十章 VLAN间路由
  13. Linux内存寻址之二:逻辑地址到虚拟地址的转换
  14. android手机备份恢复出厂设置,安卓手机恢复出厂设置在哪里?史上最全版恢复过程详解...
  15. python风变编程是骗局吗-风变编程的Python课程怎么样?
  16. 如何重置网络?如何激活产品?
  17. ASC18世界大学生超算竞赛题目分析以及思路总结
  18. 当黑丝遇上Nginx网站服务(你选谁)
  19. android 所有运行程序闪退,Android开发,运行app闪退的解决方法
  20. (亲测可用)如何在Win10家庭版中找回组策略编辑器

热门文章

  1. 独家 | 这张骑马的宇航员图片是AI感知世界的一个里程碑(附链接)
  2. Linux常见错误 “cp: omitting directory/ cp: :Permission denied”解决办法
  3. 各位同意转载博文的善意,是否被恶意利用?文章被转载了,该不该收钱?
  4. 使用traceroute 进行端口连通性测试
  5. 数据库连接技术 - 数据库连接池
  6. Linux语言和字体的自定义设置
  7. 怎么把网页添加到公众号里
  8. 喇叭、扬声器的正负极问题
  9. 项目管理-项目开发相关
  10. [Spark进阶]-- Spark Dataframe操作