软件名称:保密
加密方式: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
收工。
- 标 题:FlexNet 10.8 20位Sign揭秘
- 作 者:orchid88
- 时 间:2009-10-12 21:41
- 链 接:http://bbs.pediy.com/showthread.php?t=99373