架构师_程序员_码农网

Потребителско име Извличане на парола
Регистрация

QQ登录

Само една стъпка, за да започнете

Търсене
Преглед:5980|Реплика: 3
打印 上一主题 下一主题

Анализът на рекламите на айкистите!

[copy link]
Асансьор директно към 跳转到指定楼层
собственика на сградата
发表于 2014-10-23 22:26:53|只看该作者回帖奖励|Преглед в обратна посока|Режим на четене

Напоследък е зает с откриването на училището, подходящо за сляпо сгъване - тези два дни Нула заети видео реклами, каза, че рекламите стават все по-наводнени, някои от рекламите за откриване на видео са повече от 60. Той се е отървал от рекламите за Sohu, но не е успял да се отърве от рекламите за Aqiyi. Нека му помогна да потърси.

Изходният код е това, което ми даде, нямам swf декомпилатор.

Не съм имал swf декомпилатор. Вероятно съм гледал структурата, а не съм научил ActionScript. Той каза, че е подобен на Java, така че не си правя труда да гледам основния синтаксис, а направо минавам към него. Нека първо разгледаме заглавието на основния файл Player.as и да видим какви препратки има там.

  1.     import com.iqiyi.components.global.*;
  2.     import com.iqiyi.components.tooltip.*;
  3.     import com.qiyi.player.base.pub.*;
  4.     import com.qiyi.player.base.uuid.*;
  5.     import com.qiyi.player.core.*;
  6.     import com.qiyi.player.core.model.def.*;
  7.     import com.qiyi.player.core.model.utils.*;
  8.     import com.qiyi.player.wonder.*;
  9.     import com.qiyi.player.wonder.body.view.*;
  10.     import com.qiyi.player.wonder.common.config.*;
  11.     import com.qiyi.player.wonder.common.lso.*;
  12.     import com.qiyi.player.wonder.common.pingback.*;
  13.     import com.qiyi.player.wonder.common.sw.*;
  14.     import flash.display.*;
  15.     import flash.events.*;
  16.     import flash.media.*;
  17.     import flash.system.*;
  18.     import flash.utils.*;
Копирайте кода

