`
ch_kexin
  • 浏览: 877995 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

Flash加密解密(三)——特殊混淆让asv2010解析代码失败

 
阅读更多

1.Flash加密解密(一)——doswf混淆还原
2.Flash加密解密(二)——Doswf生成代码分析

3.Flash加密解密(三)——特殊混淆让asv2010解析代码失败

从前面两节的分析可以看出,脆弱的swf文件极其容易被一些现成的工具反编译回可执行源代码。一旦可以进行动态调试,那 么这个文件将被他人掌控,即使你使用了最先进的加密算法来保护你的资源,但是你的解密操作总会暴露在你的代码中。所以必须重点保护好代码来确保核心算法以 及资源安全。

混淆的意思就是改变函数或变量名,让解密者难以很直观的看出其中的含义。对于编译好的swf文件来 说,它保存有全局变量以及函数名信息,但是在虚拟机运行的时候,这些变量名和函数名对于执行并没有影响,虚拟机只依靠他们id来区分他们。这种机制就给予 我们混淆带来了便利。我们可以对其中的变量名和函数名进行修改,让他们被反编译回去后,重新编译会发生错误,这样就增加了破解的复杂程度。

这次给大家介绍如何手动混淆一个swf文件,并提供一种方法,只需要改变swf中的一个字符,就可以使asv2010无法正常解析出代码。

现在开始我们的内容~

 

本帖隐藏的内容


首先我们先写一个测试文件,这个文件的作用是在舞台上显示一个“hello”的文本框,并设置其alpha值,代码如下:

  1. package
  2. {
  3.         import flash.display.MovieClip;
  4.         import flash.text.TextField;
  5.         import flash.text.TextFormat;
  6.         public class Test extends MovieClip
  7.         {
  8.                 private var a1:int;
  9.                 private var a2:Number;
  10.                 private var a3:String;
  11.                 private var t1:TextField;
  12.                 public function Test()
  13.                 {
  14.                         a1 = 275;
  15.                         a2 = 200;
  16.                         a3 = "test2";
  17.                         t1=new TextField();
  18.                         fun1();
  19.                         fun2();
  20.                         fun3();
  21.                 }
  22.                 public function fun1()
  23.                 {
  24.                         t1.x = a1;
  25.                         t1.y = a2;
  26.                         t1.text = "hello";
  27.                         addChild(t1);
  28.                         trace(t1.text);
  29.                         
  30.                 }
  31.                 public function fun2()
  32.                 {
  33.                         t1.alpha = 0.8;
  34.                 }
  35.                 public function fun3()
  36.                 {
  37.                         t1.rotation = t1.rotation * 0.8;
  38.                 }
  39.         }
  40. }
复制代码

运行结果如下:

1.png

我们导出swf文件,然后用WinHex文件打开(如果swf文件被压缩,则先解压缩后在打开),我们可以看到swf文件中的内容:

 

2.png

 

具体文件各个地方表示的什么意思,可以参考官方文档。

 

我们往下面翻,可以看到:

 

3.png

 

我们刚才代码中定义的全局变量和函数的名字都在这里。

现在我们就可以对他们进行混淆了,你可以选择你喜欢的字符进行混淆。

 

我们对这些名字进行更改,将所有字符都改为数字:

 

5.png

 

保存后,发现swf可以正常运行,导入到asv中查看:

6.png

 

发现函数名和变量名都变成了数字,如果重新编译将无法通过。


如何让asv获取不到任何代码(仅针对asv2010及以前版本)?其实很简单,我们只需要打开编译好的swf文件,然后将任意变量名的第一个字符改为一个特殊字符,如下:

7.png

 

我们发现asv没有解析出任何代码:

8.png

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics