Flash SWF jpeg 入れ替え調査

Adobe Flash CS3 で Flash Lite1.1 (905SH プロファイル)で出力した saitama.swf から JPEG データをバイナリのまま抽出。

% php swfdump.php saitama.swf  | grep DefineBits
tag=DefineBitsJPEG(6) length=2133
% php swfextract.php saitama.swf
% echo swftag_*_6.bin
swftag_3_6.bin
% bcut swftag_3_6.bin 2 > saitama.jpg # 先頭2byte は ID なので cut

※ bcut は自作ツール

JPEGセグメント構造ダンプ

% php jpegdump.php saitama.jpg
0x0000: SOI(Start of Image)(FFD8)
0x0014: APP0(FFE0) length=(2+)14
0x0059: DQT(FFDB) length=(2+)65
0x009e: DQT(FFDB) length=(2+)65
0x00b1: SOF0(FFC0) length=(2+)15
0x00ce: DHT(FFC4) length=(2+)25
0x010f: DHT(FFC4) length=(2+)61
0x012b: DHT(FFC4) length=(2+)24
0x0159: DHT(FFC4) length=(2+)42
0x0167: SOS(FFDA) length=(2+)10
0x0851: EOI(End Of Immage)(FFD9)

うーん‥

によると、中に EOI SOI を挟んでるはずなんだけど‥

って、よく見ると、この記事のは DefineBitsJPEG2 か‥ 何か違うのかな‥

推測

によると、

if(f_tag != DefineBitsJPEG) {
	/* when DefineBitsJPEG, use JPEGTables instead */
	unsigned char	f_encoding_tables[<variable size>];
}
unsigned char	f_image_data[<variable size>];

と書いてあるので多分、

  • DefineBitsJPEG は f_encoding_tables がないので EOI SOI を挟まない。
  • DefineBitsJPEG2,3 は JPEGTables がない場合 f_encoding_tables の次に f_image_data が来るので、EOI SOI を挟む。
  • DefineBitsJPEG2,3 でも JPEGTables がある場合は f_encoding_tables が空なので EOI SOI を挟まない。(かなり怪しい)

と推測してみる。

とりあえず、これで検証してみるか。(サンプル数が少なすぎるけど)