aixiao fb175ccd02 feat(gen): RightToUpgradeExpiryDate 延到 2099-12-31 (73050)
按用户要求,把【升级权到期日】从 2030-11-05 (47792) 延到 2099-12-31 (73050)。

改动(gen/ 两份,各一行,已重签):
  Full-Perpetual.alf               2816 -> 2816 B   data_len 1850 不变
  Full-Perpetual-Professional.alf  2832 -> 2832 B   data_len 1863 不变
  (47792 与 73050 同为 5 位数字,故文件大小与 data_len 均不变)

三个日期字段现状:
  ExpiryDate=Infinite              保持永久(UI 显示 Perpetual)—— 比 2099 更彻底
  LeaseExpiryTime=Infinite         同上
  RightToUpgradeExpiryDate=73050   2099-12-31(该字段只接受数字,见 NOTES 7.2.2)

预期 UI:Subscription Renew 将显示 2099/12/31
  (此前 ExpiryDate=Infinite 无法显示成日期时,AD 回退读 RTU)。
验签仍为 UNIS(BE=None);rights 仍 63 条。

文档:NOTES 7.2.2 补一句 —— 想把 RTU 推远就给更大的数字,并说明
  AD 显示 Subscription Renew 时对 ExpiryDate / RTU 的取舍顺序。

回归:六层 20+11+13+8+57 全 PASS;validate_msvc 28/28。
2026-09-21 16:28:10 +08:00
2026-09-19 20:42:16 +08:00
2026-09-19 20:42:16 +08:00

AD21 Unis Licenses — 资料库与源码还原工程

本仓库围绕一个伪装成系统组件的 Altium Designer 授权劫持组件 shfolder.dll, 包含原样本、配套工具,以及完整的源码还原工程(含构建、校验与体积对齐工具链)。

目录结构

路径 说明
shfolder.dll 目标样本(16,896 B / PE32+ x86-64)—— hook advapi32!CryptImportKey 替换 RSA 公钥
shfolder.dll.i64 IDA 数据库(已 pack,含函数重命名、注释与证据)
ADLicenseGen/ Altium Designer .alf 生成器("by UNIS",内嵌 RSA 私钥 @0x10A08)+ 源码还原工程;Licenses/ 含 13 份真实授权样本(12 份 UNIS 签名 + 1 份 Altium 官方签名)
EMIStreamKeyGen/ 另一套体系:NEC EMIStream 的 FlexLM keygen(TeamEFA)+ license.dat
shfolder/ 源码还原工程(本仓库核心,见 shfolder/README.md)
!!! ReadMe !!!.txt 原发布者自带说明

核心结论(4 条)

  1. 样本 = MinHook(x64) + 单一 detour:当 CryptImportKey 导入 276 字节的 RSA-2048 公钥且内容等于 Altium 官方公钥 时,替换为 UNIS 公钥。
  2. 自校验门禁:DllMain 计算自身文件 CRC32,只有 == 0 才安装 hook,否则静默放弃 (这是原始样本被刻意构造的性质,也是复刻时的必备步骤)。
  3. 闭环证据:shfolder.dll@0x403590(公钥)↔ ADLicenseGen.exe@0x10A10(私钥) 的 modulus md5 均为 be68ad7734cdd390f96b806133a4161f。
  4. 样本原大小 16,896 B 属 "无 CRT"风格:不导入 msvcrt,mem* 由 intrinsic 内联, __security_check_cookie(0x21 B)与 _guard_dispatch_icall_nop(2 B)都是极简手写 stub。

还原工程速查

cd shfolder
make          # MinGW 默认构建
make check    # 全文件 CRC32 归零 + 9 项自检 + MSVC 工程校验
make slim     # 体积优化(gc-sections + strip)
make nocrt    # 无 CRT 构建

Windows / MSVC:

msbuild msvc\shfolder.sln /p:Configuration=ReleaseNoCRT /p:Platform=x64
python tools\crc32_zero.py build\msvc-nocrt\shfolder.dll
python tools\verify_build.py  build\msvc-nocrt\shfolder.dll

产物阶梯(同一份源码)

构建 大小 说明
MSVC ReleaseNoCRT 17,408 B 最接近原始样本(16,896 B,+512 B / +3%),无 CRT
MinGW make nocrt 23,040 B 无 CRT,导入仅 KERNEL32 + SHELL32
MinGW make slim 30,720 B gc-sections + strip
MinGW make 115,553 B 含 DWARF 调试节(约 45%)
MSVC Release 116,736 B 静态 CRT(/MT)

工具

工具 用途
tools/crc32_zero.py 解 4 字节使全文件 CRC32 = 0(门禁必需)
tools/verify_build.py 产物 9 项自检(PE / 导出 / CRC / 公钥 / 字符串)
tools/gen_data_headers.py 从原始 DLL 提取两把 RSA 公钥与 CRC32 表
tools/validate_msvc.py MSVC 工程文件合法性校验(XML、配置、选项一致性)
tools/fetch_minhook.py 补齐上游 MinHook 源文件

重要提醒

  • 任何产物必须先跑 tools/crc32_zero.py 归零,否则 DllMain 会拒绝安装 hook(表现为静默失效)。
  • shfolder/build/ 与 IDE 本地状态(.vs/、*.vcxproj.user)均已在 .gitignore 中,构建产物不入库。
  • 仅用于互操作性 / 安全研究,请遵守所在地法律法规与软件许可协议。
S
Description
No description provided
Readme
2.7 MiB
Languages
C 59.3%
Python 38.1%
Makefile 2.6%