Analyser un player swf

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#1
Bonjour,

Je suis confronté à un petit problème : l’intégrale Nicky Larson est sur le site de wat dans une version introuvable ailleurs, alors j’ai envie de la télécharger, mais il ne suffit pas de regarder le code source pour trouver l'url de la vidéo parce que ces malins utilisent un lecteur flash.
Mais là je me rends compte que je sais décompiler un swf pour savoir où il va chercher la vidéo.
Par exemple, l'url suivante pointe vers le player avec comme argument un videoId : https://www.wat.tv/images/v70/PlayerLite.swf?videoId=762vp
J'ai décompilé le playerLite avec JPEXS :
Code:
package tv.wat.player.loader
{
   import flash.display.Sprite;
   import flash.display.Loader;
   import flash.net.URLLoader;
   import flash.events.Event;
   import flash.events.IOErrorEvent;
   import flash.events.SecurityErrorEvent;
   import flash.net.URLRequest;
   import flash.system.Security;
   import flash.display.StageScaleMode;
   
   public class PlayerLite extends Sprite
   {
      
      public function PlayerLite()
      {
         super();
         Security.allowDomain("www.wat.tv");
         Security.allowDomain("*");
         this.protocol = "";
         this.sizePlayerW = -1;
         this.sizePlayerH = -1;
         this.isAlone = !(stage == null);
         this.flashvars = loaderInfo.parameters;
         try
         {
            if(this.isAlone)
            {
               stage.scaleMode = StageScaleMode.NO_SCALE;
               stage.align = "TL";
               stage.addEventListener(Event.RESIZE,this.resizePlayerHandler);
               this.loadPlayer();
            }
         }
         catch(error:Error)
         {
         }
      }
      
      private var ldr:Loader;
      
      private var sizePlayerW:int;
      
      private var sizePlayerH:int;
      
      private var isAlone:Boolean;
      
      private var flashvars:Object;
      
      private var baseUrl:String;
      
      private var protocol:String;
      
      public function loadPlayer() : *
      {
         var _loc1_:URLLoader = null;
         this.ldr = new Loader();
         this.ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,this.completeHandler);
         this.ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,this.errorHandler);
         if(this.flashvars.videoId == null)
         {
            this.flashvars.videoId = "9489605";
         }
         if(this.flashvars.baseUrl == null)
         {
            this.flashvars.baseUrl = "www.wat.tv";
         }
         if(this.flashvars.rev == null)
         {
            _loc1_ = new URLLoader();
            _loc1_.addEventListener(Event.COMPLETE,this.revCompleteHandler);
            _loc1_.addEventListener(IOErrorEvent.IO_ERROR,this.revIOErrorHandler);
            _loc1_.addEventListener(SecurityErrorEvent.SECURITY_ERROR,this.securityErrorHandler);
            if(this.flashvars.preprod == "1")
            {
               _loc1_.load(new URLRequest("//www2.wat.tv/images/v70/rev"));
            }
            else
            {
               _loc1_.load(new URLRequest("//www.wat.tv/images/v70/rev"));
            }
         }
         else
         {
            this.callPlayer(this.flashvars.rev + "");
         }
      }
      
      private function securityErrorHandler(param1:SecurityErrorEvent) : *
      {
         this.protocol = "https:";
         (param1.target as URLLoader).load(new URLRequest(this.protocol + "//www.wat.tv/images/v70/rev"));
      }
      
      private function revCompleteHandler(param1:Event) : *
      {
         (param1.currentTarget as URLLoader).removeEventListener(Event.COMPLETE,this.revCompleteHandler);
         (param1.currentTarget as URLLoader).removeEventListener(IOErrorEvent.IO_ERROR,this.revIOErrorHandler);
         this.callPlayer((param1.currentTarget as URLLoader).data + "");
      }
      
      private function revIOErrorHandler(param1:IOErrorEvent) : *
      {
         this.callPlayer("004.000.000");
      }
      
      private function callPlayer(param1:String) : *
      {
         this.flashvars.rev = param1;
         var _loc2_:* = "";
         _loc2_ = this.protocol + "//" + "www.wat.tv" + "/images/v70/PlayerWat.swf";
         this.ldr.load(new URLRequest(_loc2_ + "?rev=" + param1));
      }
      
      private function errorHandler(param1:IOErrorEvent) : *
      {
         try
         {
            (param1.currentTarget as Loader).removeEventListener(Event.COMPLETE,this.completeHandler);
            (param1.currentTarget as Loader).removeEventListener(IOErrorEvent.IO_ERROR,this.errorHandler);
         }
         catch(err:Error)
         {
         }
      }
      
      private function completeHandler(param1:Event) : *
      {
         this.addChild(this.ldr);
         dispatchEvent(new Event("PLAYER_LOADED"));
         (this.ldr.content as Object).addEventListener("PLAYER_PLUGGED",this.resizePlayerHandler);
         if(!(this.sizePlayerW == -1) && !(this.sizePlayerH == -1))
         {
            (this.ldr.content as Object).plugVars(this.flashvars,this.sizePlayerW,this.sizePlayerH);
         }
         else
         {
            (this.ldr.content as Object).plugVars(this.flashvars,stage.stageWidth,stage.stageHeight);
         }
         if(this.isAlone)
         {
            this.resizePlayerHandler();
         }
      }
      
      private function resizePlayerHandler(param1:Event = null) : *
      {
         if(this.ldr == null)
         {
            return;
         }
         if(!(this.sizePlayerW == -1) && !(this.sizePlayerH == -1))
         {
            (this.ldr.content as Object).setPlayerSize(this.sizePlayerW,this.sizePlayerH);
         }
         else
         {
            (this.ldr.content as Object).setPlayerSize(stage.stageWidth,stage.stageHeight);
         }
      }
      
      public function setPlayerSize(param1:int, param2:int) : *
      {
         try
         {
            if(this.ldr != null)
            {
               (this.ldr.content as Object).setPlayerSize(param1,param2);
            }
         }
         catch(err:Error)
         {
         }
      }
   }
}
Je comprends pas très bien ce que font les appels à des url comme images/v70/rev...
Ni ce qu'il passe comme arguments au "vrai" player, cad PlayerWat.swf. En plus, celui-là a plein de fichiers...

