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`);其条款得到保留并不受影响。
标签:请求拦截, 逆向工具