Arbeitspeicher-Manipulation von Spotify mit C++



  • 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 😉



  • Hat Spotify nicht 'ne Developer Web API, mit der man Spotify in eigene Web Anwendungen einbauen kann? Ich hätte erst mal versucht High Lever darüber an den Stream im Browser zu kommen, bevor ich anfange irgendwo im RAM nach möglichen Audiodaten zu suchen.



  • Das einfachste dürfte sein librespot zu nehmen und das Speichern einzubauen: https://github.com/librespot-org/librespot/issues/152



  • @Schlangenmensch Auch eine sehr gute Idee. Danke.


Anmelden zum Antworten