使播放器从句子中间开始读数据
让我们开始讨论“是播放器从句子中间读数据”的破坏反编译器的技术。
首先,我举一个现实世界的例子:
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格式的文件,将详细解释怎样制作这样的受保护文件