Posts filed under 'Programmieren'

iTunes und Fairplay-DRM

Auch wenn ich keinen Mac besitze, höre ich regelmäßig den MobileMacs-Podcast. Darin hatte Tim Pritlove erwähnt, dass gekaufte Lieder, Programme und Videos erst im lokalen iTunes mit dem DRM versehen werden. Ich hatte das so verstanden, dass iTunes Dateien aus dem Store als unverschlüsselte Inhalte herunterläd.

Prima dachte ich mir, dann hab ich ja bald eine schöne Sammlung an DRM-freien M4A-Dateien auf meiner Festplatte rumzuliegen. Die erste Aktion war also Wireshark anzumachen und mir einen Song im iTunes-Store zu kaufen. Die heruntergeladene Datei wollte ich dann mittels Wireshark direkt speichern.

Das Ergebnis war relativ enttäuschend. So wie ich es mir vorgestellt hatte, funktioniert es nicht. Die iTunes-Server schicken, nach Austausch diverser Daten, zunächst unverschlüsselt das Coverbild als jpg und anschließend den Song. Dieser wird im m4p-Format geschickt. Eine M4P-Datei ist eine in einem MP4-Container verpackte und DRM-geschützte Datei.

Die englische Wikipedia stellt den Prozess ähnlich dar. Der Artikel über Apples DRM-System Fairplay sagt über die Funktionsweise folgendes:

FairPlay-protected files are regular MP4 container files with an encrypted AAC audio stream. The audio stream is encrypted using the AES algorithm in combination with MD5 hashes. The master key required to decrypt the encrypted audio stream is also stored in encrypted form in the MP4 container file. The key required to decrypt the master key is called the “user key.”

Each time a customer uses iTunes to buy a track a new random user key is generated and used to encrypt the master key. The random user key is stored, together with the account information, on Apple’s servers, and also sent to iTunes. iTunes stores these keys in its own encrypted key repository. Using this key repository, iTunes is able to retrieve the user key required to decrypt the master key. Using the master key, iTunes is able to decrypt the AAC audio stream and play it.

When a user authorizes a new computer, iTunes sends a unique machine identifier to Apple’s servers. In return it receives all the user keys that are stored with the account information. This ensures that Apple is able to limit the number of computers that are authorized and makes sure that each authorized computer has all the user keys that are needed to play the tracks that it bought.

When a user deauthorizes a computer, iTunes will instruct Apple’s servers to remove the unique machine identifier from their database, and at the same time it will remove all the user keys from its encrypted key repository.

The iPod also has its own encrypted key repository. Every time a FairPlay-protected track is copied onto the iPod, iTunes will copy the user key from its own key repository to the key repository on the iPod. This makes sure that the iPod has everything it needs to play the encrypted AAC audio stream.

Das hört sich durchaus so an als ob beim Abruf bereits ein mit dem Master-Key verschlüsseltes M4P-File empfangen wird. Der Master-Key ist in dem File mit dem User-Key verschlüsselt enthalten, so das man nur den User-Key benötigt um den Masterkey und damit das File zu entschlüsseln und abzuspielen. Den Key bekommt man dann von einem Apple-Server oder im Falle eines Offline-Devices, wie dem iPod, aus dem lokalen Repository.

Dennoch kann Tim mit seiner Aussage nicht ganz falsch liegen. iTunes verändert die Datei nach dem Herunterladen zumindest. Denn vergleicht man die M4P-Datei, die heruntergeladen wird und die M4P-Datei, die abgelegt wird, so sind die Dateien zwar größtenteils identisch - dennoch gibt es zwischen den beiden Dateien Unterschiede. So ist die abgelegte Datei im getesteten Fall um circa 140KB größer (die Gesamtgröße ist circa 3.3MB) .

Schaut man sich die beiden Dateien mit WinMerge an, so wird man feststellen, dass in der abgelegten M4P-Datei bei circa 48KB Inhalte eingefügt werden. Das sind die circa 140KB Unterschied. Im Anschluss daran sind die Dateien jedoch wiederum Identisch.