Bref, si quelqu'un pouvait m'aider, ce serait sympa...
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#2
Essaye de regarde si ya du code concernant PLAYER_PLUGGED et la fonction plugVars
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#3
En effet, il y a une fonction plugVars définie dans PlayerWat.as :
public function plugVars(param1:object, param2:int, param3:int) : *
{
super.flashvarsObj = param1;
if(super.flashvarsObj.baseUrl == null)
{
super.flashvarsObj.baseUrl = "wat.tv";
}
if(super.flashvarsObj.referer == null)
{
super.flashvarsObj.referer = "wat.tv";
}
if(super.flashvarsObj.refererURL == null)
{
super.flashvarsObj.refererURL = "wat.tv";
}
if(super.flashvarsObj.revision == null)
{
if(super.flashvarsObj.rev != null)
{
super.flashvarsObj.revision = super.flashvarsObj.rev;
}
}
if(super.flashvarsObj.context == null)
{
super.flashvarsObj.context = "playerWat";
}
if(super.flashvarsObj.oasTag != null)
{
super.flashvarsObj.forceOASTag = super.flashvarsObj.oasTag;
}
if(super.flashvarsObj.oasTag == "www.metronews.fr")
{
super.flashvarsObj.forceOASTag = "METRO/videos/metrozap";
}
if(super.flashvarsObj.recoTf1 == "")
{
super.flashvarsObj.noReco = "1";
}
this.startPlayer();
this.setPlayerSize(param2,param3);
}
Et elle n'est appelée que dans le code ci-dessus... Il y a aussi un event "PLAYER_PLUGGED" qui n'est présent que dans le premier code...

Apparemment rev veut dire revision et ce qui est important c'est flashvarsObj, mais je ne sais pas quel attribut...

Je pense qu'il faut se concentrer sur le PlayerLite et le rev vu que c'est les seules URLRequest suspects du code...
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#4
En fait, j'ai essayé https://www.wat.tv/images/v70/PlayerWat.swf?videoId=762vp directement, et ça marche, donc tu avais raison, le PlayerLite ne sert à rien.
J'en déduis donc que plugVars non plus, puisque ce n'est manifestement pas comme ça que l'url est transmise...

EDIT : Je pense que j'ai quelque chose !
requestUrl = this._serverBaseURL + "/" + this.streamInfos[quality].streamName + "Seg" + segId + "-Frag" + this.currentFAI.fragId + this.addQueryArgsIfRequired();
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#5
J'ai trouvé !!!
Grâce à la précieuse de Sorrow, qui m'a donné l'idée de regarder les requêtes http GET faites par le player.
Seulement, leur player principal fonctionne avec du streaming (fichier .f4m), et c'est super dur à recevoir, limite faut se faire son propre client et c'est super dur.
Heureusement, j'ai trouvé un ancien player wat qui fonctionne encore et qui lui utilise directement un fichier .h264 (format vidéo).

