/* * @author Galaburda Oleg a_[w] * http://actualwave.com/ * */ package aw.projects.antidecompiler{ import flash.utils.ByteArray; import flash.utils.Endian; public class SWFDecryptor{ static public const TAG_LENGTH:int = 6; static public const TAG_EXT_FLAG:int = 0x3f; static public const SIGNATURE:String = 'FWS'; static public const COMPRESSED_SIGNATURE:String = 'CWS'; static public const NOTCOMP_HEADER_LENGTH:int = 8; static public function uncompress(ba:ByteArray):ByteArray{ var pos:uint = ba.position; var baRet:ByteArray = new ByteArray(); baRet.position = 0; if(ba.readUTFBytes(3)==COMPRESSED_SIGNATURE){ var baTemp:ByteArray = cloneByteArray(ba); ba.position = 0; baRet.writeUTFBytes(SIGNATURE); var sl:int = SIGNATURE.length; baTemp.position = sl; baRet.writeBytes(baTemp, sl, NOTCOMP_HEADER_LENGTH-sl); baTemp.position = NOTCOMP_HEADER_LENGTH; baRet.position = NOTCOMP_HEADER_LENGTH; uncompressByHeader(baTemp); baTemp.readBytes(baRet, NOTCOMP_HEADER_LENGTH); baTemp.length = 0; }else{ ba.position = 0; ba.readBytes(baRet); } ba.position = pos; baRet.position = 0; return baRet; } static protected function uncompressByHeader(ba:ByteArray):void{ ba.readBytes(ba); ba.length -= NOTCOMP_HEADER_LENGTH; ba.uncompress(); ba.position = 0; } static public function cloneByteArray(ba:ByteArray):ByteArray{ var pos:int = ba.position; ba.position = 0; var con:ByteArray = new ByteArray(); con.position = 0; con.writeBytes(ba); con.position = ba.position = pos; con.endian = ba.endian; con.objectEncoding = ba.objectEncoding; return con; } static public function replaceTags(ba:ByteArray, tags:Array, positions:Array):void{ presetByteArray(ba); var len:uint = tags.length; var tag:uint; var pos:uint; var rsh:uint; for(var i:int=0; i