关于 Flexlm ECC的通用修正方法主要包括: 1.打补丁强制返回正确校验 2.修改1-2处flag位使用12位sign进行校验 3.pubkey 替换。最后一种方法仅改变程序原始数据,而不改变代码,具有通用性。论坛关于pubkey替换的相关讨论相对较少。
关于pubkey几个常见问题的说明
1、可以PJ xxx, yyy软件么?
A:只要是相同编译器(linux下一般都是gcc吧?)编译出来的Flexln的代码,都有相同的代码特征,可以查到pubkey的位置,获取pubkey并进行替换。Win32下编译器可能有所不同,正在弄。一句话,理论上都可以替换掉pubkey。
2、详细步骤如何?
给一般玩家:
1、在linux下运行"pubkey -d cdslmd -y",WINDOWS下是"pubkey.exe -d cdslmd -y"(需要进命令控制台,就是DOS窗口)。
2、在windows下运行"lmcrypt_kkk -i xxx.dat -o yyy.dat",xxx.dat是原来的license文件,包括需要的feature在里面,yyy.dat是重新生成的license文件
3、复制yyy.dat到linux下,作为license使用。
给喜欢自己动手的人:
可以自己制作lmcrypt,需要SEED1、SEED2和私钥,SEED1、SEED2自己找,做的时候,用Flexlm sdk,我用的是11.4版本。私钥存放在lmprikey.h文件中,最后一个私钥就是(239位那个)。值得注意的是,并不是所有软件都只是ECC保护的,有的软件还有VENDOR_STRING保护,这个还需要额外研究,或使用别的PJ来辅助完成。
3、报告Warning: diff pubkey.....
A:如果是运行pubkey -d xxx之后出现的,意味着该目录下有的软件使用了不同的pubkey(对同一软件而言基本不可能,除非使用不同的vendor daemon),或者pubkey这个软件无法侦测到该文件的正确的pubkey,需要单独处理(自己破解,例如pubkey_verify破解等)。
如果pubkey -d xxx没问题,而pubkey -d xxx -y出现warning,则可以直接忽视。这个主要是在linux下,有符号链接这个玩意,一个文件有多个文件名,所以patch完一次还可能patch第二次。我的工具会在出现Warning的时候跳过去,不再替换,所以应该没问题的。
4、是否需要重新安装软件?
A:强烈建议重新安装。因为你以前可能用了别的破解,这些破解有可能修改了程序代码,导致我的pubkey替换被屏蔽掉(没作用)或者异常。
5、是否可以恢复(uninstall patch)?
A:目前没做这个功能。估计没必要,反正你也不知道正确的公私钥对,修不修改没意义,暴力破解照样通行,哈哈
6、我没有原始输入用的license?
A:自己写一个,我的软件包里面有例子,自己修改修改。把需要的Feature自己加上去,注意SIGN或者SIGN2要写120字符长的那种,不能写12字符长的SIGN。
7、自己想搞lmcrypt的如何做?
1、修改lm_code.h,我的lm_code.h内容如下:
#define LM_SEED1 0x11111111
#define LM_SEED2 0x22222222
#define LM_SEED3 0x33333333
#define LM_STRENGTH LM_STRENGTH_239BIT
#define ENCRYPTION_SEED1 0x90A843B1 
#define ENCRYPTION_SEED2 0x00000000 
#define VENDOR_KEY1 0xc5c185ad 
#define VENDOR_KEY2 0x441a00c2
#define VENDOR_KEY3 0xe52222bf
#define VENDOR_KEY4 0xa28926c3
#define VENDOR_KEY5 0x617343c9
#define TRL_KEY1 0x8e11a8a9
#define TRL_KEY2 0xf9176408
#define VENDOR_NAME "xxxx"
//#define LM_SIGN_LEVEL LM_SIGN2 //有些软件需要SIGN2,有些不需要。
2、修改makefile,把VENDORNAME修改为自己需要的xxx
3、build(你先要安装VC)
4、看看lmprikey.h,是否是下列内容?
static unsigned char lm_prikey[1][3][40] = {{{0x0, 0xb2, 0x45, 0x2c, 0xbc, 0x7e, 0x72, 0xc1, 0x3a, 0x39, 0x5e, 0x67, 0x25, 0xce, 0xd9},
{0x2, 0x1c, 0x8f, 0xa2, 0xe4, 0xb6, 0x4f, 0x7a, 0x2c, 0xd2, 0x6, 0x81, 0xb5, 0xd8, 0xf9, 0xf1, 0x81, 0x6, 0x4a, 0x8e, 0x17},
{0x3, 0xa0, 0x58, 0x89, 0xd2, 0x30, 0x22, 0xd8, 0xca, 0x5e, 0xac, 0x59, 0x33, 0xb3, 0x69, 0xdc, 0x30, 0x9b, 0xb6, 0x8d, 0x24, 0x56, 0x60, 0x23, 0xf0, 0x8c, 0x11, 0xb8, 0xc2, 0xba}}};
static unsigned int lm_prisize[4][3] = {{0xf, 0x15, 0x1e}
特别是最长最后那个key,一定要是上面那个值
5、用生成的lmcrypt测试一下license,看看对不对?不对的最大可能就是#define LM_SIGN_LEVEL LM_SIGN2,注释掉试试,重新生成lmcrypt试试看。
6、如果有VENDOR_STRING保护,需要自己破解或者借助别人的PJ,一般VENDOR_STRING保护除了SIGN字段外的其他字段,所以可以先用别人的PJ生成正确的VENDOR_STRING,再用自己的lmcrypt对同一个文件生成正确的SIGN。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)