Arbeitspeicher-Manipulation von Spotify mit C++



  • Guten Abend liebe C++ Community.

    Vor ab: Ich bin C++ Anfänger, habe jedoch trotzdem Programmiererfahrung (Python) und möchte darum bitten mir keine Antworten zu senden, welche mich abhalten sollen dieses Projekt zu realisieren. Ich bin mir der Schwierigkeit der Umsetzung bewusst und werde höchstwahrscheinlich zur Sicherheit das Programm in einer VM schreiben.

    Nun zu meiner eigentlichen Frage:
    Ich benötige .mp3-Dateien/.wav-Dateien ausgehen von meinen Spotify-Playlist (Zweck: DJing). Ich habe bereits vergeblich einen großen Teil des Internets durchforstet, um jegliche vermeintliche Spotify-Downloader zu installieren und zu testen. Es stellte sich jedoch heraus, dass keines dieser Programme sein Versprechen erfüllte. Nämllich: .mp3-Dateien direkt von Spotify zu downloaden (bzw. aus der Spotify-App zu ziehen). Stattdessen werden die Tracks von YT gedownloaded und anschließend konvertiert.
    Ich will also wissen wie es möglich wäre mit C++ die Audio-Dateien, die beim Ausführen von Spotify in den Arbeitsspeicher gelangen, auslesen zu können und anschließend zu speichern. Ich deneke mal, dass das nicht so ohne Weiteres möglich ist und habe selbst keinen genauen Plan wie ich meinen Plan umsetzen könnte (Das Einzigste, was mir abgesehen davon eingefallen ist, wäre die gedownloadeten Tracks von Spotify-Premium in .mp3 zu konvertieren. Das ist jedoch aufgrund der Verschlüsselung praktisch unmachbar). Hat also jemand einen groben Plan wie man das machen könnte? Ich freue mich über jede Idee.



  • @fluppei2 sagte in Arbeitspeicher-Manipulation von Spotify mit C++:

    und werde höchstwahrscheinlich zur Sicherheit das Programm in einer VM schreiben.

    Warum???



  • @Mechanics Weil ich C++ Noob bin und ich mir wahrscheinlich sonst mein OS zerfetz 😃



  • @fluppei2 sagte in Arbeitspeicher-Manipulation von Spotify mit C++:

    Guten Abend liebe C++ Community.

    Vor ab: Ich bin C++ Anfänger, habe jedoch trotzdem Programmiererfahrung (Python)

    Ohne unfreundlich zu wirken, aber hast Du schonmal irgendeine Datei geöffnet und gelesen?

    @fluppei2 sagte in Arbeitspeicher-Manipulation von Spotify mit C++:

    @Mechanics Weil ich C++ Noob bin und ich mir wahrscheinlich sonst mein OS zerfetz 😃

    Soweit ich weiß, geht das in Windows nicht so einfach.



  • @zeropage Klar



  • Na dann...



  • @fluppei2 sagte in Arbeitspeicher-Manipulation von Spotify mit C++:

    @Mechanics Weil ich C++ Noob bin und ich mir wahrscheinlich sonst mein OS zerfetz 😃

    Und du traust dir dann zu dir die rechte zum lesen eines Speicherbereiches eines anderen Programmes zu holen?

    Aber mal im ernst glaubst du das die mp3´s kodiert auf der Platte rum liegen, die dann die ganze Datei öffen die in den Speicher entpacken als plain mp3 und dann abspielen?
    Wenn das meine Aufgabe wäre so was für eine Musiksteaming Platform zu basteln, dann würde ich die Datei Mappen, also nur in den Speicher einblenden und dann Teilstücke lesen, entpacken und dann der Soundkarte übergeben zum abspielen.
    Wobei selbst wenn du ran kommen würdest, wäre das immer noch recht wenig legal, warum muss ich hier jetzt nicht extra schreiben.
    Was aber immer geht und total legal ist, nimm es doch einfach auf, bei soundblaster zum Beispiel kannst du ganz einfach das recorden was du gerade in den Lautsprechern hörst, easy und ohne großen Aufwand. Na ja du kannst immer noch nen Soundrecorder dir Basteln der die Aufnahme Startet und beendet je nach pegel zum Beispiel, kommt halt drauf an wieviel lieder du da mitschneiden willst.



  • @CTecS Wie genau würdest du die Audio im Arbeitsspeicher lokalisieren?



  • @fluppei2 sagte in Arbeitspeicher-Manipulation von Spotify mit C++:

    @CTecS Wie genau würdest du die Audio im Arbeitsspeicher lokalisieren?

    Wenn man nach deiner Theorie geht, dann könnte man nach dem mp3-Header suchen. Nach meiner Theorie gar nicht weil die Daten ja immer noch Codiert sind und man mit dem Spass eh nix anfangen kann. Ergo, schauen das man die Speicherbereiche bekommt die das Programm sich reserviert hat und schauen was da drin steht und ob man damit was Anfangen kann. Oder hast du gedacht da steht am Anfang vom Speicherbereich "mp3-Titel:"?
    Wie gesagt ohne das du Ahnung von der Speicherverwaltung unter Windows hast wirst du nicht weit kommen. Denn wie schon in meinem ersten Post geschrieben müssen nicht alle Daten die das Programm benutzt auch wirklich entpackt im Speicher stehen. Ganz verwegen könnte man sein in dem man den Prozessorcache benutzt und nur darin entpackt und das dann in die Soundkarte schiebt, kommt immer drauf an wie groß die Böcke sind die da Codiert sind.
    Aber wie gesagt fang erst mal an die die Prozess-ID von Spotify zu holen und dann die Zugriffsrechte das du überhaupt was machen kannst und dann versuch die einzelnen Speicherbereiche dir in zum Beispiel einzelnen Dateien zu schreiben, dann hast du das "Datenmaterial erst mal vorliegen und kannst schaun was du damit anfangen kannst, wenn du so weit kommst.



  • Irre ich mich oder ist Spotifys Audioformat nicht schon eine ganze Weile Vorbis im Ogg Container?



  • Greif´ die Audiodaten am Ausgang ab und schreib den Mitschnitt irgendwohin. Später musste die einzelnen Songs rausschneiden und ggf. konvertieren. Hast natürlich den Nachteil, dass alles mitgeschnitten wird, was über PC Audio ausgegeben wird, du darfst also nur Musik hören und nebenbei nichts anderes machen, was ebenfalls Sound ausgibt. Audacity ist ein Tool, mit dem sowas möglich ist.
    Zu deinem ursprünglichen Vorhaben darf ich ja nichts sagen, das hast du in deinem Eingangspost ausdrücklich erwähnt.


  • Mod

    @VLSI_Akiko sagte in Arbeitspeicher-Manipulation von Spotify mit C++:

    Irre ich mich oder ist Spotifys Audioformat nicht schon eine ganze Weile Vorbis im Ogg Container?

    Ja. Und das findet man in weniger als einer Minute raus, selbst wenn man nicht danach sucht, was die für ein Format haben, sondern nur wenn man sucht, wo die Dateien gespeichert sind. So viel also zu den Erfolgsaussichten dieses Projekts.



  • Ein Ansatz wäre eventuell erst einmal herauszufinden, welche Funtkionen/Bibliotheken das Programm zum decodieren verwendet, oder um Audio auf dem Ausgabegerät auszugeben. Letzteres wird unter Windows vielleicht so etwas wie WASAPI, XAudio2 oder was es da sonst noch so gibt sein.

    Eventuell kann man dem Programm dann irgendwie eine selbstgebaute DLL unterschieben, welche die API-Aufrufe erstmal durch deinen eigenen Code leitet, bevor sie an die Audio-API durchgereicht werden. Das ermöglicht wahrscheinlich Zugriff auf Buffer mit Teilen der Audiodatei oder die abgespielten (bereits decodierten) Audio-Buffer, mit denen man dann weiterarbeiten kann. Der Nachteil wäre allerdings, das man die Audiodaten nur so schnell "grabben" kann, wie sie abgespielt werden. Es sei denn, man kann dem Proramm mit dem eigenen API-Wrapper irgendwie verklickern, dass die Zeit schneller läuft. Das ist aber stark davon abhängig, wie die Anwendung das Timing implementiert.

    Eine umständlichere Alternative wäre eventuell einen eigenen Audiotreiber für eine virtuelle "Soundkarte" zu schreiben - Falls die "Steromix"-Aufnahme des Audiotreibers nicht ohnehin schon eine zufriedenstellende Lösung darstellt (das ist Aufnahme dessen, was gerade abgespielt wird).

    Das ganze funktioniert natürlich nur, wenn da ein Hardware-DRM oder sowas gemacht wird, wo die Buffer erst in einem Chip auf der Hardware entschlüsselt werden (weiss nicht wirklich was es da so für Audio gibt, für Video/Audio über HDMI/Displayport gibts ja HDCP - da würde man dann nicht wirklich an die unverschlüsselten Buffer kommen).

    Das ist hier nur ein Brainstorming meinerseits. Genau aufzeigen wie man da Schritt für Schritt vorgehen muss kann ich dir leider nicht. Da müsste ich mich selbst erstmal intensiv mit befassen. Rein theoretisch sollte das aber möglich sein. Wie genau, solltest du schon in der Lage sein selbst zu recherchieren, die konkrete Umsetzung später wird garantiert nicht leichter 😉



  • Ich weiß nicht genau in welcher Form dir Spotify vorliegt. Ist es eine Binary könntest du es Stück für Stück mit Ghidra reverse-engineeren. Das macht allerdings sehr viel Aufwand. Unter Windows kannst du Tools wie z. B. CheatEngine oder x64dbg zusätzlich nutzen um zumindest erstmal zu lokalisieren an welcher Stelle überhaupt eine Funktion kommt welche dein Lied abspielt. Schon der Weg dahin wird aber ewig dauern. Wenn es das tatsächlich schaffen solltest das zu finden, kannst du evtl das Lied im RAM finden. (Evtl reicht auch nur Cheat Engine). Daraufhin kannst du untersuchen über welche Offsets du dort hinkommst. (also Pointer -> Pointer -> Pointer -> Lied). Wenn du das auch noch geschafft hast, kannst du das Ganze in C++ niederschreiben. Unter Windows gibt's dafür die ReadProcessMemory() Funktion. Am Ende könntest du es dann konvertieren lassen. Das Problem ist aber erstmal zu wissen wonach du suchst und wo du es findest, sowie die Frage ob es verschlüsselt ist oder nicht. So etwas auseinander zu nehmen kostet ewig viel Zeit, besonders ohne Erfahrung.
    Da kann ich mich nur @DocShoe anschließen. Schneide es einfach mit und konvertiere es. Das erspart dir viel Zeit und Ärger.



  • @fluppei2 Kauf dir einfach die Tracks.

    Ich bin mir der Schwierigkeit der Umsetzung bewusst

    Nein, bist du nicht.

    möchte darum bitten mir keine Antworten zu senden, welche mich abhalten sollen dieses Projekt zu realisieren

    Sorry, no can do.



  • @Zhavok Endlich mal ein nützlicher Kommentar. Dankeschön 😃



  • @fluppei2
    Na dann berichte mal von deinen Fortschritten, ich bin gespannt. So alle ein- bis zwei Wochen eine kurze Wasserstandsmeldung fänd´ ich gut.



  • @DocShoe Jo ich meld mich dann. Aber erwartet nicht zu viel ;D. Finde fordernde Projekte trotzdem immer sehr spannend.



  • @Finnegan Aber das braucht man ja eigentlich nicht, die Ausgabe könnte man z.B. mit Audacity abgreifen. Oder hat dein Ansatz das selber zu schreiben einen Vorteil, den ich grad nicht verstanden habe?



  • @Mechanics sagte in Arbeitspeicher-Manipulation von Spotify mit C++:

    @Finnegan Aber das braucht man ja eigentlich nicht, die Ausgabe könnte man z.B. mit Audacity abgreifen. Oder hat dein Ansatz das selber zu schreiben einen Vorteil, den ich grad nicht verstanden habe?

    Nur dann, wenn man darüber direkter an die Daten kommt. z.B. einen fetten Block mit dem ganzen Audiofile oder wenn man sich in die Audio-API einhakt und dem Programm vorzeitig weismachen kann, dass der Buffer bereits abgespielt wurde und man bitte gerne den nächsten hätte. Dieses Timing macht soweit ich weiss eigentlich die Sound-Hardware, letztendlich über Interrupts auf Treiber-Ebene, das könnte also durchaus funktionieren. Dann könnte das Wartezeit einsparen. Audacity und dergleichen ist aber erstmal eine deutlich simplere Lösung. Mein Ansatz ist also wohl eher nicht der Mühe wert, höchstens zum Lernen 😉


Log in to reply