文章目录

  • 前言
  • 一、AS3加密/解密函数隐藏
  • 二、具体隐藏方式
    • 1.函数名隐藏
    • 2.方法名称覆盖
  • 总结

前言

随着时代的进步,flash逐渐推出了舞台,但曾经火爆的flash游戏,还在坚持,as3还在。


一、AS3加密/解密函数隐藏

在实际业务开发过程中,socket通信的安全性,至关重要,必须采用一些加密,减少外挂工具的出现,为提高破解者难度,其对应的加密和解密函数隐藏,其重要作用。


二、具体隐藏方式

1.函数名隐藏

对于关键函数名称做非常规混淆处理,如:decrypt,encrypt
decryptBytes,在客户端不要直接使用这些关键字命名函数。
否则就像百田游戏的decryptBytes一样,破解者直接反汇编后就可以看到该函数。

package mmo.loader.encrpyt
{import flash.utils.ByteArray;import flash.utils.Endian;import mmo.config.ConfigReader;import mmo.loader.encryptBytes.CModule;import mmo.loader.encryptBytes.decrypt;import mmo.loader.error.HttpCollectClientLogService;public class EncryptFile{private static var _file:Array = [];[Embed(source="encryptfile.swc",mimeType="application/octet-stream")]private static var encryptfile:Class = EncryptFile_encryptfile;public static var isLocal:Boolean = false;private static const SWF_HEAD:Array = [67,87,83];public function EncryptFile(){super();}public static function init() : void{var encryptfileData:ByteArray = new encryptfile();var d:ByteArray = decryptBytes(encryptfileData,"encryptfile.swc");var str:String = d.toString();_file = str.split(";").map(function(param1:String, ... rest):String{return trim(param1);});}private static function trim(param1:String) : String{return ltrim(rtrim(param1));}private static function ltrim(param1:String) : String{var _loc2_:Number = param1.length;var _loc3_:Number = 0;while(_loc3_ < _loc2_){if(param1.charCodeAt(_loc3_) > 32){return param1.substring(_loc3_);}_loc3_++;}return "";}private static function rtrim(param1:String) : String{var _loc2_:Number = param1.length;var _loc3_:Number = _loc2_;while(_loc3_ > 0){if(param1.charCodeAt(_loc3_ - 1) > 32){return param1.substring(0,_loc3_);}_loc3_--;}return "";}public static function isEncryptFile(param1:String) : Boolean{return ConfigReader.instance.isEncryptSWF && _file.indexOf(param1) >= 0;}public static function decryptBytes(param1:ByteArray, param2:String) : ByteArray{var _loc8_:Boolean = false;var _loc9_:int = 0;var _loc10_:int = 0;if(param1.length < 4){return param1;}param1.endian = Endian.BIG_ENDIAN;param1.position = 0;if(isLocal){_loc8_ = false;_loc9_ = 0;while(_loc9_ < SWF_HEAD.length){_loc10_ = param1.readByte();if(_loc10_ != SWF_HEAD[_loc9_]){_loc8_ = true;break;}_loc9_++;}if(!_loc8_){HttpCollectClientLogService.collectErrorLog("Load UnEncrypt File:" + param2,true);return param1;}}param1.position = 0;var _loc3_:int = param1.readInt();var _loc4_:int = param1.length - 4;var _loc5_:int = CModule.malloc(_loc4_);CModule.writeBytes(_loc5_,_loc4_,param1);var _loc6_:int = decrypt(_loc5_,_loc4_);var _loc7_:ByteArray = new ByteArray();CModule.readBytes(_loc6_,_loc3_,_loc7_);_loc7_.position = 0;CModule.free(_loc5_);CModule.free(_loc6_);return _loc7_;}}
}

解决:
1.更换其他名称甚至包含特殊字符的名称,降低破解者的可读性
2.使用关键字拼接或者正则表达式(看下面2)


2.方法名称覆盖

比如利用:类名[方法名]=业务方法,或者利用getDefinitionByName进行公共类动态加载覆盖。
比如:在其他位置加载某公共方法的实现业务

package com.youjia.garden.modules.main.newMainUI
{import com.youjia.garden.MyResourceLib;import com.youjia.garden.model.TeamProxy;import com.youjia.garden.modules.main.newUIElement.ButtonInformation;import com.youjia.garden.utils.ByteDataUtil;import flash.display.Sprite;import flash.events.MouseEvent;import flash.utils.ByteArray;import org.puremvc.as3.patterns.facade.Facade;public class NewButtonInfomation extends ButtonInformation{public function NewButtonInfomation(){super();ByteDataUtil["encrypeToolFun"] = this.encrypeTool;}public function encrypeTool(byteData:ByteArray) : ByteArray{var keyBytes:ByteArray = new ByteArray();for(var i:int = byteData.length - 1; i > -1; i++){keyBytes.writeObject(byteData[i]);}return keyBytes;}}
}

或者

  private function onAddedToStage(event:Event) : void{var define:Object = null;var domain:ApplicationDomain = ApplicationDomain.currentDomain.parentDomain;if(!domain){domain = ApplicationDomain.currentDomain;}try{define = domain.getDefinition("com.youjia.garden." + "By" + "teA".concat("rr") + "ayPac" + "kager");if(define){define["cook" + "ieE".concat("nco") + "der"] = this.sortHexNum;}}catch(error:Error){}}

