首页
社区
课程
招聘
[原创]FlexNet 10.8 20位Sign揭秘
发表于: 2009-10-12 21:41 13417

[原创]FlexNet 10.8 20位Sign揭秘

2009-10-12 21:41
13417

软件名称:保密
加密方式:FlexNet 10.8.50
工具:od,ida

本文适用于目前所有的Flexlm7.2以上版本
Flexlm(现改名为FlexNet) 10.8生成的license文件,如果使用了ECC,就是20位。
例如:
FEATURE sample EXAMPLE 10.0 30-jan-2010 uncounted \
        8D3AE17F5FA71E6B86AD VENDOR_STRING=Demo \
        HOSTID=0015287ec8ea ck=16
sign为8D3AE17F5FA71E6B86AD
       ^ ^ ^ ^
请注意看,下面带^号的四个数字DA1F(也就是第2、4、6、8位数)实际上是个时间,具体是什么时间下面具体分析。
剩余的16位数83E75FA71E6B86AD这是真正的Sign。由此产生了2个问题:
1 如何算出16位sign
2 另外4位数是什么,起什么作用。
一、16位sign的计算
其实很简单,先找出该程序的Flexlm版本号,用lmtools.exe可以找出来,或者“lmutil.exe lmver 目标exe.exe”。
然后用ida反编译该exe,用对应版本的sig文件找出所有的flexlm函数。找到_l_string_key函数,这里面是对
伪sign和真实的sign进行比对的地方。btw,请用od调试跟踪,在_l_string_key出设断,具体的我就不举例了。
论坛上应该很多例子,大家自己练练手。如果_l_string_key里面有自定义算法,那要自己分析,再逆向出来。
如果用ida找不到_l_string_key函数,还有一个办法,用od搜索55 8B EC 81 EC DC 01 00 00 53,会找到2个
函数,一个是_l_string_key(一般找到的第一个就是),另一个是_xuA00pGqD7WK_0。
二、另外4位sign,DA1F是什么
这是个starting date(开始日期),也就是你的license的开始日期。我碰到的这个软件(版权问题,名称保密)
里面这个非常重要。我找到了这个算法,请看下面的机器代码:
00781CA4    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]        ;[EBP-C]=0000DA1F
00781CA7    C1F8 09         SAR EAX,9                                ;eax=6d
00781CAA    83E0 7F         AND EAX,7F
00781CAD    8945 F8         MOV DWORD PTR SS:[EBP-8],EAX
00781CB0  |.  837D F8 63    CMP DWORD PTR SS:[EBP-8],63
00781CB4  |.  7E 0C         JLE SHORT Sam.00781CC2
00781CB6  |.  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]
00781CB9  |.  81C1 6C070000 ADD ECX,76C                                ;eax=76c+6d=7d9=2009年
00781CBF  |.  894D F8       MOV DWORD PTR SS:[EBP-8],ECX

00781CC2    8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]        ;[EBP-C]=0000DA1f
00781CC5    C1FA 05         SAR EDX,5
00781CC8    83E2 0F         AND EDX,0F                                ;edx=month-1

00781CE7    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]        ;[EBP-C]=0000DA1f
00781CEA    83E0 1F         AND EAX,1F                                ;=day

是不是很简单?
总结一下:
年=(DA1F >> 9 & 7F )+76c
月=DA1F >> 5 & 0F+1        (加1的原因里Flexlm把1月当成0月,以此类推)
日=DA1F & 1F

因此DA1F就是2009年1月31日。
反过来,当我们要做license的时候,就需要自己设定起始日期,然后转换成Flexlm的日期数,
公式为:日期数=日+(月份-1)*0x20+(年-0x76c)*0x200

收工。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主很强!我也有遇到过这样的问题,今天拜读楼主的帖子才晓得是这么回事啊!
2009-10-13 00:22
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个是SIGN,但是不是ECC,只不过是比license key强一点的license key而已
本质并不是ECC,真正的ECC怎可能出现明文比较?
2009-10-13 11:58
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
4
如果使用了ECC,就是20位。
,haha,这个不敢苟同!

但楼主分析的那个starting date(开始日期),计算是对的,这是很重要的,可以加精了,呵呵。但现在的软件基本都是ecc的,或者至少_l_string_key里面有自定义算法,
2009-10-15 16:22
0
雪    币: 211
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
确实不是ECC,采用这种方法的软件主要是为了考虑兼容问题。
2009-10-22 18:10
0
雪    币: 334
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Mark
2017-7-31 09:47
0
雪    币: 101
活跃值: (743)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
mark
2020-6-29 21:20
0
雪    币: 293
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
碰到了一个这样的软件,但是还是没头绪
2022-4-23 01:08
0
游客
登录 | 注册 方可回帖
返回
//