制作Flexlm license总结.docx

上传人:b****4 文档编号:12144482 上传时间:2023-04-17 格式:DOCX 页数:25 大小:29.15KB
下载 相关 举报
制作Flexlm license总结.docx_第1页
第1页 / 共25页
制作Flexlm license总结.docx_第2页
第2页 / 共25页
制作Flexlm license总结.docx_第3页
第3页 / 共25页
制作Flexlm license总结.docx_第4页
第4页 / 共25页
制作Flexlm license总结.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

制作Flexlm license总结.docx

《制作Flexlm license总结.docx》由会员分享,可在线阅读,更多相关《制作Flexlm license总结.docx(25页珍藏版)》请在冰豆网上搜索。

制作Flexlm license总结.docx

制作Flexlmlicense总结

标题:

【原创】制作Flexlmlicense总结!

作者:

laoqian

时间:

2005-12-15,17:

45:

50

链接:

作者:

  laoqian [FCG]

时 间:

2005-12-15 

软件名称:

 Zendenc (FLEXlm 7.1d)

软件类别:

Nolan Blender提供的经典例子 

软件介绍:

 FLEXlm 7.1d加密

破解工具:

ollydbg 1.10(FLY修改) ,w32Dasm_2002828_pll621,UltraEdit10.0,Flexlm7.2 SDK,calcseed,lmkg7,lmcryptgui,flexlm9.2 

sdk的源码等

 

破解目的:

制作无限制使用license文件

通过这篇文章我们将向你介绍如何制作FlexLm的license,并总结经验

第一部分:

 废话

Zendenc这个软件是Nolan Blender提供的经典例题,crackZ或网上有下载和分析文章。

玩了几个Flexlm, 想总结一下, 就拿它来开刀方便!

文是关于7.x的,但有部分适用于8.x和9.x,甚至10.x。

第二部分:

 转入正题

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

1. 确定版本号

2. 找vendor

3. 计算ENCRYPTION_SEED

4. 找FEATURE

有了这几个,就可以使用FlexLm SDK(如果你有)或工具做出注册机了.

btw:

FlexLm SDK一般是通用兼容的的,比如7.2就可以制作7.1的,甚至有时7.1也可以制作7.2的,关键是参数设置。

1. 确定FlexLm版本号 BEHAVIOR Version

方法一:

* 用二进制编辑器,推荐使用HexWorkshop(我用UltraEdit10.0,呵呵),它的查找功能很强,特别是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或dll,

然后“find version”,在下面就会显示你的Flexlm版本,用v7.1版甚至可以看到8.3版以后,是通用的。

有个别程序可能此法不行!

方法三:

在反汇编以后,搜索“87654321”,在前面设断点

在Flexlm SDK里lm_code.h文件里你可以看到一下几句:

代码:

 *      Vendor's private seeds, -- replace with 32-bit numbers that

 *                                 you make up.

 */

#define ENCRYPTION_SEED1 0x87654321

#define ENCRYPTION_SEED2 0x12345678

/*

 *      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)

 */

这说明demo的SEED1=0x87654321,SEED2=0x12345678

对应Zendenc里是:

代码:

0043391D    E8 184B0400       call 

00433922    83C4 0C           add esp,0C

00433925    8D8D 40FFFFFF     lea ecx,dword ptr ss:

[ebp-C0]  ;我们可以在这里设断点!

0043392B    51                push ecx

0043392C    8B95 30FFFFFF     mov edx,dword ptr ss:

[ebp-D0]  ;ebp-D0地址是以后要用的!

00433932    81C2 4C010000     add edx,14C                    ;计算得到VENDOR地址

00433938    52                push edx                       ;VENDOR入栈!

(ASCII "zend")

00433939    8B85 30FFFFFF     mov eax,dword ptr ss:

[ebp-D0]

0043393F    50                push eax

00433940    E8 95560000       call zendenc.00438FDA   ;这个call就是著名的所谓7648B98E标志call!

后面要进去的!

00433945    83C4 0C           add esp,0C

00433948    81BD 44FFFFFF 214>cmp dword ptr ss:

[ebp-BC],87654321  ;此处比较是否是demo的seed1,当然在此seed1已被加密!

00433952    74 0C             je short zendenc.00433960           ;此处比较是否是demo的seed2,当然在此seed2已被加密!

00433954    81BD 48FFFFFF 785>cmp dword ptr ss:

