View Single Post
De nyere versjonene av Spotify (alle etter 42849) bruker Themida, som ikke liker debuggere i det hele tatt, og selv om man får pakket ut Themida fra den nyeste versjonen av Spotify, trenger ikke Spotify AB å gjøre noe annet enn å forandre protokollen litt for så å legge ut en ny "versjon".

Derfor tror jeg den beste tilnærmingen er å ta Spotify på det den er nødt til å gjøre for å vise reklame. Når det gjelder bilde-reklame, kommer all denne fra IE (bare bruk Spy++, Winspector e.l. for å bekrefte), noe som betyr at Spotify i seg selv starter IE (gjennom mshtml.dll som igjen kaller wininet.dll).

Hvorfor ikke patche enten mshtml.dll eller wininet.dll til å alltid gi feil når noen prøver å åpne en webside gjennom disse? Siden det finnes en haug med forskjellige versjoner av IE, kan ikke Spotify legge en CRC-sjekk på disse dll-filene (slik den kan på seg selv). Men hvis du gjør det på filene mshtml.dll/wininet.dll, så slutter IE å fungere. Da kan du likegodt bare sette proxy til 0.0.0.0:3128 og slippe å dille med DLL-filene :-)

Det finnes likevel en løsning på dette: bruk Windows API til å få lese/skrivetilgang til Spotify-prosessen etter at den er kjørt. Finn addressen til mshtml.dll eller wininet.dll i prosessen, og skriv en search-and-replace patch som patcher de involverte funksjonene i minnet. Siden det er en process patch, kan du fremdeles bruke IE utenfor Spotify!

Mer "step by step":

- Finn Spotifys hWnd med FindWindow("SpotifyMainWindow", NULL);
- Få en handle til dens prosess ved GetWindowThreadProcessId og så OpenProcess (med VM_READ, VM_WRITE og VM_QUERY_OPERATION)
- Fyll en HMODULE array med referanser til Spotifys DLLer (med EnumProcessModules)
- Finn den som tilsvarer wininet.dll/mshtml.dll (med GetModuleBaseName og string compare)
- Bruk HMODULEs lpBaseDll pluss ReadProcessMemory og WriteProcessMemory for å patche.
- Have fun!

Siden det finnes så mange versjoner av disse filene, må man enten patche forskjellig avhengig av versjon, eller finne et område som er likt på alle versjonene. Men hvis et sånt område finnes, kan Spotify som mottiltak bare sjekke dette området - og så kan man finne et nytt område, og Spotify legger også det inn, og slik fortsetter våpenkappløpet.

Uansett er Spotifys problem at alle banner-reklame-servere går over HTTP, så hvis de blir alt for paranoide, kan man bare sette opp en transparent proxy. Squid + squirm skulle fungere bra.

Hva lydreklamen angår, kan man bruke Virtual Audio Cable eller noe lignende, og så bare kutte lyden når reklamen kommer. Bruk PrintWindow sammen med en GDI context (GetDC) og HBITMAP samt GetPixel på "kaka" som viser hvor mye som er igjen av reklamen. Hvis den er der (lysegrå piksel), bryt forbindelsen mellom VAC og det "ekte" lydkortet. Eller bare bruk DLL patching på winmm.dll og få waveOutGetVolume til å si at lydkortets volum alltid er på full pinne, "then mute with impunity". Igjen er Spotifys problem at den på en eller annen måte må vise at nå er det reklame, og at den må stole på at lyden faktisk blir hørt.