authrequest/Freeloader

GitHub: authrequest/Freeloader

Freeloader是一个针对Plex媒体服务器的逆向工程工具,用于功能解锁和远程访问。

Stars: 57 | Forks: 14

# Plex_Patch 针对 **Linux** 上的 **Plex 媒体服务器** 的逆向工程笔记和工具 x86-64** — 涵盖 **功能解锁** 和 **远程访问**。 ## 这里有什么 | # | 组件 | 路径 | 概述 | |---|-----------|------|---------| | 1 | **功能解锁补丁** | `src/`, `build.sh` | `LD_PRELOAD` 共享库,强制将每个 `FeatureManager` 位设置为开启 | | 2 | **中继 RE + 模型** | `plex_relay/` | 逆向工程、可运行的 Plex 的 `RelayController` 的重实现 | | 3 | **远程访问(无需补丁)** | `scripts/plex-tailnet/` | 通过 Tailscale/Headscale 而不是 Plex 中继访问您的服务器 | | 4 | **Docker 支持** | `docker/`, [`docs/DOCKER.md`](docs/DOCKER.md) | 修改过的 `plexinc/pms-docker` / `lscr.io/linuxserver/plex` 镜像(多阶段构建)**以及**运行容器内的原地补丁程序 (`plex-docker-patch.sh`) | 每个子系统都有自己的 README;这个页面是地图。 ## 1 · 功能解锁补丁 Plex 的功能门控读取单个内存表,`g_feature_bitset_slots` (14 × `uint64`),从 MyPlex 功能列表中填充。具有内部 代码 `C` 的功能 "可用" 当且仅当 `slots[C >> 3] & (1 << (C & 7))`。补丁 (`src/`) 是一个小的共享库,其构造函数查找 `FeatureManager_apply_feature_list_xml`,安装一个跳板,并在 Plex 应用其功能列表后强制所有 14 槽位设置为 `0xFF…FF` — 因此每个功能 (包括 Plex Pass,代码 92)都读取为已启用。 两个不明显的要求使或破坏了在真实安装上的: 1. **针对 musl 构建,而不是 glibc。** Plex 打包了自己的 musl libc + libgcompat (`/usr/lib/plexmediaserver/lib/`)。glibc 构建的 `.so` 无法重新定位 仅 glibc 的符号,Plex 退出 127。构建使用 `zig` 来针对 `x86_64-linux-musl`。 2. **使用 `LD_PRELOAD` 注入,而不是 `patchelf`。** `patchelf --add-needed` 在 musl 的加载器下破坏了 PIE(立即 SIGSEGV)。一个小型启动器仅设置 `LD_PRELOAD` 为 Plex `exec`,并且库 `unsetenv`s 它,以便 Plex 的 glibc 辅助子进程不受影响。 ``` bash build.sh # -> build/plexmediaserver_crack.so (musl); prints install steps ``` 完整的构建/安装/卸载指南:**[`docs/BUILD.md`](docs/BUILD.md)**。 ## 2 · Plex 中继 — `plex_relay/` 研究 Plex 如何在没有直接连接的情况下使服务器可访问:它 打开一个 **反向 SSH 隧道到 Plex 运营的中继主机**。`plex_relay/` 是一个 无依赖项的 Python 重实现,用于 `RelayController` 翻译单元(密钥获取 + 24h 缓存,`relayHostKey.txt` 锁定,ssh 隧道,300s 清理者),具有类型化错误模型,注入 I/O 缝,以及完整的测试套件。请参阅 **[`plex_relay/README.md`](plex_relay/README.md)**。 ## 3 · 无需补丁的远程访问 — `scripts/plex-tailnet/` Plex Relay 和补丁的实用替代方案:将服务器及其 观众放在一个 **Tailscale/Headscale 网状 VPN** 上,并让 Plex 发布 tailnet 地址。包括一个幂等的设置脚本(安全问卷,防火墙锁定,健康检查),一个可选的自托管 Headscale 安装程序,以及一个共享的 shell 库。请参阅 **[`scripts/plex-tailnet/README.md`](scripts/plex-tailnet/README.md)**。 ## 4 · Docker 支持 — `docker/` 相同的 `LD_PRELOAD`-on-the-PMS-exec 补丁,打包用于两个流行的 Plex 容器镜像。支持两种流程: - **重建修改过的镜像** — 多阶段 Dockerfile (`Dockerfile.plexinc`, `Dockerfile.linuxserver`) 使用 `zig` 构建musl `.so`,将其层叠到上游镜像上,并替换 s6 `svc-plex` `run` 文件。适用于重复部署和 CI/CD。 - **原地修改运行中的容器** — `plex-docker-patch.sh` 修改 实时容器的文件系统(`.so`,包装器,s6 `run` 文件)并 重新启动它。无需重新构建镜像,原始镜像未受影响,完全可逆。适用于一次性修补您不想修改的容器。 包装器将 `LD_PRELOAD` 设置为 **最后**,并且 `.so` 的构造函数 `unsetenv`s 它,因此 glibc 辅助子进程(调谐器,脚本宿主,转码器)不受影响。 请参阅 **[`docker/README.md`](docker/README.md)** 和完整的指南 **[`docs/DOCKER.md`](docs/DOCKER.md)**。 ## 仓库布局 | 路径 | 作用 | |------|------| | `src/hook.cpp` · `hook.hpp` | 钩子引擎:`dl_iterate_phdr` 发现,签名扫描,跳板,功能逻辑,功能-UUID 目录 | | `src/main.cpp` | 库构造函数(`unsetenv` + `hook()`) | | `build.sh` | 通过 `zig`(自动下载)使用 musl 构建(具有 ABI 稳定性门控) | | `scripts/plex-crack-wrapper.sh` | systemd `ExecStart` 启动器,将 `LD_PRELOAD` 限制在 Plex 进程中 | | `scripts/readbitset.py` | 验证器:从运行的 PMS 中转储实时功能位集 | | `scripts/plex-tailnet/` | Tailscale/Headscale 远程访问设置(请参阅其 README) | | `plex_relay/` | Plex 的 `RelayController` 的 Python 重实现(请参阅其 README) | | `windows/` | Windows x64 DLL 注入器 + godmode 补丁(请参阅其 README) | | `docker/` | 修改过的 `plexinc/pms-docker` + `lscr.io/linuxserver/plex` 镜像 + 运行容器的原地补丁程序(请参阅其 README) | | `third_party/zydis/` | 供应商 [Zydis](https://github.com/zyantific/zydis) 汇编器(MIT) | | `docs/BUILD.md` | 原生 Linux 构建/安装/卸载指南 | | `docs/DOCKER.md` | Docker 构建/运行/验证/卸载/故障排除指南 | | `docs/WINDOWS.md` | Windows x64 补丁/构建索引 | | `experimental/debug_hook.c` | 独立的备用钩子(旧签名) | | `AGENTS.md` | 架构/RE 笔记 | ## 不在此存储库中(按设计) 受版权保护的 Plex 二进制文件(`Plex 媒体服务器`,`libsoci_core.so`),IDA Pro 数据库(`*.i64`,`*.id0`,…),自动下载的 `toolchain/`,以及任何 本地机器配置(`.mcp.json`,密钥,`.env`)是故意 **git-ignored** — 它们很大,敏感,或不是我们有权分发的。将您的分析工具指向您自己的 Plex 安装。 ## 许可证 [GNU AGPL-3.0-or-later](LICENSE) © Plex_Patch 作者。每个源文件 都带有 `SPDX-License-Identifier: AGPL-3.0-or-later` 标签。 `third_party/zydis/` 中的供应商 Zydis 汇编器是 **MIT** 许可(请参阅 `third_party/zydis/README.md`);其条款得到保留并不受影响。
标签:请求拦截, 逆向工具