1.Flash加密解密(一)——doswf混淆还原
2.Flash加密解密(二)——Doswf生成代码分析
3.Flash加密解密(三)——特殊混淆让asv2010解析代码失败
从前面两节的分析可以看出,脆弱的swf文件极其容易被一些现成的工具反编译回可执行源代码。一旦可以进行动态调试,那 么这个文件将被他人掌控,即使你使用了最先进的加密算法来保护你的资源,但是你的解密操作总会暴露在你的代码中。所以必须重点保护好代码来确保核心算法以 及资源安全。
混淆的意思就是改变函数或变量名,让解密者难以很直观的看出其中的含义。对于编译好的swf文件来 说,它保存有全局变量以及函数名信息,但是在虚拟机运行的时候,这些变量名和函数名对于执行并没有影响,虚拟机只依靠他们id来区分他们。这种机制就给予 我们混淆带来了便利。我们可以对其中的变量名和函数名进行修改,让他们被反编译回去后,重新编译会发生错误,这样就增加了破解的复杂程度。
这次给大家介绍如何手动混淆一个swf文件,并提供一种方法,只需要改变swf中的一个字符,就可以使asv2010无法正常解析出代码。
现在开始我们的内容~
本帖隐藏的内容
首先我们先写一个测试文件,这个文件的作用是在舞台上显示一个“hello”的文本框,并设置其alpha值,代码如下:
- package
- {
- import flash.display.MovieClip;
- import flash.text.TextField;
- import flash.text.TextFormat;
- public class Test extends MovieClip
- {
- private var a1:int;
- private var a2:Number;
- private var a3:String;
- private var t1:TextField;
- public function Test()
- {
- a1 = 275;
- a2 = 200;
- a3 = "test2";
- t1=new TextField();
- fun1();
- fun2();
- fun3();
- }
- public function fun1()
- {
- t1.x = a1;
- t1.y = a2;
- t1.text = "hello";
- addChild(t1);
- trace(t1.text);
- }
- public function fun2()
- {
- t1.alpha = 0.8;
- }
- public function fun3()
- {
- t1.rotation = t1.rotation * 0.8;
- }
- }
- }
运行结果如下:
我们导出swf文件,然后用WinHex文件打开(如果swf文件被压缩,则先解压缩后在打开),我们可以看到swf文件中的内容:
具体文件各个地方表示的什么意思,可以参考官方文档。
我们往下面翻,可以看到:
我们刚才代码中定义的全局变量和函数的名字都在这里。
现在我们就可以对他们进行混淆了,你可以选择你喜欢的字符进行混淆。
我们对这些名字进行更改,将所有字符都改为数字:
保存后,发现swf可以正常运行,导入到asv中查看:
发现函数名和变量名都变成了数字,如果重新编译将无法通过。
如何让asv获取不到任何代码(仅针对asv2010及以前版本)?其实很简单,我们只需要打开编译好的swf文件,然后将任意变量名的第一个字符改为一个特殊字符,如下:
我们发现asv没有解析出任何代码: