软件名称:保密
加密方式: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

收工。