as3加密入门-1使用alchemy进行代码混淆

声明:这里所讨论的(以及后续相关的as3加密教程)所有方法都来自网络和我个人试验,
如果有错误,还请大家赐教,所有其它内容均为个人观点,若有不同意见,也可提出讨论。
所列举方法与代码引用了许多其它资料,在此可能不会一一列举出,相关作者如有需要注明来源,可以自行联系我(回帖或邮件都可)。
另外,这几篇加密入门教程其实也可以看成普通教程,只不过披件“加密”外衣而已。
比如,alchemy混淆可以看成简单的alchemy调用as3函数教程,跳转指令混淆可以看成as3c的hello world级入门教程。
为什么要加密?
1保护游戏数据,防止外挂作弊
2客户要求
3老板要求
4保护个人权利

之前对swf加解密没有研究,也不太感兴趣。一月份有位朋友同我探讨这一问题,才开始关注,也学到不少相关东西,空余也做了几个加壳、混淆试验。虽然商业的swf加密、破解软件已很成熟,网上关于这方面的资料却不多,这里总结了一下几个实际中常用as3代码混淆方法。
如果说加壳是对swf化装,那么混淆就是整容,不,更确切的说是毁容,对破解者来说是才是整容。俗话说,毁容容易整容难,这就是混淆的优势。这里总结几个常见的方法,来把你的swf毁个面目全非。

据我了解,实际中as3程序员对代码保护基本上都是手动混淆(修改变量名)。强制使用非法变量名完全可以保护住代码,尤其是源代码比较长,类文件比较多时。反编译出的东西基本没可用性。很少有人去用加密软件,即时用加密软件,基本上也就混淆一下代码,深度加密(加壳,随机跳转指令等)会降低flash运行效率,并很容易带来一些不可预知错误,甚至有时多次调试都发现不了,得不偿失。
所以这里首先推荐强制使用非法变量名混淆方法。另外,我认为alchemy是flash10最有用、最有意义的东西(3DAPI目前就是个鸡肋,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部分):

  1. package {
  2. import cmodule.Bengine.CLibInit;
  3. import flash.display.*;
  4. import flash.events.*;
  5. [SWF(width="300", height="300", backgroundColor="#123456")]
  6. public class Main extends Sprite {
  7. public var cLibInit : CLibInit;//alchemy库
  8. public var alcLookupLib:Object;
  9. public function Main()
  10. {
  11. cLibInit = new CLibInit();
  12. alcLookupLib = cLibInit.init();//初始化alchemy库
  13. addChild(new Sprite())//添加一个空Sprite对象到舞台
  14. addEventListener(Event.ENTER_FRAME,enterFrame)// 添加帧循环
  15. }
  16. public function enterFrame(e):void
  17. {
  18. removeChildAt(0)
  19. addChild(alcLookupLib.initialize())//添加alchemy生成的Sprite对象到舞台
  20. }
  21. }
  22. }
复制代码

代码(C部分):

  1. #include "AS3.h"
  2. int r=0;//
  3. AS3_Val initialize(void* self, AS3_Val args)
  4. {
  5. AS3_Val spNS = AS3_String("flash.display");//取得命名空间
  6. AS3_Val spClass = AS3_NSGetS(spNS, "Sprite");//取得Sprite类
  7. AS3_Val emptyParams = AS3_Array("");//Sprite类参数
  8. AS3_Val sp = AS3_New(spClass, emptyParams);//声明一个Sprite对象
  9. AS3_Val gpc= AS3_GetS(sp, "graphics");//取得该Sprite对象graphics属性
  10. AS3_CallTS("beginFill", gpc, "IntType",0xffffff*rand());//使用随机颜色填充
  11. AS3_CallTS("drawRect", gpc, "IntType, IntType, IntType, IntType",-100,-100,200,200);
  12. //画一个方形
  13. r+=5;//旋转角度增加
  14. AS3_Val ro = AS3_Int(r);//转换C-Int为AS3-Int
  15. AS3_SetS(sp,"rotation",ro);//设置当前Sprite对象旋转角度
  16. AS3_Release(ro);
  17. AS3_Val xy = AS3_Int(150);
  18. AS3_SetS(sp,"x",xy); //设置当前Sprite对象x位置
  19. AS3_SetS(sp,"y",xy); //设置当前Sprite对象y位置
  20. AS3_Release(xy);//释放无用变量
  21. return sp;// 返回当前Sprite对象
  22. }
  23. int main()
  24. {
  25. AS3_Val initializeMethod = AS3_Function( NULL, initialize);
  26. AS3_Val result = AS3_Object("initialize: AS3ValType",initializeMethod);
  27. AS3_Release( initializeMethod );
  28. AS3_LibInit( result );
  29. return 0;
  30. }//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
编译结果见附件。
大家可以尝试使用反编译软件看下源码。
  alcswf.zip (161.04 KB)


http://www.cnblogs.com/keng333/archive/2011/12/26/2301906.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值