
- 本栏最新文章
- 用实例学习一步一步使用Flash AS3.0 脚本语言 04-04
- Flash AS3.0 实现FLASH的“动态链接库” 03-31
- Flash AS3.0 爽快使用XML 03-31
- 学习As2.0与AS3.0的尴尬 03-16
- AS打造的复制粘贴功能 03-14
- Flash as制作一个铅笔画图程序教程 03-07
- AS3中的数据存取方式效率比较 03-01
- AS3.0的类及绑定 03-01
- As3.0 decompiler反编译器 01-24
- As3.0 xml + Loader 01-24

- 本栏推荐文章
- ASP.NET设计网络硬盘之查看文件夹 04-29
- ASP.NET设计网络硬盘之文件夹实现 04-29
- ASP.NET设计网络硬盘之上传文件 04-29
- 小试ASP.NET 2.0的兼容性 04-29
- ASP 系列函数大全 04-29
- Asp.net Mvc Framework 九 (View与Controlle... 04-04
- 【翻译】动态调用样式表代码 04-04
- Flash AS3.0 实现FLASH的“动态链接库” 03-31
- Flash AS3.0 爽快使用XML 03-31
- MySQL的LIST分区体验与总结 03-27
As3.0 decompiler反编译器
转载中文请注明出处.感谢ws-forum 版主molay提交的As3.0文章.
这原本是在一个法国 ASer 的博客上发表的两篇文章,现在它们通过无线电传到我这儿了,于是乎,我就把它们翻译一下并发表在这里。这个 Tamarin 工具主要就是一个动作脚本字节编码(Actionscript Byte Code,ABC)的反编译器,它可以从 Swf 以及 ABC 文件中提取出便于我们阅读的伪码。之后,这些伪码就能通过一系列的程序转换成 AS3 源码。这可是相当地可怕呀,不是么?
让我们来看看文章都说了些什么吧。首先作者向我们阐述了如何构建属于你自己的编译器。然后你就可以直接下载前面构建好的编译器了。最后是我自己个人对本文的注解。
通过 Tamarin 工程创建可执行文件
您可以在 CVS 上下载 Tamarin。参考了 Zwetan 的描述,CVS 信息如下所示:
代码:
cvs -d :pserver:anonymous:anonymous@cvs-mirror.mozilla.org:/cvsroot co mozilla/js/tamarin
按照 readme.txt 文件的指导进行安装就可以了。工程可以通过 Microsoft C 编译器进行编译;当然,如果您还没有 VC.NET Express 2005 的话,您可以去免费下载一个。
Tamarin 工程包含相当多的有趣的玩意儿。您可以查看“util”文件夹,里面有一个abc、swf和swc文件的反编译器。现在你通过它只能获得 AS3 的伪码,但是别急,好戏才刚刚开始。
编译类似的“abcdump.as”文件时,您需要将Tamarin内部在编译过程中使用到的核心内建组件也一同编译成ABC。 您可以使用 Flex 2 SDK 通过下面所示的方法进行编译
代码:java -jar asc.jar builtin.as
这样你就获得了一个“builtin.abc”文件。此外,ByteArray class 同样也是必须的,您可以在命令行解释器文件夹中找到它:
代码:java -jar asc.jar ByteArray.as
至此,我们就可以准备开始编译abcdump了:
代码:java -jar asc.jar import builtin.abc -import ByteArray.abc abcdump.as
现在我们得到了abcdump.abc文件,您可以在AVM虚拟机中运行它或者使用反编译器来反编译任何偶然发现的.abc文件。拿playerglobal.abc文件举例:
代码:avmplus abcdump.abc playerglobal.abc
通过 ASC 编译器我们完全可以使用 -exe 编译参数来创建 exe 文件,就像这样:
代码:java -jar asc.jar -exe avmplus.exe -import builtin.abc -import ByteArray.abc abcdump.as
这样我们就完成了一个名称为“abcdump.exe”的可重用的、命令行模式的反编译器。酷吧?同样Tamarin也包含了很多其他有趣的玩意儿,例如文件IO操作以及其他不可思议的材料。
第一个 ActionScript 反编译器
我们可以通过Tamarin File IO模块来转储反编译器的输出文件。这个abcDump反编译器的雏形至此已经完成。您可以按照下面的方法来使用它:
代码:D:\ASC>abcdump
AbcDump
usage:
abcdump <filename>
我的注释
我拿“Amfphp Service Browser”来开刀,得到了一个7MB的servicebrowser.il文件。该文件是一个含义模糊的比特文件,尽管如此,它还是能被我们读懂^_^。举个例子吧,RawAmfService class的源文件内容和下面的差不多:
代码:public class RawAmfService extends EventDispatcher
{
public var gatewayUrl:String = "";
var loader:URLLoader;
public function RawAmfService()
{
loader = new URLLoader();
loader.addEventListener('complete', readData);
}
...
}
反编译后的 class 文件则是:
代码:class RawAmfService extends flash.events::EventDispatcher
{
var gatewayUrl:String = "" /* slot_id 0 */
var loader:flash.net::URLLoader /* slot_id 0 */
function RawAmfService():* /* disp_id -1*/
{
// local_count=1 max_scope=1 max_stack=3 code_len=40
0 getlocal0
1 pushscope
2 findproperty gatewayUrl
5 pushstring ""
7 initproperty gatewayUrl
10 getlocal0
11 constructsuper (0)
13 findproperty loader
16 findpropstrict flash.net::URLLoader
19 constructprop flash.net::URLLoader (0)
23 initproperty loader
26 getlex loader
29 pushstring "complete"
32 getlex readData
35 callpropvoid addEventListener (2)
39 returnvoid
}
...
}
有趣的是,我发现在构造器内部参数“gatewayUrl”的值似乎被设置为了它的默认值。下一步,就是开始翻译这个.il文件,把它变成一个能被我们更方便地识别的语言所编写的东西了呵呵。在iteratif.net上,这个家伙说自己正从事着这方面的工作,当然,我并不是很确定当前的状况。如果您很感兴趣并且想和他一起合作的话,您可以在iteratif DOT net 的 “contact AT”版块与他取得联系。
Adobe将ActionScript Virtual Machine 2(AVM2)的核心源代码捐献给Mozilla组织,变成了一个叫做Tamarin的开源项目。Tamarin作为一个标准的ES4引擎,虽然现今只有AVM2和SpiderMonkey基于它,但这也足够形成一个强大的战略同盟——Adobe或Mozilla社区对Tamarin的改进都会让双方同时受惠。
AMF(Action Message Format)是一种 binary format的资料型态,透过 AMF over HTTP的方式将flash端资料编码后传回server,server端的remoting adaptor接收到资料后则会译码回正确的native对象,交给正确的程序处理。
AMF除了用于Flash remoting外,也广泛的用于 Local Connection 与 Flash communication server,它最大的特色在于可直接将flash native object,例如Object, Array, Date, XML,传回server端,并且在server端自动进行转译成适当的对象,例如flash 的Array传回PHP时就会自动转换为 Associative Array;这个特色对开发者最大的好处在于不需要再人工处理serialization 与 deserialization的繁复工作,不但精确度更高,同时开发也更省时间。
由于AMF是binary format并且编码时经过高度压缩,因此非常适合用来传递大量的资料,根据flashorb网站的测试(主要针对web service与flash remoting),当资料量越大时,flash remoting的传输效能就越高,远远超过web service的表现,因此同样的道理也可得知xml, loadVars, loadVariables 等使用plaine text format的传输方式自然也无可比拟
<完>