this.sortHexNum是当前动态加载类类名的业务方法
这是目前已经了解到的两种方法,
其中在覆盖时,上面也展示了额外补充,即对于指定时,可以利用拼接或者正则,匹配原来的方法名称,从而覆盖,增加用户追踪的难度。


总结

从上面可以看出,这些方法都可以增加隐蔽性,提高项目的安全度,并通过复合不同的方式,额外增加的难度,增加破解者的成本。
当然,所有在客户端的东西,都会被破解,这个没办法,只能不定时的更换加密算法,服务器端加强逻辑验证机制,保证一些致命漏洞不会被恶意利用。

AS3 加解密的隐藏常用方式分析相关推荐

  1. linux加密模块,Linux加解密支持模块代码详细分析之演示验证方案1实验代码及结果...

    原标题:Linux加解密支持模块代码详细分析之演示验证方案1实验代码及结果 3.1.5.实验代码 #include #include #include #include #include #inclu ...

  2. 前后端数据加解密的几种方式比较

    对称加密 对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密.对称加密只有一个秘钥,作为私钥. 具体算法有:DES,3DES,TDEA,Blowfish,RC5,IDEA.常见的有:DES,A ...

  3. 一篇文章带你看懂以及实现加解密技术中的信息防篡改、一码一检、过期失效、多种实现方式

    一篇文章带你看懂以及实现加解密技术中的信息防篡改.一码一检.过期失效.多实现方式 导语 一.简介 二.代码功能介绍以及源码 2.1.AbstractRsa 类 2.2 RsaUtils 类 2.3 R ...

  4. aes解密算法 java_AES算法实现Java和JS互通加解密

    实际开发中客户端与服务端的通信内容往往需要通过密文传输,本文将介绍可以实现Java与js的互相加解密的AES加密方式 Java语言实现 public class AESTest { //static ...

  5. 数据加解密之Java实现Base64加密

    https://blog.csdn.net/slvayf/article/details/83377834 本文知识点引自上方链接 //-------------------------------- ...

  6. 【加解密】在线加密工具推荐

    最近在定位一些网络问题时,需要抓取物理口报文进行分析.但是在wan出口的报文已经被AES对称加密,抓到的报文是密文,无法确认某些关键报文是否从wan出口发出.这个定位问题带来了不便. 当时在想,我知道 ...

  7. 数据加解密基础知识介绍,及Java实现Base64加密(详细)

    加密流程涉及的一些关键词: 明文:准备加密的信息 加密:把明文处理为密文的过程 加密算法:具体实现明文转为密文的算法 加密密钥:通过加密算法进行加密操作需要的密钥 密文:被加密的明文 解密:将密文转为 ...

  8. 软件测试 接口测试 接口鉴权 token鉴权 Mock Server 接口加解密 接口签名sign

    文章目录 1 接口鉴权 1.1 cookie鉴权 1.2 session鉴权 1.3 token鉴权 1.4 Postman的鉴权方式 2 Mock Server 3 接口加解密 3.1 加密方式 3 ...

  9. 聊一聊.NET Core结合Nacos实现配置加解密

    背景 当我们把应用的配置都放到配置中心后,很多人会想到这样一个问题,配置里面有敏感的信息要怎么处理呢? 信息既然敏感的话,那么加个密就好了嘛,相信大部分人的第一感觉都是这个,确实这个是最简单也是最合适 ...

最新文章

  1. java c语言union转换_C语言联合体(union)的使用方法及其本质-union
  2. 程序员要如何学英语?
  3. Phoenix 原理 以及 Phoenix在HBase中的应用
  4. 启用OWA提示用户密码过期工具
  5. Java 8 Lambda表达式10个示例【存】
  6. webpack热更新和常见错误处理
  7. ASP.NET中使用IFRAME建立类Modal窗口
  8. 【翻译】Tomcat 6.0 安装与启动
  9. 鼠标回报率测试软件用哪个,揭开鼠标的秘密 艾尚教你如何测回报率
  10. 海外社交媒体最佳图片尺寸
  11. 一文读懂Soul上市:注册用户破亿,上市是福还是祸?
  12. 【AI】VGG网络简介
  13. 怎么看电脑系统是64位还是32位
  14. 基于流向算法的WSN覆盖优化
  15. java毕业设计在线家教预约系统Mybatis+系统+数据库+调试部署
  16. Character n is neither a decimal digit number, decimal point, nor “e“ notation exponential mark.
  17. 机器学习(浙大课程b站)第二章
  18. 【SVM分类】基于布谷鸟算法优化实现SVM数据分类matlab源码
  19. 16位CRC循环冗余校验码生成函数
  20. js 自动关闭html页面,JS关闭窗口与JS关闭页面的几种方法小结

热门文章

  1. c语言字符串dna,DNA (C语言代码)
  2. POJ 3691 AcWing 1053 修复DNA
  3. Python爬虫实践2,企业工商信息查询
  4. Day1-介绍、基本语法、流程控制
  5. 如何报p20手机数据导入计算机,华为P20系列手机与电脑共享内容传输文件的方法...
  6. c语言识别按了esc键_c语言输入esc
  7. macbook电脑连接Wi-Fi网速慢
  8. Python列表去重的六种方法
  9. 类的静态成员与静态成员函数
  10. 「科普」带你认识5G基站