2014-04-28 55 views
0

我是Java開發人員。我最近的項目需要我瞭解一些反編譯的ActionScript。在flash actionscript中調用一個不存在的方法時會發生什麼?

我想我理解了大部分代碼,因爲語法與Java沒有多大區別。然而,它開始困惑我,當我看到

_loc_10 = {}; 
if (param1.lastIndexOf("?") != -1) 
{ 
    _loc_8 = param1.split("?", 2); 
    param1 = _loc_8[0]; 
    _loc_13 = _loc_8[1]; 
    _loc_10["mzsg"] = _loc_13; 
} 
if (param3 != null) 
{ 
    for (_loc_16 in param3) 
    {   
    _loc_10[_loc_16] = _loc_17[_loc_16]; 
    } 
} 
_loc_10[this.CbSlotkey()] = this.CbSlotvalue(); 
_loc_11 = JSON.stringify(_loc_10); 
_loc_15 = ""; 
_loc_15 = String.fromCharCode(this.CbSlot(), this.CbSlot2(), this.CbSlot3(), this.CbSlot4(), this.CbSlot5()) + this.CbSlot6(); 
_loc_12 = new URLVariables(); 
_loc_12.z = myzip(_loc_11); 
_loc_12.b = MD5.hash(_loc_12.z + _loc_15); 
param3 = _loc_12; 

上半部分是所有的權利,但我找不到CbSlotKey()CbSlotvalue()在整個代碼庫中的任何地方定義。當一個不存在的方法被調用時會發生什麼?在Java中,這個代碼甚至不會編譯。 actionscript編譯器不檢查方法的存在嗎?

關鍵字這個是什麼意思?我正在看的課程叫做HttpLoader。是這個指向HttpLoader或它可能指向別的東西?我在同一個類中找到類似下面的調用,並且方法顯然未在HttpLoader中定義?

this.escape(ver_build) 

非常感謝您提前!

+0

是否可以在動作在運行時添加方法?就像在JavaScript中一樣,我們可以做eval(*)並創建不存在的方法。 – user2375809

回答

1

第一 - 這是很難理解反編譯的代碼:)

this指向是當前正在使用的類 - 例如,如果你有相同名稱的成員變量帕拉姆傳遞給函數,這個。 param將指向成員變量。

是的,類可以動態修改,如果該類被標記爲動態(請點擊這裏查看:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f89.html)。每個單位本身就是一個Object,所以就像爲物體添加屬性一樣。

所以你的情況,有可能是這個特殊的鍵(this.CbSlotkey())的動態定義,完全像其他屬性被定義那裏(_loc_10[_loc_16] = _loc_17[_loc_16];

例如,這是一個有效的AS3:

this['test' + 'Func'] = function() { 
    trace ('test'); 
} 
this.testFunc(); // traces test 

不幸的是,這意味着沒有太多的選項來理解正在發生的事情。最好的選擇是使用調試器並跟蹤所有這些變量和操作的結果。你可以首先嚐試給代碼中所有那些凌亂的變量命名。

編輯:我忘了提及,如果您使用Flash調用動態不存在的方法,則會引發運行時異常。如果您嘗試調用不存在的非動態作用域的方法,則會引發編譯錯誤。

+0

非常感謝您的回答!該類以'public class HttpLoader extends Object'開始,這是否意味着這不是一個動態類,並且在運行時不能定義任何方法? – user2375809

+0

據我所知,它應該是動態的,擴展的或通過原型添加的。我想不出別的辦法。這裏最好的一個是使用斷點並檢查'this'和'CbSlotkey'的值是什麼。它會告訴你一切:)如果你不知道如何使用它 - 我可以解釋它,但在其他問題。 –

+0

代碼被故意混淆。我一直在使用Sothink SWF Decompiler來查看代碼。除了混淆的部分以外,它對所有的東西都非常好用。我使用了另一個反編譯器FFDec,它揭示了HttpLoader類中的隱藏部分。非常感謝你們所有的詳細解答。我現在對ActionScript中的語法和語法有了更好的理解。 – user2375809

1

這裏的關鍵字是什麼意思?

This是對包含方法的對象的引用。當腳本執行時,this關鍵字引用包含腳本的對象。在方法體內,this關鍵字引用包含被調用方法的類實例。

,所以我想你的情況,這是參考HttpLoader,如果你發佈的代碼是不是在Bound Method

當一個不存在的方法被調用,會發生什麼?

應該有運行時異常。 我想如果類被定義爲動態的,那麼它可能不會拋出一個錯誤,但我從來沒有使用動態類,所以我不太確定。

在Java中,這個代碼甚至不會編譯。

這是太多,如果.(點)操作符在myObj.FooIsNotDefined()使用像AS3的情況。但是如果使用[],那麼編譯器將不會像myObj["FooIsNotDefined"]()那樣執行檢查,但這裏應該是運行時錯誤。

也許HttpLoader正在擴展一些其他有你需要的方法的類嗎?或者反編譯器搞砸了嗎?

是否有可能在actionscript中在運行時添加方法?

是如果類是動態的,或通過Prototype

+0

非常感謝你對這樣的詳細解釋。我看到 '公共類HttpLoader擴展對象{...}'。它看起來不像是在擴展任何東西。什麼讓班級變得動態?有動態類的關鍵字嗎? – user2375809

+0

是的,它應該是'dynamic class SomeClass' – twoface

+1

如果你使用'.'(點),它會拋出運行時(正如關於動態類的東西所提到的)並不總是這樣。但我認爲它應該是動態的,擴展的或作爲原型添加的。現在想不到其他的方式.. –

1

其他的答案已經解釋會發生什麼,如果一個方法沒有在現有的ActionScript3。 (如果方法被明確引用,你會得到一個編譯錯誤,如果按名稱引用,你會得到一個運行時錯誤)。

但是,也許你應該尋找你的'失蹤'方法的另一種解釋。

在ActionScript3的能夠調用函數以比使用Function類(使用callapply功能)的默認另一this參考。由於這看起來像故意混淆的代碼(CB可能意味着「作弊阻止者」?),這可能就是這種情況。

調用該函數會是這樣:

yourObject.yourMethod.call(yourOtherObjectThatIsNowThis, arg1, arg2, arg3); 

順便說一句:在方法調用屬於String.fromCharCode函數的參數是絕對迷惑 - 要麼意味着反編譯或可能爲用戶作弊引擎或類似的程序。所以這更加清楚這是一個故意的混淆。

+0

很好的解釋,但這不是重點。 –

+0

@AndreyPopov你怎麼知道這不是重點?我同意你的觀點:這個問題確實會問未定義的函數會發生什麼,但我認爲這可能是海報代碼中發生的事情,並且函數事實上根本就沒有定義。我會在我的答案中添加一個解釋。 –

+0

我現在明白你的觀點。但正如我之前說過的 - 瞭解'CbSlotkey'是什麼非常重要。是的,也許這是另一回事,但我不認爲這很重要 - 動態屬性可以通過多種方式注入。問題是關於其他問題,答案很明確 - 可以調用動態函數,並且知道它們來自哪裏的唯一方法是調試。你的答案提供了一個選項,但不是解決方案,但我必須同意你是對的,你的選擇是可能的:) –

1

還有一個可能性:

如果附加該代碼是在一個閉合this關鍵字可以意味着:

  • global(根)
  • 如果調用由Function.call(thisObj),則thisObj參數
相關問題