学院首页 新闻频道 学院概况 网络学院 院系设置 师资介绍 教学成果 招生就业 实践基地 校园文化 视频 论坛
  ◎    网络学院首页
  ◎    影视动画
  ◎    动漫设计
  ◎    影视广告
  ◎    视觉传达
  ◎    环境艺术
  ◎    人物形象
  ◎    电脑艺术
  ◎    电视摄像
  ◎    电视制作
  ◎    多媒体
  ◎    摄影专业
  ◎    播音主持
  ◎    影视表演
  ◎    新闻采编
  ◎    编导专业
  ◎    电视网络
  ◎    电视制片
  ◎    师生交流
  ◎    意见采纳
  ◎    我要投稿
 
 
    您认为网络学院那些栏目仍然需要加强?
专业新闻
理念论文
软件教程
作品赏析
专业资源

  
    您最想了解哪一类型的专业知识?
理念文献
软件教程
素材资源
作品赏析

  



如何防止SWF文件被反编译?
作者:佚名    文章来源:http://www.yy0736.com/    点击数:    更新时间:2006-6-22

依据数据尺寸(句子)分块反编译

大多数之所以能够成功的迷惑或者破坏反编译器,原因在于播放器和反编译器的不同行为。播放器逐个的执行字节码,就像现实世界中的读书一样,一个单词,接着下一个单词。然而反编译器通常将字节链分成有意义的片断,犹如现实世界中的读书一样,一个句子,接着下一个句子。

反编译器的行为如此简单的原因在于大多数的p-code都是遵循数据大小规律的。对于字节码("96 08 00 00 61 00 07 03 00 00 00 1D"),反编译器遇到代表"push"操作的0x96时会想“push什么呢”?下个字节(0x0008)指示的内容:接下去8个字节中的内容压入堆栈,即把("00 61 00 07 03 00 00 00")压入堆栈。所以,通常反编译器依据数据大小将简短的片断切成一块一块的,这样便会解释成“push something”。因此,("96 08 00 00 61 00 07 03 00 00 00")就成为一个句子。下一个字节是下一个句子的开始,就是代表"setVariable"的0x1D。这样8个字节的"something",将被更进一步解释成一个字符串“a”和一个数字“3”。

让我们来看一下字节码:("99 02 00 05 00 96")。0x99意味着分支(或者跳转),在哪里分支呢?接下去的是(0002),因此数据存储在机下去的两个字节中,将它在下面两个字节处截断。总之,我们知道"99 02 00 05 00"是个句子。接下去的是0x96,代表下个句子的开始。

再看第三个例子,字节码:("88 08 00 03 00 63 00 62 00 61 00 96 07 00")。0x88代表定义常数,定义的常数内容是什么呢?后续字节(0008),表明常数内容存储在后继的8个字节中。所以,句子就是:("88 08 00 03 00 63 00 62 00 61 00")。代表下个句子开始的("96 07 00 ...),意味着将7个字节的数据压入堆栈。

因此,字节码砍成单独的句子。每个句子由命令和数据组成,并且以命令打头。因此,每个句子都是一个基本的单元。理论上来说,对于这种方法没有什么错误。


使播放器从句子中间开始读数据

让我们开始讨论“是播放器从句子中间读数据”的破坏反编译器的技术。

首先,我举一个现实世界的例子:

John says good morning.
Mary says thank you.
现在生成SWF文件:
skip 9 words
Tom says John says good morning.
skip 3 words
back 7 wordsMary says thank you.

如果逐个字读的话,结果和原来一样,然而反编译器按句子来读取,自然发生错误。第一,它知道Tom说了什么,但语法不对,汇报出错;第二,它没有看到第二个“skip”命令,因为它处于句子中间;第三,当它被迫退回7个字后,感到迷惑,认为应该从“Tom said”开始执行整个句子;第四,这个错误使它在第二行和第三行之间陷入无限循环之中。

总之,我们增加了“Tom said”这句垃圾代码,并提供整个句子长度的错误数据大小信息。这个错误的长度覆盖了“skip”命令。

来看个真实的例子,请注意,这些技术需要操作字节码,纯actionscript不能够实现。

  例1 :

向前跳转的包含无效尺寸数据的死代码。

push True
branchifTrue label2
constants ''label2:push 'a',3setVariable

你仔细看的话,会发现"constants ''"这行是垃圾代码,它不可能被执行到。然而,理论上,当第二行的结果为"not True"时,它将被执行。因此,反编译器尝试对它进行反编译。

让我们来增大"0x88 - constants"后面的"sentence size",从而包括知道脚本结尾的所有字节。你知道,反编译器将把字节码砍成像这样的3个句子:

push True
branchifTrue label2
constants label2: push 'a',3 setVariable

如果你试图反编译此SWF文件,根据我前面提到的4个错误,一些反编译器将碰壁。仍旧有些反编译器幸存,但只是显示:"if(false){};"。ASV 3也不能显示此脚本,但是ASV 4能够显示。为了破解这个SWF,我们移除死代码"constant xxxx", (0x88和随后两个字节),然后所有的东西都得到反编译。

这儿是zip格式的文件,将详细解释怎样制作这样的受保护文件。

  例2:

先后跳转的包含无效尺寸数据的死代码。

push 'b'
label1:
push 'a',3
setVariable
branch label2
branch label1
label2:push 'b'是句垃圾代码,我们将修改它,用来使ASV 4碰壁。让我们来修改push 'b'的"length of sentence"。修改"0x96"后面的2个字节的数据,使句子的长度增长到分支Label1之前。这样,反编译器将把字节码作为3个句子:

push label1: push 'a',3 setVariable branch label2
branch label1
label2:

现在,反编译器不知道将把什么压入堆栈,同样它将在第一个句子和第二个句子之间形成死循环。这种技术将使大部分反编译器碰壁。Flasm、ASV 4同样也无效。为了破解这个SWF,我们手工删除"push b" (0x96和后随的2个字节),这样所有的东西都可反编译了。

当这个技术流传后,burakk将修改ASV 4,使它能正确处理死循环。这样下个版本的ASV就可对付这种技术了。

这儿是zip格式的文件,将详细解释怎样制作这样的受保护文件

非显示字符和混淆器

除了阻碍反编译器的技术之外,我们还可以使反编译的结果不容易读。你可以浏览关于混淆器的网站。

基本上,它是对变量和函数的名字进行重命名。

 

上一页  [1] [2] [3] 下一页

文章录入:李晋静    责任编辑:李晋静 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
      相 关 文 章
    浅谈如何更好的在现代图形设计中运用汉字
    学李英爱如何打造透明肌肤
    如何拍一张好照片
    如何知道相片是什么相机拍的?
    Photoshop中如何计算选区面积大小
    如何表现人物的“相貌”?
    国画如何分类?
    如何使用摄像机清洁带
    日本动漫是如何吸引青少年的
    Premiere中如何定制VCD的项目设置
     
    最新热门图片  

    网页色彩的情感表现

    网站的色彩表现

    Photoshop:超强抠图合…

    网站的色彩信息量
    最 新 热 门
    最 新 推 荐
    关于我们 广告服务 法律声明 联系方式 常见问题 中国生活网 留言 论坛 帮助
    广播电影电视管理干部学院版权所有 Copyright 2001-2006 ARFT.net All Rights Reserved
    感谢动易网络科技有限公司友情提供技术支持,山西艺龙影视信息中心(有限公司)运营