Home > ActionScript > flasm を使って FLASH の swf file に直接変更を加える

flasm を使って FLASH の swf file に直接変更を加える

flasm - web site

Flasm disassembles your entire SWF including all the timelines and events. Looking at disassembly, you learn how the Flash compiler works, which improves your ActionScript skills. You can also do some optimizations on the disassembled code by hand or adjust the code as you wish. Flasm then applies your changes to the original SWF, replacing original actions.

flasm とは、 swf file から action script 部分のバイトコードを抽出〜解析した上で、可読性の高いスタック形式のスクリプトに変換してくれるツールです。さらに面白いのが、この独自形式のスクリプトに任意の修正・追記を加えたうえで、それら変更内容を元の swf file に反映させる事ができる、つまり、オリジナルの .fla file を必要とせずに swf file に直接変更を加える事が出来る点です。

たまたま受けた、同僚の業務案件での相談事を解決する為に flasm がとっても有効なソリューションだったので、簡単に flasm の使い方例を紹介してみます:

ああ困った

とある企業の web site において、地図検索サイト Mapion へのリンクを内部に含んだ Flash swf file がサイト内の色々な箇所で使われていました。※たとえばこんなの:

ところが今日の戦略会議にて、来月からリンク先を Mapion ではなく google maps に変更する事が決定されました。FLASHコンテンツの修正依頼が速やかに制作部へ伝達されましたが、ここで問題が。制作部曰く、

  • このFLASHはその昔に外注デザイナーに制作を発注したものである
  • その後デザイナーは消息不明でもう連絡がつかない
  • オリジナルの .fla file は貰っていない
  • なので、リンク先の変更(修正)は無理
  • 別の制作会社にまったく同じ物を作って貰うよう頼んだ所、見積り概算 200万円 との事

200万アリエネー!!と半切れ状態、でもどうすればよいのかわからない・・・途方にくれた末、駄目もとで開発部に相談を持ち込んだのでした・・・。

flasm 使ってリンクURLを変更する方法

1) swf から .flm スクリプトファイルを作成する

% flasm -d map.swf > map.flm

shell や dos prompt 上で上記コマンドを実行する事により、action script部分を解析した結果のスクリプトファイルが作成されます。windows版の場合、エクスプローラにて flasm.exe に任意の swf file をドラッグ&ドロップしても同様の結果が得られます。

2) 作成した .flm ファイルを編集する

movie 'map.swf' // flash 7, total frames: 1, frame rate: 12 fps,
200x100 px

  defineMovieClip 2 // total frames: 1
  end // of defineMovieClip 2

  placeMovieClip 2 

    onClipEvent press
      push 'http://www.mapion.co.jp/'
      push '_blank'
      getURL2 POST
    end
  end // of placeMovieClip 2

  defineMovieClip 5 // total frames: 1
  end // of defineMovieClip 5
end

map.flm をテキストエディタで開くと↑こんな感じになっています。見てすぐわかるように、flasm は action script のスタック処理を解析すると同時に、定数や引数の値も書き出してくれています。まあ素敵。あからさまに http://www.mapion.co.jp って文字列があるので、ここを

http://maps.google.co.jp/

に書き換えた上で上書き保存しておきます。

3) 編集後の .flm ファイルを使って、swf をリコンパイルする

% flasm -a map.flm

map.flm とリコンパイルしたい map.swf を同一ディレクトリに置いた状態で上記コマンドを実行する事で、flasm が .flm の修正を反映させた状態で map.swf をリコンパイルしてくれます。

完成

以上、再生成された map.swf をポポイとサイトに反映させれば任務完了。今回はテキストエディタを使って手動で修正しましたが、同じような置換処理を複数の異なる swf file に施す必要がある場合とかは、置換処理用の perl script 等を使って、上記ステップ1から3を自動化させるのが良いかと思われます。

今回は 定数を置換する という、かなり初心者ちっくな扱い方でしたが、flasm にはまだまだ使い所 (実行速度 optimization, 新バージョン Flash Player の機能追加、等)が沢山ありそうです。

flasm で取得可能な定数一覧 (09/07追記)

調べた限りでは、以下の action script メソッドの引数として扱われる定数 (変数) が flasm で取得可能のようです:

  • getURL
  • loadMovie
  • loadMovieNum
  • loadVariables
  • loadVariablesNum
  • MovieClipLoader.loadClip()
  • LoadVars.sendAndLoad()
  • LoadVars.send()
  • XML.sendAndLoad()
  • XML.send()

以下の2種類の Flash Object に対する定数設定の中身は、 flasm では取得できないので注意(action script では無いので)。

  • 静止テキスト > URLリンクプロパティ
  • ダイナミックテキスト > URLリンクプロパティ

上記の例でいうと、元の swf file にて、もしも getURL() では無く、これらテキストのURLリンクプロパティに 'http://www.mapion.co.jp' と書かれていた場合は flasm でも対応できません。痛い罠。
これらテキストのURLリンクを取得するには、例えば perl だと SWF::File を駆使して抽出+変更する方法があったりします。多分。(抽出は試した事あるも、変更は未調査...

Comments:0

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Remember personal info

Home > ActionScript > flasm を使って FLASH の swf file に直接変更を加える

Search
Feeds

Page Top