首页
社区
课程
招聘
[旧帖] [原创]flexlm v9.2的l_n36_buf及l_n36_buff说明 0.00雪花
发表于: 2009-6-11 18:29 5594

[旧帖] [原创]flexlm v9.2的l_n36_buf及l_n36_buff说明 0.00雪花

2009-6-11 18:29
5594

在flexlm v9.2中,程序首先调用lc_new_job--l_n36_buf--lc_init,l_n36_buf实际上是获取vendorid以及SEED0 SEED1 KEY0--KEY3以及其他的初始化数据,当然vendorid是明码,seed和key0--key3是加过密的,将code放入l_xorname执行后key0--key3就恢复成原始状态,然后在l_sg的函数里边把code放入l_n36_buff去执行。
l_n36_buff使用_time函数生成job->mem_ptr2_bytes[12]数据,l_n36_buff恢复key5_order[0]--key5_order[3],key5_uniqx,sig[0]--sig[3],然后对l_n36_buf提取出的SEED0,SEED1进行xor运算,所以为什么在l_string_key程序中看到的seed0和seed1都是变化的,原因就在于mem_ptr2_bytes[12]是用_time函数生成的。如果用idapro手工恢复seed只需要把mem_ptr2_bytes[12]全部设为0或者直接用lmnewgen.c中的key5()程序恢复就可以了。我相信CrackZ没有完全看这2个函数,所以他发表的文章对这2个函数没有详细的说明。
l_getattr.c
void
l_xorname(name, vc)
char *name;  //一般是vendorid
VENDORCODE *vc;
{
#define VENDORMAGIC_V7 0x08BC0EF8
  int i;
  char buf[MAX_VENDOR_NAME + 1];
        /* make sure vendor name is all zeros after the first zero */

        memset(buf, 0, sizeof(buf));
        strcpy(buf, name);

        for (i = 0;i < 4; i++)
                vc->keys[i] &= 0xffffffff; /* 64-bit fix */
        vc->keys[0] ^= buf[0] ^
                (buf[1] << 8) ^
                (buf[2] << 16) ^
                (buf[3] << 24)  ^ VENDORMAGIC_V7;
        vc->keys[1] ^= buf[2] ^
                (buf[5] << 8) ^
                (buf[7] << 16) ^
                (buf[4] << 24)  ^ VENDORMAGIC_V7;
        vc->keys[2] ^= buf[4] ^
                (buf[6] << 8) ^
                (buf[1] << 16) ^
                (buf[6] << 24)  ^ VENDORMAGIC_V7;
        vc->keys[3] ^= buf[5] ^
                (buf[0] << 8) ^
                (buf[2] << 16) ^
                (buf[3] << 24)  ^ VENDORMAGIC_V7;

}

