0%

破解Emby服务器端

Emby 是一款面向媒体服务器和客户端的开源软件。它能够帮助用户整理,管理和播放他们自己的多媒体库。Emby 提供了一个美观且易于使用的界面,可在各种设备上使用,包括 Windows, macOS, Linux, Android 和 iOS。值得注意的是,在享受某些高级功能时需要购买Emby Premiere订阅服务。

​ 本文将通过DNSpy修改Emby服务端的部分dll文件,通过更改文件中默认的授权认证接口到自建的服务器上以实现对服务端Emby Premiere授权的破解。

需要的工具:

注:这篇博客仅为技术探讨,不鼓励任何个人或集体对软件进行非法修改和分发。有能力的读者可以去支持一下正版Emby Premiere

一、搭建验证服务器

​ 在修改原来程序中的认证链接之前,我们需要一个新的认证服务器来处理程序发出的认证请求。参考neko.re老哥的API,认证服务器需要包含以下端点:

1
2
3
4
5
6
7
8
9
POST /admin/service/registration/getStatus

HTTP/1.1 200 OK
Content-Type: application/json
{
"deviceStatus": "0",
"planType": "Lifetime",
"subscriptions": {}
}
1
2
3
4
5
6
7
8
9
POST /admin/service/registration/validateDevice

HTTP/1.1 200 OK
Content-Type: application/json
{
"cacheExpirationDays": 365,
"message": "Device Valid",
"resultCode": "GOOD"
}
1
2
3
4
5
6
7
8
9
10
POST /admin/service/registration/validate

HTTP/1.1 200 OK
Content-Type: application/json
{
"featId": "MBSupporter",
"registered": true,
"expDate": "2999-01-01",
"key": ""
}

​ 本文使用Cloudflare Workers作为响应请求的“服务器”,也可以使用Nginx、Apache等网页服务器。使用Cloudflare Workers的好处是,在cloudflare的全球网络宕机前不用担心验证服务器故障且配置简单,缺点是每日有限的请求次数(10万次,足够个人使用)和*.workers.dev在中国大陆存在DNS污染。

​ 参考Cloudflare Workers文档“快速开始”页面中给出的“路由器”例子进行修改,添加允许跨域的响应头,最后的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// node_modules/itty-router/dist/itty-router.min.mjs
function e({ base: t = "", routes: n = [] } = {}) {
return { __proto__: new Proxy({}, { get: (e2, a, o) => (e3, ...r) => n.push([a.toUpperCase(), RegExp(`^${(t + e3).replace(/(\/?)\*/g, "($1.*)?").replace(/(\/$)|((?<=\/)\/)/, "").replace(/:(\w+)(\?)?(\.)?/g, "$2(?<$1>[^/]+)$2$3").replace(/\.(?=[\w(])/, "\\.").replace(/\)\.\?\(([^\[]+)\[\^/g, "?)\\.?($1(?<=\\.)[^\\.")}/*$`), r]) && o }), routes: n, async handle(e2, ...r) {
let a, o, t2 = new URL(e2.url);
e2.query = Object.fromEntries(t2.searchParams);
for (var [p, s, u] of n)
if ((p === e2.method || "ALL" === p) && (o = t2.pathname.match(s))) {
e2.params = o.groups;
for (var c of u)
if (void 0 !== (a = await c(e2.proxy || e2, ...r)))
return a;
}
} };
}

// index.js
var router = e();

router.post("/admin/service/registration/validateDevice", () => {
let validateDeviceInfo = {
cacheExpirationDays: 365,
message: "Device Valid",
resultCode: "GOOD"
};
const returnData = JSON.stringify(validateDeviceInfo, null, 2);
return new Response(returnData, {
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "*",
"Access-Control-Allow-Method": "*",
"Access-Control-Allow-Credentials": "true"
}
});
});
router.post("/admin/service/registration/validate", () => {
let validateInfo = {
featId: "MBSupporter",
registered: true,
expDate: "2999-01-01",
key: ""
};
const returnData = JSON.stringify(validateInfo, null, 2);
return new Response(returnData, {
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "*",
"Access-Control-Allow-Method": "*",
"Access-Control-Allow-Credentials": "true"
}
});
});
router.post("/admin/service/registration/getStatus", () => {
let getStatusnfo = {
deviceStatus: "0",
planType: "Lifetime",
subscriptions: {}
};
const returnData = JSON.stringify(getStatusnfo, null, 2);
return new Response(returnData, {
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "*",
"Access-Control-Allow-Method": "*",
"Access-Control-Allow-Credentials": "true"
}
});
});
router.all("*", () => new Response("404, not found!", { status: 404 }));
var emby_unlock_default = {
fetch: router.handle
};
export {
emby_unlock_default as default
};
//# sourceMappingURL=index.js.map

