Reverse-engineering notes and a runtime patch for Plex Media Server on
Linux x86-64. It hooks Plex's FeatureManager and forces every feature bit
on, unlocking gated features. Educational / RE use on software you run yourself;
it ships no Plex code and bypasses no account/server authentication.
- Target: the main
Plex Media Serverexecutable (PIE). The feature machinery moved here fromlibsoci_core.soon post-2024/08/13 builds;libsoci_core.sois no longer the target. - Plex runs against its OWN bundled musl libc + libgcompat
(
/usr/lib/plexmediaserver/lib/), NOT the host glibc. This drives the build and injection choices below.
- Language: C++20, plus the vendored Zydis C amalgamation.
- Module discovery:
dl_iterate_phdrlocates the main program's executable segment (the legacyexperimental/debug_hook.cstill uses/proc/self/maps). - Hook:
sig_scan()findsFeatureManager_apply_feature_list_xmland the feature bitset by byte-pattern signature;create_hook()installs a 14-byte trampoline (Zydis decodes the prologue so relocated bytes stay valid). - Effect: after Plex applies its MyPlex feature list, the hook forces all 14
g_feature_bitset_slotsqwords on (std::bitset<896>), so every feature (including Plex Pass, code 92, slot 11) reads as enabled.
- Build with musl via
zig(-target x86_64-linux-musl):bash build.sh. A glibc build cannot relocate glibc-only symbols (__isoc23_strtol,arc4random,*_chk,_dl_find_object) in Plex's musl runtime → exit 127. - Inject with
LD_PRELOADviascripts/plex-crack-wrapper.sh+ a systemd drop-in. NEVERpatchelf --add-neededthe Plex binary — it corrupts the PIE under musl's loader (instant SIGSEGV); recover with a package reinstall.
src/hook.cpp/src/hook.hpp— hook engine, feature logic, feature-UUID catalogsrc/main.cpp— library constructor (unsetenv("LD_PRELOAD")thenhook())build.sh— musl build via zig (auto-downloaded) with an ABI sanity gatescripts/plex-crack-wrapper.sh—LD_PRELOADlauncher scoped to the PMS processscripts/readbitset.py— live feature-bitset verifierthird_party/zydis/— vendored Zydis disassembler (MIT)experimental/debug_hook.c— standalone alternate hook (legacyis_feature_availablesignature)
RE artifacts (the Plex Media Server binary, libsoci_core.so, and *.i64 IDA
databases) are git-ignored and not redistributed.
Hex bytes with ? wildcards; spaces ignored (? = one-byte wildcard). Patterns
are version-specific — re-verify after PMS updates.