blog.Ring.idv.tw

ActionScript 3.0

SWF Dump Tools

剛剛找到一個AIR : SWF dump tool,它是用Tamarin project中的「abcdump.as」來寫成的Adobe AIR應用,不過感覺上似乎沒有「swfdump」來得強大~

從「利用swfdump反組譯ActionScript 3.0」的一文中~ 其實「swfdump.exe」還是利用「Java」程式去執行的~ 為何如此說?我們可以看一下「swfdump」(shell script)的內容:

.....
java $VMARGS -jar "$FLEX_HOME/lib/swfdump.jar" "$@"

所以我將整個「swfdump」會用到的jar檔抓出來~ 並寫成一個批次檔來處理~ 這樣大家就不需要那麼麻煩還要抓原始檔然後再編譯等等的工作步驟了! ^^

批次檔內容

@java -jar "%~dp0swfdump.jar" %*

下載點:swfdump

下載後請直接解壓縮~ 然後將「c:\swfdump\bin」設定至「Path」的環境變數即可~

操作方式

swfdump -abc helloworld.swf

2008-02-26 14:38:39 | Add Comment

利用swfdump反組譯ActionScript 3.0

Open-Source Flex SDK project 提供了一個命令列的小工具,稱為:「swfdump」,我們可以用它來反組譯包含ActionScript 3.0的SWF檔案,不過要利用此工具之前~ 必須先做一些相關的處理。

swfdump建置步驟

Step 1. 請設置好你的Apache Ant,並設好「Path」環境變數。

Step 2. 確認你的「JAVA_HOME」環境變數已經指到你的JDK目錄夾位置。

Step 3. 請下載Flex SDK的原始碼,可參考「Flex 3 is Now Open Source !!」。

Step 4. 切換工作目錄至Flex SDK原始碼中的「trunk\modules\swfutils」,並輸入「ant」來編譯swfutils底下所有的Java程式並打包。

cd c:\flexsrc\trunk\modules\swfutils
ant

Step 5. 切換至「trunk\bin」,然後進行反組譯「helloworld.swf」。

(這裡我們用Flash CS3開發一個含「trace("Hello World");」的測試檔案)

cd c:\flexsrc\trunk\bin
swfdump -abc helloworld.swf

接著你就可以看到反組譯後的結果了~

…………………
   01 02 01 0A 0B 0A    function helloworld_fla:MainTimeline::helloworld_fla:frame1():
    maxStack:2 localCount:1 initScopeDepth:10 maxScopeDepth:11
    D0                       getlocal0     	
    30                       pushscope     	
    5D 04                findpropstrict	:trace
    2C 09                pushstring    	"Hello World"
    4F 04 01           callpropvoid  	:trace (1)
    47                       returnvoid    	
    0 Extras
    0 Traits Entries

    02 03 01 0A 0B 0F    function helloworld_fla:MainTimeline::helloworld_fla:MainTimeline():
    maxStack:3 localCount:1 initScopeDepth:10 maxScopeDepth:11
    D0                       getlocal0     	
    30                       pushscope     	
    D0                       getlocal0     	
    49 00                constructsuper	(0)
    5D 05                findpropstrict	:addFrameScript
    24 00                pushbyte      	0
    60 03                getlex        	helloworld_fla:frame1
    4F 05 02           callpropvoid  	:addFrameScript (2)
    47                       returnvoid    	
    0 Extras
    0 Traits Entries
…………………

Good luck! ^^

參考資源

Disassembling a SWF with swfdump

2008-02-25 23:18:22 | Comments (2)

LoadVars vs. Flash Remoting

從標題「LoadVars vs. Flash Remoting」來看,我想這絕對夠直覺本文想要表達的是什麼~沒錯~ Flash可以藉由著許多種方式和後端程式溝通,尤其是採用loadVariables、LoadVars這種純文字(Plain Text)方式的傳輸最便利使用,然而它真的是純文字嗎?而Flash Remoting真的就是用binary format來傳輸嗎?

本文將藉由著Ethereal封包捕捉工具來協助我們探討底層的傳輸格式~

LoadVars - Plain Text

我們寫一個簡單的小範例來做測試~

Flash ActionScript

var data_lv:LoadVars = new LoadVars();
data_lv.name = "Flash";
data_lv.sendAndLoad("http://localhost/LoadVars.php",data_lv,"POST");
data_lv.onLoad = function(success)
{
	if(success)
	{
		trace("Loaded!");
		trace(this.value);
	}else{
		trace("Failed!");
	}
}

PHP (LoadVars.php)

<?php
	echo "&value=Hello! " . $_POST['name'];
?>

Ethereal捕捉請求封包(Plain Text)

Ethereal捕捉回應封包(Plain Text)