Погледнете името, com.qiyi.player.wonder.common.config.*; привлече вниманието ми - погледнете информацията за конфигурацията. Има два файла, FlashVarConfig.as и SystemConfig.as. SystemConfig.as не показва нищо интересно, но конфигурационният файл xml, към който се препраща във FlashVarConfig.as, си струва да бъде проучен.

  1. package com.qiyi.player.wonder.common.config
  2. {

  3.     public class FlashVarConfig extends Object
  4.     {
  5.         public static const OWNER_PAGE:String = "page";
  6.         public static const OWNER_CLIENT:String = "client";
  7.         public static const OS_XP:String = "xp";
  8.         public static const OS_WIN7:String = "win7";
  9.         public static const OS_WIN8:String = "win8";
  10.         public static const PAGE_OPEN_SRC_NONE:String = "0";
  11.         public static const PAGE_OPEN_SRC_DIRECT:String = "1";
  12.         public static const PAGE_OPEN_SRC_OTHER:String = "2";
  13.         private static var _flashVarSource:Object;
  14.         private static var _albumId:String = "";
  15.         private static var _tvid:String = "0";
  16.         private static var _vid:String = "";
  17.         private static var _autoPlay:Boolean = true;
  18.         private static var _isMemberMovie:Boolean = false;
  19.         private static var _cyclePlay:Boolean = false;
  20.         private static var _components:String = "fefff7e6";
  21.         private static var _cupId:String = "";
  22.         private static var _shareStartTime:int = -1;
  23.         private static var _shareEndTime:int = -1;
  24.         private static var _preloaderURL:String = "http://dispatcher.video.qiyi.com/dispn/player/preloader.swf";
  25.         private static var _preloaderVipURL:String = "";
  26.         private static var _exclusivePreloader:String = "";
  27.         private static var _useGPU:Boolean = true;
  28.         private static var _showBrand:Boolean = true;
  29.         private static var _expandState:Boolean = false;
  30.         private static var _tipDataURL:String = "http://static.qiyi.com/ext/tips/tipdata.xml";
  31.         private static var _coop:String = "";
  32.         private static var _owner:String = "page";
  33.         private static var _os:String = "win7";
  34.         private static var _adPlayerURL:String = "";
  35.         private static var _origin:String = "";
  36.         private static var _passportID:String = "";
  37.         private static var _playListID:String = "";
Копиране на кода

На ред 31 в този конфигурационен файл има следния параграф. А в ред 35 от рекламния адрес също привлече вниманието ми, по-късно в анализа. Първо разгледайте конфигурационния файл.

  1. </item>
  2. <!-- 正在为您播放片中广告, 可选择是否要跳过, 类别是1, 持续时间是8秒 -->
  3. <!-- 限制条件是:  不是正在登录中的会员 -->
  4. <!-- 每天每人次只最多显示两次这个tips -->
  5. <item id="ToSelectWhetherToSkipPlayingMiddleAD" level="1" duration="-1" type="1">
  6. <conditions>
  7. <fields>
  8. <field name="member" operator="eq" value="false"/>
  9. </fields>
  10. <frequency count="2">
  11. <restrain name="day"/>
  12. <restrain name="user"/>
  13. </frequency>
  14. </conditions>
  15. <list>
  16. <message>
  17. <![CDATA[
  18. 正在为您播放片中广告, <a href="event:ASEvent(skipAD)"><b><u>跳过广告</u></b></a>
  19. ]]>
  20. </message>
  21. </list>
  22. </item>
  23. <!-- 提示即将跳过8秒后会显示的剧中广告, 类别是1, 持续时间是8秒 -->
  24. <!-- 必须是登录的会员 -->
  25. <item id="ToCancelSkipNextMiddleAD" level="1" duration="8" type="1">
  26. <conditions>
  27. <fields>
  28. <field name="member" operator="eq" value="true"/>
  29. </fields>
  30. <frequency count="1">
  31. <restrain name="day"/>
  32. <restrain name="user"/>
  33. </frequency>
  34. </conditions>
  35. <list>
  36. <message>
  37. <![CDATA[
  38. 即将为您跳过片中广告,<a href="event:ASEvent(cancelSkipAD)"><u>不再跳过</u></a>
  39. ]]>
  40. </message>
  41. </list>
  42. </item>
  43. <!--
  44. 提示版权下线, 如果还有小于7天的时间下线, 每天一个专辑一台电脑提醒一次, 类别是1, 从起始60秒开始显示, 持续时间是10秒
  45. -->
  46. <!-- 因为优先级很高, 前面的最高优先级是10, 所以这里把level设为11. -->
  47. <!-- 这个tip是由signal发起的. Shawn.X  -->
  48. <!--
  49. 《<span>#keyword#</span>》 将于  <span>#expiredTime#</span> 版权到期.
  50. -->
  51. <item id="NoticeThisCopyrightWillExpire" level="11" duration="10" type="1">
  52. <conditions>
Копирайте кода

В него се казва, че това е вътрешна реклама с продължителност 8 s, което означава, че съм я локализирал и съм отвлякъл браузъра, за да премахна рекламите, но е ясно, че това не е реклама преди зареждането на видеоклипа. Продължавайте да прелиствате - много скучен процес.

Разберете кой извиква get adPlayerURL() и погледнете нагоре. В com\qiyi\player\wonder\plugins\ad открих, че рекламният плейър съществува под формата на плъгин, т.е. все още има повикване, като погледнах нагоре, открих, че в com\qiyi\cupid\adplayer\CupidAdPlayer.as се инициализира CupidAdPlayer. И класът е обфускулиран, което е подозрително.

  1. public function CupidAdPlayer(param1:CupidParam)
  2.         {
  3.             this.PLAYER_TIMEOUT_LENGTHS = new Array(10000, 15000);
  4.             Log.info("init, version=" + VERSION + ", " + param1.toString());
  5.             this._videoPlayerVersion = param1.videoPlayerVersion;
  6.             this._videoId = param1.videoId;
  7.             this._tvId = param1.tvId;
  8.             this._channelId = param1.channelId;
  9.             this._collectionId = param1.collectionId;
  10.             this._playerId = param1.playerId;
  11.             this._albumId = param1.albumId;
  12.             this._userId = param1.userId;
  13.             this._webEventId = param1.webEventId;
  14.             this._videoEventId = param1.videoEventId;
  15.             this._vipRight = param1.vipRight;
  16.             this._terminal = param1.terminal;
  17.             this._duration = param1.duration;
  18.             this._passportId = param1.passportId;
  19.             this._passportCookie = param1.passportCookie;
  20.             this._passportKey = param1.passportKey;
  21.             this._videoDefinitionId = param1.videoDefinitionId;
  22.             if (this.isQiyiWebEx())
  23.             {
  24.                 this._playerUrl = this.IQIYI_WEBEX_AM_URL;
  25.             }
  26.             else if (param1.playerUrl)
  27.             {
  28.                 this._playerUrl = param1.playerUrl;
  29.             }
  30.             else
  31.             {
  32.                 this._playerUrl = this.IQIYI_WEB_AM_URL;
  33.             }
  34.             if (param1.dispatcher == null)
  35.             {
  36.                 this._dispatcher = this;
  37.             }
  38.             else
  39.             {
  40.                 this._dispatcher = param1.dispatcher;
  41.             }
  42.             this._volume = param1.volume;
  43.             this._videoIndex = param1.videoIndex;
  44.             this._stageWidth = param1.stageWidth;
  45.             this._stageHeight = param1.stageHeight;
  46.             this._displayContainer = param1.adContainer;
  47.             this._screenStatus = DisplayProperties.isFullScreen(this._displayContainer.stage) ? ("1") : ("0");
  48.             this._baiduMainVideo = param1.baiduMainVideo;
  49.             this._disablePreroll = param1.disablePreroll;
  50.             this._disableSkipAd = param1.disableSkipAd;
  51.             this._enableVideoCore = param1.enableVideoCore;
  52.             this._isUGC = param1.isUGC;
  53.             this._videoPlayerUrl = this._displayContainer.loaderInfo ? (this._displayContainer.loaderInfo.loaderURL) : ("");
  54.             this._env = this.generateEnv();
  55.             this.addAdPlayerEventListeners();
  56.             return;
  57.         }// end function
Копирайте кода

CupidAdPlayer(param1:CupidParam) <- погледнете параметрите на извикването му, т.е. горният слой все още се извиква, който параметър е един, стойността е много забележима, vipRight Съдете дали е vip, а vip не съществува реклами, т.е. ако получа информацията за потребителя в сесията в плейъра, ще я използвам, за да получа информацията за потребителя в уебсайта, т.е. ако получа информацията за потребителя в сесията в плейъра, ще я използвам, за да получа информацията за потребителя в уебсайта. Това означава, че ако направя промяна в информацията за потребителя в сесията на уебсайта, след като неговият плейър получи информацията за потребителя в уебсайта, и направя промяна в мястото за преценка дали е вип или не, което ще доведе до извикване на по-ниския слой, той погрешно ще бъде помислен, че е вип (само рекламният плейър мисли, че сте вип, а другите места няма да бъдат засегнати). Затова нека продължим да гледаме нагоре. Търсейки го, ние се върнахме в директорията на рекламния плъгин. com\qiyi\player\wonder\plugins\ad\view в ADView.as, заглавието първо е

  1. private var _adPlayer:CupidAdPlayer;
Копирайте кода

Дефинирахме веднъж инстанция на CupidAdPlayer с име _adPlayer, превъртяхме надолу, за да разберем кой използва _adPlayer. изненадващо намерихме функцията за създаване на рекламен плейър.

  1. public function createAdPlayer(param1:CupidParam) : void
  2.         {
  3.             if (this._adPlayer)
  4.             {
  5.                 this.unloadAdPlayer();
  6.             }
  7.             this._log.info("loading adplayer...");
  8.             this._adPlayer = new CupidAdPlayer(param1);
  9.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_LOADING_SUCCESS, this.onAdLoadSuccess);
  10.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_LOADING_FAILURE, this.onAdLoadFailed);
  11.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_AD_START, this.onAdStartPlay);
  12.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_PAUSE, this.onAdAskVideoPause);
  13.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_RESUME, this.onAdAskVideoResume);
  14.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_START_LOADING, this.onAdAskVideoStartLoad);
  15.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_START, this.onAdAskVideoStartPlay);
  16.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_END, this.onAdAskVideoEnd);
  17.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_AD_BLOCK, this.onAdBlock);
  18.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_DISPLAY_AD_TIP, this.onAskVideoShowBonusTips);
  19.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_AD_VIDEO, this.onAdFlvADAction);
  20.             this._adPlayer.load();
  21.             return;
  22.         }// end function
