Welcome to RVX-Spotify Discussions! #1
Replies: 8 comments 11 replies
-
|
Howdy. The original patch notes state "Audio and visual ads will now appear." I am trying to understand what the point of this patch is if that's the case |
Beta Was this translation helpful? Give feedback.
-
|
Hello i analyse your work, there is some really good ideas but still login out detection. - Problem 1: Deleted Files Loaded in Memory (deleted)Method flaw: In Linux/Android, when a .so file is loaded using System.load and then deleted, it remains visible in /proc/self/maps with the (deleted) tag. Example: /data/data/.../cache/liba8jf83k.so (deleted). This is the biggest red flag possible. Anti-cheat systems specifically look for executables located in data folders (rather than in the APK's system folder) that are marked as (deleted). This is the classic signature of malicious dynamic injection. Improvement: Do not delete the temporary .so file while the application is running. Generate a filename that blends in perfectly with the environment, such as libcrashlytics-ndk.so or libspotify_audio_engine.so. Keep it on the disk. On the next launch, delete the old "fake" files before creating a new one, rather than hot-deleting them. - Problem 2: Using Standard Java Collections Instead of ProtobufMethod flaw: The UnlockPremiumPatch.java class now returns standard Java LinkedHashMap or ArrayList objects. If the original Spotify code strictly expects to receive a specific Protobuf implementation (e.g., ProtobufList or Internal.ProtobufMap), the application will suffer an unexpected ClassCastException slightly further down in its execution, causing a crash. Improvement: Instead of creating a new ArrayList<>(), it would be better to use the official Protobuf Builders (if they haven't been stripped by Proguard/R8) to instantiate collections that are "compatible" with the hooked method's signature. If not possible : Alternatively, use a Java Dynamic Proxy to intercept calls to the original collection and make it lie "on the fly" (by overriding the .get() or .iterator() methods) without ever modifying its original type. - Problem 3: Unhandled Null Signatures (Fingerprints)Method flaw: The commit successfully wrapped AutoValue_PlayerOptionOverrides$Builder in a runCatching block, which is excellent. However, in UnlockPremium(), the calls to hookMethod on the DexKit fingerprints (e.g., ::homeStructureGetSectionsFingerprint.hookMethod) assume that the fingerprint was found. If the method returns null after a major Spotify update, calling .hookMethod on it will throw a NullPointerException and halt the initialization of the other hooks. Improvement: Calls like ::X.hookMethod must be checked. DexKit should return an optional abstraction, or they must all be placed in individual try/catch blocks or utilize the existing fallback function to prevent a domino effect during a Spotify API update. |
Beta Was this translation helpful? Give feedback.
-
|
|
Beta Was this translation helpful? Give feedback.
-
|
This is a bug report for RVX-Spotify-v260308. |
Beta Was this translation helpful? Give feedback.
-
|
Blocking dealer will not work on app relaunch spotify has binded apresolve to dealer https://apresolve.spotify.com/?time=1773777228&type=accesspoint&type=spclient&type=dealer-g2, no apresolve no login, has dealer = logout When you close and reopen the app: the app must refresh its session via login5.spotify.com/v3/login. But on the server side, the stored session and credentials have already been invalidated (the server has “marked” the account for logout even though the logout request wasn't received). login5 therefore returns an error → the app logs you out. |
Beta Was this translation helpful? Give feedback.
-
|
I get logged out again 😔 |
Beta Was this translation helpful? Give feedback.
-
|
The only way to assign a premium license exclusively to the Player without the server knowing (to avoid detection) is to spoof the ProductState just before it is sent via JNI (Java Native Interface) to the C++ core, without including it in the network headers sent to the spclient server. In your current code (UnlockPremiumPatch), when you modify an attribute via OverrideAttribute, you modify it globally within the application’s Java singleton. As a result, any network request from the application will carry this information (and get caught by the server). |
Beta Was this translation helpful? Give feedback.
-
|
Audio ads are back, plsease update the release! Thank you very lots |
Beta Was this translation helpful? Give feedback.




Uh oh!
There was an error while loading. Please reload this page.
-
👋 Welcome!
We’re using Discussions as a place to connect with other members of our community. We hope that you:
build together 💪.
To get started, comment below with an introduction of yourself and tell us about what you do with this community.
Beta Was this translation helpful? Give feedback.
All reactions