【软件名称】LabView 7.1
【应用平台】Win2000 SP4
【作者邮箱】chubing6143@sina.com
【使用工具】OllyDbg1.10,FlexLM 7.2 SDK
【软件限制】FlexLM8.4a
【软件简介】NI的产品,做测试和虚拟仪器的大家可能都知道了。 该软件其实在安装时提供的有不限制的Licence文件,但是作为练手,我将其删除掉了(这样我不用担心任何后果了)。

1. 确定FlexLm版本号 BEHAVIOR Version
* 用二进制编辑器,推荐使用HexWorkshop打开LabView.exe,它的查找功能很强,特别是Find All Instances更是我最最常用的.
在查找对话框Type中选择类型Text String,Value中输入"@(#) FLEXlm v",查找,"@(#) FLEXlm v"后面的就是版本号.
【以上是tulipfan[CCG]大虾说的】
@(#) FLEXlm v8.4a (lmgr.lib)可以知道 FlexLm版本号 BEHAVIOR Version是8.4a

2. 找FEATURE
目的:确定FEATURE和产品版本号(不是FLEXLM的版本号)
方法:在字符串参考中查找'lm_ckout.c';总共也就出现几次,比较容易确定。

据newsearch讲“一般是挨着的两个才是;另外有四个挨着的不是。”
根据这一原则,在OD中BP C9EBFC,然后F9运行,
程序被中断下来,此时察看堆栈情况如下所示:
0012E3E8    01B34178  |Arg1 = 01B34178
0012E3EC    00EE25E4  |Arg2 = 00EE25E4 ASCII "lm_ckout.c"
0012E3F0    00000093  \Arg3 = 00000093
0012E3F4    00C99EF4  LabVIEW.00C99EF4
0012E3F8    01B34178
0012E3FC   /0012E46C
0012E400   |00C81BAD  返回到 LabVIEW.00C81BAD 来自 LabVIEW.00C9EBD0
0012E404   |01B34178
0012E408   |018BF908  ASCII "LabVIEW_LabVIEW"
0012E40C   |018BEF28  ASCII "7.0100"
可以确定
FEATURE版本 v7.0100
FEATURE ID,LABVIEW _LABVIEW

3. 找vendor以及计算seed的关键数据
在反汇编以后,搜索“87654321”,在前面设断点
00C9393C  |.  8D8D 80FDFFFF LEA ECX,DWORD PTR SS:[EBP-280]
00C93942  |.  51            PUSH ECX                                 ; /Arg3
00C93943  |.  8B95 6CFDFFFF MOV EDX,DWORD PTR SS:[EBP-294]           ; ebp-294地址是以后要用的!
00C93949  |.  81C2 0C030000 ADD EDX,30C                              ; 计算得到VENDOR地址
00C9394F  |.  52            PUSH EDX                                 ; VENDOR入栈!(ASCII "nilm")
00C93950  |.  8B85 6CFDFFFF MOV EAX,DWORD PTR SS:[EBP-294]           ; |
00C93956  |.  50            PUSH EAX                                 ; |Arg1
00C93957  |.  E8 07E80000   CALL LabVIEW.00CA2163                    ; 这个call就是著名的所谓7648B98E标志call!后面要进去的
00C9395C  |.  83C4 0C       ADD ESP,0C
00C9395F  |.  81BD 84FDFFFF>CMP DWORD PTR SS:[EBP-27C],87654321
00C93969  |.  74 0C         JE SHORT LabVIEW.00C93977
00C9396B  |.  81BD 88FDFFFF>CMP DWORD PTR SS:[EBP-278],12345678

我们在00C9393C停下d EBP-280
0012E244  00000004   ...
0012E248  7E58C8CF  先X~
0012E24C  9B7AB0C4  陌z
0012E250  D7B636AA  ?蹲
0012E254  C9A6F893  ?ι
0012E258  B1CDE046  F嗤
0012E25C  A5254D00  .M%
0012E260  00040008   . .
0012E264  38300061  a.08
0012E268  0000332E  .3..

我们得到BEHAVIOR Version  V8.3a
VENDOR为"nilm"

根据需要我们做一个假的LabVIEW_LabVIEW_070100.lic,放在C:\Program Files\National Instruments\Shared\License Manager\Licenses目录里下:
FEATURE LabVIEW_PKG nilm 7.0100 permanent uncounted VENDOR_STRING="Cracked \
  by laowanghai" HOSTID=ANY SIGN=123456789012
然后重新加载程序,根据前面寻找Vendor的过程可以知道CALL LabVIEW.00CA2163这个call就是著名的所谓7648B98E标志call!因此BP  00CA2163,F9运行
00CA2163  /$  55            PUSH EBP
00CA2164  |.  8BEC          MOV EBP,ESP
00CA2166  |.  83EC 24       SUB ESP,24
00CA2169  |.  C745 F4 B8307>MOV DWORD PTR SS:[EBP-C],6F7330B8                     ; ====就是这个数在确定l_sg函数上很有用
00CA2170  |.  C745 F0 03000>MOV DWORD PTR SS:[EBP-10],3
00CA2177  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00CA217A  |.  8B48 6C       MOV ECX,DWORD PTR DS:[EAX+6C]
00CA217D  |.  8B91 A8030000 MOV EDX,DWORD PTR DS:[ECX+3A8]
00CA2183  |.  81E2 00800000 AND EDX,8000
00CA2189  |.  85D2          TEST EDX,EDX
00CA218B  |.  74 23         JE SHORT LabVIEW.00CA21B0                               ; ====这个跳第一次肯定会跳的!第二次再来!
00CA218D  |.  833D 70EBF200>CMP DWORD PTR DS:[F2EB70],0
00CA2194  |.  74 1A         JE SHORT LabVIEW.00CA21B0
00CA2196  |.  8B45 10       MOV EAX,DWORD PTR SS:[EBP+10]
00CA2199  |.  50            PUSH EAX
00CA219A  |.  8B4D 0C       MOV ECX,DWORD PTR SS:[EBP+C]
00CA219D  |.  51            PUSH ECX
00CA219E  |.  8B55 08       MOV EDX,DWORD PTR SS:[EBP+8]
00CA21A1  |.  52            PUSH EDX
00CA21A2  |.  FF15 70EBF200 CALL DWORD PTR DS:[F2EB70]                           ; ====在这个地方下断,F8之后就是我们要的!
00CA21A8  |.  83C4 0C       ADD ESP,0C
00CA21AB  |.  E9 13010000   JMP LabVIEW.00CA22C3

F9执行,中断在00CA2163。
这时第一次来到00CA218B时它是要跳过去的,注意要跳就让他跳吧。
若开始第一次时强制不跳,倒是能来到00CA21A2,结果跟出了错误的seed1和seed2,而且多少次结果还都一样。
再次F9,我们又回来中断在00CA2163,F8单步执行,这次不跳了,直到过了00CA21A2,暂停!
我们在命令栏下如下命令,可以看到:(可以纪录了多次的调试结果)
输入 d [esp+4]  在内存窗口看到,【长型——ASCII 转存】
01B24484  6D6C696E  nilm

输入 d [esp+8] 在内存窗口看到,【长型——ASCII 转存】
0012DCD0  00000004   ...
0012DCD4  8216F92E  .?   data[0]
0012DCD8  67348125  %?g  data[1]
0012DCDC  B266513C  <Qf
0012DCE0  C11AF607  ?
0012DCE4  B918EEBE  绢 
0012DCE8  C0F52DF8  ?趵
0012DCEC  00040008   . .
0012DCF0  38300061  a.08
0012DCF4  0000332E  .3..

输入d [esp] 【长型——ASCII 转存】
01B24178  00000066  f...
01B2417C  002100E7  ?!.
01B24180  3C0DCF4B  K?<   job+08
01B24184  00B12ACE  ??    job+0c
01B24188  00D40000  ..?   job+10

这些数据就是我们计算seed1和seed2的关键!

4. 计算ENCRYPTION_SEED
使用工具calcseed.exe,输入data[0],data[1],job+08,job+0c,job+10,VENDORname为 "nilm"上述信息,计算
ENCRYPTION_SEED1 0xa81b372e
ENCRYPTION_SEED2 0x4d394f25

至此,分析已经基本完成,可以使用SDK写license文件了。

5制作license.dat
我们得到数据如下:
FEATURE版本 v7.01
FEATURE id,LABVIEW_LABVIEW
vendor: nilm
ENCRYPTION_SEED1 0xa81b372e
ENCRYPTION_SEED2 0x4d394f25
BEHAVIOR Version  V8.3a

使用lmkg.exe,选择version 7.0,在vendor_id输入"nilm"得到:
/* Version 7 keys */
#define VENDOR_KEY1 0x6b55b25a
#define VENDOR_KEY2 0xe74d99f2
#define VENDOR_KEY3 0xaa7e7ee6
#define VENDOR_KEY4 0x93a6eec9
#define VENDOR_KEY5 0x1821d5fe
#define CRO_KEY1 0x6f75b052
#define CRO_KEY2 0xa16ffb74

#define VENDOR_NAME "nilm"
然后编辑lm_code.h如下所示:

#ifndef LM_CODE_H
#define LM_CODE_H
#include "lm_cro.h"
#define LM_STRENGTH LM_STRENGTH_DEFAULT
#define ENCRYPTION_SEED1 0xa81b372e//计算出来的
#define ENCRYPTION_SEED2 0x4d394f25//计算出来的
#define ENCRYPTION_SEED3 0x11223344 
#define ENCRYPTION_SEED4 0x55667788 
#define VENDOR_KEY1 0x6b55b25a//计算出来的
#define VENDOR_KEY2 0xe74d99f2//计算出来的
#define VENDOR_KEY3 0xaa7e7ee6//计算出来的
#define VENDOR_KEY4 0x93a6eec9//计算出来的
#define VENDOR_KEY5 0x1821d5fe//计算出来的
#define CRO_KEY1 0x6f75b052//计算出来的
#define CRO_KEY2 0xa16ffb74//计算出来的
#define VENDOR_NAME "nilm"//找到的哦
#define LM_VER_BEHAVIOR LM_BEHAVIOR_V7_1
#endif /* LM_CODE_H */

打开\flexlm\v7.2\i86_n3\genlic.exe开始我们的制作吧
1.basic窗口内填好Feathure “LABVIEW_LABVIEW”,选择permanent打勾,选择run anywhere
2.进入advance窗口,version内填FEATURE的Version就是7.010,Vendor info填上Cracked by laowanghai
3.其余不改了,回到basic窗口,点击make license,然后save你的license文件
大功告成!
生成的如下:

FEATURE LABVIEW_LABVIEW nilm 7.010 permanent uncounted \
  VENDOR_STRING="cracked by laowanghai" HOSTID=ANY \
  SIGN=80A999623E02

6明码比较(laoqian文章中的方法)
通过搜索“66D8B337”可以定位到下面的代码:
00CA5A71   |.  A2 290DF300            mov byte ptr ds:[F30D29],al
00CA5A76   |.  C605 2F0DF300 00       mov byte ptr ds:[F30D2F],0
00CA5A7D   |.  8A15 2F0DF300          mov dl,byte ptr ds:[F30D2F]
00CA5A83   |.  8815 2E0DF300          mov byte ptr ds:[F30D2E],dl
00CA5A89   |>  C785 74FEFFFF 08000000 mov dword ptr ss:[ebp-18C],8
00CA5A93   |.  817D 18 37B3D866       cmp dword ptr ss:[ebp+18],66D8B337
00CA5A9A   |.  75 0F                  jnz short LabVIEW.00CA5AAB
在CA5A9A处下断点,运行到此处时,d 0xf30d29
可以看到:
00F30D25  80000000  ...€
00F30D29  3E6299A9  b>
00F30D2D  A2000002   .
因此正确的SIGN就是80A999623E02 。