Da der Großteil der Datei nicht verändert wird - also der Audiostream definitiv nicht lokal verschlüsselt wird - nehme ich nicht an, dass das DRM lokal wesentlich verändert wird. Dennoch interessiert mich, was genau passiert.

Falls jemand von euch Informationen dazu hat - bitte postet entsprechende Infos in die Comments. Danke :-)

Hier noch kurz ein Screenshot der Wireshark-Session. Die beiden M4P-Dateien kann ich auf Anfrage gerne auch bereitstellen.

Wireshark-Session eines iTunes Downloads

Wireshark-Session eines iTunes Downloads

Edit : Das Cover ist auch so circa 140KB groß. Und wenn man sich das Cover und die zusätzlichen 140K anschaut sieht man, dass zumindest ein Teil der 140K das Cover sind.


Add comment September 5, 2008

NoMule 2008.09.01 ist draußen

… und es hat ein neues Feature. Es gibt jetzt eine Kommandozeilenversion des Programms.

Das heißt zum einen, dass man es von der Kommandozeile aus nutzen kann und zum anderen, dass man es in andere Programme integrieren kann (andere Programme können es einfach aufrufen über die in der Doku festgelegten Parameter). Wenn man das Programm in andere Software integrieren will ist zu beachten, dass es unter der GPL veröffentlicht ist.

Natürlich gab es seit der letzten Version auch viele kleinere Änderungen. Diese wurden als “Minor Updates” sofort bereitgestellt. (Bspw. wurde Yuvutu als MediaProvider integriert)

Wie immer wünsche ich euch viel Spaß mit der neuen Version von NoMule :-)


Add comment September 1, 2008

MySpace - on my computer

Heyho!

Heute ist eine neue NoMule-Version (2008.06.06) erschienen. Zum ersten mal wurde die Version über das NoMule Update-Notificationsystem bekanntgegeben.

Also - was hat sich verbessert?!

NoMule unterstützt MySpace als Mediaprovider. Das heißt, dass nun Videos und Songs von MySpace heruntergeladen werden können. Und es gibt noch was tolles : Videos und Songs können jetzt auch auf MySpace gesucht werden.

Das heißt dass für MySpace nun die gleichen Features bereit stehen, die es auch für YouTube gibt.

Es wurde auch noch ein anderes Thema angegangen - Unterstützung für Unix.

Ich habe mehrere Mails erhalten, dass NoMule unter Unix nicht so läuft wie es sollte. Also habe ich mich heute hingesetzt und ein bisschen rumgebastelt.

NoMule unterstützt jetz also auch die Voransicht von Videos im Browser in Unix und sollte generell besser unter Betriebssystemen dieser Familie laufen.

Falls ihr trotzdem in Probleme mit NoMule rennt schreibt mir ruhig eine Mail. Die Adresse ist:

kenny1987 at users dot sourceforge dot net

Also viel Spaß mit NoMule 2008.06.06 .

Und vielen Dank an Paul und Eric für die hilfreichen Mails :)

Update : War schon spät gestern, deswegen hab ich was vergessen : Die Dokumentation hat jetzt auch einen Abschnitt über Unix. Darin steht welche Pakete ihr braucht und was es für Tipps und Tricks gibt, wenn ihr NoMule unter Unix nutzt.


Add comment Juni 6, 2008

It’s up and running

Puh - nach langer Arbeit ist das Ergebnis unseres Studienprojektes im Netz und läuft.

Unsere Aufgabe war es für den Verband der Blinden- und Sehbehindertenpädagogik e.V. eine
Webanwendung zu erstellen, mit der sie die Medien verwalten können die sie so benutzen.

Zugegeben - der Datenbestand ist grausig und sehr schlecht gepflegt. Foreign-Keys zeigen teilweise
ins Leere, aber letztendlich haben wir es doch geschafft die Anwendung heute hochzuladen.

