【软件名称】利用Flex 10.1 SDK开发某软件注册机。
【应用平台】WinXP SP4
【作者邮箱】chubing6143@sina.com
【使用工具】OllyDbg1.10,FlexLM 10.1SDK
【软件限制】FlexLM

  好长时间不破解了,也好长时间没有到看雪来了。
  最近因为需要帮人解决一个软件远程桌面调用的问题,该软件我以前用Flexlm 7.2SDK写的注册机,但是由于FlexLM低版本的SDK不支持远程桌面使用方式,即License文件中不支持TS_OK,因此,需要利用高版本的SDK重新开发NI通用注册机。因此,我就又操起了这一行了,好长时间感觉没有投入破解了,还是怀念当初学习破解的过程,当然由于自己工作的原因,没有坚持下来,因此,连二把刀都不算。写这篇文章只是为了给我这样的初学者提供帮助。考虑到论坛的需要,就不公布是什么软件了。为了给初学者尽可能多的帮助,我将过程记录的尽可能详细,高手飘过。

一、首先安装FLEXnetLicensing.exe(10.1的SDK)。
二、利用CrackZ上下载的Flexvkg3(lmkg.exe)自动生成Vendor为****(怎样找Vendor,论坛上介绍的太多了,不叙述),Version为10的Key如下:
/* Version 10 keys */
#define VENDOR_KEY1 0x0218a4**
#define VENDOR_KEY2 0xa52467**
#define VENDOR_KEY3 0x185a43**
#define VENDOR_KEY4 0xfa721f**
#define VENDOR_KEY5 0x011a5c**
#define TRL_KEY1 0x31f528**
#define TRL_KEY2 0x4cc898**

#define VENDOR_NAME "****"

然后编辑C:\Program Files\flexlm\v10.1\machind\lm_code.h文件,将其中的VENDOR_KEY、VENDOR_NAME与TRL_KEY替换成前面生成的宏定义。

三、将C:\Program Files\flexlm\v10.1\i86_n3\makefile文件中VENDORNAME = demo替换为VENDORNAME = nilm
然后运行cmd,进入命令行模式下C:\Program Files\flexlm\v10.1\i86_n3\lmrand1 seed
会随机生成LM_SEED1、LM_SEED2、LM_SEED3的值,并生成lmseed.dat文件,将该文件中的LM_SEED值粘贴到lm_code.h中去。
四、考虑到该软件加密是从7.1升级过来的,因此在lm_code.h中粘贴下面的代码:
#define LM_SIGN_LEVEL 1
 
#define ENCRYPTION_SEED1 0x**1b372e(需要对软件跟踪进行查找,为了安全起见,我隐去了)
#define ENCRYPTION_SEED2 0x**394f25(需要对软件跟踪进行查找,为了安全起见,我隐去了)


#define ENCRYPTION_SEED3 0x12315688 //任意值了
#define ENCRYPTION_SEED4 0x12315688 //任意值了
并将LM_STRENGTH定义为LM_STRENGTH_LICENSE_KEY
#define LM_STRENGTH LM_STRENGTH_LICENSE_KEY

五、此时命令行模式下C:\Program Files\flexlm\v10.1\i86_n3\build.bat会自动生成lmcrypt.exe,该文件就可以将license文件自动完成加密的过程。
然而为了写注册机,还得进行下面的工作。

六、命令行模式下C:\Program Files\flexlm\v10.1\i86_n3\build DLL
会自动生成lmgr10.dll与lmgr10.lib,这两个文件是非常有用的,写注册机时需要链接这两个文件,写注册机时需要SDK中的以及build生成的以下文件:
lm_attr.h、lm_code2.h、lm_code.h、lm_trl.h、lmclient.h、lmhostid.h、lmprikey.h、lmseeds.h、lmgr10.lib、lmgr10.dll。
七、为了在VC工程中能够编译通过,首先将lmprikey.h中的
lm_extern int *l_prikey_sign(void) = 0;
修改为:
lm_extern int (*l_prikey_sign)(void) = 0;
然后在Project Setting中添加PC的宏定义。
写解密的关键代码函数如下:

LM_CODE_GEN_INIT(&site_code);//:初始化Flex变量,主要是lm_code.h中的变量
if (lc_init((LM_HANDLE *)0, VENDOR_NAME, &site_code, &lm_job))
{
  lc_perror(lm_job, "lc_init failed");
  exit(-1);
}
if (lc_cryptstr(lm_job, fileCrypt, &ofile_str, /*&v*/&site_code, forceit, "", 
      &err))//laowang :关键函数将License文件字符串内容加密求得正确的License文件
{
  MessageBox(NULL,"lc_cryptstr 运行错误,请联系作者!",filePath,MB_OK);  
}

到此就完成了,如果有我等初学者对此感兴趣的,我可以考虑将基本的注册机代码发上来。