Zuken CADSTAR 16 破解流程
1.什么是CADSTAR?
Home Page: https://www.zuken.com
What's New in CADSTAR 16: https://www.zuken.com/en/products/pcb-design/cadstar/whats-new/cadstar-whats-new/cadstar-16-features
2.授权方式
此前网络上流传着CADSTAR13的破解版本,经过分析发现v13版本采用了FlexNet授权机制进行保护,该破解文件对ECC校验进行了修改,并利用FlexNet SDK开发了生成许可证的程序。所涉及的补丁文件包括以下内容:
engineer.exe
impulse.exe
Log.txt
pred.dll
rdr2adv.exe
scs.exe
senario.exe
sysutils.dll
gradianWX\bin\winnt\gradian.EXE
通过对比分析可知,CADSTAR16版本使用的是FlexNet 11.11.1授权机制,若要编写注册机,则首先需要获取SDK。目前网络上公开的SDK版本为FlexNet SDK 11.9.1。
3.破解过程
3.1 确定VENDOR_NAME
通过OD加载engineer.exe文件,查找固定值0x87654321。随后找到邻近地址0x12345678,在其上方的CALL指令处设置断点,执行F9命令运行程序直至触发断点,此时仍可观察到VENDOR_NAME的值为zuken。

3.2 找FEATURE_NAME
核心步骤在于定位lc_checkout函数,通过IDA工具加载11.9.1版本SDK中lmgr.lib库文件所包含的lm_ckout.obj对象文件,进而找到对应函数_lc_checkout。首先需对该函数在11.9.1版本中的结构特征进行分析与观察,随后再在11.11.1版本中确定lc_checkout函数的具体位置。

通过肉眼观察,发现存在一个0x20000的常量,该常量被&和^操作符各使用了一次。在OD中搜索指令序列“and ecx, 0x20000”,共找到四处匹配结果。经人工比对后确认,第一处函数流程与IDA中的分析结果基本一致,因此可以初步判断该函数即为新版11.11.1中的lc_checkout函数。
同时也可以借助SDK 11.11.1所提供的IDA SIG文件,直接定位到lc_checkout函数
在函数入口处设置断点后,通过F9键执行程序直至到达该函数入口位置。

在寄存器与堆栈区域中,已经能够识别出FEATURE_NAME与FEATURE_VERSION的存在。同时,在数据窗口中还可以发现其他相关的FEATURE信息。通过多次调试与观察可以得知,大多数情况下FEATURE_NAME均存储于PE文件的data段内,并且其格式通常表现为类似“name version epxxxx”的字符串形式。因此,在OD工具中可通过按下ALT+M键打开内存窗口,定位至PE文件的data段,随后双击进入数据窗体,在其中搜索“ep2”、“ep3”、“ep4”等相似字符,查看是否以“name version epxxxx”的方式存储,从而能够完整地识别出所有 FEATURE 信息。