Und jetzt kann man sie hier bestaunen :)

Dem Vorausgegangen ist eine anderthalbstündige Rootpasswort-Suchorgie, weil an unserer Hochschule anscheinend keine Passwortlisten geführt werden und der Prof, der das Rootpasswort kennt, momentan nicht an der Hochschule ist. Toll oder? :S
Naja aber der Admin, der Prof und andere Mitarbeiter haben uns dann zum Glück geholfen, so dass wir das doch noch alles in die richtigen Ordner verschoben wurde und jetzt alles läuft.

Programmiert wurde das ganze übrigens in PHP 5. Dabei haben wir unter Anderem mein MimicPHP-Framework verwendet, was glaub ich ganz gut so war. Da die ganze Anwendung auch Ajax verwendet haben wir uns entschieden clientseitig Prototype.JS zu nutzen, was bei MimicPHP ohnehin mit dabei ist

Die Grafiken wurden letztendlich mit GIMP erstellt, was sich mal wieder als gutes Programm für Webgrafikerstellung bewiesen hat :)

Tja - jetzt muss das ganze nur noch von unserem Auftraggeber abgenickt werden und dann ist der Praxisteil des ersten Studienprojektes fertig.

Yeah :)


Add comment Mai 30, 2008

Agespoofing

In Deutschland ist hat jeder über 16-Jährige einen Personalausweis.

Dieser Personalausweis enthält in der sogenannten maschinenlesbaren Zone eine Reihe von Ziffern und Winkeln, die nocheinmal das Wesentliche, was auf dem Ausweis auch im Klartext steht, zusammenfasst.

Dazu gehören:

  • Die ausstellende Behörde
  • Die Nationalität
  • Der Geburtstag
  • Das Ablaufdatum

Mir geht es im folgenden vor Allem um das Geburtsdatum. Oftmals wird diese Personalausweisnummer nämlich zur Altersverifikation genutzt. Es wäre doch schön wenn man nun nicht seine tatsächliche Ausweisnummer angeben müsste, sondern sich eine generieren könnte.

Das geht. Denn die Nummer lässt sich aus den oben genannten Daten und einigen Prüfsummen zusammensetzen. Das “schwierige” wäre nun also die Prüfsummen zu berechnen. Das ist aber nicht schwer.

Die Personalausweisnummer lässt sich in Blöcke unterteilen, die jeweils durch Winkel bzw. den Nationalitätsbuchstaben (D für Deutschland) begrenzt sind.

Über diese Blöcke wird eine Prüfsumme erstellt. Es wird jeweils die erste, vierte, siebte, … Zahl mit 7 multipliziert, die zweite, fünfte, achte, … mit 3 und die anderen Ziffern mit 1. Dann werden diese Produkte aufsummiert. Die letzte Zahl dieser Summe (also die Summe Modulo 10) entspricht der Prüfsumme.

Der Aufbau der Ausweisnummer ist also folgender (ohne Leerzeichen):

wwww NNNNN p1 D << jj MM dd p2 < JJmmDD p3 <<<<<< pGes

Dabei stehen die Symbole für folgendes:

  • wwww Ist die Behördenkennzahl
  • NNNNN ist eine fortlaufende Nummer
  • p1 ist die Prüfsumme über den ersten Block
  • D ist die Nationalität für Deutschland
  • die folgenden jj MM dd stehen für Jahr, Monat und Tag (jeweils mit führender Null wenn einstellig) des Geburtstages
  • p2 ist die Prüfsumme über den Geburtstag
  • die letzten jj MM dd stehen für Jahr, Monat und Tag (wiederum mit führender Null) des Ablaufdatums
  • p3 ist widerum die Prüfsumme über das Ablaufdatum
  • pGes ist dann die Prüfsumme über alle Blöcke inklusive der Prüfsummen p1, p2, p3 (Das D wird jedoch nicht mitgezählt)