#define MAX_DAEMON_NAME 10                /* Max length of DAEMON string */
#define MAX_VENDOR_NAME MAX_DAEMON_NAME        /* Synomym for MAX_DAEMON_NAME */
lmnewgen.c
static
void
key5(k)
VENDORCODE *k;
{
  unsigned long *keys;
  unsigned long signature;
#define SIGSIZE 4
  char sig[SIGSIZE];
  int i = SIGSIZE-1;
  int len = strlen(vendor_name);
//len直接把vedorname的长度写进去就好,比如vendor=KHJZXe,那么len=6

        sig[0] = sig[1] = sig[2] = sig[3] = 0;

        for (i = 0; i < 10; i++)
        {
                if (sig[i%SIGSIZE] != vname[i%len])
                        sig[i%SIGSIZE] ^= vname[i % len];
        }
        k->data[0] ^=
                (((((long)sig[0] << key5_order[0])|
                    ((long)sig[1] << key5_order[1]) |
                    ((long)sig[2] << key5_order[2]) |
                    ((long)sig[3] << key5_order[3]))
                ^ key5_uniqx
                ^ k->keys[1]
                ^ k->keys[0]) & 0xffffffff);
        k->data[1] ^=
                (((((long)sig[0] << key5_order[0])|
                    ((long)sig[1] << key5_order[1]) |
                    ((long)sig[2] << key5_order[2]) |
                    ((long)sig[3] << key5_order[3]))
                ^ key5_uniqx
                ^ k->keys[1]
                ^ k->keys[0]) & 0xffffffff);
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 324
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没明白你想要说些什么。
2009-6-12 13:14
0
雪    币: 72
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我说的是为什么每回调用l_sg()函数,seed都会变化的根本原理
2009-6-12 16:47
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mdm
4
楼主把标题写明白点哦.看不大懂我是菜鸟一只
2009-6-12 16:52
0
雪    币: 72
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
NoFlexlm,ecc能摆平吗?其实ecc很简单的,有简单的办法就可以把license做出来,他们说的patch都很无奈,从专业的算法上去攻private key简直是天方夜谭,你今天的运算速度高了,加密方很容易把算法的位数加长(这样难度就大到你根本没办法去穷举或者Rho,大步小步等),其实flexlm在ecc上面留了一条路的只是大家不深挖细看了。
2009-6-12 17:00
0
雪    币: 72
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
国外也好,国内也好,很多大的软件公司在开发保护这块要不是没人才,就是开发人员不愿意承担责任,所以才去选择用flexlm这样的垃圾,出了问题去找flexlm去,不是开发的问题,就这样简单。
2009-6-12 17:07
0
雪    币: 72
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
前人说的很清楚,汇编面前了无秘密。
要想在逆向工程上有突破,必须过汇编这关,现在的代码都很大,还的有很强的工具(比如ida,od,ald,trace32)。
如果你对算法有怀疑或者想法的时候,还要自己写程序来试探(当然首选c,c++等)。
flexlm这么多年都这样骗过来了,其实他们很清楚一点,客户就只是想画个老虎在门上吓唬下,汇编面前真的没有密密。
2009-6-12 17:25
0
雪    币: 324
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
貌似楼上的很精通flexlm的ECC,请共享!

谢谢先!
2009-6-12 17:50
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
同学,这个原理都不知道,人家怎么可能写出calseed.exe呢?
至于ECC,那已经不是汇编的问题了
所谓汇编面前无秘密,说的只是你能看到人家的程序
但是ECC并不是怕你看到他的程序,而是在于你能不能以一个合适的资源来逆运算得到原始值
我觉得前人举的那个例子相当有意思:
就是我有两个很大的素数,假设都是32bit的,然后相乘,把结果丢给你做质因数分解
这种就是顺着很容易,逆着很难的事情了
2009-7-23 11:40
0
雪    币: 324
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
说的太精辟了!

2009-7-23 14:24
0
雪    币: 72
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
flexlm ecc,最关键的certicom库没有源代码,只能购看汇编一个一个的重组,先完全弄明白其加密的全部过程后,特别要仔细分析随机数产生器的细节,破解的关键在certicom库的随机数函数是伪随机数,只和私钥和msg关联。
2009-8-27 01:53
0
雪    币: 72
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
如果是去分解想都别想,只能找其中的随机数下手。
2009-8-27 01:58
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
如果说macrovision在加密上有什么漏洞这不奇怪
但是certicom的加密算法中是很难找出漏洞的,尤其是一直存在而不改善的漏洞
人家靠的就是这个混饭吃的,这种事情做不好,公司还不挂掉啊?
2009-8-27 08:57
0
雪    币: 72
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
嘿嘿,如果你去肯certicom库里边的硬骨头,你自然就不这样问了。汇编代码全部重放完,把结构一理,你自然就知道如何把私钥算出来了。里边几乎所有的加密算法都有,陷阱很多,如果没有三两个月的空余时间就别开这个头。
2009-8-28 04:01
0
雪    币: 72
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
说实在的它的大数算法还是基于16位的,讲运算速度就不及目前的32位或者64位,现在还在延续他们做ic的库。
2009-8-28 04:10
0
雪    币: 100
活跃值: (836)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
看样子楼上是高手,分享点经验出来。我们学习一下,谢谢。
2009-8-30 08:19
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我不怀疑甚至部分认同存在漏洞,但是我还是觉得问题在macrovision本身而不再certicom

另外想请问gcxiong兄,你成功做出一个239-bit ECC flexlm的license了吗?
2009-9-1 08:56
0
雪    币: 134
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
certicom的随机过程是有问题。

gcxiong的猜测是对的,不过基于某些原因,现在很少有人有certicom库的SDK,只能从汇编去分析这种带有高度复杂算法的程序。

说难度高,是因为国内的程序员,90%以上都是不研究算法的,所以捅不破这层纸。

另外,flex用了这么多年,ecc创造了不被keygen的记录,以至于几乎所有人都坚信,只能爆破。这也是该产品成功的地方了。

加密只需要在软件的生存周期阻挡大部分破解,就已经成功了。现在发布的加密,3年后有解,已经无所谓了。
2009-10-21 21:42
0
雪    币: 51
活跃值: (2096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
仔细研究整个加密流程,漏洞也不难发现
其实无非就是在生成第二个随机数时(与私钥和MSG相关),其有效空间被大大地降低了
2009-10-23 11:39
0
游客
登录 | 注册 方可回帖
返回
//