Копиране на кода

Виждайки, че все още можете да подавате параметри, означава, че тя все още се извиква. Най-накрая намерих източника в ADViewMediator.as под com\qiyi\player\wonder\plugins\ad\view. Окончателното извикване на неговата функция изглежда така

  1. private function createADPlayer() : void
  2.         {
  3.             sendNotification(BodyDef.NOTIFIC_PLAYER_STOP_LOAD);
  4.             ProcessesTimeRecord.STime_adInit = getTimer();
  5.             var _loc_1:* = facade.retrieveProxy(PlayerProxy.NAME) as PlayerProxy;
  6.             var _loc_2:* = facade.retrieveProxy(UserProxy.NAME) as UserProxy;
  7.             var _loc_3:* = new CupidParam();
  8.             _loc_3.playerUrl = FlashVarConfig.adPlayerURL;
  9.             _loc_3.videoId = _loc_1.curActor.loadMovieParams.vid;
  10.             _loc_3.tvId = _loc_1.curActor.loadMovieParams.tvid;
  11.             _loc_3.channelId = _loc_1.curActor.movieModel.channelID;
  12.             _loc_3.playerId = FlashVarConfig.cupId;
  13.             _loc_3.albumId = _loc_1.curActor.movieModel.albumId;
  14.             _loc_3.dispatcher = null;
  15.             _loc_3.adContainer = this._ADView;
  16.             _loc_3.stageWidth = GlobalStage.stage.stageWidth;
  17.             _loc_3.stageHeight = GlobalStage.stage.stageHeight;
  18.             _loc_3.userId = _loc_1.curActor.uuid;
  19.             _loc_3.webEventId = UUIDManager.instance.getWebEventID();
  20.             _loc_3.videoEventId = UUIDManager.instance.getVideoEventID();
  21.             _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
  22.             _loc_3.terminal = "iqiyiw";
  23.             _loc_3.duration = _loc_1.curActor.movieModel.duration / 1000;
  24.             _loc_3.passportId = _loc_2.passportID;
  25.             _loc_3.passportCookie = _loc_2.P00001;
  26.             _loc_3.passportKey = KeyUtils.getPassportKey(0);
  27.             _loc_3.enableVideoCore = true;
  28.             _loc_3.disableSkipAd = _loc_1.curActor.movieModel.forceAD;
  29.             _loc_3.volume = Settings.instance.mute ? (0) : (Settings.instance.volumn);
  30.             _loc_3.isUGC = UGCUtils.isUGC(_loc_1.curActor.movieModel.tvid);
  31.             _loc_3.collectionId = FlashVarConfig.collectionID;
  32.             _loc_3.videoDefinitionId = _loc_1.curActor.movieModel.curDefinitionInfo.type.id;
  33.             _loc_3.videoPlayerVersion = WonderVersion.VERSION_WONDER;
  34.             this._ADView.createAdPlayer(_loc_3);
  35.             return;
  36.         }// end function
