Actionscript 3 当主权财富基金被反编译成AS3时,什么是_loc_uu变量?

Actionscript 3 当主权财富基金被反编译成AS3时,什么是_loc_uu变量?,actionscript-3,actionscript,flash,bytecode,Actionscript 3,Actionscript,Flash,Bytecode,当通过反编译器(我自己的SWF,而不是别人的SWF)运行SWF时,我注意到很多人提到了某些变量: _loc_1 _loc_2 _loc_3 . . . _loc_n 如下例所示: private function templateFilterFunction(param1) : Boolean { var _loc_2:* = false; if (filterFunction != null) { _loc_2 = filterFunction(par

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

_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

    }
}

这些没有申报。但它们也不完全是
对象的成员,而且我从未在swf反编译之外见过它们。那是什么呢?谢谢。

我不确定这段代码,但我使用的反编译器(据我记忆所及)都调用局部变量loc\n、local\n或类似的东西

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

现在,您可能知道的另一件事是,编译器生成的某些字节码无法转换为actionscript代码。有些事情可以用字节码完成,但在AS代码中却不可能;举个例子,“dup”操作码(复制一个值并将其推送到堆栈上)。还有其他(跳跃、跳跃等)。将其转换为原始源代码有时是不可能的

还有其他有趣的例子,比如循环。您可能会注意到,无论源代码是for循环还是while循环,特定的反编译器都倾向于生成“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;
}

“这些未声明”中的“这些”是什么意思?我不清楚。这可能是反编译器如何处理字节码的问题。编写自己的简单程序,编译swf,然后反编译。我假设反编译器将无法找出注释/变量名/数学表达式等。您需要跟踪每个变量(可能带有断点),找出它们的作用并推断它们的类型,然后相应地重构代码