• 标 题:制作AUTOcad2002中文网络版的Flexlm license
  • 作 者:laoqian
  • 时 间:2004-11-04,17:29
  • 链 接:http://bbs.pediy.com

软件名称: AUTOcad2002中文网络版
软件类别:地球人都知道 
软件介绍:地球人都知道 Flexlm7.1f加密
破解工具:ollydbg 1.10(FLY) ,w32Dasm_2002828_pll621,UltraEdit8.0,Flexlm7.1f SDK,calcseed,lmkg,lmutil等
 
破解目的:制作无限制使用license文件

通过这篇文章我们将向你介绍如何制作FlexLm的license,当然有些重复的我省略了


第一部分: 废话

这个软件上次爆破了,大家也用的很满意。前些日子想玩玩Flexlm, 就拿它来开刀,我参考了tulipfan[CCG]大虾的《制作Compuware.SoftIce.Driver.Suite.3.0.1.StinkyD的license》,有些还照搬了!


第二部分: 转入正题

破解FlexLm最主要的是找到4样东西.

1. 确定版本号
2. 找vendor
3. 计算ENCRYPTION_SEED
4. 找FEATURE

有了这几个,就可以使用FlexLm SDK(如果你有)做出注册机了.
btw:FlexLm SDK一般是通用兼容的的,比如7.2就可以制作7.1的,甚至有时7.1也可以制作7.2的,关键是参数设置。

1. 确定版本号

* 确定版本号可以通过lmutil.exe(tulipfan[CCG]大虾提供的工具里有)来确定
* 还有一个办法就是用二进制编辑器,推荐使用HexWorkshop,它的查找功能很强,特别是Find All Instances更是我最最常用的.
在查找对话框Type中选择类型Text String,Value中输入"@(#) FLEXlm v",查找,"@(#) FLEXlm v"后面的就是版本号.
*以上是tulipfan[CCG]大虾说的
而我的方法是用Flexlm SDK里的lmtools(在\flexlm\v7.1\i86_n3目录里),运行进入Utilities,点击“Browse”查找你的Flexlm加密的程序主exe,然后“find version”,在下面就会显示你的Flexlm版本,用v7.1版甚至可以看到8.3版以后,是通用的。

最后确定版本号是7.1f,这一步的目的有两个,一是在lmkg.exe中生成Vendor信息时用,二是在写制作FlexLm的license时使用。

2. 先找FEATURE

我没有用IDA,太麻烦了,既然有SDK和前人的经验,我偷个懒。如果你没有像我的条件就只好去找lc_checkout,其实也不难,我记得在我写上篇《cad2002中文版的破解[网络验证及限制用户]》时,跟踪时我就看到它的FEATURE和VENDOR,但是当时不明白,只觉得这个值很特别就记下来了“41100ACD_2002_0F”和"adskflex",跟踪过程我到是忘记了。
我偷懒的办法,还是用Flexlm SDK里的lmtools!打开“Server status”项,点击“Perform status Equiry”,你就会看到服务器端的正版license.dat内容!

101: SERVER main 001234567890     (我的服务器网卡号,我隐去正确的,避免麻烦啊!)
 80: VENDOR adskflex port=8080
150: INCREMENT 41100ACD_2002_0F adskflex 1.000 permanent 100 VENDOR_STRING=(中间有很多参数,省略避免麻烦)SIGN=787878787878(我隐去正确的,避免麻烦,为什么是78 ?) 
     关联信息: 省略
170: (overall file checksum)

看到了吗!

VENDOR adskflex
INCREMENT 41100ACD_2002_0F,这个INCREMENT其实就是FEATURE,后面那个1.000就是Version
permanent 是用户数
VENDOR_STRING=  这个也参与计算验证的
中间有很多参数也参与计算验证的,省略避免麻烦
SIGN=787878787878 我就不说了

如果你没有像我的条件就只好去看别的资料学习,很简单的!

3. 找vendor以及计算seed的关键数据

