posts - 12,  comments - 47,  trackbacks - 0
  2011年1月25日
在2010年11月28日,我在盛大举办的WeDoSwf会议上,我做了一个演讲,主题就是关于Swf的文件格式和Abc文件的混淆。

最近一个多月的时间里面,各种零零总总的事情特别多,一直没有时间把这个东西整理好放到博客中。

首先呢,把我的演讲的视频的ppt放上来:
视频:
http://v.ku6.com/show/MwjMgfhEgUFoiZhx.html

PPT:
http://www.slideshare.net/swfsh/swfabc

然后呢,经过我们的努力,我们已经将这个东西做成了一个产品,有兴趣的朋友可以去我们的公司主页上下载试用:
http://www.orandea.com/product?lang=cn

回到正题。在上一篇博客中,我讲了Swf文件和Abc文件的基本结构,我也提到了Abc文件中非常重要的一个数据结构:常量池(Constant Pool)。

常量池

常量池,顾名思义就是保存Abc文件中用到的各种常量的地方。而在Abc文件的其他部分,需要使用常量的地方都采用一个uint型的索引指向常量池中的某个元素。
常量池主要包括两类常量:基本数据类型常量和符号常量。

基本数据类型常量

Abc文件中的常量池中,主要包括四类基本数据类型的常量:
  • 无符号整形常量
  • 有符号整形常量
  • 双精度浮点常量
  • 字符串常量
这里需要注意的是Abc文件中整形常量都是32位的,而且是采用的可变长的整形来保存。
双精度常量是64位,IEEE标准的双精度浮点数。
字符串常量采用的是UTF-8编码保存的,提供了很好的跨语言能力。
在基本数据类型的常量之间不存在相互的引用关系。

符号常量

符号常量主要包括2个类别:Namespace常量和Multiname常量。
Namespace常量又包括:
  • Namespace常量

    主要是指向字符串常量的一个指针

  • Namespace Set常量

    由一系列指向Namespace常量的指针组成

而Multiname常量由指向Namespace的指针和指向字符串常量的Name指针组成,表示一个符号,比如:
  • 类的符号

    [pk]com.orandea.utils:ArrayUtils 表示在Package:com.orandea.utils中的ArrayUtils类

  • 类的方法或者属性

    [pk]com.orandea.utils.ArrayUtils:wrapFunc 表示类com.orandea.utils.ArrayUtils的wrapFunc方法。


所以,我们可以看到,Flash player是基于一系列的引用关系工作的,而不是具体的字符串常量工作的,这样就给我们提供了混淆代码的机会。

也就是说,如果我们修改了这些字符串常量,不会对程序的实际执行造成影响。

这也就成为了我们混淆的突破口,只要将那些类引用的Multiname常量所对应的字符串常量修改掉,那么反编译工具反编译出来的代码就变得难以阅读了。

Namespace的种类

在Abc文件中Namespace被分为了几个不同的种类,主要对应于不同的访问控制修饰符(public, protected, private, static...),包括:
  • Namespace

    主要是指Xml中的namespace

  • PackageNamespace

    主要是public修饰的package中的符号

  • PackageInternalNs
  • ProtectedNamespace
  • ExplicitNamespace
  • StaticProtectedNs
  • PrivateNs
剩下的几个我就不多解释了,可以参考avm2_overview.pdf文档。

Multiname的种类

Multiname也有很多不同的类型,包括:
  • QName (Qualified Name)

    就是完整的Multiname,由Namespace和Name组成,比如上文中提到的[pk]com.orandea.utils:ArrayUtils

  • RTQName (Runtime Qualified Name)

    跟QName相似,但是namespace由运行时决定

  • RTQNameL (Runtime Qualified Name Late)

    与RTQName类似,但是Name也由运行时决定

  • Multiname (Multiple Namespace Name)

    Adobe真是词穷啊,到处都是Multiname,还代表不同的意思。。。。这个和RTQName是一样的,但是用Namespace Set取代了Namespace

  • MultinameL (Multiple Namespace Name Late)

    这个和Multiname是一样的,但是Name字段由运行时决定


