AS3 加解密的隐藏常用方式分析
文章目录
- 前言
- 一、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 加解密的隐藏常用方式分析相关推荐
- linux加密模块,Linux加解密支持模块代码详细分析之演示验证方案1实验代码及结果...
原标题:Linux加解密支持模块代码详细分析之演示验证方案1实验代码及结果 3.1.5.实验代码 #include #include #include #include #include #inclu ...
- 前后端数据加解密的几种方式比较
对称加密 对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密.对称加密只有一个秘钥,作为私钥. 具体算法有:DES,3DES,TDEA,Blowfish,RC5,IDEA.常见的有:DES,A ...
- 一篇文章带你看懂以及实现加解密技术中的信息防篡改、一码一检、过期失效、多种实现方式
一篇文章带你看懂以及实现加解密技术中的信息防篡改.一码一检.过期失效.多实现方式 导语 一.简介 二.代码功能介绍以及源码 2.1.AbstractRsa 类 2.2 RsaUtils 类 2.3 R ...
- aes解密算法 java_AES算法实现Java和JS互通加解密
实际开发中客户端与服务端的通信内容往往需要通过密文传输,本文将介绍可以实现Java与js的互相加解密的AES加密方式 Java语言实现 public class AESTest { //static ...
- 数据加解密之Java实现Base64加密
https://blog.csdn.net/slvayf/article/details/83377834 本文知识点引自上方链接 //-------------------------------- ...
- 【加解密】在线加密工具推荐
最近在定位一些网络问题时,需要抓取物理口报文进行分析.但是在wan出口的报文已经被AES对称加密,抓到的报文是密文,无法确认某些关键报文是否从wan出口发出.这个定位问题带来了不便. 当时在想,我知道 ...
- 数据加解密基础知识介绍,及Java实现Base64加密(详细)
加密流程涉及的一些关键词: 明文:准备加密的信息 加密:把明文处理为密文的过程 加密算法:具体实现明文转为密文的算法 加密密钥:通过加密算法进行加密操作需要的密钥 密文:被加密的明文 解密:将密文转为 ...
- 软件测试 接口测试 接口鉴权 token鉴权 Mock Server 接口加解密 接口签名sign
文章目录 1 接口鉴权 1.1 cookie鉴权 1.2 session鉴权 1.3 token鉴权 1.4 Postman的鉴权方式 2 Mock Server 3 接口加解密 3.1 加密方式 3 ...
- 聊一聊.NET Core结合Nacos实现配置加解密
背景 当我们把应用的配置都放到配置中心后,很多人会想到这样一个问题,配置里面有敏感的信息要怎么处理呢? 信息既然敏感的话,那么加个密就好了嘛,相信大部分人的第一感觉都是这个,确实这个是最简单也是最合适 ...
最新文章
- java c语言union转换_C语言联合体(union)的使用方法及其本质-union
- 程序员要如何学英语?
- Phoenix 原理 以及 Phoenix在HBase中的应用
- 启用OWA提示用户密码过期工具
- Java 8 Lambda表达式10个示例【存】
- webpack热更新和常见错误处理
- ASP.NET中使用IFRAME建立类Modal窗口
- 【翻译】Tomcat 6.0 安装与启动
- 鼠标回报率测试软件用哪个,揭开鼠标的秘密 艾尚教你如何测回报率
- 海外社交媒体最佳图片尺寸
- 一文读懂Soul上市:注册用户破亿,上市是福还是祸?
- 【AI】VGG网络简介
- 怎么看电脑系统是64位还是32位
- 基于流向算法的WSN覆盖优化
- java毕业设计在线家教预约系统Mybatis+系统+数据库+调试部署
- Character n is neither a decimal digit number, decimal point, nor “e“ notation exponential mark.
- 机器学习(浙大课程b站)第二章
- 【SVM分类】基于布谷鸟算法优化实现SVM数据分类matlab源码
- 16位CRC循环冗余校验码生成函数
- js 自动关闭html页面,JS关闭窗口与JS关闭页面的几种方法小结