架构师_程序员_码农网

N Récupérer le mot de passe
S'inscrire

QQ登录

Une seule étape pour commencer

Recherche
Vue :5980|Réponse : 3
打印 上一主题 下一主题

L'analyse des annonces du joueur d'Aiki !

[copier le lien]
L 跳转到指定楼层
le propriétaire du bâtiment
发表于 2014-10-23 22:26:53|只看该作者回帖奖励 | Mode lecture

Récemment occupé par l'ouverture de l'école adaptée au pliage aveugle - ces deux jours Zéro occupé publicités vidéo, a déclaré que les annonces sont de plus en plus inondés, certains des annonces d'ouverture vidéo sont plus de 60s. Il s'est débarrassé des publicités pour Sohu, mais il n'a pas réussi à se débarrasser des publicités pour Aqiyi. Laissez-moi l'aider à chercher.

Il m'a donné le code source, je n'ai pas de décompilateur de swf.

J'ai probablement regardé la structure et je n'ai pas appris ActionScript. Il a dit que c'était similaire à Java, donc je ne me suis pas donné la peine de regarder la syntaxe de base, et je suis allé directement à l'actionScript. Regardons d'abord l'en-tête du fichier principal Player.as et voyons quelles sont les références qui s'y trouvent.

  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.*;
Copier le code

Regardez le nom, com.qiyi.player.wonder.common.config.* ; cela a attiré mon attention - regardez les informations de configuration. Il y a deux fichiers, FlashVarConfig.as et SystemConfig.as. SystemConfig.as ne montre rien d'intéressant, mais le fichier de configuration xml référencé dans FlashVarConfig.as vaut la peine d'être étudié.

  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 = "";
Copie du code

A la ligne 31, ce fichier de configuration contient ce paragraphe. Et à la ligne 35 de l'adresse de l'annonce a également attiré mon attention, plus tard dans l'analyse. Regardons d'abord le fichier de configuration.

  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>
Copier le code

Il est indiqué qu'il s'agit d'une publicité in-show d'une durée de 8 secondes, ce qui signifie que je l'ai localisée et que j'ai détourné le navigateur pour supprimer les publicités, mais il est clair qu'il ne s'agit pas d'une publicité avant le chargement de la vidéo. Continuez à feuilleter, c'est très ennuyeux.

Trouvez qui appelle get adPlayerURL() et regardez vers le haut. Sous comqiyi\player\wonder\plugins\ad, j'ai trouvé que le lecteur de publicité existe sous la forme d'un plugin, c'est-à-dire qu'il y a toujours un appel, en regardant vers le haut, j'ai trouvé que sous comqiyi\cupid\adplayer\CupidAdPlayer.as CupidAdPlayer est initialisé. Et la classe est obfusquée, ce qui est suspect.

  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
Copiez le code

CupidAdPlayer(param1:CupidParam) <- regardez ses paramètres d'appel, c'est-à-dire que la couche supérieure appelle toujours, quel paramètre un, une valeur est très perceptible, vipRight Judge si c'est vip, et vip n'existe pas ads, c'est-à-dire que si j'obtiens les informations de l'utilisateur dans la session dans le lecteur, je l'utiliserai pour obtenir les informations de l'utilisateur dans le site Web, c'est-à-dire que si j'obtiens les informations de l'utilisateur dans la session dans le lecteur, je l'utiliserai pour obtenir les informations de l'utilisateur dans le site Web. En d'autres termes, si je modifie les informations relatives à l'utilisateur dans la session du site web après que le lecteur a obtenu les informations relatives à l'utilisateur sur le site web, et que je modifie l'endroit où l'on juge s'il s'agit d'un vip ou non, ce qui entraînera l'appel de la couche inférieure, on pensera à tort qu'il s'agit d'un vip (seul le lecteur de publicité pense que vous êtes un vip, et les autres endroits ne seront pas affectés). Continuons donc à regarder vers le haut. Pour le trouver, nous sommes retournés dans le répertoire du plugin de publicité. comqiyi\player\wonder\plugins\adview dans le ADView.as, l'entête est d'abord

  1. private var _adPlayer:CupidAdPlayer;
