翻譯FLEXlm9.2的破解教學三
翻譯第三篇 On Software Reverse Engineering - 3
Reverse Engineering, FLEXlm, IMSL
揭示加金鑰和加密種子
從實際的觀點出發我們現在可以止步不前了,因為有了許可的複製我們可以自由的使用目標程式了。但是,軟體破解的最終目的是反向(逆向)工程的所有相關演算法並重新建立它們,那就好像我們是原始作者一樣。在我們的例項中,最低限度的要求是揭示VNI的5個vendor金鑰和3個隨機種子。不用說,這要求我們更仔細的閱讀FLEXLM SDK原始碼,因此我們簡單的回顧一下它是怎樣組織的。下面的列表顯示了包含最關鍵檔案的資料夾。
src lmgr.lib或lmgr9a.dll的原始檔
app lmgras.lib的原始檔
server lmgrs.lib的原始檔
master lmgrd.exe的原始檔
utils 實用工具的原始檔
machind 機器獨立檔案(源 & 頭)
i86_n3 對於x86 平臺的最終的二進位制檔案
h 標頭檔案
certicom 來自Certicom公司的庫和標頭檔案
ulite FLEXLM的ultralite版本
此外,檔案和函式根據其角色被指定了不同的字首。例如,目錄app, server和master以ls_開始,而在utils中是以lm為字首。
l_ 許可證, 用於內部函式
lc_ 許可證客戶端, 用於客戶端API
ls_ 許可證伺服器, 用於伺服器API
lm_ 許可證管理器, 用於實用工具和一般的程式(原為材料)
現在,我們回到文獻[2]和[3]中關於Vendor怎樣實用FLEXLM SDK的指導中。基本地,Vendor需要將許多FLEXLM二進位制與其自己的產品結合並建立若干實用工具-一些作為內部使用,一些用於終端使用者釋出。在這些Vendor-所產生的檔案之間有很親密的聯絡,下面是其關係表:
檔案 由...產生 #include
lmrand1.exe lmrand1.c + lmgr.lib
lmcode.c, lsrvend.c lmrand1.exe + lsvendor.c lm_code.h
lmappfil.c, lmkeyfil.c lmrand1.exe
lmnewgen.exe lmnewgen.c + lmcode.c + lmgr.lib lm_code.h
lm_new.c lmnewgen.exe seeds & pubkey
lmseeds.h lmnewgen.exe
lmprikey.h, lmpubkey.h lmnewgen.exe
lmcrypt.exe lmcrypt.c + lmgr.lib lm_code.h,
lmseeds.h,
lmprikey.h
makekey.exe makekey.c + lmgr.lib lm_code.h,
lmseeds.h,
lmprikey.h
vendor application vendor code + lm_new.obj + lmgr.lib + seeds & pubkey
libsb.lib + libcrvs.lib
vendor daemon lsvendor.obj + lm_new.obj + lmgr.lib + lm_code.h,
lsserver.h,
lmgras.lib + lmgrs.lib + libsb.lib + seeds & pubkey
libcrvs.lib
注意,並非上述的所有檔案都對我們是重要的。lmappfil.c和lmkeyfil.c是Vendor確定的濾波器,它們是附加的安全測試但通常未用。類似的,lmprikey.h 和lmpubkey.h僅用於CRO金鑰,在我們的例子中可以忽略。透過編輯lsrvend.c 或lsvendor.c,Vendor可定製後臺程式,但很少有人那樣做。
有一件值得討論的事情是Certicom產品,也即libsb.lib和libcrvs.lib 。它們幾乎涵蓋了從SHA到DSA的整個加密領域,而且FLEXLM採用的API幾乎為ECC(橢圓曲線加密技術)和RGN(隨機數字產生)。ECC用於在CRO中的公開/專用金鑰對,但在我們的目標程式中關閉了;而RGN用於Vendor種子的轉換,我們不可忽略。
正如先前宣告的,Vendor選擇了3個隨機種子(LM_SEED1, LM_SEED2, LM_SEED3),但並不直接使用它們。實際上,基於前3個,lmnewgen.c!main()®l_prikey.c!l_genrand()®libsb.lib!sb_rngFIPS186Session()產生了4個新種子[8](ENCRYPTION_SEED1, … ENCRYPTION_SEED4)輸出到lmseeds.h。種子3和4專門用於公開/專用金鑰對,因此我們僅需要考慮種子1和2。
儘管FLEXLM在l_rand.h和lm_rand3.c中有其自己的RGN,但它在此仍然使用了在DSS標準中確定的演算法(c.f. [8])。該演算法是決定性的(沒有讀取時間、暫存器值等),因此對給定的LM_SEED,那麼ENCRYTION_SEED(的值)將是固定的。它也是一個單向的函式,這意味著在實踐中不可能從已知的ENCRYPTION_SEED來解決LM_SEED。因為是ENCRYPTION_SEED被程式設計到Vendor釋出版本中,而LM_SEED除了在l_genrand()中出現外別處都不出現,因此我們最好恢復前者。但是,恰巧出於相同的原因,我們假定恢復LM_SEED是同樣的好。
在FLEXLM的內部基本上是C/S模型,結合Vendor應用程式的是客戶端,Vendor後臺程式(這裡是vni.exe )是伺服器。注意,Vendor後臺程式不同於FLEXLM許可證管理器lmgrd.exe,後者僅重定向客戶端請求到相應的做實際工作的Vendor後臺程式。令一個因素是許可證檔案格式。FLEXLM提供了豐富的許可選項,在計數與不計數上是很重要的。不計數的許可證對於(使用者)數量的檢查沒有限制並且不需要Vendor後臺程式-其有效性僅在Vendor軟體同時作為客戶端和伺服器時發生。計數的許可證通常用於網路(浮點許可證必須被計數),在大公司通常可以看到這樣的情景:中心節點執行伺服器,所有工作站連線到它上面進行許可證的輸入輸出檢查。因此,我們可以推斷Vendor後臺程式的主要任務是計數、管理和調節受限許可證的使用。
看我們的許可證,它是 “permanent uncounted HOSTID=ANY”, 它表明沒有任何條件限制。這一定是每個破解者的夢想(無後臺程式處理也使追蹤更容易)。實際上在許可證檔案中,“SERVER"和"DAEMON"行是不必要的,兩個“FEATURE"足以保證cmath.exe能無限制的執行。後面我們將有主題討論許可證型別。
現在,我們已有了具有Vendor金鑰和加密種子的cmath.exe作為客戶段和伺服器。有個好訊息是CRO不起作用,因此僅要一套金鑰。如果我們挖掘出它們,我們將可以用lmcrypt.exe或makekey.exe製作任何許可證檔案,與Visual Numerics的方式一樣。在我們著手進行時,我們總結了在金鑰檔案中的一些金鑰。
lm_code.h: /* \machind\lm_code.h and \h\lm_code.h must be identical */
VENDOR_KEY1, VENDOR_KEY2, VENDOR_KEY3, VENDOR_KEY4, VENDOR_KEY5
LM_SEED1, LM_SEED2, LM_SEED3
lmcode.c:
#include "lm_code.h"
#include "lmclient.h"
VENDORCODE vendorkeys[] = { /* 錯誤的名字,需使用vendorcodes[]代替*/
{ VENDORCODE_7,
ENCRYPTION_SEED1 ^ VENDOR_KEY5, ENCRYPTION_SEED2 ^ VENDOR_KEY5,
VENDOR_KEY1, VENDOR_KEY2, VENDOR_KEY3, VENDOR_KEY4,
FLEXLM_VERSION, FLEXLM_REVISION, FLEXLM_PATCH,
LM_BEHAVIOR_CURRENT, {CRO_KEY1, CRO_KEY2},
LM_STRENGTH, LM_SIGN_LEVEL, 0
},
};
lmseeds.h:
ENCRYPTION_SEED1, ENCRYPTION_SEED2, ENCRYPTION_SEED3, ENCRYPTION_SEED4
lm_new.c:
x = 0x3d73db2e; /* 在lmnewgen.c中產生的隨機數key5_uniqx */
VENDORCODE.data /* 由key5()模糊 */
VENDORCODE.keys /* 由l_xorname()模糊 */
l_getattr.c:
#define VENDORMAGIC_V7 0x08BC0EF8 /* 不重要, 僅用於xor(與或)取消*/
lmclient.h:
#define L_NEW_JOB l_n36_buf
l_privat.h:
#define L_UNIQ_KEY5_FUNC l_n36_buff
#define L_SET_KEY5_FUNC l_x77_buf
#define SEEDS_XOR mem_ptr2_bytes /* 這裡seeds 隱藏在job */
#define SEEDS_XOR_NUM 12
此外,這裡有三個數字被嵌入到二進位制中(比如VENDORMAGIC_V7),但好像從來沒有使用(至少在cmath.exe)中。也許它們僅用於某個版本或某個許可證型別,當我們訪問這些函式時,我們將會看到它們。
Besides, there are three numbers that are hard-coded into the binaries (just like VENDORMAGIC_V7) but seems never used (at least in the case of cmath.exe). Maybe they are solely for certain versions or license types, we’ll see that when we visit those functions.
lm_ckout.c!l_sg():
x = 0x6f7330b8; /* v8.x */
lmnewgen.c!VKEY5():
x = 0x6f7330b8; /* v8.x */
l_key.c!l_zinit():
z = crokey_flag ? 0x62586954 : 0x72346B53; /* v9.x */
相關文章
- 翻譯FLEXlm9.2的破解教學四2004-12-08Flex
- 翻譯FLEXlm9.2的破解教學五2004-12-10Flex
- 翻譯FLEXlm9.2的破解教學一2015-11-15Flex
- 翻譯:Zendenc
FLEXlm 7.2 破解資訊[TT]2004-12-27Flex
- Yurii談翻譯(三)怎樣翻譯更地道:補語篇2012-01-08
- Apache Storm 的歷史及經驗教訓——Nathan Marz【翻譯】2015-10-30ApacheORM
- 關於“新手教學”的新手教程(三):教學節奏設計2019-09-17
- Yurii談翻譯(五)怎樣翻譯更地道:so…that…的翻譯2012-01-08
- 《wifi加密破解論文》翻譯介紹-wifi不再安全2017-10-17WiFi加密
- ollydbg破解教學之--------萬能斷點篇2015-11-15斷點
- Yurii談翻譯(九)怎樣翻譯更地道:冠詞a的翻譯2012-01-09
- Yurii談翻譯(十)怎樣翻譯更地道:最高階的翻譯2012-01-09
- 翻譯的未來:翻譯機器和譯後編譯2013-06-13編譯
- 學php之翻譯wordpress(2)2020-04-04PHP
- Yurii談翻譯(六)怎樣翻譯更地道:“as somebody said…”的翻譯2012-01-08AI
- Yurii談翻譯(十三)怎樣翻譯更地道:It is…that…句型諺語的翻譯2012-01-09
- Yurii談翻譯(十四)怎樣翻譯更地道:否定句的翻譯2012-01-09
- dumping_oracle_blocks翻譯(一)個人翻譯,學習總結用2011-11-30OracleBloC
- 一道英文數學題的翻譯2013-09-25
- 有趣的翻譯2016-06-28
- 痛苦的翻譯2007-05-16
- 翻譯2020-12-29
- 各種數學名詞的英語翻譯2007-12-01
- 如何完成中文翻譯日文線上翻譯2019-09-23
- Yurii談翻譯(四)怎樣翻譯更地道:翻譯如鋪路2012-01-08
- [翻譯]JavaScript的成本2019-02-27JavaScript
- Symbol 的作用[翻譯]2019-04-05Symbol
- Before的翻譯2013-07-28
- Google翻譯的API2008-03-25GoAPI
- 本人翻譯的文件2005-03-02
- 偶翻譯的小說2007-09-24
- Ubuntu安裝劃詞翻譯軟體Goldendict 單詞翻譯 句子翻譯2021-01-05UbuntuGo
- 【翻譯】使用React、 Redux 和 SVG 開發遊戲(三)2019-02-19ReactReduxSVG開發遊戲
- voltDB官方文件第三章翻譯2018-09-17
- [書呆子]讀書三兩事——《翻譯漫談》2014-03-20
- Serilog文件翻譯系列(三) - 基礎配置2024-09-01
- 裝模作樣學翻譯:樂譯隨想之一2012-04-11
- 人工翻譯的分類 安睿傑線上翻譯平臺2022-08-11