unRAID 官方版不修改不用 keymaker 可持续 Happy 的方法

 

最近想从 ESXi 上的黑群晖转向 unRAID, 然而正版 unRAID 价格昂贵, 来路不明的 crack 也不太敢用.

找到一种开源的 crack, 转载自 https://www.dosk.win/2022/03/11/unraid-guan-bu-xiu-gai-bu-yong-keymaker-ke-chi-xu-happy-de-fang-fa/

亲测在最新的 unRAID 6.10.0 正式版中以下方法有效, 其实用 Ubuntu 编译对应的代码即可, 无需 Slackware.

前言

  1. 文章里的讨论仅限于技术交流,如有需要请 购买正版 !!!
  2. 文章里的讨论仅限于技术交流,如有需要请 购买正版 !!
  3. 文章里的讨论仅限于技术交流,如有需要请 购买正版
  4. 请勿分发二进制!!!

原理

  1. emhttpd 使用 RSA_public_decrypt 去解析 BTRS.key,里面是你的注册信息
  2. 将信息写入 var/state.ini,这样其他人就可以拿到

思路

  1. LD_PRELOAD 拦截 RSA_public_decrypt 函数,做自定义替换

使用方法

注意:我在 Slackware 上编译的,为的是不理会那些编译环境造成的问题

  1. 把源码编译一下:gcc -fPIC -shared crack.c -o BTRS.key,至于名字为什么是 BTRS.key,因为反正这个文件也没什么用了,不如就少个文件少点事情 (p.s. 如果取了别的名字也要保证 BTRS.key 这个文件存在并且文件长度足够, 建议还是直接将编译结果取名为 BTRS.key.)
  2. 编译好的 BTRS.key 文件放到 /boot/config/BTRS.key
  3. 修改一下启动配置文件 /boot/config/go,把
1
/usr/local/sbin/emhttp &

替换成

1
2
3
4
5
export UNRAID_GUID=你优盘的GUID
export UNRAID_NAME=你的名字
export UNRAID_DATE=一个UNIX时间戳
export UNRAID_VERSION=你想要开心的版本比如Pro
LD_PRELOAD=/boot/config/BTRS.key /usr/local/sbin/emhttp &

效果

写这份代码时,版本是 6.9.2,顺手测试了一下 6.10.0-rc3 也是能用的,就贴个图吧

imgimg

代码

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
#define _GNU_SOURCE
#include <stdio.h>
#include <fcntl.h>
#include <dlfcn.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/uio.h>
#include <netinet/in.h>

#define RSA void
#define BTRS_FORMAT "regGUID=%s&regTy=%s&regTo=\"%s\"&regTm=%s&regGen=0&regDays=0"

typedef int (*RSA_PUBLIC_DECRYPT_FUNC)(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding);
RSA_PUBLIC_DECRYPT_FUNC rsa_public_decrypt;

const char* get_self_exe_name(int full) {
static char buffer[4096] = "";
readlink("/proc/self/exe", buffer, 4096);
if (full) {
return buffer;
}
char* ptr = &buffer[strlen(buffer)];
while (*ptr != '/') --ptr;
return (ptr + 1);
}

int RSA_public_decrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding) {
if (!rsa_public_decrypt) {
rsa_public_decrypt = (RSA_PUBLIC_DECRYPT_FUNC)dlsym(RTLD_NEXT, "RSA_public_decrypt");
}
if (!strcmp(get_self_exe_name(0), "emhttpd") || !strcmp(get_self_exe_name(0), "shfs")) {
sprintf(to, BTRS_FORMAT, getenv("UNRAID_GUID"), getenv("UNRAID_VERSION"), getenv("UNRAID_NAME"), getenv("UNRAID_DATE"));
int len = strlen(to);
return len;
} else {
return rsa_public_decrypt(flen, from, to, rsa, padding);
}
}

本文采用 CC BY-NC-SA 4.0 许可协议发布.

作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/unraid-crack/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