fladdictのTakaさんが、「AVM2にAVM1のSWFを強引にロードするやり方」というのを紹介しているので、これが一体何をしているのか勝手に解説。
まず、
・ByteArrayの[3]番目のインデックスを9に書き換える。
ByteArrayで3番目のインデックス、つまり4バイト目の値は、SWFファイルのバージョン番号が入っています。恐らく、Flash8で書き出したなら「8」が入っているはずです。AVM2対応なのはバージョン9のSWFからなので、このバージョン番号の部分を「9」に書き換えます。
次に、
・ByteArrayのインデックス20~30あたりのどっかに、01, 00, 44, 11, 00 という順番にintが並んでいる場所があるので見つける。
ですが、最初の 01, 00 の部分(20~21バイト目固定)は、フレーム数です。メインタイムラインのフレーム数が1の場合は 01, 00 になりますが、1より多い場合はこの部分の値が変わるので注意してください。このフレーム数の部分までが、SWFファイルのヘッダで、次のバイトから「タグ」と呼ばれるデータが始まります。
で、44, 11, 00, 00, 00, 00 というのがひとつのタグです。44, 11 がタグのヘッダ、00, 00, 00, 00 がタグのデータになってます。まず、ヘッダはリトルエンディアンで書かれているので直して 11, 44 。これを2進数にして 0001000101000100 。で、最初の10ビット 0001000101 、10進数で言うと「69」がタグ番号、次の6ビット 000100 、10進数で言うと「4」がタグのデータの長さになってます。確かに4バイト分データ(00, 00, 00, 00)が続いてますね。
で、タグ番号「69」は何を表しているかというと、「ファイルの属性」です。バージョン8のSWFでは、4バイトのデータのうち、4ビット目が「SWFファイルがメタデータタグを持つかどうか」で、8ビット目が「ネットワークを利用するかどうか」のフラグになっており、それ以外は予約領域になっています。
ここで、
・01, 00, 44, 11, 08 に書き換える。
を行いますが、00 を 08 に書き換えるということは、予約領域であった1ビット目のフラグを立たせたということです。つまり、バージョン9のSWFでは、1ビット目の値に何らかの新たな属性が割り当てられたので、それを有効にする必要があるということのようです。
まとめると、4バイト目を 09 に書き換え、22バイト目以降に出現する 44, 11 の次のバイトを 08 との論理和を取ったものにすればOKでしょう。
サイト内関連記事
この記事へのトラックバック
TrackBack URL:
http://www.be-interactive.org/trackback.php?id=250

1フレームのでしか検証してなかったので、見落としてました。
補足ありがとうございますー。