以下记录仅是参照下面大佬文章的解锁过程,属于个人尝试性描述,可能存在疏漏或偏差,仅供参考。对于记录内容的准确性或可能导致的后果,不承担任何责任。

参考文章:

  1. 重新学习并解锁emby
  2. 学习 Emby Server 解锁及优化
  3. 学习解锁emby服务端
  4. Emby Premiere ByPass for Docker

主要分为两个部分,一是认证伪站的搭建,二是替换 emby 中认证服务器的域名。

伪站搭建

在 web 服务器中,让以下路径返回对应的数据:

  • /admin/service/registration/validateDevice 返回 {"cacheExpirationDays":365,"message":"Device Valid","resultCode":"GOOD"}

  • /admin/service/registration/validate 返回 {"featId":"","registered":true,"expDate":"2099-01-01","key":""}

  • /admin/service/registration/getStatus 返回 {"deviceStatus":"0","planType":"Lifetime","subscriptions":{}}

  • /admin/service/appstore/register 返回 {"featId":"","registered":true,"expDate":"2099-01-01","key":""}

  • /emby/Plugins/SecurityInfo 返回 {"SupporterKey":"","IsMBSupporter":true}

也可以用 cloudflare workers 搭建:


const commonHeaders = {
  "content-type": "application/json; charset=utf-8",
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Headers": "*",
  "Access-Control-Allow-Method": "*",
  "Access-Control-Allow-Credentials": "true"
};

const createResponse = (data) => {
  return new Response(JSON.stringify(data), {
    headers: commonHeaders
  });
};

const routes = {
  "/admin/service/registration/validateDevice": () => ({
    cacheExpirationDays: 365,
    message: "Device Valid",
    resultCode: "GOOD"
  }),
  
  "/admin/service/registration/validate": () => ({
    featId: "",
    registered: true,
    expDate: "2099-01-01",
    key: ""
  }),
  
  "/admin/service/registration/getStatus": () => ({
    deviceStatus: "0",
    planType: "Lifetime",
    subscriptions: {}
  }),
  
  "/admin/service/appstore/register": () => ({
    featId: "",
    registered: true,
    expDate: "2099-01-01",
    key: ""
  }),
  
  "/emby/Plugins/SecurityInfo": () => ({
    SupporterKey: "",
    IsMBSupporter: true
  })
};

addEventListener("fetch", (event) => {
  const { pathname } = new URL(event.request.url);
  for (const [path, handler] of Object.entries(routes)) {
    if (pathname.endsWith(path)) {
      event.respondWith(createResponse(handler()));
      return;
    }
  }
});

替换 emby server 中的认证域名

总共修改五个文件:

  • system/Emby.Server.Implementations.dll
  • system/MediaBrowser.Model.dll
  • system/Emby.Web.dll
  • system/dashboard-ui/embypremiere/embypremiere.js
  • system/dashboard-ui/modules/emby-apiclient/connectionmanager.js

dll 文件使用 dnSpy 进行修改,js 文件使用文本编辑器修改就可以了。我这里使用的是 4.7.14.0 的版本,不同版本在代码中替换的位置会有不同。

  1. 修改 system/Emby.Server.Implementations.dll 使用 dnSpy 打开,如图找到 PluginSecurityManager,把 C# 换为 IL

在右边搜索 mb3admin.com,替换为上面搭建认证伪站的域名。

替换完后保存。

注意,有的是右键后编辑 IL 指令,有的是编辑字段。

  1. 修改 system/MediaBrowser.Model.dll 使用 dnSpy 打开,如图找到 get_isMBSupporter(),把 IL 换为 C#

在右边代码在 this 位置右键,点编辑方法

this.<IsMBSupporter>k__BackingField 改为 true

然后和上面一样保存。

  1. 修改 system/Emby.Web.dll 使用 dnSpy 打开,如图找到 Emby.Web.dashboard_ui.modules.emby_apiclient.connectionmanager.js,右键保存。

使用文本编辑器打开 Emby.Web.dashboard_ui.modules.emby_apiclient.connectionmanager.js,查找替换 mb3admin.com

保存后替换到 Emby.Web.dll 里,先删除再创建资源,找到刚才修改保存的文件替换进去。

  1. 修改 system/dashboard-ui/embypremiere/embypremiere.js/system/dashboard-ui/modules/emby-apiclient/connectionmanager.js

使用文本编辑器搜索 mb3admin.com 替换为自己搭建的认证域名即可。

使用

如果是安装到系统里的,直接替换文件即可。如果是 docker 安装,可以映射进去,如 linuxserver/emby 镜像:

docker run -d \
  --name emby \
  --hostname=media \
  --restart=always \
  -e TZ=Asia/Shanghai \
  -e PUID=0 \
  -e PGID=0 \
  -p 8096:8096 \
  -v /media:/media \
  -v /opt/emby_config:/config \
  -v /path/to/system/dashboard-ui/embypremiere/embypremiere.js:/app/emby/system/dashboard-ui/embypremiere/embypremiere.js \
  -v /path/to/system/connectionmanager.js:/app/emby/system/connectionmanager.js \
  -v /path/to/system/Emby.Server.Implementations.dll:/app/emby/system/Emby.Server.Implementations.dll \
  -v /path/to/system/MediaBrowser.Model.dll:/app/emby/system/MediaBrowser.Model.dll \
  -v /path/to/system/Emby.Web.dll:/app/emby/system/Emby.Web.dll \
  linuxserver/emby:4.7.14

效果