我一直在玩ABC字節碼,希望有人能爲我澄清一點困惑。我有一個簡單的Flash文件,在舞臺上放置一個剪輯,並有一個小腳本來更新它在每個幀上的位置。代碼看起來是這樣的:如何在AVM2字節碼中找到方法?
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class RedCircle extends MovieClip
{
public function RedCircle()
{
this.addEventListener(Event.ENTER_FRAME, moveit);
}
function moveit(e:Event)
{
this.x -=1;
}
}
}
這編譯成類似:
protected package protected RedCircle
{
class RedCircle extends flash.display.MovieClip
{
static() : Void
{
getlocal_0();
pushscope();
returnvoid();
}
RedCircle() : Void
{
getlocal_0();
pushscope();
getlocal_0();
constructsuper(0);
getlocal_0();
getlex(flash.events.Event);
getproperty(ENTER_FRAME);
getlex(internal .moveit); // ###1
callpropvoid(addEventListener, 2);
returnvoid();
}
function (anonymous) (flash.events.Event param1) : Void // ###2
{
getlocal_0();
pushscope();
getlocal_0();
getlocal_0();
getproperty(x);
decrement();
setproperty(x);
returnvoid();
}
}
}
我的問題是如何在「getlex」運營工作(我已經與### 1標記的話)。它傳遞了一個多重引用,它引用了該類的'moveit'方法。不幸的是,方法信息中的'name'字段似乎永遠不會被編譯器使用。所有方法都有空字符串作爲其名稱(在### 2中顯示爲未命名的函數)。
Flash播放器如何將multiiname鏈接到未命名的方法?在AVM2規範中似乎沒有這方面的規定。
我知道這是可能的,因爲商業反編譯器如sothink可以設法確定方法名稱。我只是不確定他們是如何做到的,或者代碼如何工作。
一個非常完整的答案,謝謝:) – izb 2010-11-04 10:38:30
非常明確的答案。你用什麼工具以這種漂亮的格式轉儲abcData? – 2016-08-06 20:41:27
@HaoNguyen我寫了我自己的工具(https://github.com/Joony/ByteMyAS)。那是6年前,我不再維護它,但代碼在那裏,如果它對你有任何用處。 – Joony 2016-08-08 09:38:56