Pour y accéder : cliquer sur exporter, vous aurez le code d'un player embed, il faut extraire l'adresse.
Exemple :
Code:
<iframe src="http://www.wat.tv/embedframe/120744chuPP3r12040757" frameborder="0" style="width: 320px; height: 240px;"></iframe><div class="watlinks" style="width:WIDTHpx;font-size:11px; background:#CCCCCC; padding:2px 0 4px 0; text-align: center;"><a rel="nofollow" target="_blank" class="waturl" href="http://www.wat.tv/video/nicky-larson-episode-21-pari-762ph_74vof_.html" title="Vidéo Nicky Larson - &eacute;pisode 21 - Un pari dangereux sur wat.tv"><strong>Nicky Larson - épisode 21 - Un pari dangereux</strong> sur WAT.tv</a>  </div>
L'adresse est "http://www.wat.tv/embedframe/120744chuPP3r12040757"
Puis à cette adresse, il faut afficher le code source. Vous aurez en bas plusieurs appels du genre :
Code:
WATPlayer.showPlayer({autoStart : "false",noFs : "0",revision: "plus96bvn148",appStats: "webapp",appVersion: "webapp",isStartAd : "1",ad20 : "1",allowSkipAd : "1",frameReferer: "",isEndAd : "1",url : "//www.wat.tv/swf2/209595nIc0K1112040757",container : "FlashPlayer2",iphoneId : "12040757",previewMedia : "http://s.wat.fr/f/nicky-larson-episode-21-pari_762ph_150x85_3he0ox.jpg",oasTag : "WAT/videos/inedit/nicky-larson",contentTitle : "Nicky Larson - épisode 21 - Un pari dangereux",dateDiffusion : "",videoDuration : "1476",owner : "nicky-larson",emnumber : "",format : "partner",mediaurl : "http://www.wat.tv/video/nicky-larson-episode-21-pari-762ph_74vof_.html",forceNewPlayer: "1",urlPlayer: "//www.wat.tv/images/v70/PlayerLite.swf?videoId=762ph",oasTag : "WAT/animation/p/nicky-larson", watIFrame : 1, adsList: adsList, parrainageAd: parrainageAd})
Et ici, on remarque un lien "//www.wat.tv/swf2/209595nIc0K1112040757".
Quand vous allez à cette adresse (faut rajouter http: ou enlever les deux barres), vous êtes redirigés vers un player "http://www.wat.tv/images/v40/LoaderExportV3.swf" avec beaucoup de paramètres (mais les seuls paramètres importants sont baseUrl, videoId et ts, qui doit être un timestamp).

Maintenant, il ne reste plus qu'à utiliser quelque chose pour intercepter les requêtes, comme la console de Chrome (qui capture même les paquets des applis flash), firebug dans Firefox, ou même wireshark (mais avec les bons filtres). Dans la console de Chrome, si on appuie sur l'entonnoir, on peut chercher "h264" et quand on lance la vidéo avec le bouton play, une requête apparaît. L'url pointe vers la vidéo, mais dépend de votre ip.

Bonne soirée :D
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#6
Sinon c'est quoi nicky larson :/
 

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#8
Pareil j connaissais pas x)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#9
Moi je regardais aussi quand j'avais 11-12 ans ça passait sur DirectStar !!!

Cette version n'a pas le super générique mais contient des passages censurés en VOST :)
http://www.wat.tv/nicky-larson
Et en fait, quand je télécharge, ça me donne un mp4...

Vous pouvez pas imaginer la satisfaction !!!
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#10
Toute personne ne connaissant pas City Hunter doit passer au buchet.
Pour ceux qui aiment City Hunter, vous pouvez regarder Angel Heart, même auteur, même ambiance mais univers alternatif.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#11
Je suis d'accord, il faut les brûler !

Je me fais une intégrale Nicky Larson et après je regarde Angel Heart.
Mais Nicky meurt ? C'est dans un OAV, non ?

J'ai trouvé une méthode plus rapide pour arriver directement au player v40 : cliquer en dessous de la vidéo sur partager puis cocher "Ancien code" avant de faire copier ;)

Du coup c'est super rapide !!!
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#12
Ryo ne meurt pas, l'anime n'a pas de fin, il faut lire le manga pour la connaitre.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#13
Ya pas un OAV "La mort de Ryô Saeba" ?
En tous cas, petite précision, c'est quand on appuie sur play ou qu'on change de qualité que la requête GET est envoyée...
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#14
Il y a un bien un oav de ce nom mais c'est juste un titre.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#17
Super merci :) je connaissais que code geass de nom
 
Haut Bas