最近想从 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.
前言
- 文章里的讨论仅限于技术交流,如有需要请 购买正版 !!!
- 文章里的讨论仅限于技术交流,如有需要请 购买正版 !!
- 文章里的讨论仅限于技术交流,如有需要请 购买正版 !
- 请勿分发二进制!!!
原理
emhttpd
使用 RSA_public_decrypt
去解析 BTRS.key
,里面是你的注册信息- 将信息写入
var/state.ini
,这样其他人就可以拿到
思路
LD_PRELOAD
拦截 RSA_public_decrypt
函数,做自定义替换
使用方法
注意:我在 Slackware
上编译的,为的是不理会那些编译环境造成的问题
- 把源码编译一下:
gcc -fPIC -shared crack.c -o BTRS.key
,至于名字为什么是 BTRS.key
,因为反正这个文件也没什么用了,不如就少个文件少点事情 (p.s. 如果取了别的名字也要保证 BTRS.key
这个文件存在并且文件长度足够, 建议还是直接将编译结果取名为 BTRS.key.) - 编译好的
BTRS.key
文件放到 /boot/config/BTRS.key
- 修改一下启动配置文件
/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
也是能用的,就贴个图吧
img
代码
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®Ty=%s®To=\"%s\"®Tm=%s®Gen=0®Days=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); } }
|