修改Youku的Swf实现去广告

声明:本文只是对Flash实现16进制编辑的基本思路的说明,并不是确实可行完整的Youku去广告方法.

首先打开Firebug,获取swf文件地址,下载下来.

使用大名鼎鼎的某SWF Decomper工具反编译,经过鲁夫的爱的提点,

com.youku.core.view.components.BaseVideo

找到了关键代码. 

打算修改时,想到了几个问题.
首先,目前电脑上没有安装,也不想安装Flash;
其次,反编译的代码恐怕只能用来学习,反编译的结果需要耗费大量的精力进行修正才可正常编译;

于是想到了进行16进制编辑ABC

(ActionScript Byte Code)

,还好某SWF Decomper工具提供了查看2进制代码的功能.
但是

onConnectTimeOut

里逻辑太复杂,又想到黑屏时间是固定的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

(SWF的倒序?)

.

WinHex大显神通,查找

243C0C480000

只有一条记录.修改为

24000F480000

.

测试修改后的结果,正常运行并且不显示广告,OK.

 

这里是一个修改自cws2fwsflash.plPerl脚本,可以实现fws和cws的相互转换.

标签:优酷, Flash

已有 46 条评论

  1. 卧槽, 这文章早出来一个月就牛比了, 当然现在也很牛比, 只是chinalist跟进太及时.

    1. 呵呵,感谢赞赏,
      不过我觉得,ABP的请求拦截和元素隐藏肯定是敌不过Flash的

      1. 能撑几天是几天吧, 把这个播放器托管到一个速度快的地方, 再写一个替换userscript?

        1. 恩.我是这样想的.
          可惜不能放在本地.
          我尝试了file和chrome协议都不行...
          不知道Firefox有没有设置

  2. 果然技术~几乎看不懂的说。
    要是想简单的屏蔽ad的话,还是用host和cookie吧
    鄙人的博客有一篇文章关于优酷黑屏的

  3. [...]}这样, if 永远成立, 片头广告就不会被载入, 也就不被拦截, 因而不会有黑屏.详情请看他的原文《修改Youku的Swf实现去广告 》.而我作为一个没学过编译原理的山寨脚本员, 虽然知道这样做可行, 却没法动手做. 大家为彪悍的CzBiX 鼓掌.但是这样还是无法把播放器内的广告完全去掉, 而我又没有CzBiX 的动手能力. 于是我找来一个比winhex 更彪悍一点的swf doabc[...]

  4. 阉得更加彻底 :)

    1. 没什么好说的,啪啦啪啦鼓掌

  5. 不错的文章

  6. 精神可嘉!其实只要加这个参数就行了(showAd=0),具体看这个油猴脚本:
    http://userscripts.org/scripts/show/119622
    跑去一看才知道,那边两个帖子一个是我发的,一个是你发的,显然你用过这个脚本,拦截失效了,还是想更彻底一点?至少我这目前还是能够正常拦截广告的。

    1. 那个主要不是通过加参数而是替换播放器实现的.
      替换的播放器是精简版,相当不好用,所以就修改完整版的swf来去广告

      1. 现在这个播放器比没发现参数前用淘宝的那个好多了,基本上功能都在,除了那个时间线。

        1. 用淘宝的那个还不如看广告呢,
          这样你就满足了...一点Geek精神都没有

          1. 对,我显然不是Geek,我也不是优酷控,一个月进去几次都难说。

            1. 我真是很失望,想不到你是这种人.
              再也不相信什么基情了...

  7. 菜鸟看不懂这个。。。
    买了船票过来看你了,有点费劲。
    啥时加上了我的链接的呢?激动~~

    1. 我也不记得了,看了下,是一个月前加的.
      目前看来是联通全都无法访问,悲剧

      1. 今天蛮顺利,没翻墙就进来了~~~~

        1. 我貌似应该高兴?
          呵呵

          1. 高兴的应该是我!不翻墙没那么累,你也不准备个梯子。。。

  8. Anonymous Anonymous

    飞飞

  9. 我也来踩下……

  10. 呀!又能打开了。

添加新评论