So kann sich also jeder seine eigene Personalausweisnummer berechnen und Altersverifikationssysteme austricksen.

Ein fertiges Programm im C++ Quellcode gibt es dafür auch.


Add comment Mai 24, 2008

Es gibt was neues - und du weißt davon…

… denn NoMule 2008.05.16 ist draußen und es unterstützt Updatenotifications.

Das heißt, dass dir das Programm wannimmer eine neue NoMuleversion da ist darüber bescheid geben wird. Oder auch nicht. Denn du kannst dieses Verhalten auch über Einstellungen ausschalten.

Zu den Einstellungen, die du jetzt über ein Configfile machen kannst gehören:

  • Automatische Updatesuche ein/ausschalten
  • Den Familyfilter, der die Anzeige von Porncommunities unterdrückt, ein oder ausschalten

Kürzlich gab es ein paar Probleme mit YouTube, Google Video und Dailymotion, da die Seite die für die Linkumwandlung genutzt wird ihre URL geändert hat. Diese Probleme wurden mit der neuen Version behoben.

Es wurde auch ein neuer Medienprovider hinzugefügt. MySpass (dämlicher Name oder?!). Das ist die Videocommunity von Brainpool. Da gibts dann so Commedians wie Bastian Pastewka oder Axel Stein.

Wie immer könnt ihr NoMule nun hier herunterladen.


2 comments Mai 16, 2008

NoMule 2008.05.11 ist draußen!

Du willst dieses Lied auf deinem iPod haben. Also gehst du ins Internet und suchst dir den Song bei Youtube und lädst ihn dann mit NoMule runter indem du den Link kopierst und einfügst?

So ging es bisher. Seit heute kannst du direkt in NoMule suchen.

NoMule unterstützt nun also den kompletten Workflow vom Suchen des Videos bis zum Umwandeln in ein Format deiner Wahl und Taggen in einem Programm.

Momentan wird das Suchen auf zwei Webseiten unterstützt. Das sind:

  • YouTube
  • YouPorn

Wie immer kann man sich das ganze bei Sourceforge herunterladen. Have fun :)


Add comment Mai 10, 2008

Insulting sourcecode explained

(…) [S]ince SVN revision r4027 quodlibet’s source code is personally insulting me (…)

Wenn man das ließt denkt man erstmal - WTF?! Aber dahinter steckt eine Geschichte, die zeigt, dass es bei großen Projekten genauso zugehen kann wie im Kindergarten.

Dabei geht es darum, dass ein gewisser Sebastian Dröge wohl codetechnischen Mist gebaut hat undzwar in GStreamer, dem Mediaframework von GTK. GStreamer wird unteranderem benutzt von einem Audioplayer namens Quod Libet. In diesem Audioplayer musste herausgefunden werden, welcher Code sich um das Protokoll “file://” kümmert. Dazu wurde einfach “file://” an eine bestimmte Funktion übergeben. Durch den Bug in GStreamer hat das aber nicht mehr gefunzt.

Soweit so gut. Statt file:// kann man wohl auch irgendeine nicht existente URI mit dem Fileprotokoll übergeben um das gleiche zu erreichen. Was haben sie also gemacht? Sie haben file:// durch

file:///Sebastian/Droge/please/choke/on/a/bucket/of/cocks

ersetzt.

So und davon fühlte sich der Typ nun beleidigt. Verständlich - und man fragt sich nochmals - WTF?! Kindergaten?!

Auf der anderen Seite- wenn man mal eine Google Code Search nach “Bill Gates” macht kommt da auch nicht viel schönes raus.

Update: Was einmal war ist nun komplett anders. Und Schwänze werden zu Keksen.


Add comment April 24, 2008

Last.fm Protokollanalyse

Hallo Leute.

Ich habe mir gedacht, dass es doch extrem cool wäre wenn man mit zukünftigen Versionen von NoMule Mp3s von Last.fm speichern könnte. Nunja nun ist es allerdings bei Last.fm nicht so einfach. Es gibt für Last.fm nicht soetwas wie keepvid oder Ähnliches.