总结

相信通过这一节的内容,大家对Abc文件的组织方式,对Avm虚拟机的工作方式有了一个大致的了解。在下一节中,我会告诉大家Abc文件中的其他部分的组织关系和Avm虚拟机的指令集。

快速链接

posted @ 2011-01-25 18:04 TonyHuang 阅读(1297) 评论(0) 编辑
  2011年1月17日

在2010年11月28日,我在盛大举办的WeDoSwf会议上,我做了一个演讲,主题就是关于Swf的文件格式和Abc文件的混淆。

最近一个多月的时间里面,各种零零总总的事情特别多,一直没有时间把这个东西整理好放到博客中。

首先呢,把我的演讲的视频的ppt放上来:
视频:
http://v.ku6.com/show/MwjMgfhEgUFoiZhx.html

PPT:
http://www.slideshare.net/swfsh/swfabc

然后呢,经过我们的努力,我们已经将这个东西做成了一个产品,有兴趣的朋友可以去我们的公司主页上下载试用:
http://www.orandea.com/product?lang=cn

回到正题。在上一篇博客中,我已经说明了为什么需要对Swf文件进行加密,那接下来说说Swf文件和Swf内嵌的Abc文件的文件格式:

Swf文件格式

Swf文件格式呢,是Flash Player所使用的文件格式。Swf文件格式具有一下几个特点:

  • 基于Tag的流媒体技术
  • 内建压缩支持

这两个技术,尤其是第一个技术对于Flash的发展起到了至关重要的作用。

基于Tag的流媒体技术

Swf文件是由文件头和一系列的Tag组成的,下面这张图很好的说明了Flash的文件结构:

我们可以将Swf文件看成一个串流,然后顺序的从头读到尾来进行播放。
那么有那些种类的Tag呢?
这里说几个经典的:

  • SetBackgroundColor

    这个顾名思义就是设定swf的背景颜色的,我们在编译Flash的时候,设定的背景颜色最终就会生成这个Tag

  • ShowFrame

    接触Flash比较早的朋友应该都知道,在很久很久以前(我是慢羊羊村长),网络上的大部分Flash是可以一边下载一边播放的,这在当初56kbps的小猫时代可谓是惊天地泣鬼神的功能啊,当时互联网上涌现出了一大批的优秀的Flash动画作品;哎呀,扯远了,回来回来。说说ShowFrame的用途吧:在Flash里面,你可以通过其他的Tag定义位图,定义图形,定义补间动画,然后再放到舞台上去,而这个ShowFrame的作用就是把这一帧的画面显示出来,意义重大吧:)

  • DoAbc

    我们都知道,从Flash 9开始,Flash引入了Avm2虚拟机、Abc文件格式和AS3语言,大大提高了Flash中脚本的执行效率。所以Flash9应该算是划时代的一个版本啊。DoAbc类型的Tag的作用就是把Abc文件嵌入到Flash中

我们先来用Swfspy看看,我们的Swf文件到底包含些什么东西:

具体Tag的定义,大家可以参考一下参考文件中的“swf_file_format_spec_v10.pdf”。

内建压缩支持

从Flash6开始Swf文件格式开始支持压缩功能,主要的压缩算法采用的是zlib中的deflate算法。
通过Swf文件的第一个字节我们就可以分辨出这是压缩的Swf文件还是平铺的Swf文件。
第一个字节是Signature byte,如果是'F'表示该Swf文件没有压缩过,如果是'C'表示该Swf文件采用了deflate算法压缩。
这里需要注意的是,Swf文件的压缩从容是从SWF File Header的第9个字节开始的,也就是从FrameSize字段开始,就全是压缩的内容了。
这里同时给大家提供一个建议就是,对于纯位图的资源文件,建议不要采用压缩的文件。因为本身所有的位图数据不是采用JPEG格式压缩的就是采用zlib格式压缩的,如果再采用压缩格式的Swf,那就会导致用户的Flash Player需要解码两次才能访问图片数据。

