2024年5月31日发(作者:)
现在主要的对swf文件防破解的途径有两种,第一是防止用户将swf文件下载下来,或
者是限定swf文件只能在指定url上运行。但是考虑到用户总是有办法把swf文件down下
来,因此这只能作为一个辅助的手段来执行。当前的主流软件也基本上提供了对运行domai
限制的功能。
第二就是对swf文件进行改造了。现在主要的方法有如下几种。
一、加壳。对此方法说法不一,摘录其中一人的做法。
我的加密方法(直接对原始.swf):
1.加壳“使用loader读入原始.swf”对bytearray重新编码,save加壳.swf;
加壳.swf(已无法正常运行)到loader类,传加壳.swf给alchemy,使用1中方法
去壳(重新编码)得到原始.swf 传给flash,
3.使用loader加载原始.swf,addChild到舞台.
二、注入随机跳转指令和垃圾代码,此方法会一定程度上降低swf运行效率,一定程度
上降低代码可读性。但是可以通过手工有效反加密,网上也有软件可以破解SWF Decrypt。
三、混淆。通过对网上方法的调研,这是唯一有效降低反加密有效性的方法。通过
rename可以很大程度上降低反加密之后的可读性。
混淆的分类:
一,对类名混淆,将包的名字都去除,消除工程自带的包结构。
二,混淆类的常量、静态方法。
三,混淆实例常量、变量以及方法。
局部变量的混淆可以将需要混淆的变量添加到一个列表,然后按顺序对其赋值。
类名的混淆需要考虑到对它的引用,要在所有引用处同时混淆。
方法的混淆需要考虑很多问题,比如override,以及接口实现。有些方法如
addeventlistener等不应该被混淆,对此可以建立一个特殊字符集,其中的内容不应该被混淆。
另外,有些变量名是从外部读取的,如果在程序里进行了混淆,也要在外部相应的地方进行
修改。
摘选自网上
先讲混淆 数值来自个人java编译的经验 仅供参考
1 包名 类名 变量名 函数名 混淆成无规则短名字
可读性 低 文件容量 减小 运行内存 减小 运行速度 微量微量变快
2 包名 类名 变量名 函数名 混淆成定长无规则 IlO0o的组合 例如 l0OI0Ol1lI0O
可读性 很低 文件容量 变大(一般情况) 运行内存 变大(一般情况) 运行速度 微量微量变
慢
3 将const替换为直接数
可读性 低 文件容量 减小 运行内存 减小 运行速度 微量变快
4 合类 将数十个类 合并为一个类 例如ur()变成主类里的Clock_NextHour();
可读性 很低 文件容量 未知(java会变小) 运行内存 变小(一般情况) 运行速度 未知
5 随机插入无关代码与函数或变量或类 配合混淆会很不错
可读性 中 文件容量 变大 运行内存 变大 运行速度 微量变慢
6 拆类 或者 跨类访问 例如将一个类的函数分拆到几十个类里 配合废代码看着让人容易
放弃
可读性 低 文件容量 变大 运行内存 变大 运行速度 略变慢
7 用&& || 来处理if else
可读性 中高 文件容量 - 运行内存 - 运行速度 -
1 2 3我已经做了 4 6有java的工具 5 7很好写
另外,还有一个辅助性的方法是用byteArray。它的加密原理是先用URLLoader把swf文件
加载近来,URLLoader把swf文件加载进来,得到URLLoader的data属性(byteArray类型),
然后把这个byteArray数组进行分解,得到一个8位的字节流。然后对这个字节流进行位移
(也就是加密的数字,文章中用的是+13),最后得到一个新的字节流数组,进行保存。
解密的方法也是如此:先把文件导入进来,得到byteArray,分解成8位的字节流,(解密方
法就是对字节流进行反位移,也就是加密是+13,解密就是-13),这样生成新的字节流数组
就是可以使用的swf文件了。这么做的一个问题是可以通过解密的swf轻易破解,因此可以
用其他方法或软件将这个swf文件加密。
已测试软件有 FPE4.8.6, swf-protect, secureSWF, swfspy-1.7.0, swfcry002等,其中效果最好
的应该是secureSWF。
发布评论