AS3 swf文件混淆加密器(SWF Protector)
一个swf文件混淆和加密的工具,需要flash player10才能运行。
混淆功能:可混淆类名、方法、变量、包等。可排除混淆特定字段,比如一些xml节点名、接口方法等可能被误混淆导致混淆后无法运行,这样可以排除这些字段。
加密功能:一种常见方案,swf自身加载再重新组装字节码。(目前如果你的swf使用了loaderInfo.parameters来传入参数的话,暂时不要使用此加密功能。)
使用方法:
1、选择swf文件。
2、在混淆区域选中debug mode,点击混淆按钮。然后你可以先保存并运行swf文件,看是否混淆成功。如果运行出错,可以根据报错结果排除一些特定的字段再混淆。对于复杂的swf可能需要多次尝试才能排除所有特殊字段。
3、在2成功后,关闭debug mode,再点击混淆。
4、进入encryption区域,点击encrypt进行加密。
5、保存,测试。
as3加密-代码混淆的实例
最近在准备一篇as3代码混淆的教程,先上几个swf,让大家看一下效果。
实例1(附件1) 使用alchemy混淆源代码(强力推荐,无人可破)
实例2 使用alchemy加密图片资源:http://flaswf.googlecode.com/files/Bengine_v01.swf
这个swf中的贴图资源任何破解者无法导出,因为贴图资源以我自定义的资源包格式传给alchmey,
在alchmey解出资源,并且只在alchmey端使用,要想导出贴图资源要做的是逆向工程而非简单的破解源码。
当然代码原作者(资源格式包定义者)来说,这是很容易的事情,而破解这必须完全理解引擎渲染原理才能导出贴图资源。事实上,这个swf资源包解析代码20行就可搞定。
实例3(附件2) HaXe编译混淆代码
实例4(附件3) swf云做内存保护防止内存提取。(不推荐)
实例5(附件3) 强制使用非法变量名、函数名、类名,混淆源代码,
使反编译代码不能正常编译,并且无可读性。(混淆加密的王牌)
破解时间限制的irrFuscator 2.0(代码混淆器)
现在网上混淆AS代码的工具不多,而有效的混淆工具就更少了,irrFuscator 2.0算是比较管用的一个,不过在网上就是却找不到它破解版的。偶尔在一个网站上发现了一个可以解除软件使用时间限制的工具,试了一下,还挺管用,于是自己做了一个解除试用时间限制的版本,现在分享给大家。
as3加密入门-1使用alchemy进行代码混淆
声明:这里所讨论的(以及后续相关的as3加密教程)所有方法都来自网络和我个人试验,
如果有错误,还请大家赐教,所有其它内容均为个人观点,若有不同意见,也可提出讨论。
所列举方法与代码引用了许多其它资料,在此可能不会一一列举出,相关作者如有需要注明来源,可以自行联系我(回帖或邮件都可)。
另外,这几篇加密入门教程其实也可以看成普通教程,只不过披件“加密”外衣而已。
比如,alchemy混淆可以看成简单的alchemy调用as3函数教程,跳转指令混淆可以看成as3c的hello world级入门教程。
为什么要加密?
1保护游戏数据,防止外挂
2客户要求
3老板要求
4保护个人权利
之前对swf加解密没有研究,也不太感兴趣。一月份有位朋友同我探讨这一问题,才开始关注,也学到不少相关东西,空余也做了几个加壳、混淆试验。虽然商业的swf加密、破解软件已很成熟,网上关于这方面的资料却不多,这里总结了一下几个实际中常用as3代码混淆方法。
如果说加壳是对swf化装,那么混淆就是整容,不,更确切的说是毁容,对破解者来说是才是整容。俗话说,毁容容易整容难,这就是混淆的优势。这里总结几个常见的方法,来把你的swf毁个面目全非。
据我了解,实际中as3程序员对代码保护基本上都是手动混淆(修改变量名)。强制使用非法变量名完全可以保护住代码,尤其是源代码比较长,类文件比较多时。反编译出的东西基本没可用性。很少有人去用加密软件,即时用加密软件,基本上也就混淆一下代码,深度加密(加壳,随机跳转指令等)会降低flash运行效率,并很容易带来一些不可预知错误,甚至有时多次调试都发现不了,得不偿失。
所以这里首先推荐强制使用非法变量名混淆方法。另外,我认为alchemy是flash10最有用、最有意义的东西(3D API目前就是个鸡肋,pixel bender实现的功能太弱,其他新功能也没见对flash有何惊人改变),
alchemy的出现同时也给所有的swf反编译软件带来了一次“危机”。
这里第一部分是一个简单的alchemy混淆代码教程(其实就是alchemy调用flash函数教程)。对alchemy不感兴趣的朋友可直接跳到第二部分-强制使用非法变量名。
第一部分 使用alchemy混淆as3代码(选用)
为什么要用alchemy?
1.C语言是程序员的老本行,alchemy使用C\C++写代码,对多数程序员来说要比用as3更加得心应手。
2.Alchemy代码效率高,使用一些优化指令,尤其对计算速度提升明显。Joa Ebert给过一个极端的例子:纯as3的fps3~5,使用Alchemy优化指令编译后fps飙到200多。当然一般来说速度不会这么大幅改进。我的Bengine引擎最初是纯as3写的,fps0~5,使用Alchemy后可达到8~40.
3.Alchemy代码移植性好,尤其对纯bitmapdata操作的试验,可很方便地与allegro,sdl程序代码互相转换。
目前没有反编译软件可导出使用Alchemy写的源C\C++代码。Alchemy使用C\C++直接生成AS3字节码,目前反编译软件只能针对as3代码反编译,而且编译生成swc就自动加入c标准库,直接导致源文件变大,导致破解难度加大。
我估计以后也很难有反编译软件可以导出alchemy源C\C++代码,引用一段asv作者Burak关于反编译alchemy的评论"For Alchemy some new bytecode instructions were introduced to AVM2 (see Scott Petersen slides PDF). I'm not sure what this will mean for ASV. If we will be dealing with a full featured optimizing C/C++ compiler, decompiling back to C/C++ will be really hard work for us, that I can say..."(一些新的bytecode指令因alchemy而引入AVM2,我不敢肯定这对asv意味着什么。如果我们要面对的是一个全功能优化的C / C + +编译器,反编译回C/C++对我们来说将是非常困难的,我可以说…)
使用alchemy混淆代码简单例子(源代码见附件):
其实反编译器对HaXe生成的代码支持也不好。直接用HaXe写,代码反编译出,绝大多数不能编译,但一般代码结构还很清楚。如果项目比较大,使用HaXe写基本也用不着去加密。
不喜欢使用HaXe原因:1.已有了Alchemy,2.HaXe资料少。
基本思想,代码关键部分使用alchemy写(其实只有某一重要的小部分用alchemy也可以),as3部分只写一个class Main extends Sprite作容器。
下面代码给了一个简单例子,其实as3部分还可以减少,转为alchemy部分。
(项目文件以打包提供下载,见附件)
代码(as3部分):
package { import cmodule.Bengine.CLibInit; import flash.display.*; import flash.events.*; [SWF(width="300", height="300", backgroundColor="#123456")] public class Main extends Sprite { public var cLibInit : CLibInit;//alchemy库 public var alcLookupLib:Object; public function Main() { cLibInit = new CLibInit(); alcLookupLib = cLibInit.init();//初始化alchemy库 addChild(new Sprite())//添加一个空Sprite对象到舞台 addEventListener(Event.ENTER_FRAME,enterFrame)// 添加帧循环 } public function enterFrame(e):void { removeChildAt(0) addChild(alcLookupLib.initialize())//添加alchemy生成的Sprite对象到舞台 } } }
代码(C部分):
#include "AS3.h" int r=0;// AS3_Val initialize(void* self, AS3_Val args) { AS3_Val spNS = AS3_String("flash.display");//取得命名空间 AS3_Val spClass = AS3_NSGetS(spNS, "Sprite");//取得Sprite类 AS3_Val emptyParams = AS3_Array("");//Sprite类参数 AS3_Val sp = AS3_New(spClass, emptyParams);//声明一个Sprite对象 AS3_Val gpc= AS3_GetS(sp, "graphics");//取得该Sprite对象graphics属性 AS3_CallTS("beginFill", gpc, "IntType",0xffffff*rand());//使用随机颜色填充 AS3_CallTS("drawRect", gpc, "IntType, IntType, IntType, IntType",-100,-100,200,200); //画一个方形 r+=5;//旋转角度增加 AS3_Val ro = AS3_Int(r);//转换C-Int为AS3-Int AS3_SetS(sp,"rotation",ro);//设置当前Sprite对象旋转角度 AS3_Release(ro); AS3_Val xy = AS3_Int(150); AS3_SetS(sp,"x",xy); //设置当前Sprite对象x位置 AS3_SetS(sp,"y",xy); //设置当前Sprite对象y位置 AS3_Release(xy);//释放无用变量 return sp;// 返回当前Sprite对象 } int main() { AS3_Val initializeMethod = AS3_Function( NULL, initialize); AS3_Val result = AS3_Object("initialize: AS3ValType",initializeMethod); AS3_Release( initializeMethod ); AS3_LibInit( result ); return 0; }//end of int main
编译过程:C部分:打开cygwin->cd /cygdrive/f/alchemy/ALCSWF/lib
source /cygdrive/f/alchemy/alchemy-setup
alc-on
gcc ALCSWF.c -O3 -Wall -swc -o ALCSWF.swc
生成ALCSWF.swc
AS3部分:打开ALCSWF.as3proj->build project
编译结果见附件。
大家可以尝试使用反编译软件看下源码。
as3加密入门-4使用avm2内嵌式汇编指令混淆简介
(p.s.这篇教程也可以看做as3c的入门教程)
这里主要是使用avm2跳转指令Jump,在在源代码中写入asm进行跳转,两个跳转中间插入大量无用代码(不会被执行,但反编译出的文件中看得到)
asv对跳转反编译不好,会出现“//unresolved jump”字样,sothink反编译出代码也无法实现原跳转。
重编译后,无用代码会被执行。总之,使用跳转指令后,as3代码基本上可以混淆到无法还原,要想破解,只能手动进行(人工翻译pcode),
所以只要你的原始代码够长,没人愿意去翻译/破解你的代码。
跳转指令好处就是大量无用代码不会被执行,混淆不会降低运行效率。
不太推荐跳转指令或asm混淆,因为内嵌汇编写东西比较麻烦(主要是现在avm2没有一个像as2时代的flasm那样好用的工具)。
当然,如果你能研究透avm2指令,使用asm像as3一样熟练,优化代码、加密、破解都不在话下。
as2可以用flasm直接操作(编译/反编译)bytecode,这是高手们作优化、加密、游戏、破解甚至逆向工程的一件利器。
可惜flasm没再更新,只支持到flash8。不过幸好我们还有其继承者,Joa Ebert 的As3c,虽然可能使用起来不如flasm那么方便。
推荐工具:As3c
简单的跳转混淆:
1. 到As3c项目地址http://code.google.com/p/as3c/source/browse/#svn/trunk/bin/Release
下载As3c.exe,As3c.pdb,SwfLibrary.dll,SwfLibrary.pdb,zlib.net.dll几个文件,
以及所需as3类文件http://code.google.com/p/as3c/source/browse/#svn/trunk/src/as3/AsmLibrary/src/de
(下载整个de文件夹)
将As3c.exe,As3c.pdb,SwfLibrary.dll,SwfLibrary.pdb,zlib.net.dll几个文件和de文件夹保存到C:\as3c
附件中已包含以上文件,可直接下载附件。
2.写好待混淆代码:
package { import flash.display.*; import flash.text.*; public class Jump extends Sprite { var Bruce_Jawn_Encrypt= new TextField(); Bruce_Jawn_Encrypt.text="跳转指令"; Bruce_Jawn_Encrypt.textColor=0xff0000; Bruce_Jawn_Encrypt.scaleX=10; Bruce_Jawn_Encrypt.scaleY=10; addChild(Bruce_Jawn_Encrypt); } }
3.原代码中插入asm跳转指令,并用注释分割
package { import flash.display.*; import flash.text.*; import de.popforge.asm.Op; import de.popforge.asm.__asm; public class Jump extends Sprite { __asm(Op.jump('.text'));//跳转到.text位置 //============================== //============================== //**********此处随便插入大量混淆用代码(不会被执行) //============================== //============================== __asm('.text:'); // .text位置 var Bruce_Jawn_Encrypt= new TextField(); __asm(Op.jump('.text2')); //跳转到.text2位置 //============================== //============================== //**********此处随便插入大量混淆用代码(不会被执行) //============================== //============================== __asm('.text2:'); // .text2位置 Bruce_Jawn_Encrypt.text="跳转指令"; __asm(Op.jump('.text3')); //跳转到.text3位置 //============================== //============================== //**********此处随便插入大量混淆用代码(不会被执行) //============================== //============================== __asm('.text3:'); // .text3位置 Bruce_Jawn_Encrypt.textColor=0xff0000; __asm(Op.jump('.text4')); //跳转到.text4位置 //============================== //============================== //**********此处随便插入大量混淆用代码(不会被执行) //============================== //============================== __asm('.text4:'); // .text4位置 Bruce_Jawn_Encrypt.scaleX=10; Bruce_Jawn_Encrypt.scaleY=10; __asm(Op.jump('.text5')); //跳转到.text5位置 //============================== //============================== //**********此处随便插入大量混淆用代码(不会被执行) //============================== //============================== __asm('.text5:');// .text5位置 addChild(Bruce_Jawn_Encrypt); __asm(Op.jump('.text6')); //跳转到.text6位置 //============================== //============================== //**********此处随便插入大量混淆用代码(不会被执行) //============================== //============================== __asm('.text6:');// .text6位置 } }
4.在//********** 处随便复制插入大量混淆用代码。
5.编译Jump.as得到Jump.swf,复制到C:\as3c文件夹(此时asm跳转指令未编译,运行swf会发现混淆代码将被执行)
6.使用as3c编译asm跳转指令
运行dos命令符,cd到C:\as3c文件夹
as3c.exe -inline Jump.swf
7.再次测试Jump.swf,跳转成功,混淆代码不被执行。
上面的例子比较简单,要想达到更好跳转混淆效果,可以把跳转加到循环,嵌套函数,条件判断…语句中,并打乱代码顺序,使用多次折返跳转而非例子中的顺序跳跃。
as代码混淆器
刚完成的一个as代码混淆器,有兴趣的就下载做做小白鼠吧呵呵
支持 as文件,mxml代码 混淆
更好的保护的你脚本源码
因为只写得比较匆忙,也没怎么测试,发现问题请尽量回复谢谢
[SWF-Cry]免费swf加密混淆工具v0.02发布
代码混淆beta2 支持类名混淆了 补上图
代码趋于完善 bug变少了
但 仍然不少 -..-
相比 第一个版本
http://bbs.actionscript3.cn/thread-11475-1-1.html
多了 类名的混淆 以及支持多个类
老样子 主类不混淆
swf 加密 代码混淆 添加水印
唉~~ 终于整合在一起了。针对swf的三部分功能:加密、代码混淆以及添加水印。
在线版本请查看这里>>>
如果操作中出现了错杀(代码混淆)、死亡(加密失败)等问题,请和我联系,呵呵 谢谢先。 可以帮助我修善程序。
SWF/ActionScript代码混淆器SWF Encrypt V4.0.05
好东西,保护as代码
官方网站:http://www.amayeta.com/
下载http://www.9553.com/soft/2211.htm
SWF Encrypt 是一款强大的Flash加密工具,使用 DMM(动态内存修改) 技术和 ActionScript 混淆技术来保护您的原创设计,可以抵御绝大多数主流的 Flash 反编译器,据某人说若使用某知名国产 Flash 反编译器来尝试处理经 SWF Encrypt 加密的文件时会使前者陷入死锁 >_<
本软件支持命令行操作,可使用 -? 查询命令行参数的定义。
激活码: SE3-9gGHtBdn74wSn3945-861