Abc文件格式

Adobe在设计Avm2和Abc文件格式的时候,大量参考了Java的设计。Abc文件格式几乎是Java中的class文件格式的翻版。
此外Adobe在Swf文件格式和Abc文件格式使用了大量的相似但是不同的基本数据格式,最典型的例子就是可变长无符号整形的存储,在Swf文件格式中是U30格式,最多使用4个字节,但是到了Abc文件里面就变成了AbcU30,最多使用5个字节。给开发工作带来了很多麻烦。
Abc文件格式是一种结构化的文件格式,主要由以下几个部分组成:

  • 版本号

    Abc文件格式的版本号,现在只有一种可能,就是16.20

  • 常量池

    常量池是Flash为了减小Swf的体积,加快Swf的运行速度设计的一个基础设施,主要包括了“整形常量”、“无符号整形常量”、“双精度浮点常量”、“字符串常量”、“命名空间常量”、“命名空间集常量”、“Multiname常量”,非常多,但是对于咱们程序员而言并不复杂。

  • 元数据

    主要是各种类、方法、函数、常量、属性等等等等的声明信息

  • 方法体

    方法具体包含的的指令都在这个部分保存。

Abc文件格式的具体内容,限于篇幅就放到下篇文章里面吧!

参考资料

 

快速连接

posted @ 2011-01-17 17:28 TonyHuang 阅读(1169) 评论(6) 编辑
  2011年1月11日
在2010年11月28日,我在盛大举办的WeDoSwf会议上,我做了一个演讲,主题就是关于Swf的文件格式和Abc文件的混淆。 最近一个多月的时间里面,各种零零总总的事情特别多,一直没有时间把这个东西整理好放到博客中。 首先呢,把我的演讲的视频的ppt放上来: 视频: http://v.ku6.com/show/MwjMgfhEgUFoiZ.html PPT: http://www.slideshare.net/swfsh/swfabc 然后呢,经过我们的努力,我们已经将这个东西做成了一个产品,有兴趣的朋友可以去我们的公司主页上下载试用。 Ok, 接下来切入正题:

出发点和目标

现在游戏行业已经越来越激烈,竞争对手之间的不正当竞争手段也越来越恶劣。 而现在的游戏的内核已经越来越重要,由于Flash的局限性,每个厂商都都会设计一些高性能的算法以支持复杂游戏的流畅运行。 在这同时,由于Flash和Web环境的特点,网页游戏的外挂简直泛滥到了一定的程度。 所以,我们加密Swf文件要达到如下的几个目的:
  • 防止游戏中的高性能算法被他人盗用
  • 防止游戏的客户端成为外挂编写者的参考资料
  • 防止游戏被破解后,广泛传播,却不能给开发者带来合理的收益
所以,我们不能任由他人践踏我们的知识产权。 现在在市场上,最流行的Swf反编译软件主要有两款:
  • 硕思闪客精灵

    说来惭愧,我是这款软件的正版用户。这款软件应该是市面上用户界面最友好,使用面积也最广的Flash破解软件了。个人认为他的主要强项在于资源文件的破解。它的反编译引擎比较傻瓜,依葫芦画瓢,所以我们插入的混淆代码能起到很好的作用。

  • ASV

    ASV也是市面上非常流行的反编译软件。它的侧重点恰恰相反,在于AS代码的反编译上面,它反编译出来的代码可读性非常强,如果swf是采用Debug编译的,基本上能够反编译几乎完全相同的代码。试用我们的方法进行混淆了以后,用ASV打开文件,就会发现,它根本无法正常识别AS脚本。

所以,我们加密的目标也就是要保证,这两款软件的最新版本也无法破解我们的软件,即:
  • 硕思闪客精灵 5.6
  • ASV 2010/6

效果

直接上图是最给力的,先把我们的加密效果发布出来大家围观一下吧:
posted @ 2011-01-11 22:07 TonyHuang 阅读(1288) 评论(3) 编辑
  2010年11月2日
