关于Director文件的保护与还原的问题!

      学习笔记 2005-1-6 18:23:00
已经有很多朋友跟我提过下面文章中script的错误,其实引起这些错误的原因是因为版本的更新,Director的语法和命令的变化引起的,在DirecoterMX2004中,tell命令已经废弃,打开MIAW的语法也有一些改变,下面的script我再MX2004中做过测试:
on outputdir input,output
window().new(input).open()
window(input).movie.saveMovie(output)
forget(window(input))
end
大家再试试,欢迎讨论!
因为这儿已经不能回复帖子,可以到我的Blog: mazhiguo.5d.cn 讨论!
********************************************************************************

Director文件的保护与还原
donlee
作为广受多媒体开发人员钟情的开发平台,Director可以根据开发人员的需要输出多种格式的文件,其中最常用的格式当属dir文件以及加以保护的dxr文件,后两种格式的文件是用于播放的,不可再用Director编辑,一般最终作品都做成这样的格式。但在我们在实际开发过程中,往往由于备份文件损坏或出于学习观摩的目的等种种原因,有必要打开这类文件作为参考或继续编辑。本文从技术的角度出发,完全依靠Director自身提供的工具,对dxr文件的保护与还原手段作一探讨,所有讨论基于Director 8.0。
一、保护
Director在其IDE环境可通过逐级选择菜单"Xtras"->"Update Movie...",来把文件改为dxr格式,或通过publish输入为dcr格式的文件,不允许再被Director打开或编辑,以此来保护作品不被篡改。这是Director所提供的最基本的保护手段。
二、还原
不知出于何种考虑,Director所内嵌的lingo语言中有savemovie、save castlib两个保存movie和cast的命令,而且这两个命令对于dxr和dcr也有效!正是这两个命令,为还原被保护的文件大开方便之门。由于我们不能在Director下直接打开这两种文件,于是我们想到了MIAW,把它们通过MIAW打开,Director允许使用tell命令向miaw发送消息,因而我们尝试用这种途径来遥控dxr保存成可以再编辑的dir文件。作法如下:
新建一个movie,编写一个movie script,内容为:
on outputdir input output
miaw=window(input)
tell miaw to savemovie output
forget(miaw)
end

假设我们要打开的文件是“D:\Locked.dxr”,希望解除保护并另存为“D:\unlocked.dir”,则执行此movie,在message窗口中输入outputdir "D:\Locked.dxr" "D:\unlocked.dir",然后我们察看D盘根目录,将会在那里发现unlocked.dir文件,这个文件可以用Director打开,所有的score、member安排与原文件毫无二致,但其中所有的script内容均为空白。
正如把李白的诗翻译成英文,再由英文译成的中文已完全见不到诗仙的影子。由于转换成dxr格式时,movie内的script都经过编译,转换成由计算机执行的代码。所以用savemovie也不可能得到原来文本格式script,下面谈到的所有还原手段对此都无能为力。
目前在Director各论坛上大受青睐的还原工具dirOpener实际上完全基于以上思路来完成的,这个小工具也的确是用Director来制作的。但dirOpener具有一个很好用的界面并补充了一些关于光标和不规则窗口的“秘技”,这为Director初学者提供了一些方便,但对于有一定lingo编程基础的人来说,它的能力实在有限,不如自己做一个更强的opener,至于理由,请看“再保护”。
三、再保护
通常开发人员希望全面保护自己的作品,即使是score也不愿被他人窥视,怎样防止别人用savemovie之类的手段来还原呢?还是用lingo!我们可以写一个处理程序,当movie接收到savemovie命令时不保存movie,而是执行我们所定义的代码,对于save castlib也做同样处理。下面的例子是方法之一:
on savemovie
quit
end
on save castlib
quit
end

如果movie script含有以上内容时,则当movie接收到savemovie命令时,不会执行保存,而是退出集成环境或projector,如果企图用dirOpener还原这样的dxr文件,结果将是没有任何dir或cst文件输出,并且dirOpener自身也被退出,这是由quit命令的特点决定的,既然dirOpener是用Director制作的,自然难以逃此噩运,有此软件的朋友一试便知。
四、再还原
为了解除用上述savemovie方法施加的保护,我们再次仔细研究一下lingo,发现可以用lingo在runtime动态地增加或删除member,或修改现有的member的内容。于是我们有了这样的想法,先检查一下movie中所有的member,如果是script,则删除它,自然savemovie之类的保护手段也不存在了。前面已经讨论过,还原出来的dir总是丢失所有script内容,所以在这里删去它们也不会带来更多的遗憾。解除所有script作用的代码(包括保存新的movie部分)如下:

FileToBeOut=the file name to be output --modify it in your scripts
miaw=window(FileToBeOut)
tell miaw
repeat with i=1 to the number of castlibs
repeat with j=1 to the number of members of castlib i
if member(j,i).type=#script then
if member(j,i).scripttype=#movie then
member(j,i).scripttext="" --script内容成为空白,但member名称会保留
--或者 member(j,i).erase() --整个member被删除
end if
end if
end repeat
end repeat
--上面的两层循环查找所有cast中的所有member,并解除所有movie script的作用
savemovie "输出文件名" --为输出的文件命名
end tell
forget(miaw)
至此,基于lingo的保护完全失效。我想在Director的下一个版本中,Macromedia应该不会保留这种双手互搏之术了。
如果朋友们有兴趣,可以在此基础上包装一个好界面,自己做一个新的dirOpener。如果希望方便使用,可以用fileio xtra的displayopen和displaysave函数,来选择要输入、输出文件的位置及文件名。至今我还是不能理解为什么作为免费软件的dirOpener要捆绑大而贵的三个net相关的xtras和directOs。
这种方法并不是万能的,尤其对于dcr文件,上面的手段往往无所施其技。
我想这是最后一个关于还原director文件的贴子,到此为止吧。
I'm a freelance,not a cracker.
标签集:TAGS:
回复Comments() 点击Count()
喜欢就顶一下

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}