Das heißt, dass ich von Hand ran muss und mir anschauen muss was der Flashplayer, der auf Last.fm eingebettet ist tut.

Herangehensweise

Zunächst habe ich mir eine beliebige Seite eines Songs bei Last.Fm angeschaut und mir angesehen was für Cookies gesetzt wurden. Die kann man ja später immer noch brauchen. Dann habe ich Wireshark aufgemacht und auf HTTP “eingestellt”, um anschließend zu sehen wie der eingebettete Flashplayer sich denn so mit Last.fm unterhält.

Dann ging es los - indem der Play-Button im Flashplayer gedrückt wurde. Die folgenden Pakete erklären dann den Ablauf der Kommunikation und wie man letztendlich an das Mp3-File herankommt, welches durch den Last.fm Player abgespielt wird.

Analyse

  1. GET /crossdomain.xml
    Antwort: Eine Menge an Domains von denen zugegriffen werden darf (unwichtig denke ich)
  2. POST //1.0/webclient/xmlrpc.php - Ein XML-RPC der getSession aufruft
    Antwort: Ein String mit einer Session-ID die im folgenden verwendet wird
  3. GET /1.0/webclient/getresourceplaylist.php?resourceID=…&
    resourceType=…&sk=…&fod=…&onData=…& y=…Die wichtigen Parameter sind hier:

    • resourceID , resourceType und y - kann man im HTML-Quelltext finden
    • sk - ist die eben empfangene Session ID

    Die restlichen Parameter sind mehr oder weniger fest. Als Cookie ist nocheinmal der Sessionkey gesetzt.

    Antwort: Das ist etwas tricky und hat mir etwas zu denken gegeben. Die Antwort ist zunächst einmal gezippt. Kein Problem. Der Content-Type ist folgender: “application/xpsf+xml”. XPSF ist das XML Shareable Playlist Format. In ihm können Playlisten abgelegt werden. Es handelt sich dabei um ein offenes Format.
    Das was da nach dem entzippen rauskommt sieht aber überhaupt nicht nach XML aus. Zuerst dachte ich es wäre soetwas wie ROT-13-kodiertes XML. Ist es aber auch nicht. Nach einiger Zeit kam ich darauf, dass das ganze verdächtig nach Base64-Kodierung aussieht (wie sie auch in Emails verwendet wird).
    Und Bingo - das ist es. Macht man eine Base64-Dekodierung sieht man das XML. Zwar wurden alle Zeichen die keine Buchstaben oder Zahlen sind URL-Kodiert (%20 für Leerzeichen u.Ä.), aber das macht ja nix.
    In diesem XML-Wirrwarr enthalten ist die URL des MP3-Files :)

  4. GET /anon/… .mp3
    Als Cookie ist auch hier wieder der Sessionkey gesetzt.

    Antwort: Nocheinmal eine Weiterleitung und nach dem folgenden POST dann das MP3 :)

  5. POST /webClient/logPlay
    Hier werden nocheinma die Session-ID und die oben erwähnte Resource-ID gesendet.

    Antwort: Das heißersehnte MP3-File

So - mit diesem WIssen werde ich demnächst herangehen und mal schauen ob man das vernünftig in NoMule implementieren kann. Und bis dahin kann man sich übrigens den Mp3-Stream auch aus WireShark extrahieren und als Mp3 speichern..


Add comment April 14, 2008

Previous Posts


 

Oktober 2008
M D M D F S S
« Sep    
 12345
6789101112
13141516171819
20212223242526
2728293031  

Kategorien

Links

Brandenburg - it's all around us!

Glienicker Brücke

Brandenburger Tor

DSC02393

DSC02416

DSC02355

DSC02405

DSC02433

DSC02411

More Photos

RSS Me on twitter

RSS Kunst by Kniepuder