对其他文件实施相同处理方式,所提取到的特征信息详见下表
| filename | feature | version | unkonw |
|---|---|---|---|
| enginer.exe | emc_server | 25.0 | ep4416 |
| emc_front_loaded | 25.0 | ep4418 | |
| dc_analysis | 25.0 | ep4454 | |
| sysutils.dll | cadstar_gold | 19.0 | ep2553 |
| cadstar_silver | 19.0 | ep2554 | |
| cadstar_bronze | 19.0 | ep2555 | |
| emcrules_auth | 4.0 | ep2698 | |
| cadstar_eval | 19.0 | ep2998 | |
| cadstar_beta | 19.0 | ep2999 | |
| cadstar_field_solver | 19.0 | ep3085 | |
| cadstar_library_editor | 19.0 | ep3099 | |
| cadstar_schematics | 19.0 | ep3103 | |
| freedom | 9.0 | ep3314 | |
| cstar_viewer_plus | 19.0 | ep3675 | |
| cadstar_des_view_ppr | 19.0 | ep3690 | |
| cadstar_des_view_rep_gen | 19.0 | ep3691 | |
| embedded_router | 19.0 | ep3876 | |
| emd_2dcheck | 4.0 | ep3942 | |
| cadstar_variants | 19.0 | ep3953 | |
| pred_ibase | 25.0 | ep4191 | |
| pred_cbase | 25.0 | ep4194 | |
| pred_interactive | 25.0 | ep4195 | |
| pred_2000 | 25.0 | ep4196 | |
| pred_5000 | 25.0 | ep4197 | |
| pred_single_pass_batch | 25.0 | ep4205 | |
| pred_multi_pass_batch | 25.0 | ep4206 | |
| pred_memory_batch | 25.0 | ep4209 | |
| pred_mitre_batch | 25.0 | ep4210 | |
| cadstar_ds1_interface | 3.0 | ep4372 | |
| pred_pattern_batch | 25.0 | ep4211 | |
| hs_route | 25.0 | ep4213 | |
| hs_place_and_route | 25.0 | ep4214 | |
| cadstar_scm_variants | 19.0 | ep4263 | |
| hotstage_verify | 25.0 | ep4297 | |
| pred_2000_s | 25.0 | ep4304 | |
| pred_2000_hs | 25.0 | ep4305 | |
| cadstar_datasheet_pub | 19.0 | ep4323 | |
| cadstar_shape_trim | 19.0 | ep4324 | |
| pred_six_layer_enh | 25.0 | ep4336 | |
| pred_max_layer_enh | 25.0 | ep4337 | |
| viewer_cadif_import | 19.0 | ep4377 | |
| lightning_spice_gen | 25.0 | ep4463 | |
| cadstar_rules_by_area | 19.0 | ep4492 | |
| cadstar_migration_link | 1.0 | ep4543 | |
| cstar_idf_link | 4.0 | ep4569 | |
| cstar_constraint_browser | 25.0 | ep4577 | |
| analysis_results_viewer | 2.0 | ep4593 | |
| cadstar_copper | 19.0 | ep4599 | |
| cadstar_scm_copper | 19.0 | ep4600 | |
| impulse.exe | idem_model_import | 6.0 | ep4534 |
| sim_lib_manager | 6.0 | ep4222 | |
| scs.exe | si_interactive_simulation | 25.0 | ep4221 |
| si_batch_simulation | 25.0 | ep4417 | |
| lightning_spice_gen | 25.0 | ep4463 | |
| pred.dll | pred_ibase | 25.0 | ep4191 |
| pred_vbase | 14.0 | ep4192 | |
| pred_bbase | 25.0 | ep4193 | |
| pred_cbase | 25.0 | ep4194 | |
| pred_interactive | 25.0 | ep4195 | |
| pred_2000 | 25.0 | ep4196 | |
| pred_5000 | 25.0 | ep4197 | |
| pred_floorplanner | 25.0 | ep4198 | |
| pred_assembly | 25.0 | ep4199 | |
| pred_rules_by_area | 25.0 | ep4200 | |
| pred_radial_router | 25.0 | ep4201 | |
| pred_thermal | 25.0 | ep4202 | |
| pred_widis | 14.0 | ep4203 | |
| pred_batch_upgrade | 25.0 | ep4204 | |
| pred_single_pass_batch | 25.0 | ep4205 | |
| pred_multi_pass_batch | 25.0 | ep4206 | |
| pred_smooth_batch | 25.0 | ep4207 | |
| pred_optimum_batch | 25.0 | ep4208 | |
| pred_memory_batch | 25.0 | ep4209 | |
| pred_mitre_batch | 25.0 | ep4210 | |
| pred_pattern_batch | 25.0 | ep4211 | |
| preditor11_adv_plc_tools | 14.0 | ep4212 | |
| hs_route | 25.0 | ep4213 | |
| hs_place_and_route | 25.0 | ep4214 | |
| hs_realize | 25.0 | ep4215 | |
| hs_prototype | 25.0 | ep4216 | |
| hs_scenario | 25.0 | ep4217 | |
| hotstage_verify | 25.0 | ep4297 | |
| hotstage_verify_plus | 25.0 | ep4298 | |
| hotstage_verify_elite | 25.0 | ep4299 | |
| pred_rbase | 25.0 | ep4300 | |
| pred_2000_s | 25.0 | ep4304 | |
| pred_2000_hs | 25.0 | ep4305 | |
| pred_2000_floorplanner | 25.0 | ep4312 | |
| pred_beta | 25.0 | ep4329 | |
| hs_scenario_plus | 25.0 | ep4332 | |
| pred_six_layer_enh | 25.0 | ep4336 | |
| pred_max_layer_enh | 25.0 | ep4337 | |
| pred_conc_placement | 25.0 | ep4343 | |
| multi_board | 25.0 | ep4415 | |
| emc_server | 25.0 | ep4416 | |
| lightning_spice_gen | 25.0 | ep4463 | |
| cp_heavy_cluster | 25.0 | ep4469 | |
| zx0301 | 13.0 | ep4511 | |
| pred_classic_autorouter | 25.0 | ep4512 | |
| pred_dragon_autorouter | 25.0 | ep4513 | |
| pred_dragon_strategy | 25.0 | ep4514 | |
| pred_dragon_consultant | 25.0 | ep4515 | |
| pred_intelligent_obj | 25.0 | ep4516 | |
| zx0501 | 15.0 | ep4526 | |
| dragon_smart_fanout | 25.0 | ep4532 | |
| dragon_escape_routing | 25.0 | ep4533 | |
| zx1601 | 10.0 | ep4561 | |
| pred_smart_fanout | 21.0 | ep4574 | |
| cstar_constraint_browser | 25.0 | ep4577 | |
| pred_netless_router | 25.0 | ep4584 | |
| zx3201 | 2013.0 | ep4585 | |
| gradian.exe | gradian | 2.0 | ep4420 |
| rdr2adv.exe | emcrules_auth | 4.0 | ep2698 |
| adviser_dfm_rules | 4.0 | ep3020 | |
| fastrule_auth | 4.0 | ep3073 | |
| senario.exe |
3.3 找SEED1和SEED2
依据以上找到的feature,伪造一个enginer.exe文件的license文件如下:
INCREMENT emc_server zuken 25.0 1-jan-2100 uncounted HOSTID=ANY SIGN=0
INCREMENT emc_front_loaded zuken 25.0 1-jan-2100 uncounted HOSTID=ANY SIGN=0
INCREMENT dc_analysis zuken 25.0 1-jan-2100 uncounted HOSTID=ANY SIGN=0
保存为license.dat至C:\flexlm\目录下.OD重新加载enginer.exe文件。根据第一步找VENDOR_NAME的方式找到的关键CALL,在该函数内部第一个跳转的位置下断点,未跳转的第一个CALL下断点,F9运行直至断在未跳转的第一个CALL的位置。F8运行该CALL结束,如下图

