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 を挟まない。(かなり怪しい)
と推測してみる。
とりあえず、これで検証してみるか。(サンプル数が少なすぎるけど)