Thumbs.dbのフォーマット調べて抽出ツール作った
2011-02-13 17:26:00 +0000thumbs.dbがあるフォルダか、thumbs.db自体をこのツールにドラッグして使う。その場にjpgファイルが吐き出される。
概要
WindowsのThumbs.dbはOLE Compound DocumentとかStructured Storageという形式でできている。Wordのdocファイルにも使われていて、要はアーカイブの一種らしい。
OLE形式のことは割愛。ここではそのOLEなる形式でどういうファイルが入っているかだけ書く。
これを読み込むライブラリは、Rubyではruby-oleジェム、PerlならWin32::OLE、JavaならApache POIのPOIFS、Cなら本家COMのIStorageとかオープンソースでPOLEというライブラリがある。
ディレクトリの内容
そのたぐいのライブラリで内容を見ると、Thumbs.dbの中には以下のようなファイルが収まっている。
フォルダはなく、バイナリファイルだけからなる。
- Catalog
- 01
- 1
- 11
- 2
- 21
- 3
- 4
- 5
- ...
内容としては、01, 2, 11, 2, 21..のような名前が数字のファイルは(先頭にタグのついた)JPEGファイル。Catalogには各番号と元のファイル名の対応付けが記録されている。
各サムネイルにはIDがついていて、それを文字列として反転するとファイル名になる。
idが5のサムネイルは5というファイルに入っているが、idが13のサムネイルは31というファイルに入る。
カタログ (Catalog ファイル)
Catalogのフォーマットは先頭からこう。数値は全てUint32LE。
- ヘッダが16バイト
- 4バイト~8バイト目にサムネイル数
- サムネイル数だけ以下を繰り返し(各エントリのサイズは不定)
- エントリ全体のサイズ
- ID
- 更新日時
- (何かの数値?)
- UTF16LEでファイル名
- 0でパディング
サムネイル (0, 1, 11, 2, 21 ..)
サムネイル画像のファイルの内容は以下のとおり。
- ヘッダ (12バイトか16バイト)
- JPEGファイル
ヘッダの長さは可変。12バイトか16バイトかのどちらからしい。
本来ならヘッダにあるタイプを調べるべきなのだろうが、とりあえずJPEGファイルの頭にあるマジックナンバー(0xFF 0xD8)を目印にすればヘッダの内容を読む必要はない。
実装
画像を吐き出すだけのツールを作るなら、流れはこうなる。
- Structured Storageのライブラリを使ってthumbs.dbを読み込む
- Catalogファイルを取り出して上のフォーマットで解釈する
- 各ファイル名についてサムネイルを取り出し、JPEGファイルをその辺に書き出す
これをRubyとC++で書いた。
手抜き
こういった解体処理をする必要があるのは元のファイル名が欲しいときだけで、サムネイル画像を取り出したいだけならまじめに読み込む必要はない。
無圧縮で暗号化もされていないので、thumbs.dbを普通に開き、JPEGのSOI(0xFF 0xD8)とEOI(0xFF 0xD9)を探して次々書き出せばすむ。
参考
以上はlibforensicsというPythonのライブラリのlf.win.shell.thumbsdbのコードを読んだだけなので、このライブラリを使うのが一番早いかもしれない。