首页
社区
课程
招聘
[原创]制作Flexlm license总结!
发表于: 2005-12-15 17:45 189530

[原创]制作Flexlm license总结!

2005-12-15 17:45
189530

作者:  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)
 */
0043391D    E8 184B0400       call <jmp.&MSVCRT.memcpy>
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
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  ....
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).
.....
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
/*-
 *	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;
	}
.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+C7Cp
.text:00438FDA                                         ; sub_437621+B9p ...
.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:0043900B                 jz      short loc_439027
.text:0043900D                 mov     eax, [ebp+arg_8]
.text:00439010                 push    eax
.text:00439011                 mov     ecx, [ebp+arg_4]
.text:00439014                 push    ecx
.text:00439015                 mov     edx, [ebp+arg_0]
.text:00439018                 push    edx
.text:00439019                 call    dword_49E5EC          ====在这个地方下断,F8之后就是我们要的!
.text:0043901F                 add     esp, 0Ch
.text:00439022                 jmp     loc_43913A
.text:00439027 ; ---------------------------------------------------------------------------
.text:00439027 loc_439027:                             ; CODE XREF: sub_438FDA+28j
.text:00439027                                         ; sub_438FDA+31j
.text:00439027                 push    4
.text:00439029                 lea     eax, [ebp+var_28]
.text:0043902C                 push    eax
.text:0043902D                 mov     ecx, [ebp+arg_8]
.text:00439030                 add     ecx, 0Ch
.text:00439033                 push    ecx
.text:00439034                 mov     edx, [ebp+arg_4]
.text:00439037                 push    edx
.text:00439038                 call    sub_451F26
0043391D    E8 184B0400       call <jmp.&MSVCRT.memcpy>
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 [esp+4]  在内存窗口看到,【长型――ASCII 转存】
**********
003983AC  646E657A  zend

输入 d [esp+8] 在内存窗口看到,【长型――ASCII 转存】
****1****

0012CF98  00000004  ...
0012CF9C  B68ACAC8  仁?     data[0]
0012CFA0  96327B11  {2      data[1]
0012CFA4  534D01FB  ?MS
0012CFA8  2D607B98  ?`-
0012CFAC  B069483D  =Hi
0012CFB0  67FCD8B6  敦?
0012CFB4  00000000  ....
********1************

输入d [esp] 【长型――ASCII 转存】
******2*****
00398260  00000066  f...
00398264  00F400E6  ??
00398268  B9DEDAA8  ㄚ薰   job+08
0039826C  EB6E4C33  3Ln    job+0c
00398270  BEF9AA16  ?    job+10

********2***********

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 10
支持
分享
最新回复 (111)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
GOOG.........
2005-12-15 17:59
0
雪    币: 204
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好贴啊,谢谢laoqian.保存下来好好学习。最近碰到一个flexlm v10.1加密的软件,跟踪出的license运行后提示找不到feature的user,很是郁闷。
2005-12-15 18:06
0
雪    币: 440
活跃值: (737)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
4
Excellent
2005-12-15 18:16
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
Good...
2005-12-15 18:35
0
雪    币: 242
活跃值: (163)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
6

好贴子
2005-12-15 18:46
0
雪    币: 175
活跃值: (2531)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好东西,收藏!
2005-12-15 19:28
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
好东西啊!多谢!
2005-12-15 20:18
0
雪    币: 300
活跃值: (412)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
9
支持老大,学习了
2005-12-15 20:23
0
雪    币: 10625
活跃值: (2319)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
如此强文 学习学习
2005-12-16 02:49
0
雪    币: 216
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
好贴,顶了
2005-12-16 12:31
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
12
来晚了。支持一下!
2005-12-16 15:27
0
雪    币: 97697
活跃值: (200829)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
13
的确不错!
2005-12-16 23:17
0
雪    币: 1310
活跃值: (727)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
在od中如何确定l_checkout函数的位置,是否有经验?
2005-12-17 16:13
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
laoqian老大就是中国的crackZ,文章收了,慢慢学习,呵呵。laoqian阿,你什么时候上下qq阿。从来没看到你来过,linhanshi到还难得来呢,过段时间又要问你问题了,flexlm9,呵呵
2005-12-17 20:33
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
16
shaoge:9.0之后的不少软件商好象在对比注册码前多了新的校验,估计应该是sign的chensum之类的校验,所以其现在如果sign不正确,就跳出而出现更换license之类的警告,并且不在到对比注册码的地方!
我碰到过此类情况不,而且是7.x,因为能力有限,不知所以,只好放弃,其实只要你有耐心,在出错提示前一步一步分析,应该能找到的,或者你去分析sdk的源码,这些都是很烦人的,我是没时间搞了,呵呵!
2005-12-19 10:07
0
雪    币: 1310
活跃值: (727)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
看样子是没有这方面的经验了,只有自己动手了。

sign的12位和20位是如何确定的,laoqian可以给点这方面的提示不?
2005-12-19 11:55
0
雪    币: 1310
活跃值: (727)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
flexlm技术讨论群11905916,期待各位探讨flexlm研究者的加入
2005-12-19 12:01
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
laoqian老大,您什么时候上下qq阿?我有些问题想单线咨询一下你哦,可以吗?
2005-12-19 20:29
0
雪    币: 204
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
某一用flexlm v10.1.3加密软件,按laoqian办法找seed,找到如下代码:
0044AA62    55                   push ebp
0044AA63    8BEC                 mov ebp,esp
0044AA65    83EC 08              sub esp,8
0044AA68    C745 FC 00000000     mov dword ptr ss:[ebp-4],0
0044AA6F    C745 F8 00000000     mov dword ptr ss:[ebp-8],0
0044AA76    8B45 14              mov eax,dword ptr ss:[ebp+14]
0044AA79    50                   push eax
0044AA7A    8B4D 10              mov ecx,dword ptr ss:[ebp+10]
0044AA7D    51                   push ecx
0044AA7E    8B55 0C              mov edx,dword ptr ss:[ebp+C]
0044AA81    52                   push edx
0044AA82    8B45 08              mov eax,dword ptr ss:[ebp+8]
0044AA85    50                   push eax
0044AA86    E8 0D000000          call xxxxxxxx.0044AA98
   在0044AA86处按F8暂停,d [esp+4]应该是feature名字,这里是xxxx,是feature名字;但d [esp+8]却为0,找不到data[0],data[1];d [esp]的值也确实是0x00000066,但后面的值全为0,找不到job+8,job+c,job+10的值,是中断的地方不对还是其他什么地方出问题了呢?
2005-12-19 21:50
0
雪    币: 204
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
还是该软件,试试看能否找到sign的明文,于是全文查找常数0x66d8b337,发现下列地址处代码与laoqian所说的很接近:
0044785C    25 FF000000          and eax,0FF
00447861    25 FF000000          and eax,0FF
00447866    A2 051C5000          mov byte ptr ds:[501C05],al
0044786B    C605 0B1C5000 00     mov byte ptr ds:[501C0B],0
00447872    8A15 0B1C5000        mov dl,byte ptr ds:[501C0B]
00447878    8815 0A1C5000        mov byte ptr ds:[501C0A],dl
0044787E    C785 78FEFFFF 080000>mov dword ptr ss:[ebp-188],8
00447888    817D 18 37B3D866     cmp dword ptr ss:[ebp+18],66D8B337        ;在此下断,查看内存d 501c05应该为明码!
0044788F    75 0F                jnz short xxxxxxxx.004478A0
00447891    8B85 78FEFFFF        mov eax,dword ptr ss:[ebp-188]
00447897    83E8 02              sub eax,2
0044789A    8985 78FEFFFF        mov dword ptr ss:[ebp-188],eax
004478A0    C785 7CFEFFFF 000000>mov dword ptr ss:[ebp-184],0
004478AA    EB 0F                jmp short xxxxxxxx.004478BB
004478AC    8B8D 7CFEFFFF        mov ecx,dword ptr ss:[ebp-184]
004478B2    83C1 01              add ecx,1
   程序运行到00447888处F8暂停, 查看内存d 501c05确实是sign的明码,呵呵.
2005-12-19 21:56
0
雪    币: 1310
活跃值: (727)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
最初由 伟伟 发布
某一用flexlm v10.1.3加密软件,按laoqian办法找seed,找到如下代码:
0044AA62 55 push ebp
0044AA63 8BEC mov ebp,esp
0044AA65 83EC 08 sub esp,8
0044AA68 C745 FC 00000000 mov dword ptr ss:[ebp-4],0
........


你断下的函数好象不对吧。
2005-12-19 23:18
0
雪    币: 238
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
好长的文章,收藏下来慢慢学习!
2005-12-20 08:57
0
雪    币: 329
活跃值: (343)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
24
非常不错。学习
2005-12-20 08:59
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
25
最初由 伟伟 发布
某一用flexlm v10.1.3加密软件,按laoqian办法找seed,找到如下代码:
0044AA62 55 push ebp
0044AA63 8BEC mov ebp,esp
0044AA65 83EC 08 sub esp,8
0044AA68 C745 FC 00000000 mov dword ptr ss:[ebp-4],0
........


这是哪里啊?感觉不对啊
2005-12-20 09:51
0
游客
登录 | 注册 方可回帖
返回
//