我是一名Java开发人员。我最近的项目要求我理解一些反编译的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编译器不检查方法的存在吗?
关键字 this 在这里意味着什么?我正在研究的课程称为 HttpLoader 。 此指向 HttpLoader 还是指向其他内容?我在同一个类中找到了类似下面的调用,并且这些方法显然没有在 HttpLoader 中定义?
this.escape(ver_build)
非常感谢你提前!!!
答案 0 :(得分:1)
首先 - 很难理解反编译代码:)
this
指向当前正在使用的Class - 例如,如果您的成员变量与传递给函数的param具有相同的名称,则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调用一个动态的不存在的方法,它将抛出一个运行时异常。如果您尝试调用不存在的非动态范围的方法,则会抛出编译错误。
答案 1 :(得分:1)
这里的关键字是什么意思?
This
是对方法包含对象的引用。脚本执行时,this
关键字引用包含脚本的对象。在方法体内,this
关键字引用包含被调用方法的类实例。
因此,如果您发布的代码不在Bound Method
,我认为在您的情况下,这是对HttpLoader
的引用
调用不存在的方法会发生什么?
应该有运行时异常。 我认为如果将class定义为动态,那么它可能不会抛出错误但我从未使用动态类,所以我不太确定。
在Java中,这段代码甚至都不会编译。
如果.
(点)运算符与myObj.FooIsNotDefined()
一样使用,也是AS3的情况。但如果使用[]
,则编译器不会像myObj["FooIsNotDefined"]()
那样执行检查,但这里应该是运行时错误。
也许HttpLoader
正在扩展其他一些有你需要的方法的类?或者也许反编译搞砸了?
在actionscript中是否可以在运行时添加方法?
如果课程是动态或通过Prototype
,则为是答案 2 :(得分:1)
其他答案解释了如果ActionScript3中不存在某个方法会发生什么。 (如果方法被明确引用,则会出现编译错误,如果按名称引用,则会出现运行时错误。)
但也许你应该为你的'缺失'方法寻找另一种解释。
在Actionscript3中,可以使用Function类(使用this
或call
函数)使用另一个apply
引用调用函数而不是默认值。因为这看起来像是故意混淆的代码(CB可能意味着“作弊拦截器”?),情况很可能如此。
对函数的调用将是这样的:
yourObject.yourMethod.call(yourOtherObjectThatIsNowThis, arg1, arg2, arg3);
顺便说一句:作为String.fromCharCode
函数的参数的方法调用肯定是混淆 - 要么是针对反编译器,要么是针对Cheat Engine或类似程序的用户。因此,这更加清楚这是一种蓄意的混淆。
答案 3 :(得分:1)
还有一种可能性:
如果您附加的代码位于关闭中,则this
关键字可能意味着:
global
(root)Function.call(thisObj)
调用,则为thisObj
参数