然后在命令分别输入以下命令,数据窗口分别得到以下数据
| 命令 | 数据 |
|---|
| dd [esp+8]| 013DECC8 00000004
013DECCC B745B072 data[0]
013DECD0 B75B6161 data[1]
013DECD4 5CD988E0
013DECD8 946F3B1E
013DECDC 9BB0D61F
013DECE0 08B17561
013DECE4 000B000B ver 11.11
013DECE8 31310000 ver 11
||
| dd [esp]| 01707100 00000000
01707104 00FBFFF9
01707108 014D20FE job+08
0170710C ED9CB784 job+0c
01707110 AE36D371 job+10
||
运行calcseed.exe程序,输入相关数据后,可获取seed1的值为0x00089003,以及seed2的值为0x00164110,具体示例如下图所示。

3.4 Patch ECC校验
通过采用FlexNet ECC Patch工具,可以移除对补丁文件实施ECC校验的步骤,具体操作示例如下图所示。

Patch的完整Log如下:
在gradian.EXE文件中检测到ECC 32位签名
文件大小为2396160字节
补丁位置位于00135050h
补丁验证地址为00135050h
文件已被修改。
在engineer.exe文件中检测到ECC 32位签名
文件大小为9965056字节
补丁位置位于006F64E0h
补丁验证地址为006F64E0h
文件已被修改。
在impulse.exe文件中检测到ECC 32位签名
文件大小为3153920字节
补丁位置位于0020C0E0h
补丁验证地址为0020C0E0h
文件已被修改。
在pred.dll文件中检测到ECC 32位签名
文件大小为2117376字节
补丁位置位于00EF48E8h(注意:此处可能原文存在排版或格式问题,已根据上下文进行合理调整)
验证补丁的地址是同上所述位置。
此文件同样被实施了补丁操作。
在rdr2adv.exe文件中发现有ECC类型的32位数字标识符存在
当前该程序的总容量显示为2577448个字节单位
已在偏移量处完成相应的代码改动,具体位置是起始点从零开始计数至第十六进制数值对应的位置值
对于该补丁内容的真实性校验,也采用相同的内存区域作为参考依据
综合判断后确认此软件组件确实经历了人为干预处理过程
类似地,在scs.exe这个可执行程序里也发现了类似的EC C编码结构特征
其存储空间占用量达到约13,884,776个基本单元尺寸
修改发生在特定内存段内的指定偏移点上,并且使用相同区域进行有效性检查
明确表明该二进制文件已经过非授权变更操作
同样,在senario.exe这个运行时组件中也识别出具有EC C标准定义的认证标记信息
它所占有的磁盘空间大约是15,749,888个数据单元数量
所有改动均集中在某个固定偏移量处完成,并通过相同区域来确保其完整性
检测结果清楚地显示出该软件模块已经被非法篡改过
最后,在sysutils.dll动态链接库中同样出现了符合EC C规范的认证信息
此库文件的总体尺寸约为1,557,994个数据块长度
修改工作在特定偏移点完成,且利用相同内存区域进行真实性检验
最终结论指出此系统组件已遭受未经授权的修改行为。
3.5 计算SIGN
此前提及了一个名为License.dat的数据文档,其中SIGN字段的内容设定为了零值,这种设置无法满足授权验证的要求。因此需要借助编译FlexNET SDK版本号为11.9.1所提供的工具链来生成符合规范的SIGN与HOSTID参数。
通过使用lmkg3命令行工具并输入VENDOR_NAME作为输入参数,可以计算得出对应的VENDOR_KEY和TRL_KEY的具体数值,相关结果如图所示:

通过调用SDK所提供的lmrand1.exe程序,在命令行界面中执行lmrand1 -seed指令,即可生成对应的LM_SEED数值,具体操作示例如下图所示:

在lm_code.h文件中,需对sdk内的相关内容进行替换操作:
#define VENDOR_KEY1 0xd4c8bbc2
#define VENDOR_KEY2 0xc592f46a
#define VENDOR_KEY3 0x753a8c1c
#define VENDOR_KEY4 0x2a195ac8
#define VENDOR_KEY5 0x7b065bc0
#define TRL_KEY1 0x9f1896c6
#define TRL_KEY2 0x789f90a0
#define VENDOR_NAME "zuken"
#define ENCRYPTION_SEED1 0x00089003
#define ENCRYPTION_SEED2 0x00164110
#define LM_SEED1 0xcb469f78
#define LM_SEED2 0x60610e5a
#define LM_SEED3 0x5c576721
#define LM_STRENGTH LM_STRENGTH_239BIT
将makefile文件中VENDORNAME对应的参数值由demo更改为zuken,借助VS2013平台提供的命令行工具,执行build.bat脚本,完成整个编译流程。

利用SDK所提供的lmhostid.exe工具,可以提取当前设备的hostid信息。随后,在Excel表格中参照前述位置所展示的license格式,借助相关公式将所有feature进行整合连接,具体示例如下图所示。