​ 打开Cloudflare Workers,点击“Start building”,登录Cloudflare账户(注意,默认跳转的是注册界面,没有账户的可以注册一个,有账户的可以点击“Log in”跳转登录界面)。点击左侧导航栏中的“Workers 和 Pages”,再点击”创建应用程序“,在跳转的页面中点击”创建worker“。名称可以随意填写,但是建议尽量简洁。因为这里填写的名称会出现在最后访问的域名中。填写完成后,点击部署。如果你是第一次使用cloudflare workers,可能会要求你设置自己的子域,这个可以随意,但尽量简洁,原因同上。部署完成后,点击”编辑代码“,用上面的代码替换网页编辑器里的worker.js中的示例代码,最后点击”保存并部署“,记录如下图所示的左侧测试框中的域名。

记录域名

二、修改dll文件

1. 安装emby服务端

​ 访问Download Emby,在”Emby Server“中选择运行的系统,在跳转的页面中选择对应的发行版和cpu架构进行下载,按网页上的说明进行安装。本文采用Ubuntu 22.04发行版进行操作,最终的安装目录为/opt/emby-server

​ 在${Emby安装目录}/system下找到Emby.Server.Implementations.dllEmby.Web.dllMediaBrowser.Model.dll三个文件,在${Emby安装目录}/system/dashboard-ui/embypremiere下找到embypremiere.js,这四个文件就是需要修改的文件。

​ 注意,修改文件之前先停止Emby服务器。

2. 修改认证链接

embypremiere.js

  • 使用任意文本编辑器打开,替换https://mb3admin.com/admin/service/registration/getStatushttps://<第一步中cloudflare worker的域名>/admin/service/registration/getStatus,并保存。

Emby.Server.Implementations.dll

  1. 使用DNSpy打开,在"Emby.Server.Implementations.dll" - “Emby.Server.Implementations.Security” - "PluginSecurityManager"中找到https://mb3admin.com/admin/service/registration/validate,在该url对应的变量MBValidateUrl上右键-编辑字段,修改值为https://<第一步中cloudflare worker的域名>/admin/service/registration/validate,点击确定。

    Emby.Server.Implementations.dll-1

  2. 保持选择的类不变(即不要更改1中前三步选择的东西),将DNSpy切换到IL视图,再次查找https://mb3admin.com/admin/service/registration/validate,在指令名上右键-编辑IL指令,在102行左右找到链接,修改值为https://<第一步中cloudflare worker的域名>/admin/service/registration/validate,点击确定。

    Emby.Server.Implementations.dll-2

  3. 点击DNSpy左上角的文件-全部保存,默认是保存到原位置,也可以自定义保存位置。

Emby.Web.dll

  1. 使用DNSpy打开,在"Emby.Web.dll" - “资源” - "Emby.Web.dashboard_ui.modules.emby_apiclient.connectionmanager.js‎"上右键保存,然后再右键删除。

    Emby.Web.dll-1

  2. 使用任意文本编辑器打开保存的文件,查找https://mb3admin.com/admin/service/registration/validateDevice并替换为https://<第一步中cloudflare worker的域名>/admin/service/registration/validateDevice

  3. 回到DNSpy,在”资源“上右键-创建文件资源,将上一步中修改过的文件导入。

    Emby.Web.dll-2

  4. 保存

MediaBrowser.Model.dll

  1. 使用DNSpy打开,在"MediaBrowser.Model.dll" - “MediaBrowser.Model.Entities” - “PluginSecurityInfo” - "IsMBSupporter"中找到get_IsMBSupporter()方法。在该方法的return语句上右键-编辑方法,在弹出的窗口中修改该方法始终返回true。

    MediaBrowser.Model.dll

  2. 保存

3. 确定文件位置无误后重启Emby服务器

参考资料

重新学习并解锁emby - 如意云-莘家小站 (jiawei.xin)