发信人:laoqian
时 间:2004-11-2
软件名称: 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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!