存档

2010年5月 的存档

浅谈swf中的加密及对策

2010年5月30日 1 条评论

DelphiSwfSdk近一年没更新,作者消失无踪,留下bug一堆。最近在完善DelphiSwfSdk的过程中,对swf文件格式有了系统的了解,同时就自己比较感兴趣的as加密,也进行了一下研究。研究发现,as1,as2时代的加密,其实大部分都只能称之为“混淆”,利用混淆达到迷惑反编译器甚至卡死反编译器的目的。

就其原理,本质上只在于 反编译器  与 播放器 在处理swf文件时的细节上的差异。详述如下:
1. swf反编译器在反编译过程中,是按照swf的文件规范,将swf依次拆分为很多tag,然后如果tag中含有脚本,例如doaction或doinitaction等tag,则对这个tag中的bytecode,按照最紧凑原则进行依次读取解析,直至解析完整个swf文件。
阅读全文…

分类: Computer 标签: , ,

swf中tag整理

2010年5月27日 没有评论

swf文件格式是基于tag的,每个tag之间独立,只有引用与被引用的关系。软件在处理swf文件时,遇见不认识的tag,可以跳过处理。

截止swf 10为止,tag共有以下种类,其中有些tag已经被废弃不用。已经标出。

tagEnd = 0;
tagShowFrame = 1;
tagDefineShape = 2;
tagFreeCharacter =3;
tagPlaceObject = 4;
tagRemoveObject = 5;
tagDefineBits = 6;
tagDefineButton = 7;
tagJPEGTables = 8;
tagSetBackgroundColor = 9;
tagDefineFont = 10;
tagDefineText = 11;
tagDoAction = 12;
tagDefineFontInfo = 13;
tagDefineSound = 14;
tagStartSound = 15;
tagStopSound =16;
tagDefineButtonSound = 17;
tagSoundStreamHead = 18;
tagSoundStreamBlock = 19;
tagDefineBitsLossless = 20;
tagDefineBitsJPEG2 = 21; 阅读全文…

分类: Computer 标签: , ,

以zm的旧瓶,装fflippage的新酒

2010年5月13日 1 条评论

篇首语:这篇文章老早就想写了,但是本人懒散,兴趣爱好多变,因此本文一直流产至今,知道最近受CGFinal的CGArt杂志的as3翻页核心刺激,重新研究as3杂志时,才有了写这篇唠叨之词的兴致。

另:本文中仅唠叨思想,而无完整实现给出,因此想不自己动手的可以关掉此页面了,对你们的乘兴而来,败兴而归,本人深感抱歉!

电子杂志从初出茅庐,到兴起,乃至今天的回归平淡,依稀走过了6,7年的时光。

zinemaker的诞生,是推动当时电子杂志行业发展的一大举措,也是她将电子杂志这个原来遥不可及的东西摆到了普通业余爱好者的面前,之后,业余杂志数不胜数。
即使2010年的今天,zinemaker沉寂多年后的今天,zinemaker在电子杂志爱好者的手中,依然发挥着她的余光预热。

但是,不得不说,zinemaker的杂志表现形式太单调,翻页效果不够完善。令人失望的是,网上见得比比皆是的都是基于原杂志核心就行的改进,诸如:1、尺寸改进后的模板,2:按钮美化后的模板,3:添加个别功能,诸如打开密码后的模板,4:搜索,放大缩小,自动缩略图等等。  但  这些并不涉及zinemaker的翻页核心:pageflip.swf,而只是其外在的部分表现形式的更改及优化。zinemaker杂志的翻页依旧是那么死板,那么别扭,那么令人感到难受。 阅读全文…

倒,榜首

2010年5月10日 没有评论

嘛也不说了,悲剧的榜首了

