今、ネット上では、画像、音楽、ゲームなどの著作権保護が課題になっていますが、これらをFlashにして公開すれば問題ないと思っている人がいたら、残念な人です。
FlashはオープンソースなWEBアプリ制作ソフトで、開発元のAdobeがFlashのファイルフォーマットを公開しているため、Flash内の画像、音楽、ActionScriptソースファイルまで、簡単に抜き出すツールがたくさん存在する。
なかでも、Sothink社から出している「Motion Decompiler 2(モーションデコンパイラ2)」は強力で、その元のコンパイル前の状態にする再現度がずば抜けている。
私自身、Flashでアプリを作成しているが、(大したものではないが)中の情報を抜き取られるのは不愉快なので、思案してみることにした。
FlashはオープンソースなWEBアプリ制作ソフトで、開発元のAdobeがFlashのファイルフォーマットを公開しているため、Flash内の画像、音楽、ActionScriptソースファイルまで、簡単に抜き出すツールがたくさん存在する。
なかでも、Sothink社から出している「Motion Decompiler 2(モーションデコンパイラ2)」は強力で、その元のコンパイル前の状態にする再現度がずば抜けている。
私自身、Flashでアプリを作成しているが、(大したものではないが)中の情報を抜き取られるのは不愉快なので、思案してみることにした。
まずは、google検索。
同じようなことをしている方がいました。
SWF デコンパイラ対策
この方は、なんと、ActionScriptのソースがデコンパイルされない領域を見つけてしまったらしい。
この方法では、画像、音楽といった外部ファイルの保護は難しいような気がする。
[2009/2/3追記]
bk-zenさんがついにその方法を公開されました!
embedのなかに埋め込みすれば良かったらしい。
embedするswfを暗号化しておき、
embedした暗号化とキークラスで複号する。(少し問題があるらしい)
これなら何で暗号化しているのか分からなくなるためなかなかです。
詳しくは↓
http://blog.bk-zen.com/2009/02/02/128/
ということで、私は、違う方向からやってみようと思う。
これから紹介する方法の要は、Flash自体(swfファイル)の暗号化。破られない方法で暗号化すれば、ブラウザからキャッシュに落ちても開けないので問題がなくなる。当然デコンパイラも解読できない。復号キーが破られなければ・・・・。
Flash起動中のメモリから解析されると終りということもあるが、何より、暗号化したFlashを復号するための鍵が、この方法では簡単にばれてしまうという致命的な問題がある。
だとしても、そこまでがんばろうとするする人もなかなかいないと思うのでこの方法はある程度の効果があると思うので紹介します。
あと、暗号化するのでSEOには不向きであることには注意してください。
ついでに、注意点として、この方法は、Flash保存先のサーバで、PHP or Perlの実行+OS環境変数の取得ができる必要ある。自宅サーバなら問題ないが、それ以外なら各自調べてください。
紹介の流れとしては、
1.保護したいFlashの入れ子となるFlashを作成する。この中で、保護したいFlashをバイナリロードして、復号して、コンテナにaddChildしたLoaderにloadBytes関数で挿入する。
2.暗号化したFlashを復号化するために、共通鍵を設定する。共通鍵が他人に見られにくいようにするため、ここではWebサーバの環境変数に書き込んでおく。
鍵を読み込む際は、1.で作った入れ子FlashからPHPかPerl経由で、Webサーバの環境変数をロードする。環境変数が持ってこれて、他人に見られないもっと良い方法があれば教えてください。
暗号化アルゴリズムには、Winnyでおなじみの「RC4」を使う。
3.暗号化復号化クラスを作成する。
4.Flashの暗号化ソフトを作成する。Flashとの相性と、暗号化クラスの使い回しが楽とった面から、Adobe Airを使用して作ってみた。作ったソフトは下に公開しているので4.は作らなくていいです。ソフトの起動には、Adobe AirをAdobeのサイトからダウンロードしてインストールする必要があります。
1.入れ子Flashの作成。
ソースファイルから、
// loadingCriptScript.asファイルの中身
import flash.display.Loader;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.utils.ByteArray;
import mx.utils.URLUtil;
private var phploader:URLLoader; // 環境変数を読み込むためのURLLoader
private var criptLoader:URLLoader; // 暗号化されたFlash(SWF)を読み込むためのURLLoader
private var swfLoader:Loader; // 復号したFlash(SWF)を表示するためのLoader
private var key:String; // 復号鍵用
// PHPロード
private function loadPHP():void{
swfLoader = new Loader();
dispImage.addChild(swfLoader);
key = "";
phploader = new URLLoader();
phploader.addEventListener(Event.COMPLETE, loadPHPComplete);
var request:URLRequest = new URLRequest("./getcriptkey.php");
var variables:URLVariables = new URLVariables();
variables.host = URLUtil.getServerName(mx.core.Application.application.url);
request.method = URLRequestMethod.POST;
request.data = variables;
phploader.load(request);
}
private function loadPHPComplete(e:Event):void{
key = e.target.data;
criptLoader = new URLLoader();
criptLoader.dataFormat = URLLoaderDataFormat.BINARY;
criptLoader.addEventListener(Event.COMPLETE, loadSWFComplete);
criptLoader.addEventListener(ProgressEvent.PROGRESS, loadSWFProgress);
criptLoader.load(new URLRequest("cripted.swf"));
}
private function loadSWFProgress(e:ProgressEvent):void{
loadingProgressBar.setProgress(e.bytesLoaded, e.bytesTotal);
}
private function loadSWFComplete(e:Event):void{
// 復号化
var criptData:ByteArray = criptLoader.data;
var criptrc4:CriptRC4 = new CriptRC4(key);
var swfData:ByteArray = criptrc4.cript(criptData);
// 復号化したバイナリデータをloadBytes()
swfLoader.loadBytes(swfData);
}
ここでは、"getcriptkey.php"が、環境変数経由で復号鍵するPHPスクリプトで、暗号化したFlashを"cripted.swf"としています。
2.getcriptkey.php
<?php
$key = getenv('KEY');
$host = $_SERVER["SERVER_NAME"];
if($host == $_POST['host']){
echo $key;
}
else{
echo "badkey";
}
?>
Flash側のドメイン名とPHP側のドメイン名が揃ったらKEYを返すようにしています。なので、そのFlashのホスト名をPOST送信すればKEYが分かってしまうという問題があります。
3.RC4クラス。Flashで使うのでActionScriptで作成しています。
// CriptRC4.as
// made by colnago
// http://thorshammer.blog95.fc2.com/
// http://www.enoguhiroba.net/
package
{
import flash.utils.ByteArray;
public class CriptRC4
{
private var rowKey:String;
private var keyCodes:Array;
private var keyLength:int = 256;
public function CriptRC4(key:String){
var i:int;
var j:int;
rowKey = key;
keyCodes = new Array();
var bufCodes:Array = new Array();
var length:int = rowKey.length;
for(i = 0; i < keyLength; i++){
bufCodes.push(int(rowKey.charCodeAt(i % length)));
keyCodes.push(i);
}
for(j = i = 0; i < keyLength; i++){
j = (j + keyCodes[i] + bufCodes[i]) % keyLength;
var temp:int = keyCodes[i];
keyCodes[i] = keyCodes[j];
keyCodes[j] = temp;
}
}
public function cript(data:ByteArray):ByteArray{
var i:int;
var j:int;
var k:int;
var buf:Array = keyCodes.slice(0, keyCodes.length);
var length:int = data.length;
var cripted:ByteArray = new ByteArray();
data.position = 0;
cripted.position = 0;
for(i = j = k = 0; k < length; k++){
i = (i + 1) % keyLength;
j = (j + buf[i]) % keyLength;
var temp:int = buf[i];
buf[i] = buf[j];
buf[j] = temp;
var t:int = (buf[i] + buf[j]) % keyLength;
var byte:int = data.readByte() ^ buf[t];
cripted.writeByte(byte);
}
return cripted;
}
}
}
4.FlashをRC4で暗号化するソフト
SWF RC4 Cripter
前にも書きましたが、Adobe Airをインストールする必要があります。

