wehrwolfmann/openaxon
GitHub: wehrwolfmann/openaxon
该项目通过 Wine 集成和原生 GTK4 客户端,让 Razer Axon 壁纸引擎能够在 Linux 上运行,并附带完整的协议逆向文档与壁纸解密工具。
Stars: 0 | Forks: 0
# OpenAxon — 在 Linux 上运行 Razer Axon
通过 Wine 在 Linux 上运行 [Razer Axon](https://www.razer.com/software/axon) —— 支持授权登录、任务栏修复以及壁纸解密。包含原生的 GTK4 客户端以及完整的 Razer Axon 协议逆向工程文档。
## 包含内容
### 脚本
| 文件 | 描述 |
|------|----------|
| `razer-login.py` | Razer ID 授权登录 |
| `razer-token-inject.py` | 将 token 注入到 Razer Central Service(无需修改 DLL 即可运行) |
| `razer-axon-gui.py` | Linux 原生 GTK4/Adwaita 客户端 |
| `openaxon-player.py` | 原生 wallpaper daemon(视频/静态,多显示器,特效) |
| `razer-axon.sh` | 通过 Wine 启动原版 Axon 的脚本 |
| `razer-axon-decrypt.py` | 提取加密的视频壁纸 |
| `razer-sync.py` | 与 Razer 账号同步壁纸 |
| `patch/RazerAxon.UserManager.dll` | 修改版 DLL(已弃用的方法,见下文) |
### 逆向工程文档
完整的 Razer Axon 协议文档,从 27 个 .NET DLL 和 JS bundle 中提取:
| 文档 | 描述 |
|----------|----------|
| [`docs/razer-central-ipc.md`](docs/razer-central-ipc.md) | Razer Central IPC 协议 — 4 个服务,137+ 个命令,wire format |
| [`docs/axon-api.md`](docs/axon-api.md) | REST API — 约 110 个 endpoint,HMAC 授权,下载管理器 |
| [`docs/react-architecture.md`](docs/react-architecture.md) | React 18 frontend — 24 个路由,state management,WebView2 bridge |
| [`docs/wallpaper-player.md`](docs/wallpaper-player.md) | Player pipe 协议 — JSON 命令,特效,多显示器 |
| [`docs/chroma-sdk.md`](docs/chroma-sdk.md) | Chroma RGB — REST API,.chroma 格式,AI 生成,LED 映射 |
| [`docs/design-system.md`](docs/design-system.md) | CSS 设计系统 — 颜色,字体,13 个组件组 |
| [`docs/webview-host-objects.md`](docs/webview-host-objects.md) | JS↔C# bridge — 6 个 host object,111 个方法 |
| [`docs/utilities.md`](docs/utilities.md) | Logger,Environment,Notifications,Telemetry |
| [`docs/reporter-screensaver.md`](docs/reporter-screensaver.md) | Analytics reporter 和 screensaver 启动器 |
## 依赖项
### 必需
- **Wine**(已测试 Wine 9.x / 10.x)
- **Python 3.10+**
- **PyGObject**(包含 GTK4, libadwaita 和 WebKit2)
- **xdotool**, **xprop**(用于修复 X11 下的任务栏问题)
- **7z** 或 **unzip**(用于解密壁纸)
### 可选
- **mpvpaper** — 在 Wayland 下使用视频壁纸
- **xwinwrap** + **mpv** — 在 X11 下使用视频壁纸
- **feh** — 设置静态壁纸(fallback)
### Arch Linux / CachyOS
```
sudo pacman -S wine python-gobject gtk4 libadwaita webkit2gtk-4.1 xdotool xorg-xprop p7zip
```
### Ubuntu / Debian
```
sudo apt install wine python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 gir1.2-webkit2-4.1 xdotool x11-utils p7zip-full
```
### Fedora
```
sudo dnf install wine python3-gobject gtk4 libadwaita webkit2gtk4.1 xdotool xprop p7zip
```
### openSUSE
```
sudo zypper install wine python3-gobject gtk4 libadwaita webkit2gtk3-soup2-devel xdotool xprop p7zip
```
### Void Linux
```
sudo xbps-install wine python3-gobject gtk4 libadwaita webkit2gtk41 xdotool xprop p7zip
```
### Gentoo
```
sudo emerge app-emulation/wine dev-python/pygobject gui-libs/gtk:4 gui-libs/libadwaita net-libs/webkit-gtk x11-misc/xdotool x11-apps/xprop app-arch/p7zip
```
### NixOS
```
# configuration.nix 或 home-manager
environment.systemPackages = with pkgs; [
wineWowPackages.stable
python3
python3Packages.pygobject3
gtk4
libadwaita
webkitgtk_4_1
xdotool
xorg.xprop
p7zip
];
```
## 安装
### 1. 通过 Wine 安装 Razer Axon
```
# 下载安装程序
wget -O /tmp/RazerAxonInstaller.exe "https://rzr.to/axon"
# 安装
wine /tmp/RazerAxonInstaller.exe
```
跟随安装程序操作。默认路径为:`C:\Program Files (x86)\Razer\Razer Axon`。
### 2. 注册 Razer Central Service
Razer Axon 使用 Razer Central Service 进行授权。将其注册为 Wine 服务(只需一次):
```
wine sc create RazerCentralService \
binPath= "C:\Program Files (x86)\Razer\Razer Services\Razer Central\RazerCentralService.exe" \
start= auto
```
该服务将在 Wine 启动时自动运行。
### 3. 安装脚本
```
cp razer-axon.sh razer-login.py razer-token-inject.py razer-axon-decrypt.py ~/.local/bin/
chmod +x ~/.local/bin/razer-axon.sh ~/.local/bin/razer-login.py ~/.local/bin/razer-token-inject.py ~/.local/bin/razer-axon-decrypt.py
```
### 4. 登录 Razer ID
```
# 获取 token
razer-login.py
# 注入到 Razer Central Service
razer-token-inject.py
```
`razer-login.py` 会打开一个显示 Razer ID 登录页面的 WebKit 窗口。授权后,脚本会拦截 JWT token 并将其保存。
`razer-token-inject.py` 通过 named pipe IPC 将 token 传递给 Razer Central Service。首次运行时会自动构建 .NET helper(需要 `dotnet` SDK 6.0+)。
### 5. 运行 Razer Axon
```
razer-axon.sh
```
### 替代方法:修改版 DLL(已弃用)
如果 Razer Central Service 的方法无效,可以将 `RazerAxon.UserManager.dll` 替换为修改版:
```
AXON_DIR="$WINEPREFIX/drive_c/Program Files (x86)/Razer/Razer Axon"
cp "$AXON_DIR/RazerAxon.UserManager.dll" "$AXON_DIR/RazerAxon.UserManager.dll.orig"
cp patch/RazerAxon.UserManager.dll "$AXON_DIR/"
```
该方法消除了对 Razer Central 的依赖,但在每次 Axon 更新后都需要重新应用。
## 使用方法
### 登录 / 刷新 token
```
razer-login.py # Открыть окно входа
razer-login.py --status # Проверить статус текущего токена
razer-token-inject.py # Инжектировать токен в сервис
razer-token-inject.py --status # Проверить состояние
```
token 大约在 24 小时后过期。请通过 `razer-login.py` 刷新,然后运行 `razer-token-inject.py`。
### 启动
```
razer-axon.sh # Запустить Razer Axon
```
启动脚本会:
- 设置 Wine 环境变量以兼容 WebView2
- 如果 Axon 已经运行,则激活现有窗口
- 动态修复任务栏可见性(Wine 会设置 `WM_TRANSIENT_FOR`,导致窗口从任务栏中隐藏 —— 脚本会监控并移除该属性)
### 壁纸解密
Razer Axon 将下载的壁纸存储为伪装成 `.mp4` 的 ZipCrypto 加密 ZIP 压缩包。
```
# 自动扫描并提取所有壁纸
razer-axon-decrypt.py
# 仅显示密码
razer-axon-decrypt.py -p
# 试运行(不提取)
razer-axon-decrypt.py -n
# 跳过已提取的
razer-axon-decrypt.py -s
# 自定义目录
razer-axon-decrypt.py -d /путь/к/обоям -o /путь/к/выходу
# 单个文件
razer-axon-decrypt.py -f wallpaper.mp4 -c ResourceConfig.txt
# JSON 输出(用于自动化)
razer-axon-decrypt.py -j
# 英文界面
razer-axon-decrypt.py --lang en
# 详细输出(debug)
razer-axon-decrypt.py -v
```
#### 解密原理
每个壁纸的密码都根据其 `ResourceConfig.txt` 计算得出:
```
import hmac, hashlib
content = open("ResourceConfig.txt").read()
password = hmac.new(b"j6l-aUmhCc@tN%T_", content.encode(), hashlib.sha256).hexdigest()
```
HMAC 密钥硬编码在 Razer Axon 的 .NET 程序集中。
## 工作原理
### 架构
```
┌─────────────────────────────────────────────────────┐
│ Razer Axon (Wine) — оригинальные файлы, без патчей │
│ │
│ RazerAxon.exe │
│ │ │
│ ├── RazerAxon.UserManager.dll (ОРИГИНАЛ) │
│ │ └── NacClient ──► named pipe IPC │
│ │ │
│ ├── WebView2 UI ──► axon-api.razer.com │
│ │ │
│ └── WallpaperPlayerManager │
│ └── Расшифровка ZIP → воспроизведение │
│ │
│ RazerCentralService.exe (Wine-сервис) │
│ ├── AccountManager ──► авторизация │
│ ├── Named pipe IPC ──► связь с Axon │
│ └── Razer API ──► manifest.razerapi.com │
│ │
├─────────────────────────────────────────────────────┤
│ Linux │
│ │
│ razer-login.py ──► id.razer.com ──► JWT-токен │
│ razer-token-inject.py ──► pipe IPC ──► сервис │
│ razer-axon.sh ──► Wine + фиксы окружения/панели │
│ razer-axon-decrypt.py ──► HMAC-SHA256 → unzip │
│ │
└─────────────────────────────────────────────────────┘
```
### 授权原理
Razer Central Service (`RazerCentralService.exe`) 作为 Wine 服务运行,并监听 named pipe `{FC828A97-C116-453D-BD88-AD471496E03C}`。Axon 通过 `NacClient.dll` 连接到它以获取授权 token。
`razer-token-inject.py` 连接到同一个 pipe,并发送带有 JWT token 的 `WebApp_SetLoginSuccessFromWeb` 命令(该 token 是通过 `razer-login.py` 获取的)。这模拟了通过 Razer Central GUI 进行的网页授权(由于 WPF 渲染限制,该 GUI 无法在 Wine 下显示)。
所有 Razer 文件均保持原样 —— 没有对二进制文件进行任何修改。
### Token 格式
`~/.wine/drive_c/users//AppData/Local/Razer/RazerAxon/wine_login_token.json`:
```
{
"convertFromGuest": false,
"token": "eyJhbGciOiJFUzI1NiI...",
"isOnline": true,
"isGuest": false,
"uuid": "RZR_...",
"loginId": "user@example.com",
"tokenExpiry": "2026-04-01T21:46:43.000Z",
"stayLoggedIn": true
}
```
### 壁纸加密
`~/RazerAxonWallpapers//Resource/` 中的壁纸是 ZipCrypto 加密的 ZIP 压缩包:
```
password = HMAC-SHA256("j6l-aUmhCc@tN%T_", ResourceConfig.txt).hexdigest()
```
## 故障排除
### Axon 显示黑屏/空白窗口
Token 未注入或已过期:
```
razer-login.py # Обновить токен
razer-token-inject.py # Инжектировать
```
### Razer Central Service 未启动
```
# 检查状态
wine sc query RazerCentralService
# 重启 Wine(服务自动启动)
wineboot
```
### 托盘中的西里尔字母显示为方块
```
wine reg add "HKCU\Software\Wine\Fonts\Replacements" /v "Segoe UI" /t REG_SZ /d "Tahoma" /f
```
### Token 过期
```
razer-login.py --status # Проверить
razer-login.py # Обновить
razer-token-inject.py # Инжектировать заново
```
### 窗口在任务栏中不可见
启动脚本会自动修复此问题。如果问题仍然存在,请确保已安装 `xdotool` 和 `xprop`。
### 壁纸解密失败
确保已安装 `7z` 或 `unzip` 并且支持 ZipCrypto。
## 许可证
MIT
标签:GTK4, Wine, 动态壁纸, 协议逆向, 多人体追踪, 数据可视化, 桌面应用, 逆向工具