当通过反编译器(我自己的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反编译之外看过它们。那他们是什么?感谢。
答案 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;
}