從上述所捕捉的封包很明確的,在請求時送出「name=Flash」,而在接收時則為「&value=Hello! Flash」,兩者的確都是採用純文字的方式來傳輸~

Flash Remoting - AMF3

Flash ActionScript

var myService = new NetConnection()
myService.connect("http://localhost/amfphp/gateway.php");
var responder = new Responder(onResult, onFault);
myService.call("Hello.sayHello", responder,"Java");
function onResult(result)
{
	trace(result);
}
function onFault(f:Event )
{
	trace("There was a problem: " + f.description);
}
stop();

PHP (Hello.php)

<?php
class Hello
{
	function sayHello($name)
	{
		return "Hello! $name";
	}
}
?>

Ethereal捕捉請求封包(AMF)

Ethereal捕捉回應封包(AMF)

(反白區就是請求與回應的位元組)

所以從上述所捕捉的封包來看~ Flash Remoting的確是採用binary format來傳輸,然而這只是一個簡單的小範例,所以尚無法將Remoting的優點發揮出來~

而筆者比較感興趣的地方就在於請求封包中的前二個位元組分別為「0x00、0x03」,其實這就是代表著此傳輸的AMF版本為AMF3,而緊接著一連串的位元組尚需要時間去做更深入的剖析,筆者有時間再為大家來分享~

2007-12-11 18:06:40 | Comments (1)

Hello AMF3 - 初次見面

還在用純文字(Plain Text)的方式傳送大量資料嗎?或許可以嘗試看看Flash Remoting~

(截圖來源:Using Flash Remoting for Flash MX 2004 ActionScript 2.0)

它採用了AMF(Action Message Format) binary format來當做溝通的橋樑,所以它可以支援以壓縮的方式來傳輸,而且在可供傳輸的資料型態還包含了ByteArray等多種型態(參考AMF3 Specification),另外AMF也隨著ActionScript 3.0的問世從AMF0直接跳到AMF3,然而最重要的是AMFPHP也一併支援AMF3了,這裡提供一個小範例供測試使用~

範例下載

基本上將你的AMF安裝好後,將範例中的Hello.php貼到你的「services/」目錄夾即可,最後開啟remoting.fla發佈後即可看到「Hello! AMF

參考資源:

Flash Remoting with AS3

Using Flash Remoting for Flash MX 2004 ActionScript 2.0

2007-12-11 17:19:06 | Add Comment

Flash Webcam 線上拍照存檔!~

.2008/12/10 新增範例下載

今天試著用Flash CS3寫一個Flash Webcam 線上拍照存檔的範例~

大致上分成兩部份來處理~一部份為Flash的前端,用來截取Webcam的畫面並將它存進BitmapData中,以供透過URLRequest來上傳處理~

而這部份比較關鍵的是,我們利用「as3corelib」所提供的「JPGEncoder」來進行壓縮,以增進傳送速度~

想當然而,後端就是直接將它讀出並存進一個影像檔即可。

程式碼如下所示:

ActionScript 3

import com.adobe.images.JPGEncoder;

var camera:Camera = Camera.getCamera("0");
camera.setMode(320,240,30);
var video = new Video(320, 240);
video.attachCamera(camera);
stage.addChild(video);
stage.addEventListener(MouseEvent.MOUSE_DOWN,clickHandler);
function clickHandler(event:MouseEvent)
{
	var bd:BitmapData = new BitmapData(320, 240);
	bd.draw(video);
	var encoder:JPGEncoder = new JPGEncoder(100);
	var bytes:ByteArray = encoder.encode(bd);
	var req:URLRequest = new URLRequest("http://localhost/WebCamHandler.as3");
	req.data = bytes;
	req.method = URLRequestMethod.POST;
	req.contentType = "application/octet-stream";
	var loader:URLLoader = new URLLoader();			
	loader.addEventListener(Event.COMPLETE, completeHandler);
	loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
	loader.load(req);
}
function completeHandler(event:Event):void
{
	trace("上傳成功");
}
function errorHandler(event:IOErrorEvent):void
{
	trace("上傳失敗");
}

Servlet

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class WebCamHandler extends HttpServlet
{
    private String base;
    
    public void init(ServletConfig sc) throws ServletException
    {
        ServletContext sco = sc.getServletContext();
        base = sco.getRealPath("/");
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
    {   
        int readed;
        try
        {
            String filePath = base+new Date().getTime()+".jpg";
            BufferedInputStream bis = new BufferedInputStream(req.getInputStream());
            FileOutputStream fos = new FileOutputStream(new File(filePath));
            byte[] bytes = new byte[2048];
            while((readed=bis.read(bytes)) != -1)
            {
                fos.write(bytes, 0, readed);
            }
            fos.close();
            bis.close();
            
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

範例下載

WebCamHandler(CS4、Webapp)

2007-08-19 15:19:20 | Comments (17)

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment