当swfs被反编译成AS3时,_loc_变量是什么?

时间:2014-01-07 19:45:02

标签: actionscript-3 actionscript flash bytecode

当通过反编译器(我自己的swfs,而不是其他人)运行swfs时,我注意到很多提到某些变量:

_loc_1
_loc_2
_loc_3
.
.
.
_loc_n

如下例所示:

private function templateFilterFunction(param1) : Boolean
{
    var _loc_2:* = false;
    if (filterFunction != null)
    {
        _loc_2 = filterFunction(param1, typedText);
    }
    return _loc_2;
}

好吧,那么这些显然只是正常变量,对吧?并且它们可能在原始AS3代码中有更多描述性名称,但是在字节码中丢失了,现在我们有与以前相同的变量,只是使用非描述性名称,对吗?

不完全是。例如:

package
{

    public class SomeClass extends Object
    {
        public var var1:Number;
        public var var2:Number;
        public var var3:Number;

        public function SomeClass(param1:Number, param2:Number, param3:Number)
        {
            if (!_loc_5)
            {
                if (!_loc_4)
                {
                    var3 = param1;
                    if (!_loc_4)
                    {
                        var1 = param2;
                    }
                }
            }
            var2 = param3;
            return;
        }// end function

    }
}

未声明这些。但它们也不是Object的正确成员,而且我从未在swf反编译之外看过它们。那他们是什么?感谢。

1 个答案:

答案 0 :(得分:2)

不确定那条特定的代码,但我使用过的反编译器(据我记得)都调用局部变量loc_n,local_n或类似的东西。

我想你已经知道为什么了。创建局部变量并将其推送到执行堆栈;它们不是从本地范围之外引用的,因为它们不能按名称调用,所以它们的名称只是从字节码中删除。 (变量指向的对象可以在堆上分配并且在函数范围之外,但是,这不是重点)。

现在,您可能会注意到的另一件事是编译器生成的某些字节码不会转换为actionscript代码。在字节码中可以完成的事情在AS代码中是不可能的;一个例子,在我的头顶:“dup”操作码(复制一个值并将其推入堆栈)。还有其他(跳跃,noops等)。有时将其反转为原始源代码是不可能的。

还有其他一些有趣的案例,比如循环。您可能会注意到,无论源代码是否有一段时间,特定的反编译器都会生成“for循环”(或“while循环”)。这是因为循环是一个更高级别的构造,通常在bytcode中实现为条件跳转。如果你想将字节码反转为AS代码,你只需选择一种风味,因为循环(作为AS构造)就不存在了。

那就是说,我已经看到一些反编译器(现在不记得哪一个)生成无效或非感知的源代码。对我来说,你发布的例子就是这种情况。我可能错了,但似乎_loc_5和_loc_4变量只是乱码而原始代码必须是这样的:

public function SomeClass(param1:Number, param2:Number, param3:Number):void
{
    var var3:Number = param1;
    var var1:Number = param2;
    var var2:Number = param3;
}