Thumbs.dbのフォーマット調べて抽出ツール作った

2011-02-13 17:26:00 +0000

thumbs.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の中には以下のようなファイルが収まっている。

フォルダはなく、バイナリファイルだけからなる。

内容としては、01, 2, 11, 2, 21..のような名前が数字のファイルは(先頭にタグのついた)JPEGファイル。Catalogには各番号と元のファイル名の対応付けが記録されている。

各サムネイルにはIDがついていて、それを文字列として反転するとファイル名になる。

idが5のサムネイルは5というファイルに入っているが、idが13のサムネイルは31というファイルに入る。

カタログ (Catalog ファイル)

Catalogのフォーマットは先頭からこう。数値は全てUint32LE。

サムネイル (0, 1, 11, 2, 21 ..)

サムネイル画像のファイルの内容は以下のとおり。

ヘッダの長さは可変。12バイトか16バイトかのどちらからしい。

本来ならヘッダにあるタイプを調べるべきなのだろうが、とりあえずJPEGファイルの頭にあるマジックナンバー(0xFF 0xD8)を目印にすればヘッダの内容を読む必要はない。

実装

画像を吐き出すだけのツールを作るなら、流れはこうなる。

これをRubyとC++で書いた。

手抜き

こういった解体処理をする必要があるのは元のファイル名が欲しいときだけで、サムネイル画像を取り出したいだけならまじめに読み込む必要はない。

無圧縮で暗号化もされていないので、thumbs.dbを普通に開き、JPEGのSOI(0xFF 0xD8)とEOI(0xFF 0xD9)を探して次々書き出せばすむ。

参考

以上はlibforensicsというPythonのライブラリのlf.win.shell.thumbsdbのコードを読んだだけなので、このライブラリを使うのが一番早いかもしれない。

Creative Commons License - BY