下面引用自tulipfan[CCG]:
“要找vendor_id就需要找到l_sg这个函数了(至于为什么要找这个函数建议看一些更基础的文章),在这儿我主要是介绍一下如何定位l_sg函数,这个是FlexLm的一个内部使用的函数. lc_init,lc_checkout都会调用它下面是它们的调用关系,括号里面的数字是调用的次数,这个是我从7.2i版的demo.exe上跟踪得到的结果,其他版本可能略有不同.

a. lc_init -> l_init
b. l_init -> l_sg

a. lc_checkout -> l_checkout
b. l_checkout -> lm_start_real(2)
c. lm_start_real -> l_good_lic_key(3)
d. l_good_lic_key -> l_sg(2)

从上面可以看到它们的调用关系. 

我们可以通过l_sg确定vendor_id和ENCRYPTION_SEED,通过lc_checkout可以确定FEATURE

IDA通过FlexLm的sig文件可以确定上面的大部分函数,再通过他们的调用关系,很容易找到其他函数.

制作FlexLm的批处理文件和工具包可去CrackZ去下载.

最后定位到l_sg函数”

*************************
各位看官说了,我们上面已经找到了 VENDOR,还麻烦什么?
嘿嘿,大头在后面呢!

废话少说,我们直接反汇编acad.exe(好大啊,我的机子是P42.8,用了10多分钟),我们查找“7648B98E”,来到下面,好像就这么1,2处。前人的经验就是宝贵啊,我省了很多事!

代码:
* Referenced by a CALL at Addresses: |:00945490   , :0094C1EA   , :0094C7B0   , :0096383C   , :00971159    |:00985C14    | :0094DB50 55                      push ebp    ====先在这个地方下断 :0094DB51 8BEC                    mov ebp, esp :0094DB53 83EC30                  sub esp, 00000030 :0094DB56 C745F08EB94876          mov [ebp-10], 7648B98E   ====这个数在确定l_sg函数上很有用 :0094DB5D C745EC03000000          mov [ebp-14], 00000003 :0094DB64 8B4508                  mov eax, dword ptr [ebp+08] :0094DB67 8B486C                  mov ecx, dword ptr [eax+6C] :0094DB6A 8B91D4010000            mov edx, dword ptr [ecx+000001D4] :0094DB70 81E200800000            and edx, 00008000 :0094DB76 85D2                    test edx, edx :0094DB78 7423                    je 0094DB9D  ====这个跳,第一次肯定会跳的,迷惑了我一下。 :0094DB7A 833DC4DAB50000          cmp dword ptr [00B5DAC4], 00000000 :0094DB81 741A                    je 0094DB9D :0094DB83 8B4510                  mov eax, dword ptr [ebp+10] :0094DB86 50                      push eax :0094DB87 8B4D0C                  mov ecx, dword ptr [ebp+0C] :0094DB8A 51                      push ecx :0094DB8B 8B5508                  mov edx, dword ptr [ebp+08] :0094DB8E 52                      push edx :0094DB8F FF15C4DAB500            call dword ptr [00B5DAC4] ====在这个地方下断,之后就是我们要的! :0094DB95 83C40C                  add esp, 0000000C :0094DB98 E913010000              jmp 0094DCB0

*************************
别急,先做一下准备工作:
*************************
因为我们是网络版,而且以前是正常使用的,就是说我们要去服务器验证正版的license.dat,那我们机子里已经有了LICPATH.LIC文件,这时我们必须断开网络!记得以前调试时没这么作,得到的seed1和seed2不对,不知道什么原因。
但是问题又来了,我们没有了license.dat,这就要我们做一个假的,格式我不说了看雪的书上很清楚了。
我们根据我们上面得到的正版license.dat内容,做一个假的license.dat,放在acad目录里:
***************
FEATURE 41100ACD_2002_0F adskflex 1.000 permanent uncounted \
  VENDOR_STRING="Cracked By laoqian[FCG]" HOSTID=ANY \
  SIGN=787878787878  (怎么又是78 !?)
