2007-02-07

[转]一个swf花指令

摘自csdn文章,我就遇到过这样的花指令,使得Sothink SWF Decompiler 3.3 不能正常工作


例1 : 向前跳转的包含无效尺寸数据的死代码。
push True
branchifTrue label2
constants ''"
label2:
push 'a',3
setVariable

你仔细看的话,会发现"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和随后两个字节),然后所有的东西都得到反编译。
例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就可对付这种技术了。

No comments: