zoukankan      html  css  js  c++  java
  • 谈谈加密和混淆吧[转]

    2009年4月15日 | 分类: flash | 标签: confuse, encrypt, flash, 加密, 混淆

    还是谈谈自己一直在做的一个应用:flash加密及混淆。从去年8,9月份开始研究。先是研究swf的文件结构,然后是abc的结构。慢慢也明了swf运 行的原理。特别是研究abc结构后,收获很多。然后在写as代码的时候会联想到这些会编译后对应的指令。比如 var a:Number = 3。对应指令就先在local数据中设置一个空间:null,接着一个指令将该空间转换为Number类型,然后添加一个byte数据3到scope,最 后才是指令将3复制到给先前的空间。a字段是不会被编译进去的,这就是为什么用编译软件看到的临时变量都不是原先的名称;再引申下,你可以尽量明了的命名 临时变量,比如:var theFirstValue:Number = 0, 而不用var b:Number = 0。很明显theFirstValue很适合阅读,而且反正也不会编译到swf中去,不用担心太长而增加swf体积。

    接下来自己便开始做 加密。先想到的是加壳的方法。后来和别人一交流,才发现,这种方法其实已经早已不是什么新想法了。只要你研究写swf的文件结构,就很容易想到这个方法。 虽然后来想久,尝试很久,还是没有更好的加密方法。其实对于swf而言,已没有加密可言。除非借助与第三方交互。或者adobe自己的人去加密——毕竟 swf文件结构白皮书公布的信息只是一部分而已。所以,最好还是混淆。

    加密完成之后,我就开始研究混淆。研究过abc结构的人,应该都很 清楚:要混淆一个方法、一个类名其实很容易。比如你有一个类ABCD,这时候你只要在abc数据中找到这个ABCD,替换为你想混淆成的样子,比如 aaa1。重新组装abc,就完成了混淆。但是如果你有一个类alpha呢?你将alpha混淆成aaa1了。然后你会发现你的代码:(new MovieClip).alpha = 0.3;变成了(new MovieClip).aaa1= 0.3;——swf是一个高压缩的文件格式,abc也是如此。它不可能为同一个字段保存两字。也就是说你的类名alpha和属性alpha引用的是同一数 据,当这个数据被改变是,一切引用该数据的地方都改变了。于是,你需要一个操作:将不混淆字段复制。就上面这个例子:将alpha数据复制一份给“new MovieClip”使用,而类alpha使用的一份进行混淆。
    好,这样完成了一小部分。但是还会有问题。比如你从服务器接受了一个xml数据:
    <root>
    <title>best wish to demi</title>
    </root>
    然 后你会通过xml.title来得到这个数据。但是你恰恰这个时候有类方法:public function get title():String。然后你混淆了title为aaa1,然后xml.titlt变为xml.aaa1了,就获取不到数据了。于是又涉及到一个 问题了:特殊字段。还比如:
    getDefinitionByName(”MainAPP”); MainAPP是特殊字
    ExternalInterface.call(”eval”, “alert(’asdf’);”); eval是关键字
    等等。有了这些特殊字和copy字段后,就可以进行大力混淆了。当然本人研究也是有限,很多情况没有遇到过,所以肯定会漏掉一些情况。

    以上只是自己的对加密和混淆的一些心得。有不对的地方,敬请指正。
    另外就是可以下载DoSWF,里面有上面谈到的加密和混淆功能。

  • 相关阅读:
    SGU 271 Book Pile (双端队列)
    POJ 3110 Jenny's First Exam (贪心)
    HDU 4310 Hero (贪心)
    ZOJ 2132 The Most Frequent Number (贪心)
    POJ 3388 Japanese Puzzle (二分)
    UVaLive 4628 Jack's socks (贪心)
    POJ 2433 Landscaping (贪心)
    CodeForces 946D Timetable (DP)
    Android Studio教程从入门到精通
    Android Tips – 填坑手册
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/1590611.html
Copyright © 2011-2022 走看看