***************
因为断开网络,所以运行acad会找不到license,我们把它指向我们的假的license.dat,当然是出错退出!

好,工作开始:
下面我启动ollydbg 1.10调入acad.exe,在入口停下,直接下bp 0094DB50,bp 0094DB8F
F9执行,中断在0094DB50。

这时第一次来到:0094DB78 7423  je 0094DB9D时它是要跳过去的,注意要跳就让他跳吧。我开始时强制不跳,倒是能来到0094DB8F,结果跟出了错误的seed1和seed2,而且居然多少次结果还都一样,邪门了。
再次F9,我们又回来中断在0094DB50,F8单步执行,这次不跳了,直到过了:0094DB8F,暂停!
我们在命令栏下如下命令,可以看到:(我纪录了2次的调试结果)

输入 dd [esp+4]
**********
00F886CC  6B736461
ESP+4    > 00F886CC  ASCII "adskflex"

输入 dd [esp+8]
****1****

0012F608  00000004
0012F60C  1731E48D     data[0]
0012F610  061711DA     data[1]
0012F614  A3A37979
0012F618  CC926A64
0012F61C  A1136749
0012F620  F174A41F
0012F624  00000000
********2************
0012F608  00000004
0012F60C  F3D50069     data[0]
0012F610  E2F3F53E     data[1]
0012F614  A3A37979
0012F618  CC926A64
0012F61C  A1136749
0012F620  F174A41F
0012F624  00000000

输入dd [esp]
******1*****

0131B660  00000066
0131B664  0073001F  
0131B668  AEF0D6A0   job+08
0131B66C  A21343D5   job+0c
0131B670  C156EC2E   job+10
0131B674  00000000
********2***********
0131B6C0  00000066
0131B6C4  0073001F  
0131B6C8  4A143244   job+08
0131B6CC  46F7A731   job+0c
0131B6D0  25B208CA   job+10

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

3. 计算ENCRYPTION_SEED

使用工具calcseed.exe,输入上述信息,计算

ENCRYPTION_SEED0 0x39e414xx   =SEED1 为了不给看雪带来麻烦故意给个错的
ENCRYPTION_SEED1 0x28c2e1xx   =SEED2 为了不给看雪带来麻烦故意给个错的


2次结果是一样的

至此,分析已经基本完成,可以使用SDK写license.dat

第三部分: 制作license.dat

我们得到数据如下:

Feathure  41100ACD_2002_0F
Version  1.000
#define ENCRYPTION_SEED1 0x39e414xx 为了不给看雪带来麻烦故意给个错的

#define ENCRYPTION_SEED2 0x28c2e1xx 为了不给看雪带来麻烦故意给个错的

VENDOR adskflex

使用lmkg.exe,选择version 7.0,在vendor_id输入"adskflex"得到:
/* Version 7 keys */
#define VENDOR_KEY1 0x2bb24a5b
#define VENDOR_KEY2 0x9d6d840b
#define VENDOR_KEY3 0x0f9b9894
#define VENDOR_KEY4 0x97fc2c5b
#define VENDOR_KEY5 0x7140af80
#define CRO_KEY1 0x2f924853
#define CRO_KEY2 0xdb4fe68d

#define VENDOR_NAME "adskflex"

