製作AUTOcad2002中文網路版的Flexlm license

看雪資料發表於2015-11-15

軟體名稱: 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(是否一樣呢),誰有啊?

相關文章