摘要: 本文是我博客的镜像,原文地址是:http://www.greatony.com/?p=73系列文章引言众所周知,我是个彻彻底底的C#控,但是没有东西是完美的,C#也是一样,所以在这里我就yy一下,设想一下我心中C#将来的样子,故取名为《C#狂想曲》系列。测试程序为了体现对C#的变化,我设定了一份游戏编程中经常遇到的程序作为标准来体现变化。Code highlighting produced by ...阅读全文
posted @ 2010-11-02 15:08 TonyHuang 阅读(1523) 评论(26) 编辑
  2010年3月21日
摘要: 由于cnblogs的代码着色系统不支持erlang,所以就直接从博客上贴过来了,如果大家看的不习惯的话,就直接来我的博客上看吧本文章为本人个人博客相应文章的镜像:原文地址:http://www.greatony.com/index.php/2010/03/21/mapreduce-algorithm-implemented-in-erlang-i/Google曾经发过3篇引起巨大反响的论文:The...阅读全文
posted @ 2010-03-21 18:03 TonyHuang 阅读(993) 评论(4) 编辑
  2010年3月18日
摘要: 由于cnblogs的代码着色系统不支持erlang,所以就直接从博客上贴过来了,如果大家看的不习惯的话,就直接来我的博客上看吧本文章为本人个人博客相应文章的镜像:原文地址:http://www.greatony.com/index.php/2010/03/18/a-combination-algorithm-written-in-erlang/在上一篇博客中,我用Erlang实现了一个优惠计算器,...阅读全文
posted @ 2010-03-18 21:51 TonyHuang 阅读(424) 评论(1) 编辑
  2010年3月17日
摘要: 由于cnblogs的代码着色系统不支持erlang,所以就直接从博客上贴过来了,如果大家看的不习惯的话,就直接来我的博客上看吧本文章为本人个人博客相应文章的镜像:原文地址:http://www.greatony.com/index.php/2010/03/17/cashback-calculator-written-in-erlang/今天在为公司买东西的时候,发现了qq的一个网站:QQ返利后来又...阅读全文
posted @ 2010-03-17 01:03 TonyHuang 阅读(531) 评论(0) 编辑
  2010年2月25日
摘要: 本文章为本人个人博客相应文章的镜像:原文地址:http://www.greatony.com/index.php/2010/02/25/mini-toy-long-connection-tester/好吧,我承认我起了个很罗嗦的名字。事实是这样的,今天研究mochiweb,然后利用mochiweb写了一个长连接web服务器用以实现游戏中的聊天功能。写到一半的时候,当然要弄个小测试自high一下啦,...阅读全文
posted @ 2010-02-25 22:08 TonyHuang 阅读(102) 评论(0) 编辑
  2010年2月24日
摘要: 本文章为本人个人博客相应文章的镜像:原文地址:http://www.greatony.com/index.php/2010/02/24/speed-of-object-creation-in-dotnet-iv/在这片文章中,我们暂时放一放Activator.CreateInstance(Type)和Activator.CreateInstance<T>()之间的性能差异,去探索一下,...阅读全文
posted @ 2010-02-24 12:58 TonyHuang 阅读(168) 评论(0) 编辑
摘要: 本文章为本人个人博客相应文章的镜像:原文地址:http://www.greatony.com/index.php/2010/02/20/speed-of-object-creation-in-dotnet-iii/从前面的文章,我们发现以下两点有趣的东西:使用System.Activator的非泛型方法比使用泛型方法快很多(超过200%)使用泛型约束和new关键字创建的速度几乎和System.Ac...阅读全文
posted @ 2010-02-24 09:16 TonyHuang 阅读(2825) 评论(7) 编辑
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

昵称:TonyHuang
园龄:2年2个月
粉丝:2
关注:1

搜索

 
 

常用链接

我的标签

随笔档案

最新评论

阅读排行榜

评论排行榜

推荐排行榜