按照上面的信息,编辑\flexlm\v7.1\machind\lm_code.h
**********************************
代码:
#ifndef LM_CODE_H #define LM_CODE_H #include "lm_cro.h" /*  *      Pick an LM_STRENGTH.  *  *              If you're not using CRO public-key, then leave this as  *              LM_STRENGTH_DEFAULT.  *              If you're upgrading from pre-v7.1, and want no changes,  *              set this to LM_STRENGTH_LICENSE_KEY.  */ #define LM_STRENGTH LM_STRENGTH_DEFAULT   /*注意12位的SIGN要这个参数 */ /*  * LM_STRENGTH Options are  *      LM_STRENGTH_DEFAULT             Public key protection unused  *                                      Use SIGN= attribute  *                                      sign length = 12  * Public key:  *       LM_STRENGTH_113BIT, LOW        sign length = 58 chars  *       LM_STRENGTH_163BIT, MEDIUM     sign length = 84 chars  *       LM_STRENGTH_239BIT, HIGH       sign length = 120 chars  *  * Use pre-v7.1, non-CRO  *       LM_STRENGTH_LICENSE_KEY        Use pre-v7.1 license-keys.  *                                      Doesn't use SIGN= attribute.  */ /*  *      Vendor's private seeds, -- replace with 32-bit numbers that  *                                 you make up.  */ #define ENCRYPTION_SEED1 0x39e414xx   /*我们找到的SEED1 */ #define ENCRYPTION_SEED2 0x28c2e1xx   /*我们找到的SEED2 */ #define ENCRYPTION_SEED3 0x22222222     /*没用,不变 */ #define ENCRYPTION_SEED4 0x32323232   /*没用,不变 */ /*  *      FLEXlm vendor keys -- enter as received from Globetrotter.  *      Changing these keys has NO impact on license files (unlike  *      the ENCRYPTION_SEEDs).  */ /*-  *      Generate these keys with: lmvkey -v demo -d (+3 months) -p ALL -c DEMO  *              (Use a date approx 3 months out)  */ #define VENDOR_KEY1 0x2bb24a5b   /*我们算出的 */ #define VENDOR_KEY2 0x9d6d840b   /*我们算出的 */ #define VENDOR_KEY3 0x0f9b9894   /*我们算出的 */ #define VENDOR_KEY4 0x97fc2c5b   /*我们算出的 */ #define VENDOR_KEY5 0x7140af80   /*我们算出的 */ #define CRO_KEY1 0x2f924853        /* Used to enable CRO -- turned off by default */ #define CRO_KEY2 0xdb4fe68d        /* Be sure to reset LM_STRENGTH above if                                CRO_KEY is non-zero */ /*  *      FLEXlm vendor name.  Leave as "demo" if evaluating FLEXlm.  Otherwise  *                           set to your vendor daemon name.  */ #define VENDOR_NAME "adskflex"  /*我们找到的VENDOR */ /*  *      Older customers with newer versions may want to set  *      behavior defaults to previous version, though this is usually  *      discouraged.  Behaviors can be changed individually using  *      LM_A_xxx in the flexible API.  New customers should use the  *      current default, as set below  *  *      Valid settings include:  *              LM_BEHAVIOR_V2, _V3, _V4, _V5, _V5_1, _V6, _V7, _V7_1  */ #define LM_VER_BEHAVIOR LM_BEHAVIOR_V7_1 /*这里因为是FLexLm版本号是7.1f */ #endif /* LM_CODE_H */

**************************************
编辑好了,存盘,OK

打开\flexlm\v7.1\i86_n3\genlic.exe开始我们的制作吧


1.basic窗口内填好Feathure,选择permanent打勾,选择run anywhere
2.进入advance窗口,version内填FEATURE的Version就是1.000,Vendor info填上Cracked by laoqian[FCG]


3.其余不改了,回到basic窗口,点击make license,然后save你的license.dat文件
大功告成!
你可以制作各种限制条件的license.dat,随你便了,我做的是无限制!


第四部分: 感谢(又照搬了tulipfan[CCG])

CrackZ
Nolan Blender
Oleh Yuschuk
tulipfan[CCG]
allenzhu[CCG]
FCG的同仁
和所有看学论坛上的朋友们!

第五部分 ...
tulipfan[CCG]介绍了直接用VC编译lmcrypt.c的方法,我试了多次总是不成功,真希望他老人家有空详细说说。
另外,我看了cad2004中文网络版是8.3的,他的在确定l_sg函数上很有用地那个数不同了,也有我找到了,只是我们没有关于8.3的计算工具calcseed.exe(是否一样呢),谁有啊?