Копиране на кода

Ключовият момент е в

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
Копиране на кода

Този ред, за да определи дали потребителят е vip или не, първо според локалната променлива loc_2 определя нивото на потребителя, ако с определението за ниво vip, връща 1. Даваме му лека модификация, той става псевдо vip.

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("1");
Копирайте кода

По този начин в Hex за модифициране на реда, тестови реклами успешно премахнати (с помощта на функцията на плъгина на Chrome, модифициране на адреса на плейъра за локалния, възпроизвеждане на същите параметри за предаване).

Освен това в AdBlockedBlackScreen.as под com\qiyi\cupid\adplayer\model има локална функция за откриване, за да се забрани блокирането на плъгина на Chrome.

  1. public static function isInBlacklist(param1:String) : Boolean
  2.         {
  3.             if (!param1)
  4.             {
  5.                 return false;
  6.             }
  7.             if (StringUtils.beginsWith(param1, "chrome-extension://"))
  8.             {
  9.                 return true;
  10.             }
  11.             var _loc_2:* = new URLParser(param1);
  12.             var _loc_3:* = _loc_2.getHost();
  13.             return HOST_BLACKLIST.indexOf(_loc_3) != -1;
  14.         }// end function
Копирайте кода

Просто променете връщането на втория if на false.






Предишна статияСъветникът за възстановяване на замразяване 7.5 Alternative Crack в Win7
Следваща: Инсталиране на виртуална машина VMware MAC OSX Mountain Lion
Код на фермерската мрежа, публикуван само в процеса на практиката, срещнал технически трудности, да не подвежда другите.
Не съм сигурен дали си фен на това.
Не съм сигурен дали ще успея да го направя.
发表于 2014-10-23 23:25:57|只看该作者
Сяо Нинцзи е толкова велик
Мрежата на фермерите с код, публикуван само в процеса на практиката, срещнал технически трудности, не подвеждайте другите.
Бенч
发表于 2014-10-24 21:57:25|只看该作者
Този плъгин за блокиране на реклами не е лош

