Запуск Razer Axon на Linux через Wine — с поддержкой авторизации, фиксами панели задач и расшифровкой обоев. Включает нативный GTK4 клиент и полную документацию по реверс-инжинирингу протоколов Razer Axon.
| Файл | Описание |
|---|---|
razer-login.py |
Авторизация в Razer ID |
razer-token-inject.py |
Инжекция токена в Razer Central Service (работа без патча DLL) |
razer-token-refresh.sh |
Тихое авто-обновление токена (для systemd --user таймера, см. systemd/) |
razer-axon-gui.py |
Нативный GTK4/Adwaita клиент для Linux |
openaxon-player.py |
Нативный wallpaper daemon (видео/статика, мультимонитор, эффекты) |
razer-axon.sh |
Скрипт запуска оригинального Axon через Wine |
razer-axon-decrypt.py |
Извлечение зашифрованных видео-обоев |
razer-sync.py |
Синхронизация обоев с аккаунтом Razer |
patch/RazerAxon.UserManager.dll |
Патченная DLL (устаревший метод, см. ниже) |
Полная документация протоколов Razer Axon, извлечённая из 27 .NET DLL и JS-бандлов:
| Документ | Описание |
|---|---|
docs/razer-central-ipc.md |
IPC протокол Razer Central — 4 сервиса, 137+ команд, wire format |
docs/axon-api.md |
REST API — ~110 endpoints, HMAC-авторизация, менеджер загрузок |
docs/react-architecture.md |
React 18 frontend — 24 маршрута, state management, WebView2 мост |
docs/wallpaper-player.md |
Player pipe протокол — JSON команды, эффекты, мультимонитор |
docs/chroma-sdk.md |
Chroma RGB — REST API, .chroma формат, AI-генерация, LED maps |
docs/design-system.md |
CSS дизайн-система — цвета, шрифты, 13 групп компонентов |
docs/webview-host-objects.md |
JS↔C# мост — 6 host objects, 111 методов |
docs/utilities.md |
Logger, Environment, Notifications, Telemetry |
docs/reporter-screensaver.md |
Analytics reporter и screensaver launcher |
- 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)
sudo pacman -S wine python-gobject gtk4 libadwaita webkit2gtk-4.1 xdotool xorg-xprop p7zipsudo apt install wine python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 gir1.2-webkit2-4.1 xdotool x11-utils p7zip-fullsudo dnf install wine python3-gobject gtk4 libadwaita webkit2gtk4.1 xdotool xprop p7zipsudo zypper install wine python3-gobject gtk4 libadwaita webkit2gtk3-soup2-devel xdotool xprop p7zipsudo xbps-install wine python3-gobject gtk4 libadwaita webkit2gtk41 xdotool xprop p7zipsudo 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# configuration.nix или home-manager
environment.systemPackages = with pkgs; [
wineWowPackages.stable
python3
python3Packages.pygobject3
gtk4
libadwaita
webkitgtk_4_1
xdotool
xorg.xprop
p7zip
];# Скачать установщик
wget -O /tmp/RazerAxonInstaller.exe "https://rzr.to/axon"
# Установить
wine /tmp/RazerAxonInstaller.exeСледуйте установщику. Путь по умолчанию: C:\Program Files (x86)\Razer\Razer Axon.
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.
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# Получить токен
razer-login.py
# Инжектировать в Razer Central Service
razer-token-inject.pyrazer-login.py открывает окно WebKit со страницей входа Razer ID. После авторизации скрипт перехватывает JWT-токен и сохраняет его.
razer-token-inject.py передаёт токен в Razer Central Service через named pipe IPC. При первом запуске автоматически собирает .NET-хелпер (требуется dotnet SDK 6.0+).
razer-axon.shПримечание: Вы также можете войти напрямую через интерфейс Axon — нажмите «Вход» в окне приложения. Токен-инжектор нужен только если прямой вход не работает.
Если метод с 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.
razer-login.py # Открыть окно входа
razer-login.py --status # Проверить статус текущего токена
razer-token-inject.py # Инжектировать токен в сервис
razer-token-inject.py --status # Проверить состояниеТокены истекают примерно через 24 часа. Обновить можно вручную (razer-login.py), но удобнее настроить авто-обновление (ниже).
razer-login.py --refresh тихо получает новый токен по сохранённым session-cookie
Razer ID — без окна входа — и только когда токен истекает в течение часа
(иначе быстрый no-op). Пока жива сессия Razer ID, повторно вводить логин/пароль не нужно.
razer-token-refresh.sh оборачивает это: вызывает --refresh и синхронизирует свежий
токен в Wine-префикс (туда, откуда патч RazerAxon.UserManager.dll читает
wine_login_token.json). Поставьте на systemd --user таймер (раз в 30 мин):
# Юниты в systemd/ ставят %h/Projects/openaxon/razer-token-refresh.sh —
# поправьте ExecStart под свой путь, если репозиторий лежит иначе.
cp systemd/razer-axon-token-refresh.{service,timer} ~/.config/systemd/user/
systemctl --user daemon-reload
# WebKit для silent-refresh нужен доступ к графической сессии:
systemctl --user import-environment WAYLAND_DISPLAY DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS XDG_RUNTIME_DIR
systemctl --user enable --now razer-axon-token-refresh.timerКогда session-cookie в итоге истекут (недели), таймер залогирует ошибку — тогда
один раз войдите интерактивно (razer-login.py).
razer-axon.sh # Запустить Razer AxonСкрипт запуска:
- Устанавливает переменные окружения Wine для совместимости с WebView2
- Если Axon уже запущен, активирует существующее окно
- Реактивно исправляет видимость в панели задач (Wine устанавливает
WM_TRANSIENT_FOR, что скрывает окно из панели задач — скрипт отслеживает это и удаляет атрибут)
UI Razer Axon рендерится встроенным WebView2 (msedgewebview2 / Chromium).
Под Wine GPU/Viz-процесс Chromium падает на CHECK()/__debugbreak() при
GPU-init (exit code 0x80000003 = STATUS_BREAKPOINT) и циклически
перезапускается; исчерпав GPU-crash-лимит (~3-6 крашей подряд), browser-процесс
сознательно выходит → Axon видит CoreWebView2ProcessFailed / причина
BrowserProcessExited и закрывает окно UI. Главный процесс Axon при этом
выживает. Это НЕ Mojo IPC и НЕ авторизация (прежняя гипотеза опровергнута,
см. ниже).
Фикс (главный рычаг) — Windows 7 для рендерера, чтобы обойти DirectComposition:
razer-axon.sh и install-axon-linux.sh идемпотентно ставят в реестр префикса:
Version=win7дляmsedgewebview2.exeвHKCU\Software\Wine\AppDefaults— главное. При Windows-версии ≥8.1 viz Chromium презентует кадр (даже software-bitmap) через DirectComposition (DCompositionCreateDevice), которого Wine не реализует (E_NOTIMPL/0x80004001) → CHECK → краш viz → кадр не доходит до окна = чёрный экран. Подwin7тот жеSoftwareOutputDeviceидёт через GDI BitBlt (без DComp) и реально копирует пиксели в окно;HardwareAccelerationModeEnabled=0вHKLM/HKCU\Software\Policies\Microsoft\Edgeи...\Edge\WebView2— вспомогательное (Edge не поднимает HW-GPU-процесс).
Важно — два РАЗНЫХ рычага версии Windows:
win7ставится ТОЛЬКО подпроцессу-рендереруmsedgewebview2.exe;RazerAxon.exeи глобально префикс остаютсяwin10— иначе сервер Razer отдаёт пустой каталог (логин/контент не работают). См.set_win10в установщике.Источники фикса: WineHQ Bug 58921, winetricks #2226, CodeWeavers, Arch Forums.
Доп. смягчения, которые применяет razer-axon.sh:
- Evergreen-рантайм (по умолчанию). Axon рендерит home через встроенный
evergreen WebView2 (Chromium 149) — единственная конфигурация, где
CreateCoreWebView2Environmentпод Wine инициализируется. Fixed-version (INSTALL_WV2_FIXED=1) не рекомендуется (см. ниже). - Software-only рендер.
LIBGL_ALWAYS_SOFTWARE=1,GALLIUM_DRIVER=llvmpipe, Mesa-EGL — убирают шум NVIDIA EGL под XWayland. - Chromium-флаги (
WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS):--no-sandbox --disable-gpu --disable-gpu-compositing --disable-software-rasterizer --disable-gpu-sandbox --disable-features=RendererCodeIntegrity --disable-crash-reporter --disable-renderer-backgrounding --disable-background-timer-throttling.
Статус (2026-06-12): проверено живьём на Wine 11.10 + RTX 4070 (Wayland). Корень переустановлен по stderr Chromium (
gpu_process_host.cc:1063 GPU process exited unexpectedly: exit_code=-2147483645=0x80000003, «has crashed N time(s)»). В одном baseline-прогоне зафиксировано 12 спавнов gpu-process.До фикса (baseline): GPU-процесс крашит ~6 раз →
BrowserProcessExitedчерез ~10-17 с, цикл ~38 раз за 200 с (UI мерцает).После фикса (
win7для msedgewebview2.exe + win10 для приложения): UI Axon реально рисуется — подтверждено визуально (главная с каруселью баннеров/TRENDING и экран Razer ID Login отрисованы полностью, 2026-06-18). Чёрный экран устранён: viz больше не зовётDCompositionCreateDevice, презентация идёт через GDI BitBlt. Флаг--disable-gpu-process-crash-limitприwin7убран как избыточный (краш-цикл DComp устранён в корне; флаг лишь маскировал симптом) — проверено живьём, UI рисуется и без него.Предыстория: ранее реестр ошибочно ставил
win81(= порог включения DComp) — это убиралоBrowserProcessExited(белый экран), но viz зацикливался на DComp-краше и не выдавал кадры → чёрный экран. Замена наwin7— настоящее решение.WineHQ #56378 — НЕ про named-pipe/Mojo (research, обход Anubis): это баг Chromium-sandbox bring-up, закрыт FIXED в Wine 11.1; парный #56377 (freeze) — FIXED в 10.5. Все их фиксы (winstation/desktop/token,
DeriveCapabilitySidsFromName,SetAdditionalForegroundBoostProcesses) уже присутствуют в системном Wine 11.10. Chromium Mojo использует named pipes в BYTE-mode (Wine давно держит); с Chrome ~112 Mojo ушёл в shared memory (ipcz). → Патч Wine по named-pipe не требуется и не помог бы; пропатченный Wine НЕ собирался (отменено по результату research).Что НЕ помогло ранее (проверено живьём):
--single-process(крашит быстрее),--no-zygote, отключениеwerfault.exe, Xvfb без NVIDIA-EGL (EGL не корень),--disable-watchdog/--disable-hang-monitor, fixed-version рантайм 109/133 (версия стабильности не даёт). Чтобы убрать оставшийся 1× ранний краш:--disable-gpu-watchdog+ повышение GPU-crash-лимита, Wine-Staging ≥11.6 (DirectComposition патчсет), либо вынос WebView2 во внешний хост (CDP-proxy).
Razer Axon хранит скачанные обои как ZipCrypto-зашифрованные ZIP-архивы, замаскированные под .mp4.
# Автосканирование и извлечение всех обоев
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-ключ захардкожен в .NET-сборках Razer Axon.
┌─────────────────────────────────────────────────────┐
│ 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 для получения токена авторизации.
razer-token-inject.py подключается к тому же pipe и отправляет команду WebApp_SetLoginSuccessFromWeb с JWT-токеном, полученным через razer-login.py. Это эмулирует веб-авторизацию через Razer Central GUI (который не отображается под Wine из-за ограничений WPF-рендеринга).
Все файлы Razer остаются оригинальными — никаких патчей бинарников.
~/.wine/drive_c/users/<USER>/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/<id>/Resource/ — это ZipCrypto-зашифрованные ZIP-архивы:
password = HMAC-SHA256("j6l-aUmhCc@tN%T_", ResourceConfig.txt).hexdigest()
Токен не инжектирован или истёк:
razer-login.py # Обновить токен
razer-token-inject.py # Инжектировать# Проверить статус
wine sc query RazerCentralService
# Перезапустить Wine (сервис стартует автоматически)
winebootwine reg add "HKCU\Software\Wine\Fonts\Replacements" /v "Segoe UI" /t REG_SZ /d "Tahoma" /frazer-login.py --status # Проверить
razer-login.py # Обновить
razer-token-inject.py # Инжектировать зановоСкрипт запуска исправляет это автоматически. Если проблема остаётся, убедитесь, что xdotool и xprop установлены.
Убедитесь, что 7z или unzip установлен и поддерживает ZipCrypto.
MIT