混淆工具

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、保存,测试。


混淆工具_第1张图片
 

 

 

 

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发布

目前只实现了简单加壳、简单代码淆功能。
还很不完善,存在大量bug,其他许多功能还没来得及做。
使用:单击"Cry_and_Save"按钮,会提示上传swf文件,之后会提示保存加密文件。
注意因为存在bug可能无法弹出保存框,解决方法如下:
请点击"Advanced Configuration"展开高级选项,之后点击"Browse_SWF"上传代swf文件,然后单击"Cry_and_Save"可直接保存加密后文件。
另外高级选项可设置要淆的变量名及加水印等其他功能。
目前加密强度比较一般,还有许多方法没去实现。
另外:
1.只支持as3,不支持as2加密,将来也不会去支持as2。
2.代淆变量名用","隔开,并选中"Obfuscate",如不选"Pack",则不加壳,可仅作淆器用。
3.被加壳swf如访问stage属性,请在main类初始化函数中添加以下代码
if(stage==null){

this.addEventListener(Event.ADDED_TO_STAGE,init1);

} else {

init2();

}

function init1(e){init2();}

  

init2为你的初始化函数

 

 

代码混淆beta2 支持类名混淆了 补上图

代码趋于完善 bug变少了
但 仍然不少 -..-

相比 第一个版本
http://bbs.actionscript3.cn/thread-11475-1-1.html
多了 类名的淆 以及支持多个类
老样子 主类不
混淆工具_第2张图片
 

 

 

 

 

swf 加密 代码混淆 添加水印

唉~~ 终于整合在一起了。针对swf的三部分功能:加密代码淆以及添加水印。
在线版本请查看这里>>>
如果操作中出现了错杀(代码淆)、死亡(加密失败)等问题,请和我联系,呵呵 谢谢先。 可以帮助我修善程序
混淆工具_第3张图片
 

 

 

 

 

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

你可能感兴趣的:(C++,c,C#,软件测试,Flash)