main
按用户要求,把【升级权到期日】从 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。
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 条)
- 样本 = MinHook(x64) + 单一 detour:当
CryptImportKey导入 276 字节的 RSA-2048 公钥且内容等于 Altium 官方公钥 时,替换为 UNIS 公钥。 - 自校验门禁:
DllMain计算自身文件 CRC32,只有== 0才安装 hook,否则静默放弃 (这是原始样本被刻意构造的性质,也是复刻时的必备步骤)。 - 闭环证据:
shfolder.dll@0x403590(公钥)↔ADLicenseGen.exe@0x10A10(私钥) 的 modulus md5 均为be68ad7734cdd390f96b806133a4161f。 - 样本原大小 16,896 B 属 "无 CRT"风格:不导入
msvcrt,mem*由 intrinsic 内联,__security_check_cookie(0x21 B)与_guard_dispatch_icall_nop(2 B)都是极简手写 stub。
还原工程速查
- 源码与构建:
shfolder/README.md - 证据链(反编译片段 / 公钥比对 / 验证记录):
shfolder/NOTES_evidence.md - MSVC 工程(
Release与ReleaseNoCRT两个配置):shfolder/msvc/README.md .alf生成器还原工程:ADLicenseGen/ADLicenseGen/README.md(含.alf格式规格、5 层验证与tools/alf.py参考实现)
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中,构建产物不入库。- 仅用于互操作性 / 安全研究,请遵守所在地法律法规与软件许可协议。
Languages
C
59.3%
Python
38.1%
Makefile
2.6%