[ebp-B8],12345678

0043395E    75 5D             jnz short zendenc.004339BD

00433960    8B8D 30FFFFFF     mov ecx,dword ptr ss:

[ebp-D0]

00433966    8379 14 00        cmp dword ptr ds:

[ecx+14],0

0043396A    74 17             je short zendenc.00433983

我们在断点停下d ebp-c0

代码:

0012D404  00000004  _...

0012D408  E0AAA4A0  _お?

  此seed1已被加密

0012D40C  C0121579  y__    此seed2已被加密!

0012D410  3F9F6A79  yj?

    此VENDOR_KEY1已被加密!

0012D414  25DC750E  

u?

    此VENDOR_KEY2已被加密!

0012D418  B8B046C5  牌案

0012D41C  0B2EAC4E  N?

......向下拉看

0012D4A8  00000000  ....

0012D4AC  00010007  _._.

0012D4B0  37300064  d.07   此处显示7.1d

0012D4B4  0000312E  .1..   7.1

0012D4B8  00000000  ....

这之后,等我们第一次走过著名的所谓7648B98E标志call,“00433940   call zendenc.00438FDA”以后,会发现被加密seed又改变了,其实

就是简单的xor,可是这个xor我们不得而知!

我们得到BEHAVIOR Version  V7.1d

btw:

87654321此处,在6.x版时,可以得到真seed,

参考文章“Ansoft Serenade v8.5 - Tutorial”

代码:

I also remembered that the checks for the default seed codes (shipped with the SDK) was a good place to fish the correct 

seeds, a simple disassembly search for '87654321' finds this code :

-

:

00429C4C CMP D, [EBP-34], 87654321 <-- Check for encryption_seed1.

:

00429C53 JZ 00429C5E <-- Jump to Error.

:

00429C55 CMP D, [EBP-30], 12345678 <-- Check for encryption_seed2.

:

00429C5C JNZ 00429C85 <-- Good jump.

:

00429C5E MOV EDI, FFFFFFA5 <-- Error Code (-91).

Routines inside Ser85.exe detect bpx type breakpoints and patching of key files, the checking code starts at 0040EFD3, here 

you'll see the names of the files that are checked and the rather obvious 'PUSH 7' instructions which produce a cryptic error 

message box asking you to call Ansoft for assistance. The files verified should give us a good idea where to look for other 

parts of the protection, Ansoft's developers evidently tried (as is good policy) to identify possible points of attack. Using 

bpmb style breakpoints we can quickly recover (what we think are valid) encryption_seed1 (0x7CB2B081) & encryption_seed2 

(0x2DFE22B6).

.....

最后用方法一、二可以确定Zendenc版本号是7.1d,这一步的目的有两个,一是在lmkg.exe中生成Vendor信息时用,二是在使用FlexLm SDK制作

FlexLm的license时使用。

2. 先找FEATURE

方法一:

不用IDA,太麻烦了,既然有SDK和前人的经验,我偷个懒。

我偷懒的办法,还是用安装Flexlm SDK里的lmtools!

打开“Server status”项,

点击“Perform status Equiry”,你就会看到服务器端的正版license.dat内容!

前提是你要配置好,而且有正版程序和license,废话!

比如显示如下:

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 我就不说了

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

btw:

如果你的选项得当,现在你甚至就可以在客户端控制license服务器,你可以关闭license服务――慎用!

,我曾在几次无意的操作中

关闭了license服务,结果单位的所有机器cad罢工,管理员还不知道怎么回事,只好重启服务器,那几天可忙坏了她!

这是flexlm的一个bug吧

方法二:

用IDA+相应版本的sig+sdk,找到_lc_checkout函数,设断点,你会找到FEATURE。

我采用的是7.2得sig,显示是_lp_checkout

代码:

00478043    68 00400000       push 4000

00478048    51                push ecx

00478049    6A 00             push 0

0047804B    6A 01             push 1

0047804D    68 ECDB4900       push zendenc.0049DBEC       ;FEATURE版本 ASCII "1.0"

00478052    56                push esi                    ;FEATURE id, ASCII "Zend_Encoder"

00478053    52                push edx

00478054    E8 57DFFBFF       call zendenc.00435FB0       ; lp_checkout

00478059    83C4 4C           add esp,4C

0047805C    85C0              test eax,eax                ; 0,jmp

0047805E    74 3F             je short zendenc.0047809F

