翻譯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 */
相關文章
- 關於“新手教學”的新手教程(三):教學節奏設計2019-09-17
- 一篇文章教會你利用Python網路爬蟲獲取有道翻譯手機版的翻譯介面2021-09-09Python爬蟲
- 學php之翻譯wordpress(2)2020-04-04PHP
- 騰訊互動翻譯的坑爹翻譯2024-12-10
- Serilog文件翻譯系列(三) - 基礎配置2024-09-01
- 翻譯2020-12-29
- voltDB官方文件第三章翻譯2018-09-17
- Arctime怎麼翻譯字幕?Arctime批次翻譯字幕的技巧2020-07-14
- Symbol 的作用[翻譯]2019-04-05Symbol
- [翻譯]JavaScript的成本2019-02-27JavaScript
- Python爬蟲教程-16-破解js加密例項(有道線上翻譯)2018-09-06Python爬蟲JS加密
- 破解有道JS引數,教你用python自制一個翻譯軟體!2020-09-18JSPython
- 蝴蝶書-task2: 文字推理、摘要、糾錯 transformers實現翻譯 OpenAI翻譯 PyDeepLX翻譯 DeepLpro翻譯2024-04-29ORMOpenAI
- Ubuntu安裝劃詞翻譯軟體Goldendict 單詞翻譯 句子翻譯2021-01-05UbuntuGo
- 如何完成中文翻譯日文線上翻譯2019-09-23
- Apache Hadoop文件翻譯之三(使用者指南)2018-09-29ApacheHadoop
- 多翻譯引擎的程式2021-06-11
- Laravel 谷歌翻譯 /Bing 翻譯擴充套件包2019-06-11Laravel谷歌套件
- OpenCV翻譯專案總結二——Mat翻譯2019-07-13OpenCV
- 實用的Word文件翻譯方法分享,讓Word文件快速翻譯2019-08-12
- 人工翻譯的分類 安睿傑線上翻譯平臺2022-08-11
- 【翻譯】使用React、 Redux 和 SVG 開發遊戲(三)2019-02-19ReactReduxSVG開發遊戲
- hadoop官網翻譯第三天Hadoop Cluster Setup2018-12-26Hadoop
- spring官網線上學習文件翻譯2020-09-14Spring
- 向安全攻擊說NO,請翻開體系化防禦的三頁“教科書”2021-03-11
- PendingIntent 是個啥?官方文件描述的很到位。我給翻譯翻譯2018-11-08Intent
- 翻譯英文軟體哪個好?中文翻譯英文最便捷的方法2019-10-22
- 告別生硬翻譯!AI谷歌翻譯:讓你的文字"說人話"2024-11-11AI谷歌
- 最佳 AI 翻譯工作流:全世界最信達雅的翻譯2024-07-23AI
- 基於合作教學的幾種教學方法2018-11-16
- 使用google翻譯 api 翻譯中文成其他語言2018-08-06GoAPI
- 文件翻譯器怎麼用?如何翻譯Word文件?2019-08-15
- 有道雲詞典--翻譯/螢幕取詞翻譯2020-12-12
- TailWind文件翻譯說明以及每日翻譯進度2021-01-19AI
- [Web翻譯]JavaScript中的編譯與填充2020-07-27WebJavaScript編譯
- 跨越專業翻譯的語言之牆:百度翻譯的技術攀登2022-12-05
- 翻譯介面整理2018-11-14
- Python 谷歌翻譯2018-08-14Python谷歌
- 翻譯軟體2019-05-03