修改Youku的Swf实现去广告
声明:本文只是对Flash实现16进制编辑的基本思路的说明,并不是确实可行完整的Youku去广告方法.
首先打开Firebug,获取swf文件地址,下载下来.
使用大名鼎鼎的某SWF Decomper工具反编译,经过鲁夫的爱的提点,
在
找到了关键代码.
打算修改时,想到了几个问题.
首先,目前电脑上没有安装,也不想安装Flash;
其次,反编译的代码恐怕只能用来学习,反编译的结果需要耗费大量的精力进行修正才可正常编译;
于是想到了进行16进制编辑ABC
(ActionScript Byte Code),还好某SWF Decomper工具提供了查看2进制代码的功能.
但是
里逻辑太复杂,又想到黑屏时间是固定的30秒,修改黑屏时间为0不就可以了吗!
经过一番摸索(过程略),在
com.youku.plugins.ads.view.FrontMediator的
showADHolder函数里找到关键代码:
var _loc_1:Number = 0; if (this._playerProxy.playerData.videoTotalTime < 60) { _loc_1 = 0; this._playerProxy.dispatchEvent(new ReportEvent(ReportEvent.AD_BLOCK_NOTICE_REPORT, {type:"front", time:_loc_1, fa:this._FSOavailable})); this._playerProxy.dispatchEvent(new PluginEvent(PluginEvent.AD_LOAD_COMPLETE, {doLoad:true})); this.onADHolderFinished(null); return; } if (this._playerProxy.playerData.videoTotalTime >= 60 && this._playerProxy.playerData.videoTotalTime < 3 * 60) { _loc_1 = 10; } else if (this._playerProxy.playerData.videoTotalTime >= 3 * 60 && this._playerProxy.playerData.videoTotalTime < 5 * 60) { _loc_1 = 15; } else { _loc_1 = 30; } this._adHolder = new ADHolder(_loc_1);
根据上面的代码,可以看出,对于小于60秒的视频,是不会黑屏的.我于是打算修改判断
videoTotalTime< 60 为 videoTotalTime >= 0.切换到二进制代码视图, 关键的比较代码如下
//66 da 04 _as3_getproperty com.youku.interfaces:IPlayerData::videoTotalTime //24 3c _as3_pushbyte 60 //0c 48 00 00 _as3_ifnlt offset: 72
祭出神器WinHex,查找
243C0C480000.恩?什么,找不到.
很明显,数据被Flash加密或压缩了.
祭出时隐时现的神器Google,搜索后得之,CWS的Flash是被压缩了的,压缩只是简单的使用zlib库.
再次Google到swfdecomp.exe这样一个软件.成功转换为未压缩的FWS
.
WinHex大显神通,查找
243C0C480000只有一条记录.修改为
24000F480000.
测试修改后的结果,正常运行并且不显示广告,OK.
额,30秒的时间还是有的。当网速不给力的情况下,这30秒还是蛮需要的
头像我喜欢~
你右键另存为吧!
请问一下,我理解最后的表示式是
if (this._playerProxy.playerData.videoTotalTime || 60)
将"3c0c"改为"000f",不知为什么是"0f"?谢谢
这个是 swf 的字节码,
请参考 http://www.anotherbigidea.com/javaswf/avm2/AVM2Instructions.html