Оценка

Участници 1 MB +1 Принос +1 ОтстраниПричината
Администратор + 1 + 1 Много мощен!

Вижте всички оценки

Кодексът на фермерската мрежа, публикуван само в процеса на практиката, срещнал технически трудности, не заблуждавайте другите.
Подови дъски
собственик|发表于 2014-10-24 22:01:44|只看该作者
Публикувано от skywriter на 2014-10-24 21:57
Този плъгин за блокиране на реклами не е лош

Adblock Plus е най-популярният софтуер за филтриране на реклами, който се предлага за браузъри Firefox, Chrome, Opera, Safari, Android и Internet Explorer. Филтрирайте всички досадни онлайн реклами: премахнете видео рекламите в Youtube, филтрирайте рекламите във Facebook, отървете се от изскачащите реклами и много други. В Google Chrome Adblock Plus е един от най-бързо развиващите се плъгини.
CodeFarmer.com, публикуван само в процеса на практиката, срещнал технически трудности, не подвеждайте другите.
Трябва да влезете в системата, преди да можете да публикувате обратно Вход | Регистрация

Тази версия на интегралните правила


ИЗКЛЮЧЕНИЕ: Целият софтуер, програмни материали или статии, публикувани от мрежата Code Farmer, е ограничен до учебни и изследователски цели; горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай, всички последици, моля, потребителят е отговорен. Този сайт информация от мрежата, спор за авторски права няма нищо общо с този сайт. Трябва напълно да премахнете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето му. Ако програмата ви харесва, моля, подкрепете оригиналния софтуер, купете регистрацията и получете по-добро оригинално обслужване. Ако има някакво нарушение, моля, свържете се с нас по имейл, за да се справим с него.

Поща To:help@itsvse.com

QQ| ( 鲁ICP备14021824号-2)|Карта на сайта

GMT+8, 2024-9-17 14:05

Бърз отговорВърнете се в началотоВърнете се в списъка