大勝利!!?
長々と書きましたが、完全な方法ではありませんのでご注意を。
参考サイト:
PHPでRC4の暗号化(エンコード)/復号化(デコード)
http://blog.localhost.jp/2007/09/rc4-rsa-security-rc4-arcfour.html
ロードした外部swfを複製
http://www.as-game.net/article/61511477.html
AIR: テキストファイルに書き込み
http://www.yukun.info/blog/2008/12/actionscript-air-async-write-text.html
| ActionScript 3.0 逆引きクイックリファレンス Adobe Flash CS3対応 | |
![]() | 田中 康博 おすすめ平均 ![]() AS3の辞書として 手元に常備したい書。Amazonで詳しく見るby G-Tools |
この記事へのコメント
action scriptもいずれ勉強しようと思ってるんですが、
お勧めの本はありますか?
よければ紹介してください。
P.S
相互リンクしてもらってもよろしいでしょうか?
FC2にメッセージ送っているので
お返事お待ちしてます。
お勧めの本はありますか?
よければ紹介してください。
P.S
相互リンクしてもらってもよろしいでしょうか?
FC2にメッセージ送っているので
お返事お待ちしてます。
>>彰智さん
コメントありがとうございます。
私はActionScriptはまだ、始めたばかりで、参考書1つと、WEB検索と、ヘルプ検索で頑張っているところです。
参考書は、
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4839927243/blackthunder1-22/" target="_blank">ActionScript 3.0 逆引きクイックリファレンス Adobe Flash CS3対応</a>
が結構使えます。
ソフトは、学生の場合、前に書いた下のような方法でただで手に入れられます。
http://thorshammer.blog95.fc2.com/blog-entry-258.html
相互リンクOKです。
よろしくお願いします。
コメントありがとうございます。
私はActionScriptはまだ、始めたばかりで、参考書1つと、WEB検索と、ヘルプ検索で頑張っているところです。
参考書は、
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4839927243/blackthunder1-22/" target="_blank">ActionScript 3.0 逆引きクイックリファレンス Adobe Flash CS3対応</a>
が結構使えます。
ソフトは、学生の場合、前に書いた下のような方法でただで手に入れられます。
http://thorshammer.blog95.fc2.com/blog-entry-258.html
相互リンクOKです。
よろしくお願いします。
逆引きでしたか、人気高いですね。
逆引きシリーズは愛用しているので、安心です。
ではリンクさせてもらいます。
逆引きシリーズは愛用しているので、安心です。
ではリンクさせてもらいます。
土日にでも以前見つけた穴っぽいものを公開してみようと思います。
暗号化の部分はほぼ同じでした!
コメントありがとうございました!
暗号化の部分はほぼ同じでした!
コメントありがとうございました!
>>彰智さん
リンクありがとうございます。
今後ともよろしく!
>>bk-zenさん
記事の更新楽しみにしてます!
暗号化は面白いアイデアと思っているんですが、もっとロバストにならないかな〜。
リンクありがとうございます。
今後ともよろしく!
>>bk-zenさん
記事の更新楽しみにしてます!
暗号化は面白いアイデアと思っているんですが、もっとロバストにならないかな〜。
SWFファイル隠蔽に関して、その脆弱性に悩んでおりましたが、本ブログの内容が大変参考になりました。
どうもありがとうございました。
ところで、記事中のaction scriptコードを自己責任のもと使用させて頂いても問題ないでしょうか?
どうもありがとうございました。
ところで、記事中のaction scriptコードを自己責任のもと使用させて頂いても問題ないでしょうか?
2009/02/12(木) 09:49 | URL | scottie #EBUSheBA[ 編集]
特に制約をつけてるわけでもないので使用してもらってかまいません。。
ただ、どのようなものに使われるのか興味あったりしますので、WEB上にアップしたときにでも教えてもらえればうれしいです。
ただ、どのようなものに使われるのか興味あったりしますので、WEB上にアップしたときにでも教えてもらえればうれしいです。
ご快諾いただきありがとうございます。
ただ、現時点ではどのような形にするかまだ決まっておりません。
お目見えするとしても、夏頃になると思います・・・。
ただ、現時点ではどのような形にするかまだ決まっておりません。
お目見えするとしても、夏頃になると思います・・・。
2009/02/13(金) 07:20 | URL | scottie #-[ 編集]
初めまして、ふぁみべぇと申します。
私も勉強がてら、記事を参考にさせて頂きました。
有難うございます!
こるなご様のソースを、一つの小さなアプリとして公開致しました。
ご参考までに…
私も勉強がてら、記事を参考にさせて頂きました。
有難うございます!
こるなご様のソースを、一つの小さなアプリとして公開致しました。
ご参考までに…
このコメントは管理者の承認待ちです
2009/10/07(水) 01:11 | | #[ 編集]
この記事のトラックバックURL
http://thorshammer.blog95.fc2.com/tb.php/261-0e93ba1b
この記事にトラックバックする(FC2ブログユーザー)
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック


AS3の辞書として
手元に常備したい書。