00478060    8A8424 18090000   mov al,byte ptr ss:

[esp+918]

00478067    84C0              test al,al

00478069    75 12             jnz short zendenc.0047807D

0047806B    8B4424 10         mov eax,dword ptr ss:

[esp+10]

0047806F    68 DCDB4900       push zendenc.0049DBDC        ; ASCII "Checkout failed"一般搜索这个字符,上面的就是checkout了!

00478074    50                push eax

在00478054中断,你会看到堆栈窗口里出现了FEATURE id和版本,或者d esi。

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

方法一同前,不说了。

方法二:

下面引用自tulipfan[CCG]:

********

“要找vendor_id就需要找到l_sg这个函数了(至于为什么要找这个函数建议看一些更基础的文章),在这儿我主要是介绍一下如何定位l_sg函数,

这个是FlexLm的一个内部使用的函数. lc_init,lc_checkout都会调用它下面是它们的调用关系,括号里面的数字是调用的次数。

a. lc_init -> l_init

b. l_init -> l_sg

(1)

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函数”

************

我们有9.2的source,我们看到lm_ckout.c中有下面一段,那几个数就是确定l_sg函数上很有用的,针对

0x7648b98e;                   v7.x */

0x6f7330b8;                 /*- v8.x,9.x*/

下面给出参考:

V7

glseed = 0x788F71D2

seedval = 0x7648B98E

V8

glseed = 0x3CDE3EBF

seedval = 0x6F73330B8

V9

glseed = 0x72346B53

seedval = 0x6F7330B8

v10

glseed = 0x5332322F

seedval = 0x6F7330B8

关于这一段,zhanzixin 有一点小小的补充。

0x7648b98e这个数字,被称为seedval的,

在版本4、5、6中是 0xa8f38730

在版本7.0-8.0c中是 0x7648b98e

在版本8.0d以后,一直没变,是0x6f7330b8。

代码:

/*-

 *  Also used by flexcrypt -- notify if API changes.

 */

void

l_sg(

  LM_HANDLE *    job,

  char *      vendor_id,

  VENDORCODE *  key) /*- l_sg means "signature vendor_key5" */

{

  unsigned long  keys[4];

  char      sig[SIGSIZE] = {'\0'};

  /*- If you change this, you must change it also in utils/lmnewgen.c */

  /*- unsigned long x = 0xa8f38730;                   v3.1 */

  /*- unsigned long x = 0x7648b98e;                   v7.0 */

  unsigned long  x = 0x6f7330b8;                   /*- v8.x */

  extern void    (*L_UNIQ_KEY5_FUNC)();

  unsigned long  d0 = 0, d1 = 0;

  int        i = SIGSIZE-1;

  if (( job->options->flags & LM_OPTFLAG_CUSTOM_KEY5) && L_UNIQ_KEY5_FUNC)

  {

    (*L_UNIQ_KEY5_FUNC)(job, vendor_id, key);

    return;

  }

废话少说,我们直接反汇编zendenc.exe,我们查找“7648B98E”,来到下面,好像就这么1,2处

前人的经验就是宝贵啊,我省了很多事!

代码:

.text:

00438FDA ; =============== S U B R O U T I N E ?

=====================================

.text:

00438FDA

.text:

00438FDA ; Attributes:

 bp-based frame

.text:

00438FDA

.text:

00438FDA sub_438FDA      proc near               ; CODE XREF:

 sub_432CC4+C7C_p

.text:

00438FDA                                         ; sub_437621+B9_p ...

.text:

00438FDA

.text:

00438FDA                 push    ebp               ====先在这个地方下断

.text:

00438FDB                 mov     ebp, esp

.text:

00438FDD                 sub     esp, 30h

.text:

00438FE0                 mov     [ebp+var_10], 7648B98Eh    ====就是这个数在确定l_sg函数上很有用

.text:

00438FE7                 mov     [ebp+var_14], 3

.text:

00438FEE                 mov     eax, [ebp+arg_0]

.text:

00438FF1                 mov     ecx, [eax+6Ch]

.text:

00438FF4                 mov     edx, [ecx+1D4h]

.text:

00438FFA                 and     edx, 8000h

.text:

00439000                 test    edx, edx

.text:

00439002                 jz      short loc_439027    ====这个跳前面分析了,第一次肯定会跳的!

第二次再来!

.text:

00439004                 cmp     dword_49E5EC, 0

.text:

0043900

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1