BeInteractive!

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でしょう。

この記事へのトラックバック

AS2用swfもAS3用swfもどっちもAVM2用としてロードする強引なローダー...

TrackBack URL:

http://www.be-interactive.org/trackback.php?id=250

この記事へのコメント

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

コメント書き込み:

カテゴリ

タグ

アーカイブ