发信人: emptyll (空空如也”"媚灵狐”"似水流年”"”), 信区: Astrology
标  题: 对感情不主动!不拒绝!不负责的男生星座
发信站: 天大求实BBS (Mon May 10 18:05:55 2010), 本站(bbs.tju.edu.cn)

第一名:魔羯男

魔羯男有两种,一种是好男人型,另一种则是玩家型的魔羯男,玩家型的魔羯男喜欢到声色场所,外表给人家一种道貌盎然的感觉的他再加上天生有一种旁观者的天份,因此会让他特别吸引异性的爱慕,所以他虽然不主动,但是异性缘超乎想像的好,而且希望大家开心的他对於异性的主动不会拒绝,因为他认为这一切都是缘分,但是要他负责完全不可能!魔羯男认为从头到尾自己都没有主动,为什麽要负责任。

第二名:水瓶男

水瓶男是隐性的主动者,若是他属於玩家级,光是摆出绅士的派头,根本不必主动很多女性就已经被他迷倒了,因为水瓶男很注重穿着、仪态的优雅、对事物的品味….等等,而且水瓶男总有一段堕落时期,这段时期私生活可说是非常混乱,简直是逢人就上,不过水瓶男绝对不会让自己弄到要负责的程度,因为他不可能让这些不列入人生计画的脱轨邂逅影响到自己未来的人生。

第三名:双鱼男

双鱼男有两种面貌,光明面的他慈善温和,不过要是论起阴暗面时他也是一等一的高手,他对待女生很贴心体贴,让异性对他丝毫不设防,根本不需要主动对方就送上门了,另外双鱼男也不会拒绝主动送上门来的对象,当他胃口好的时候,*都无所谓,他的不拒绝也很有手腕,双鱼男会用很多正当的藉口让对方死心。

分类: Life 标签: ,

CFlipPage升级

2010年5月8日 没有评论

RT
完成鼠标吸附,自动翻页,页面透明穿透,多页连翻机制优化
待完成:翻页静帧(翻页静帧这个东西比较麻烦,尤其在as3中,as3中的显示对象卸载后并不会马上清除,因此无法保证外面载入的swf里面不再执行。stop并不是一直有效的。这点上甚至不如as2)。

分类: Computer 标签: ,

as3版翻页程序测试,支持多页连翻

2010年5月6日 1 条评论

RT,完全基于as3实现
内存管理方面有待继续优化,翻页静帧功能暂未实现。
测试页面的内容随便找来的~~~版权归原作者所有
测试方法:鼠标点击页面边缘或页脚,可连续点击实现连翻

分类: Computer 标签: ,

as3中的深度管理的利于弊

2010年5月5日 1 条评论

as3相比于as1和as2,引入了新的深度管理方法。从而抛弃了as1,as2时期的swapdepth和getnexthigherdepth的深度管理方法。
代替他们的是addChildAt,addChild,removeChild,removeChildAt,swapChildAt等。
广大as3爱好者无不拍手称快。
新的深度管理的方式,将深度管理的工作交给flash自身进行,提供给用户的child索引实际上是连续的,避免的as1,2时期深度不连续的问题。同时深度管理也更加直观。

但是,从我而言,这种新式的深度管理同样也带来了弊端。

以上一篇博文中提到的多页连翻中的深度管理为例,我们可以发现,在多页连翻的过程中实际上是需要不停的去创建页面,并指定z序,同时还需要不停的交换不同页面的z序。这在as3时期的新的深度管理方法下面,简直是噩梦。
此时,你就不得不单独先一个类,去实现类似于as2时期的深度管理方案。这也就要求被管理的对象必须给其重新附加一个depth属性。
以下为depthmanager类源代码。

package org.kingse.CFlipPage.Utilities {
    import flash.display.*;
 
    public class DepthManger {
 
        public function DepthManger(){
            throw (new Error("静态类,不能实例化。", 9999));
        }
        public static function getNextHighestDepth(container:DisplayObjectContainer):Number{
            throw (new Error("未实现!"));
        }
        public static function remove(container:DisplayObjectContainer, displayobj:DisplayObject):void{
            container.removeChild(displayobj);
        }
        public static function addAt(container:DisplayObjectContainer, displayobj:DisplayObject, depth:int):void{
            var i:int;
            var childrencount:int = container.numChildren;
	        if (childrencount == 0){
                container.addChild(displayobj);
                displayobj["depth"] = depth;
                return;
            }
            if (container.getChildAt(childrencount-1)["depth"]<depth){
                container.addChildAt(displayobj,childrencount);
                displayobj["depth"]=depth;
                return;
            }
            i = childrencount-1;
            var depth1:int;
            var depth2:int;
            while (i >=0) {
                depth1=container.getChildAt(i)["depth"];
                if (i-1>=0){
                    depth2=container.getChildAt(i-1)["depth"];
                }else{
                    depth2=-1;
                }
                if (depth==depth1){
                    container.removeChildAt(i);
                    container.addChildAt(displayobj,i);
                    displayobj["depth"]=depth;
                    return;
                }
                if ((depth<depth1)&&(depth>depth2)){
                    container.addChildAt(displayobj,i);
                    displayobj["depth"]=depth;
                    return;
                }
                i--;
            }
        }
        public static function swapDepths(container:DisplayObjectContainer, displayobj:DisplayObject, depth:Number):void{
            var tempdepth:int;
	        if ((container == null) || (displayobj == null)){
                return;
            }
            var nowindex:int;
            var nowdepth:int;
            var aimdepth:int=int(depth);
            try{
                nowindex = container.getChildIndex(displayobj);
                nowdepth = displayobj["depth"];
                if (nowdepth == aimdepth){
                    return;
                }
            }catch(err:Error){
                return;
            }
            var childrencount:int = container.numChildren;
            var depth1:int;
            var depth2:int;
            var i:int=childrencount-1;
            if (container.getChildAt(i)["depth"] < aimdepth){
                container.removeChild(displayobj);
                container.addChild(displayobj);
                displayobj["depth"]=aimdepth;
            }
            while (i>=0){
                depth1=container.getChildAt(i)["depth"];
                if (i-1>=0){
                    depth2=container.getChildAt(i-1)["depth"];
                }else{
                    depth2=-1;
                }
                if (aimdepth==depth1){
                    container.swapChildrenAt(i,nowindex);
                    displayobj["depth"]=aimdepth;
                    container.getChildAt(nowindex)["depth"]=nowdepth;
                    return;
                }
                if ((aimdepth<depth1)&&(aimdepth>depth2)){
                    container.removeChild(displayobj);
                    if (nowindex>=i){
                        container.addChildAt(displayobj,i);
                    }else{
                        container.addChildAt(displayobj,((i-1<0) ? 0 : (i-1)));
                    }
                    displayobj["depth"]=aimdepth;
                    return;
                }
                i--;
            }
        }
    }
}
分类: Computer 标签: ,

多页连翻型电子杂志组件原理简介

2010年5月4日 没有评论

电子杂志之风盛行于几年前,从最初的fflippage,pageflip,margpark等组件,到zinemaker,iebook等软件。相关应用层出不群。
但是就效果来说,大部分都基于国外开源的pageflip组件或者原理类似。

其中比较独特的是自在幻想(fictiony)的fflippage组件,该组件实现了多页连翻效果,在真实性上更加完善。

本文以简图探讨多页连翻型与单翻型究竟在架构上有什么不同。

先看下面的图

上图表面的是典型的电子杂志组件的层次安排图。

其中this为整个电子杂志组件,最下面两层为shadow和shadowmask,这两层在整个组件上创造出翻页是的书下面的光影效果。

再上一层是page,page就是页面内容的容器。在往上就是pagemask了,pagemask控制page容器整体的显示范围。

page这个容器里面包含最底层content,也就是内容,例如图片等,shade,中间缝隙的阴影等,contentmask是控制翻页过程中content能够够显示出来的部分。

那么这个体系结构中,page实际上是可以多个累加,进行深度管理的。每个page都有其自己的坐标,以及shade,和contentmask,这样每个就构成了多页连翻的显示结构,至于多页连翻的程序实现,就不在本文探讨范围之内了

分类: Computer 标签: , ,