将license列的内容复制到文本文件中,并将其保存为license.txt。随后,在命令行界面中执行由sdk编译生成的lmcrypt.exe程序,输入命令lmcrypt -i license.txt -o license.dat,此时系统将生成名为license.dat的输出文件。使用记事本打开该文件,若内容无误,则已成功计算出正确的SIGN值。接下来,将此license.dat文件复制到CADSTAR的Programs目录中,启动程序后即可获得所有功能的授权。
3.6 编写KEYGEN
这一部分的实现相对简单,主要是在sdk提供的lmcrypt.c文件基础上,增加用于获取主机标识符hostid的功能。以下为相关的核心代码实现。
#include "stdafx.h"
#include "lm_code.h"
#include "lmclient.h"
#include "lm_attr.h"
#include "lmprikey.h"
#include <string.h>
LM_CODE_NEW(site_code, ENCRYPTION_SEED1, ENCRYPTION_SEED2,
VENDOR_KEY1, VENDOR_KEY2, VENDOR_KEY3,
VENDOR_KEY4, VENDOR_KEY5,
FLEXLM_VERSION, FLEXLM_REVISION, FLEXLM_PATCH, LM_VER_BEHAVIOR,
TRL_KEY1, TRL_KEY2, LM_STRENGTH);
#define FEATURE_COUNT 93
char feature[FEATURE_COUNT][255] = { "cadstar_gold", "cadstar_silver", "cadstar_bronze", "emcrules_auth", "cadstar_eval", "cadstar_beta", "adviser_dfm_rules", "fastrule_auth", "cadstar_field_solver", "cadstar_library_editor", "cadstar_schematics", "freedom", "cstar_viewer_plus", "cadstar_des_view_ppr", "cadstar_des_view_rep_gen", "embedded_router", "emd_2dcheck", "cadstar_variants", "pred_ibase", "pred_vbase", "pred_bbase", "pred_cbase", "pred_interactive", "pred_2000", "pred_5000", "pred_floorplanner", "pred_assembly", "pred_rules_by_area", "pred_radial_router", "pred_thermal", "pred_widis", "pred_batch_upgrade", "pred_single_pass_batch", "pred_multi_pass_batch", "pred_smooth_batch", "pred_optimum_batch", "pred_memory_batch", "pred_mitre_batch", "pred_pattern_batch", "preditor11_adv_plc_tools", "hs_route", "hs_place_and_route", "hs_realize", "hs_prototype", "hs_scenario", "si_interactive_simulation", "sim_lib_manager", "cadstar_scm_variants", "hotstage_verify", "hotstage_verify_plus", "hotstage_verify_elite", "pred_rbase", "pred_2000_s", "pred_2000_hs", "pred_2000_floorplanner", "cadstar_datasheet_pub", "cadstar_shape_trim", "pred_beta", "hs_scenario_plus", "pred_six_layer_enh", "pred_max_layer_enh", "pred_conc_placement", "cadstar_ds1_interface", "viewer_cadif_import", "multi_board", "emc_server", "si_batch_simulation", "emc_front_loaded", "gradian", "dc_analysis", "lightning_spice_gen", "cp_heavy_cluster", "cadstar_rules_by_area", "zx0301", "pred_classic_autorouter", "pred_dragon_autorouter", "pred_dragon_strategy", "pred_dragon_consultant", "pred_intelligent_obj", "zx0501", "dragon_smart_fanout", "dragon_escape_routing", "idem_model_import", "cadstar_migration_link", "zx1601", "cstar_idf_link", "pred_smart_fanout", "cstar_constraint_browser", "pred_netless_router", "zx3201", "analysis_results_viewer", "cadstar_copper", "cadstar_scm_copper" };
int _tmain(int argc, _TCHAR* argv[])
{
LM_CODE_GEN_INIT_NEW(&site_code, ENCRYPTION_SEED1, ENCRYPTION_SEED2,
l_priseedcnt, lm_prikey, lm_prisize);
VENDORCODE *code = &site_code;
LM_HANDLE *lm_job = (LM_HANDLE *)NULL;
if (lc_init((LM_HANDLE *)0, VENDOR_NAME, code, &lm_job))
{
lc_perror(lm_job, "lc_init failed");
printf("1");
exit(-1);
}
char hostid[MAX_CONFIG_LINE] = { 0 };
if (0 != lc_hostid(lm_job, HOSTID_DEFAULT, hostid))
{
lc_get_errno(lm_job);
printf("2");
exit(-1);
}
else
{
if (strlen(hostid) > 0)
{
if (*hostid == '"') memmove(hostid, hostid + 1, MAX_CONFIG_LINE - 1);
for (size_t i = 0; i < strlen(hostid); i++)
{
if ((hostid[i] == 0x20) || (hostid[i] == 0x00))
{
hostid[i] = 0x00;
break;
}
}
}
}
char lic_txt[1024 * 512] = {};
char tmp[512] = { 0 };
for (size_t i = 0; i < FEATURE_COUNT; i++)
{
sprintf(tmp, "INCREMENT %s %s 25.0 1-jan-2100 uncounted HOSTID=%s TS_OK SIGN=0\n", feature[i], VENDOR_NAME, hostid);
strcat(lic_txt, tmp);
}
char *lic_data = NULL, *err = NULL;
if (0 != lc_cryptstr(lm_job, lic_txt, &lic_data, code, LM_CRYPT_FORCE, "", &err))
{
lc_get_errno(lm_job);
printf("3");
exit(-1);
}
else
{
printf(lic_data);
lc_free_mem(lm_job, lic_data);
}
return 0;
}
3.7 附件
Zuken CADSTAR 16 安装相关文件:<>
Zuken CADSTAR 16 裂解文件:<>
FlexLM SDK:FlexLM-SDK-11-9-1 网络链接:https://pan.baidu.com/s/1geULxWR 提取码:pjqq
FlexLM SDK 11.11.1 SIG:https://pan.baidu.com/s/1bpKu10j 提取码:k8na
lmkg3:http://www.woodmann.com/crackz/FLEXlm/Flexvkg3.rar
calcseed:http://www.woodmann.com/crackz/Tutorials/Nolflex3.zip
ECCPatcher-v2015.04.10:引自 网络链接:https://pan.baidu.com/s/1bpKu10j 提取码:k8na