Copier le code

Définition d'une instance de CupidAdPlayer nommée _adPlayer une fois, défilement vers le bas pour trouver qui utilise _adPlayer. étonnamment trouvé la fonction de création du lecteur de publicité.

  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
Copie du code

Le fait que vous puissiez toujours passer des paramètres signifie que la fonction est toujours appelée. J'ai finalement trouvé la source dans ADViewMediator.as sous com\qiyi\player\wonder\plugins\ad\view. L'appel final à cette fonction ressemble à ceci

  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
Copier le code

Le point clé se trouve dans la section

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
Copier le code

Cette ligne, pour déterminer si l'utilisateur est un vip ou non, se base d'abord sur la variable locale loc_2 pour déterminer le niveau de l'utilisateur, si avec la définition du niveau vip, elle renvoie 1. Nous lui apportons une légère modification, elle devient un pseudo-vip.

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("1");
Copier le code

De cette manière, dans Hex, modifier la ligne, tester les publicités supprimées avec succès (en utilisant la fonction plug-in de Chrome, modifier l'adresse du lecteur pour le local, jouer les mêmes paramètres à passer).

De plus, dans le fichier AdBlockedBlackScreen.as sous com\qiyi\cupid\adplayer\model, il y a une fonction de détection locale pour interdire le blocage du plug-in de 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
Copier le code

Il suffit de changer le retour du second if en false.






Article précédentFreeze Restore Wizard 7.5 Alternative Crack in Win7
Next: Installation de la machine virtuelle VMware MAC OSX Mountain Lion
Code Farmer réseau, seulement publié dans le processus de pratique, rencontré des difficultés techniques, ne pas induire en erreur les autres.
Je ne suis pas sûr que vous soyez un fan de ceci.
Je ne suis pas sûr de pouvoir le faire.
发表于 2014-10-23 23:25:57|只看该作者
Xiao Ningzi est si grand
Le réseau de l'agriculteur de code, seulement publié dans le processus de la pratique, a rencontré des difficultés techniques, ne pas induire en erreur les autres.
Bench
发表于 2014-10-24 21:57:25|只看该作者
Ce plugin pour bloquer les publicités n'est pas mal

Classement

Participants 1 MB +1 Contribution +1 Ranger Raison
administrateur + 1 + 1 Très puissant !

Voir toutes les évaluations

Le code agriculteur réseau, seulement publié dans le processus de la pratique, a rencontré des difficultés techniques, ne pas induire les autres en erreur.
Planches
propriétaire|发表于 2014-10-24 22:01:44|只看该作者
Posté par skywriter le 2014-10-24 21:57
Ce plugin pour bloquer les publicités est pas mal

Adblock Plus est le logiciel de filtrage des publicités le plus populaire disponible pour les navigateurs Firefox, Chrome, Opera, Safari, Android et Internet Explorer. Filtrez toutes les publicités en ligne gênantes : supprimez les publicités vidéo sur Youtube, filtrez les publicités Facebook, débarrassez-vous des pop-up et bien d'autres encore. Sur Google Chrome, Adblock Plus est l'un des plugins dont la croissance est la plus rapide.
CodeFarmer.com, publié uniquement dans le processus de pratique, a rencontré des difficultés techniques, ne pas induire les autres en erreur.
Vous devez vous connecter avant de pouvoir poster Log in | Register

C ette version des règles intégralesR


AVERTISSEMENT : Tous les logiciels, matériels de programmation ou articles publiés par le réseau Code farmer sont limités à des fins d'étude et de recherche ; le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon, toutes les conséquences s'il vous plaît l'utilisateur responsable. Les informations contenues dans ce site proviennent du réseau, les litiges relatifs aux droits d'auteur n'ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, veuillez soutenir le logiciel authentique, acheter l'enregistrement et obtenir un meilleur service authentique. En cas d'infraction, veuillez nous contacter par courrier électronique pour régler le problème.

Courrier To:help@itsvse.com

QQ | ( 鲁ICP备14021824号-2)|Sitemap

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

Réponse rapideRetour au débutRetour à la liste