在网上发现一个Flash小工具,原本打算用于课堂演示,便顺手保存到本地。没想到下载完成后再次打开,画面却完全无法显示,没有任何反应。
这让我想起一位朋友曾在处理新东方英语Flash文件时遇到类似情况。翻出他当年的笔记后,我才恍然大悟:原来Flash文件中也可以嵌入反编译代码。
用SWF Decompiler工具将文件拆解后扫描,果然发现ActionScript脚本中隐藏了两个用于检测自身URL的条件判断。伪代码如下所示:
if (target._url.indexOf("somenonexistenthost.com") != -1 || ...){ // 正常播放逻辑}else{ // 弹出"sorry"界面}
逻辑非常清晰:Flash会检查其所在URL中是否包含特定关键词,如果不包含,则执行"抱歉,无法播放"的分支。
那位朋友当初采用的方法是直接替换函数——将异常处理函数替换为正常播放函数。但仔细一想,对于本地硬盘上的文件而言,所谓的URL其实就是完整的文件路径。只要文件路径中包含上述任意一个关键词,就能绕过检测。于是我尝试将文件名改为 web187.swf,果然可以正常播放了。
那么,如何更彻底地去除这个检测,使得任意文件名都能正常播放呢?最初的想法是将检测字符串替换为反斜杠 \,因为文件路径中必然包含该字符。后来发现,其实有一个更简便的方法:直接改变检测字符串的长度,例如删除末尾一个字符。这样,Flash会将原字符串解析为空字符串,而 indexOf("") 永远都不会返回 -1,因此检测条件自然就满足了。
可见,绕了一大圈,最终却用了一个看似最笨实则最聪明的方法。
