新东方flash课程破解,感激icebird的博客
连夜来赶这篇博客,就是想感谢一下icebird,利用他一篇博文中介绍的方法成功的破解了新东方的flash。原博文在此。
原文言简意赅,只是自己是门外汉,对flash了解的不多,于是小折腾一番才破解成功,在此把过程记录下来,供自己学习。
补充:原博文所提供的工具可能对某些flash不起作用,详见本文末补充。
最近在看新东方的flash课程(在网上搜一下,很多的),由于flash是加过密的,所以通常的flash player并不能播放。好在有Zzflash,一个专门为新东方网络课程设计的flash播放器(也同样感激这个作者),不过美中不足就是只能用在windows下。而好多时候,自己想放在手机中,没事时好翻出来看看,这个时候便需要破解flash,使它能在标准的播放器中使用。
首先说一下新东方flash的加密手段吧。一共是两个。
一、在flash的前三帧,并没有实际内容,只是一个死循环。(从后面反编译的代码来看,应该是在第三帧时不停的跳回第二帧)
二、在代码中检测url。发现不是新东方的网站,自动跳回到第一帧。
网上有几种破解方法,比方:1. 用二进制编译器替换固定的二进制序列,2. 在网页中嵌入flash,并用js控制从第四帧开始播放。可惜这两种方法都只做了第一步破解(就是跳过前3帧),虽然可以播放,但播放后不久会跳会开始处。所以这里不详细绐出这两种方法了。
(其实我在想,在网页中嵌入flash,通过修改js那种方法,只要再修改一下系统的host,把tol24.com指向目标文件应该可以,不过我懒的试了,毕竟下面有更好的方法)
IceBird的破解方法是这样的:
首先利用Flasm对swf进行反编译,得到近似于汇编的指令码,命令如下:
flasm.exe -d source.swf > target.flm
然后用文本编辑器打开生成的target.flm。第一步是去掉那个死循环。(并不需要理解每一句的含义,根据字面意思猜测一下即可)。
frame 2
push 'title'
getVariable
push ''
stringEq
not
branchIfTrue label1
prevFrame
label1:
end // of frame 2
找到第三帧的代码(0-based),可以看到,在某个string比较(stringEq)结果不满足时会跳到label1执行(branchIfTrue label1 一句),否则执行prevFrame跳回上一帧。所以这一步直接把那句prevFrame删了就行,不管条件如何,继续执行。(当然,把整个frame2换成一句play更好)
下面是第二个破解。强大的IceBird兄绐出了源码:
view = _url.substr(0, 4);
allURL = _url.substr(0, 60);
status = allURL.indexOf("tol24.com");
if (view != "http" || status == -1) //或者修改这两个条件
{
_root.gotoAndPlay(1); //或者想办法在汇编的代码中去掉这句
}
(摘自IceBird的Blog)
可以在刚刚那个flm文件中搜索"http",可以看到这样一段:
function vv () push 'interval called' trace push 'view', 4, 0.0, 2, '', 15 getProperty push 'substr' callMethod setVariable push 'allURL', 50, 0.0, 2, '', 15 getProperty push 'substr' callMethod setVariable push 'status', 'tol24.com', 1, 'allURL' getVariable push 'indexOf' callMethod setVariable push 'view' getVariable push 'http' equals not dup branchIfTrue label1 pop push 'status' getVariable push -1 equals label1: not branchIfTrue label2 push 1, 1, '_root' getVariable push 'gotoAndPlay' callMethod pop label2: end // of function vv
这时对照上面的源码,应该很容易就把这段汇编看个大其概。可以按IceBird说的,修改条件或去掉跳转句。不过我倾向于让这个方法直接返回。就是在第二行的 push 'interval called' 下加一句branch label2。
然后保存,用如下命令编译flm:
flasm.exe -a target.flm
另外,不要忘记用如下命令压缩一下,能省不少空间的:
flasm.exe -z source.swf
至此,破解也就完成了,你可以自己写一个工具来完成自动处理。不但IceBird自己写了一个,你可以点击这里从它的博客下载。(这个破解工具对少数flash有问题,请注意篇末的补充)
再次感谢IceBird。
补充(2010/01/07):
偶然发现上文所绐的工具对某些flash不起作用,于是研究了一下源码,发现代码中有多处url验证(除去function vv),估计icebird的工具没有考虑这种情况。其实并不一定要破坏或跳过那个判断条件,让条作满足也是一个办法,而且更简单,方法如下:
反汇编(见上),将整个frame 2替换成:
push '_url','http://tol24.com'
var
setVariable
然后编译压缩即可,又省事,又简单,还利于程序实现。
补充(2010/01/08):
又发现补充中绐的代码也有不行的时候(貌似是变量名变掉了),不过方法在那里,碰到不行的,手动改一下就好了。
P.S.
“驚聞ELVA母親病逝的消息 覺得非常的心疼 雖然沒有私交 不過衷心的希望ELVA堅強 節哀順變 媽媽一定伴隨著天使飛往平靜無憂的天堂 我和所有的歌迷朋友一起為ELVA心痛 ELVA加油 媽媽在天國會一直守護著你的。 From, 靜茹。”


January 5th, 2010 - 08:41
swf居然还有反汇编的工具,太强大了~我以前貌似听说过一个软件可以把swf反编译成fla文件的,据说可以100%还原AS,不知道是不是真的有这么厉害
January 6th, 2010 - 01:04
听说你的博客又遭变故了?
January 5th, 2010 - 21:09
看看,貌似不错的样子~~我说的是你的博客
January 7th, 2010 - 20:31
我都是直接拖到KMP里的
January 10th, 2010 - 01:13
加密强度不高。再加点扰码。你用FLASM反汇编也没用。