mardi 11 janvier 2011

Deezer Desktop et Images/Sons



Je suis en train de regarder un peu le fonctionnement de DeezerDesktop.
J'ai commencé doucement en voulant récupérer les images que le programme a téléchargé sur mon PC.


Il s'avère que seulement un header de 50 octets de long est rajouté avant une simple image jpg.
Ni une ni deux je sort ma console bash et je pond une commande permettant de récupérer l'ensemble des images, la voici :

find picture/ -type f -exec sh -c 'cat $0 | python -c "import sys; data = sys.stdin.readlines(); print \"\".join(data)[49:]" > $0.jpg' {} \;

Il suffit de se placer dans le dossier de cache de deezerDesktop (chez moi ~/dzCache/cache) et le tour est joué.
Je vais regarder pour d'autres infos à dénicher, même si mon but reste quand même les chansons.


Je mettrais à jour ce post sur mes avancements.


Edit 1 :
Après plusieurs recherches, il semble que les fichiers soient enregistrés dans ~dzData/cache/audio. Seulement la correspondance entre les fichiers (qui sont découpés par blocs de 1mo) est stockée dans une DB dans ~/.appdata/DeezerDesktopXXXXXXXXXXXXXXXXXXXXXXXX.1/Local Store/database/dz.db
La db est de type sqlite mais est encrypté. Il faut que je me renseigne sur le chiffrement d'adobe air des base sqlite.

Edit 2 :
En regardant un peu à droite à gauche, il s'avère que le mot de passe est stocké en claire dans le fichier ~/.appdata/DeezerDesktop.XXXXXXXXXXXXX.1/Local Store/#SharedObjects/Tatooine.swf/deezer_tatooine.sol
En somme un fichier intéressant à récupérer au cas où.

Edit 3:
Les fichiers audios sont juste splitter en bloc de 1mo, reste juste à trouver dans quel ordre ils faut les assembler et comment retrouver pour quel artiste quels infos. /!\ Après reconsitution, les fichiers sont modifiés, je ne sais pas encore comment, mais dans tous les cas la chansons n'est plus la même. Il va falloir que je trouve comment ils sont modifiés pour arranger les choses.
Après de longues analyses avec ltrace et strace, il s'avère qu'on peut retrouver les noms des fichiers dans l'ordre. Mais c'est un peu fastidieux et ca oblige à lire la chanson en même temps (du moins à la charger, ce qui ne prend que quelques secondes). Je vais sans doute faire un premier script en exploitant cela.
J'ai aussi fait de l'injection de lib via LD_PRELOAD. Je ferrais sans doute un petit article là dessus, c'est vraiment puissant et assez simple à faire.

Edit 4:
Après analyse avec un fichier uploader et simple, il s'avère que le fichier est chiffré (si je ne me suis pas trompé lorsque je l'ai assemblé, à vérifier). Après essaie d'analyse via audacity, je me suis penché sur le fait de récupérer les sources ActionScript des différents swf. J'ai pour cela utilisé http://www.flash-decompiler.com/fr/ en version démo et http://www.nirsoft.net/utils/sysexp.zip pour pouvoir copier/coller la source car le programme empêché de copier le contenu. SysExp est un tool super interessant pour récupérer plein d'info sur des fenêtres sous windows.
Les sources sont disponibles ici : http://www.2shared.com/file/MuiFeO2a/as_online.html
Je ne connais pas du tout l'ActionScript3 mais ca a l'air de bien ressemblé à du C++, je vais analyser le tout. Je récupèrerais sans doute le mot de passe de la db sqlite dz.db pour retrouver la correspondance chanson -> fichier. J'espère trouver la méthode de chiffrement utilisé sur les chansons. Si quelqu'un veut m'aider avec les source AS, qu'il n'hésite pas à se manifester dans les commentaires ;)

Edit 5:
Au temps pour moi, la base de donnée n'était pas chiffré mais je n'avais pas vu les permissions necessaire dessus. Les données interessantes sont dans la table SONGS_PART, avec SONG_ID l'id de la chanson (récupérable via http://www.deezer.com/listen-{SONGS_ID}) et URL l'emplacement du fichier concerné. NUM_PARTS permet aussi de voir dans quel ordre il faut prendre les morceaux. Il y a clairement une compression sur les bouts de chansons, puisque la taille standard annoncée (1024000) est différentes de la vraie taille des fichiers 409600. Reste à trouver quoi...
Apparement seul les fichiers en cache (donc les fichiers téléchargés sur le disque dur) sont compressés, ca devrait être plus facile pour récupérer les fichiers directement depuis Deezer.


Edit 6:
Le son est bien chiffré, tout à l'air de se passer dans
package dz.media.sound.synch // class SynchSoundDecrypter

5 commentaires:

  1. Tiens :) intéressant, je vais mettre mes mains dans le cambouis aussi !

    RépondreSupprimer
  2. Génial! J'espère que cela va aboutir :)

    RépondreSupprimer
  3. Salut,
    Ca m'a l'air vraiment bien tes trouvailles. J'ai pas les connaissances pour comprendre la totale, mais c'est interessant. Je reviendrai ici fréquement avec l'éspoire d'une solution.

    Ciao et merci !
    Xenope

    RépondreSupprimer
  4. Y'a des nouvelles?;)

    RépondreSupprimer
  5. Wow genial! je cherche également à rassembler les morceaux stocké dans dzCache. Une petite recherche google me même à ce blog, apparemment le seul qui s'intéresse à la récup de titre chargé avec un compte premium.

    Je vais tenter d'en apprendre plus en utilisant ton approche. Les AS ne sont pas disponible. Merci pour toutes les infos récolté.
    Sinon si je peux etre utilile à quoi que ce soit, n'hesite pas a m'en faire part.

    RépondreSupprimer