Imported Upstream version 2.0.1
[packages/binwalk.git] / src / magic / images
1 # Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com)
2 # The second word of TIFF files is the TIFF version number, 42, which has
3 # never changed.  The TIFF specification recommends testing for it.
4 0       string          MM\x00\x2a      TIFF image data, big-endian
5 0       string          II\x2a\x00      TIFF image data, little-endian
6
7 # PNG [Portable Network Graphics, or "PNG's Not GIF"] images
8 # (Greg Roelofs, newt@uchicago.edu)
9 # (Albert Cahalan, acahalan@cs.uml.edu)
10 #
11 # 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ...
12 #
13 0       string          \x89PNG\x0d\x0a\x1a\x0a         PNG image
14 >16             belong                  <1                              invalid
15 >16             belong                  >10000                  invalid
16 >20             belong                  <1                              invalid
17 >20             belong                  >10000                  invalid
18 >16     belong          x               \b, %d x
19 >20     belong          x               %d,
20 >24     byte            x               %d-bit
21 >25     byte            0               grayscale,
22 >25     byte            2               \b/color RGB,
23 >25     byte            3               colormap,
24 >25     byte            4               gray+alpha,
25 >25     byte            6               \b/color RGBA,
26 #>26    byte            0               deflate/32K,
27 >28     byte            0               non-interlaced
28 >28     byte            1               interlaced
29
30 # GIF
31 0       string          GIF8            GIF image data
32 >4      string          7a              \b, version "8%s",
33 >4      string          9a              \b, version "8%s",
34 >6      leshort         >0              %d x
35 >8      leshort         >0              %d
36 #>10    byte            &0x80           color mapped,
37 #>10    byte&0x07       =0x00           2 colors
38 #>10    byte&0x07       =0x01           4 colors
39 #>10    byte&0x07       =0x02           8 colors
40 #>10    byte&0x07       =0x03           16 colors
41 #>10    byte&0x07       =0x04           32 colors
42 #>10    byte&0x07       =0x05           64 colors
43 #>10    byte&0x07       =0x06           128 colors
44 #>10    byte&0x07       =0x07           256 colors
45
46 # PC bitmaps (OS/2, Windows BMP files)  (Greg Roelofs, newt@uchicago.edu)
47 0       string          BM
48 >14     leshort         12              PC bitmap, OS/2 1.x format
49 >>18    lelong          <1              invalid
50 >>18    lelong          >1000000        invalid
51 >>18    leshort         x               \b, %d x
52 >>20    lelong          <1              invalid
53 >>20    lelong          >1000000        invalid
54 >>20    leshort         x               %d
55 >14     leshort         64              PC bitmap, OS/2 2.x format
56 >>18    lelong          <1              invalid
57 >>18    lelong          >1000000        invalid
58 >>18    leshort         x               \b, %d x
59 >>20    lelong          <1              invalid
60 >>20    lelong          >1000000        invalid
61 >>20    leshort         x               %d
62 >14     leshort         40              PC bitmap, Windows 3.x format
63 >>18    lelong          <1              invalid
64 >>18    lelong          >1000000        invalid
65 >>18    lelong          x               \b, %d x
66 >>22    lelong          <1              invalid
67 >>22    lelong          >1000000        invalid
68 >>22    lelong          x               %d x
69 >>28    lelong          <1              invalid
70 >>28    lelong          >1000000        invalid
71 >>28    leshort         x               %d
72 >14     leshort         128             PC bitmap, Windows NT/2000 format
73 >>18    lelong          >1000000        invalid
74 >>18    lelong          <1              invalid
75 >>18    lelong          x               \b, %d x
76 >>22    lelong          <1              invalid
77 >>22    lelong          >1000000        invalid
78 >>22    lelong          x               %d x
79 >>28    lelong          <1              invalid
80 >>28    lelong          >1000000        invalid
81 >>28    leshort         x               %d
82
83 #------------------------------------------------------------------------------
84 # JPEG images
85 # SunOS 5.5.1 had
86 #
87 #       0       string          \377\330\377\340        JPEG file
88 #       0       string          \377\330\377\356        JPG file
89 #
90 # both of which turn into "JPEG image data" here.
91 #
92 0       belong          0xffd8ffe0      JPEG image data, JFIF standard 
93 >6      string          !JFIF           invalid
94 # The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06
95 # in a vain attempt to add image size reporting for JFIF.  Note that these
96 # tests are not fool-proof since some perfectly valid JPEGs are currently
97 # impossible to specify in magic(4) format.
98 # First, a little JFIF version info:
99 >11    byte            x               \b %d.
100 >12    byte            x               \b%02d
101 # Next, the resolution or aspect ratio of the image:
102 #>>13   byte            0               \b, aspect ratio
103 #>>13   byte            1               \b, resolution (DPI)
104 #>>13   byte            2               \b, resolution (DPCM)
105 #>>4    beshort         x               \b, segment length %d
106 # Next, show thumbnail info, if it exists:
107 >18    byte            !0              \b, thumbnail %dx
108 >>19   byte            x               \b%d
109
110
111 0       belong          0xffd8ffe1      JPEG image data, EXIF standard
112 # EXIF moved down here to avoid reporting a bogus version number,
113 # and EXIF version number printing added.
114 #   - Patrik R=E5dman <patrik+file-magic@iki.fi>
115 >6      string          !Exif            invalid
116 # Look for EXIF IFD offset in IFD 0, and then look for EXIF version tag in EXIF IFD.
117 # All possible combinations of entries have to be enumerated, since no looping
118 # is possible. And both endians are possible...
119 # The combinations included below are from real-world JPEGs.
120 # Little-endian
121 >12    string          II
122 # IFD 0 Entry #5:
123 >>70   leshort         0x8769
124 # EXIF IFD Entry #1:
125 >>>(78.l+14)   leshort 0x9000
126 >>>>(78.l+23)  byte    x               %c
127 >>>>(78.l+24)  byte    x               \b.%c
128 >>>>(78.l+25)  byte    !0x30           \b%c
129 # IFD 0 Entry #9:
130 >>118  leshort         0x8769
131 # EXIF IFD Entry #3:
132 >>>(126.l+38)  leshort 0x9000
133 >>>>(126.l+47) byte    x               %c
134 >>>>(126.l+48) byte    x               \b.%c
135 >>>>(126.l+49) byte    !0x30           \b%c
136 # IFD 0 Entry #10
137 >>130  leshort         0x8769
138 # EXIF IFD Entry #3:
139 >>>(138.l+38)  leshort 0x9000
140 >>>>(138.l+47) byte    x               %c
141 >>>>(138.l+48) byte    x               \b.%c
142 >>>>(138.l+49) byte    !0x30           \b%c
143 # EXIF IFD Entry #4:
144 >>>(138.l+50)  leshort 0x9000
145 >>>>(138.l+59) byte    x               %c
146 >>>>(138.l+60) byte    x               \b.%c
147 >>>>(138.l+61) byte    !0x30           \b%c
148 # EXIF IFD Entry #5:
149 >>>(138.l+62)  leshort 0x9000
150 >>>>(138.l+71) byte    x               %c
151 >>>>(138.l+72) byte    x               \b.%c
152 >>>>(138.l+73) byte    !0x30           \b%c
153 # IFD 0 Entry #11
154 >>142  leshort         0x8769
155 # EXIF IFD Entry #3:
156 >>>(150.l+38)  leshort 0x9000
157 >>>>(150.l+47) byte    x               %c
158 >>>>(150.l+48) byte    x               \b.%c
159 >>>>(150.l+49) byte    !0x30           \b%c
160 # EXIF IFD Entry #4:
161 >>>(150.l+50)  leshort 0x9000
162 >>>>(150.l+59) byte    x               %c
163 >>>>(150.l+60) byte    x               \b.%c
164 >>>>(150.l+61) byte    !0x30           \b%c
165 # EXIF IFD Entry #5:
166 >>>(150.l+62)  leshort 0x9000
167 >>>>(150.l+71) byte    x               %c
168 >>>>(150.l+72) byte    x               \b.%c
169 >>>>(150.l+73) byte    !0x30           \b%c
170 # Big-endian
171 >12    string          MM
172 # IFD 0 Entry #9:
173 >>118  beshort         0x8769
174 # EXIF IFD Entry #1:
175 >>>(126.L+14)  beshort 0x9000
176 >>>>(126.L+23) byte    x               %c
177 >>>>(126.L+24) byte    x               \b.%c
178 >>>>(126.L+25) byte    !0x30           \b%c
179 # EXIF IFD Entry #3:
180 >>>(126.L+38)  beshort 0x9000
181 >>>>(126.L+47) byte    x               %c
182 >>>>(126.L+48) byte    x               \b.%c
183 >>>>(126.L+49) byte    !0x30           \b%c
184 # IFD 0 Entry #10
185 >>130  beshort         0x8769
186 # EXIF IFD Entry #3:
187 >>>(138.L+38)  beshort 0x9000
188 >>>>(138.L+47) byte    x               %c
189 >>>>(138.L+48) byte    x               \b.%c
190 >>>>(138.L+49) byte    !0x30           \b%c
191 # EXIF IFD Entry #5:
192 >>>(138.L+62)  beshort 0x9000
193 >>>>(138.L+71) byte    x               %c
194 >>>>(138.L+72) byte    x               \b.%c
195 >>>>(138.L+73) byte    !0x30           \b%c
196 # IFD 0 Entry #11
197 >>142  beshort         0x8769
198 # EXIF IFD Entry #4:
199 >>>(150.L+50)  beshort 0x9000
200 >>>>(150.L+59) byte    x               %c
201 >>>>(150.L+60) byte    x               \b.%c
202 >>>>(150.L+61) byte    !0x30           \b%c
203 # Here things get sticky.  We can do ONE MORE marker segment with
204 # indirect addressing, and that's all.  It would be great if we could
205 # do pointer arithemetic like in an assembler language.  Christos?
206 # And if there was some sort of looping construct to do searches, plus a few
207 # named accumulators, it would be even more effective...
208 # At least we can show a comment if no other segments got inserted before:
209 >(4.S+5)        byte            0xFE
210 >>(4.S+8)       string          >\0             \b, comment: "%s"
211 # FIXME: When we can do non-byte counted strings, we can use that to get
212 # the string's count, and fix Debian bug #283760
213 #>(4.S+5)       byte            0xFE            \b, comment
214 #>>(4.S+6)      beshort         x               \b length=%d
215 #>>(4.S+8)      string          >\0             \b, "%s"
216 # Or, we can show the encoding type (I've included only the three most common)
217 # and image dimensions if we are lucky and the SOFn (image segment) is here:
218 >(4.S+5)        byte            0xC0            \b, baseline
219 >>(4.S+6)       byte            x               \b, precision %d
220 >>(4.S+7)       beshort         x               \b, %dx
221 >>(4.S+9)       beshort         x               \b%d
222 >(4.S+5)        byte            0xC1            \b, extended sequential
223 >>(4.S+6)       byte            x               \b, precision %d
224 >>(4.S+7)       beshort         x               \b, %dx
225 >>(4.S+9)       beshort         x               \b%d
226 >(4.S+5)        byte            0xC2            \b, progressive
227 >>(4.S+6)       byte            x               \b, precision %d
228 >>(4.S+7)       beshort         x               \b, %dx
229 >>(4.S+9)       beshort         x               \b%d
230 # I've commented-out quantisation table reporting.  I doubt anyone cares yet.
231 #>(4.S+5)       byte            0xDB            \b, quantisation table
232 #>>(4.S+6)      beshort         x               \b length=%d
233 #>14    beshort         x               \b, %d x
234 #>16    beshort         x               \b %d
235
236 0       string  M88888888888888888888888888     Binwalk logo, ASCII art (Toph){offset-adjust:-50}
237 >27     string  !8888888888\n                   invalid
238