软件名称: 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(是否一样呢),谁有啊?