SWF文件加密、混淆
简单说下SWF文件的混淆原理,(已经明白的请跳过本段):我们的AS源代码被编译完成后,SWF内部会形成一个字符串映射表,包含源码里出现的所有字符串(类名,包名,成员变量名,常量等)。一个数字(相当于地址指针)对应一个全局唯一的字符串。而原本的代码片段包含的字符串都会被替换为对应的数字指针。代码实际执行过程用的都是这些数字指针。所以即使你修改了映射表内的字符串内容(不能修改Flash API的关键字,会导致调用接口失效),通常对代码执行过程也不会产生影响。而反编译就是根据数字指针从这个映射表取出对应字符串填回代码,最后生成人可以阅读的源代码。其实所有语言生成的程序都是可以被反编译的。只是其他语言编译后没有存储明文字符串。还原了也没有可读性。SWF可以被反编译破解出来正是因为存储了明文的字符串。所以我们选择性的替换这个映射表的内容为毫无意义的其他字符串。这个程序就像二进制一样没有可读性了。这就是混淆的基础。
还有另一种流行的SWF保护方式:加密。简单说就是对SWF文件的字节流按一定规则篡改,然后运行时再还原回来。但是加密无论如何层层处理,最终都是要在内存中还原出原始的swf。所以有经验的破解者根本不用去猜你的加密算法,直接从最终结果内存抓取即可。不像加密,混淆才是真正二进制安全的方法。因为生成的SWF文件本身已经不包含可读性的代码了,这是一个不可逆的过程。
混淆之所以一直没有被主流采用,我认为最主要的原因是它很容易带来隐藏Bug。先说下传统的混淆方式。都是在导出发新版的SWF后,用第三方的库去解析SWF文件字节流,然后修改里面的字符串映射表内容。(这个方式有现成的第三方库,可以参考这个帖子)因为所有的字符串都是合并起来的,你修改一个字符串,就会同时影响到所有引用它的地方。举个例子:你自定义了一个类叫Sprite,那么这个类的类名会和flash.display.Sprite的“Sprite”共用一个数字指针。你要是修改了这个字符串的内容,你可以实例化你自定义的那个类(只是名字改了无所谓),但想实例化Flash API的Sprite时就会出错,会提示在那个包里找不到这个修改过的类名。还有通过字符串属性去访问的方式,被修改了之后也会带来各种问题。
所以混淆的关键其实是:确定哪些是可以安全修改的关键字列表。答案是没有通用办法。大家都只能根据自己项目的特点来写。很少能做到一个工具通吃所有情况。而且即使针对自己项目写的,也不敢100%保证获取的关键字列表是安全的,因为项目代码一直在变化。你每次发版本都得测试一遍,如果是隐藏很深的Bug,基本都很难发现,也无从测试。加上学习成本,大部分人自然就优先选择加密的保护方式了。因为写一次工具就可以无限复用。
原文:http://blog.domlib.com/articles/582.html
转载于:https://www.cnblogs.com/lcyuhe/p/4680330.html
SWF文件加密、混淆相关推荐
- swf文件加密基础(转)
本来打算下班回来就写这个东西,一方面算是对今天学习的一个笔记记录,另外一方面,给一些朋友普及一些swf文件加密基础知识.之所以说是基础,那是因为我也是刚学习了一点,灰常的基础.不过晚上看了一会我是传奇 ...
- 如何保护swf文件,加密代码(译)
在我的培训课程中我常常被问到有关保护SWF影片的问题.这里有两种方法:一种是加密代码,让它难以被别人反编译和使用:另一种方法是限制SWF文件在哪些地方可用,这样别人就不能随意将你的SWF影片放在他们的 ...
- swf文件二进制数据流加密基础
现在新建一个类EncryptTool.as,他的作用就是对这个动画加密.这里要注意的是,因为要加密文件,就会涉及本地文件读写操作,普通flash player是不支持的,需要建立AIR工程运行. 在说 ...
- 介绍几种swf文件的加密方法
目前几种流行的加密方法: 第一种是使用"swf encrypt".或者doSWF软件加密,个人认为swf encrypt 的加密不太好,原因不是它算法不够强或者什么的,而是闪客精灵 ...
- vue配置加密_HBuilderX中配置JS/NVUE文件原生混淆加密
App的安装包都可以解压.前端资源,一般都是明文存放在安装包中,为防止解压后泄露敏感信息,需要进行安全处理. 由此DCloud提供了App端的js/nvue文件的原生混淆.5+App或wap2app支 ...
- 破解加密过的SWF文件
Flash制作的文件格式是swf,有些人在制作时都会加上输入保护,然后转成EXE文件.这样我们就不能用Flsah程序打开来编辑这个文件了,这样做可以维护作者的版权,但如果你不是出于商业用途,而只想获得 ...
- exe一机一码加密工具_Python代码加密混淆
我多想再见你 哪怕匆匆一眼就别离 python作为一种解释型语言,源代码加密本身比较困难.但有时候我们在发布一款python产品时又必须考虑到代码的加密性,以避免源代码泄露.为此,我查阅了一些资料,研 ...
- 【Android 安装包优化】开启 ProGuard 混淆 ( 压缩 Shrink | 优化 Optimize | 混淆 Obfuscate | 预检 | 混淆文件编写 | 混淆前后对比 )
文章目录 一.开启 ProGuard 混淆 二.混淆文件编写 三.混淆前后对比 四.build.gradle 完整配置文件 五.参考资料 一.开启 ProGuard 混淆 在 build.gradle ...
- 【Android 安全】DEX 加密 ( Java 工具开发 | 解压 apk 文件 | 加密生成 dex 文件 | 打包未签名 apk 文件 | 文件解压缩相关代码 )
文章目录 一.解压 apk 文件 二.加密生成 dex 文件 三.打包未签名 apk 文件 四.完整代码示例 五.文件解压缩相关代码 六.执行结果 参考博客 : [Android 安全]DEX 加密 ...
最新文章
- 三维重建的核心模块有哪些?
- 调用本地html_requests-html:最简单的爬虫框架,看完你就会了
- 如何应对安全漏洞的修复
- Windows下的磁盘管理(二)
- 《数据库系统概念》9-附加关系运算
- grep,egrep及元字符和posix字符集
- Lync Server存档和监控服务器PART A:准备篇
- Windows 2008远程桌面配置多用户登陆的方法
- SAP UI5 应用开发教程之三:开始接触第一个 SAP UI5 控件
- MySQL Incorrect string value: 有可能是字符串长度不够了
- jedispool redis哨兵_通过java哨兵JedisSentinelPool代码示例连接对配置的redis哨兵主从模式进行测试验证...
- 超5400亿!教育部公布2022年部门预算
- linux awk入门,awk入门应用
- 中间固定两边自适应 两边固定中间自适应 promise
- html图片分四面切割播,JS+CSS实现3D切割轮播图
- java实现签名和解签
- C语言实现斐波那契数列
- C语言内存空间分布详解
- 开机输入用户名密码时弹出被调用对象已与其客户端断开连接解决方法
- Linux 下的dd命令使用详解以及dd if=/dev/zero of=的含义