作者:Nolan Blender
翻譯:newsearch[TT]
引言
該破解資訊涵蓋了使用預設加密保護的FLEXLM7.2包的破解。Globetrotter已經有了一個新的、 改進的防偽選項,它需要額外花錢-本文並不包括這些,如在寫本文時並未分析“橢圓曲線加密技術ECC”("安全生成器"程式碼) 。
本文的讀者物件是那些想快速直接地從FLEXLM的最近版本中得到加密種子的有經驗的破解者。如果對目前FLEXLM方法有清晰的理解將是很有幫助的,要求理解怎樣使用IDA和SoftICE。
物件的URL/FTP
可能需要如下檔案 (Calcseed.exe / Zendenc.exe) : (534k).
正文
FLEXlm金鑰取決於儲存在許可證 軟體中的兩個秘密值:ENCRYPTION_SEED1 和 ENCRYPTION_SEED2。這些值由軟體VENDOR選取並嵌入FLEXLM到產品中。如果這些值被恢復了,將不採取額外的安全措施(如vendor定義的檢查, 它進行對應於許可證的額外檢查;或使用者加密濾波器,它在許可證金鑰上應用了加密的一個額外層), 那麼就可以為目標程式產生有效的許可證了。
用於隱藏FLEXLM金鑰值的方法變得越來越複雜了 ,這可能是回應於破解者已經能夠提取金鑰/在一些客戶面前生成新的軟體版本甚至看到(破解)軟體到了自家門口!儘管其改進有較長的歷史,但我僅涵蓋最近的版本。
目前,種子由釋出給終端使用者的特定子程式隱藏,該子程式在程式建立中產生金鑰資料。其中一個函式(routine:例程/程式)產生VENDORCODE結構的一個版本, 該結構包含了正確的VENDOR金鑰,但非正確的加密種子。另一個函式採用該資料並提取種子,但在job結構(Globetrotter用於儲存 當前FLEXLM會話狀態資訊的一個全域性資料空間)和VENDORCODE結構之間分割有效資料。在FLEXLM內的加密或驗證函式使用之前,該資料將被重新編譯。
一個隨機值(基於時間)將與job結構和VENDORCODE結構中的值進行與或運算,以使其更難於恢復加密種子。
FLEXLM的早期版本(6.1-7.0)包含了一個執行弱點。透過用job結構的一個空指標傳遞到lm_new的恢復函式中,就可能在VENDORCODE結構中恢復正確的加密種子。最容易的技術(儘管還有其它技術)是用IDA搜尋l_sg和FLEXLM簽名,搜尋lm_new種子恢復函式的呼叫(通常靠近l_sg函式的起始處,且是一個指標值呼叫)。使用SOFTICE載入程式,在譯碼函式呼叫處設定斷點。
job結構指標 ,即第一個引數由一個空指標(0)替換。VENDORCODE結構指標,即第三個引數將被檢查並且程式將跳過對lm_new函式的呼叫。在呼叫後檢查VENDORCODE結構,然後它將包含正確的種子。FLEXLM的後期版本校正了該問題,當job結構的一個空指標傳遞時,不會填充正確的種子。實際上,子程式不再試圖修改種子。那麼,在這種情況下怎樣恢復種子呢?
實踐證明,在VENDORCODE和job結構之間分發資料的演算法相當簡單,它僅基於vendorname的第一個字元。因為lm_new.c由lmrand2產生,因此完全可能用逆向工程找到怎樣提取種子,然後寫程式重新編譯來自job結構和VENDORCODE結構的資料,並用這種方法恢復種子。文章Nolflex2.htm(譯者注:即該作者的另一篇文章“FLEXLM物件使用的資訊隱藏方法 FLEXLM種子隱藏系統的一個解釋”)有該方法的詳細敘述。
首先將ZENDENC.EXE程式載入進IDA中,然後在初次反編譯完成後搜尋一個要多次呼叫_time的函式,它將是lm_new函式。如果我們得到了該版本的正確簽名,我們可以簡單地在IDA中應用簽名並定位l_sg;但是,因為我們沒有(正確簽名),因此我們不得不做得艱難些。一旦我們定位了要多次呼叫時間的函式,我們就在程式的其它部分中尋找函式的參考---在這種情況下,我們僅找到一個參考:
.text:004010E7 cmp dword_49E5EC, 0
.text:004010EE jnz short loc_4010FA
.text:004010F0 mov dword_49E5EC, offset sub_40D572
在4010FA處的指令執行後,在49E5EC處的值將指向lm_new譯碼函式。下一步是查詢49E5EC的參考,因為它是函式被呼叫的地方,或其值被複製進暫存器供呼叫。透過檢查該處的參考,我們找到該呼叫的一個可能位置:
.text:0043900D mov eax, [ebp+arg_8]
.text:00439010 push eax
.text:00439011 mov ecx, [ebp+arg_4]
.text:00439014 push ecx
.text:00439015 mov edx, [ebp+arg_0]
.text:00439018 push edx
.text:00439019 call dword_49E5EC
在439019處是指標呼叫,因此這極可能是出現呼叫譯碼函式的地方。
它不會像在l_sg中一樣被驗證,但這是一個安全的賭注,假如我們有命名函式的FLEXLM7.1的簽名的話。但是,我們需要一個“假的”許可證以得到該函式的呼叫。 用那種方法,我們可以使該函式被呼叫。
FEATURE Zend_Encoder zend 9.9 permanent uncounted VENDOR_STRING=blah\ HOSTID=ANY SIGN=123412341234
我想,我透過查詢檢查呼叫得到了FEATURE名字,並看看在那裡傳入了什麼 ,還有其它許多方法也可得到FEATURE;如果你瞭解FLEXLM的話,我確信你熟悉這一切了。下一步是在license.dat檔案中放入假的許可證,在SOFTICE中載入ZENDENC.EXE,可能的話載入一個自做的符號表。
程式載入後在入口處中斷,在439019處設定斷點,在該點檢查堆疊---我使用 dd esp進行。因為引數被從右到左壓入堆疊, 且有三個引數傳遞到譯碼函式,我們可以判定給函式傳入了什麼;esp包含了指向job結構的指標,esp+4包含了指向含有vendor名字的一個字串指標,esp+8包含了指向VENDORCODE結構的一個指標。我在我的機子裡記錄瞭如下值---也許你得到了不同的值:
302B70 - ptr to job結構
302CBC - ptr to vendor名稱
12CF98 - ptr to vendorcode結構
透過檢查包含的檔案,我們確定在vendorcode+4和vendorcode+8處的值是用作data[0]和data[1]的值,後面具有加密種子。我們可以用dd (12CF98+4)得到加密種子資料值的基礎值,並用dd (302b70+8)得到在job結構中種子隱藏區的值。程式每次執行的這些值都將不同,因此同時記錄兩套值。
下面是我在執行中得到的:
vendorcode+4 是data[0] : DCE0A0A2
vendorcode+8 是data[1] : FC58117B
job+8 : D3B4B0C2
job+c : 81042659
job+10 : D493C07C
執行calcseed恢復如下:
ENCRYPTION_SEED1 : FA5410DE
ENCRYPTION_SEED2 : DAECA107
我已經提供了calcseed.exe, 它是 Nolflex2.htm論文的具體實現,並有其執行計算以獲取種子的敘述。其中,encseed[0]和encseed[1]是實際的加密種子。Selector值是當job陣列被當做字元陣列時從job陣列中提取的值索引,僅提供給感興趣的。與或值(XOR)是獲取的值,用於與資料值進行與或運算以得到加密種子。
結束語
本文是敘述FLEXLM的另一篇論文,由Globetrotter奇才---Nolan Blender所寫。到現在為止,你應該知道用它幹什麼了吧,坐下來並學習它!-CrackZ
=============================================================
譯者注:這是網上一篇關於FLEXLM破解的很有名的文章。是FLEXLM破解專家Nolan Blender早期寫的,據國外的文章講對9.0版本都適用(我沒有試過)。這篇文章不是最新的,但個人認為原理講得很好,權作教學資料。另外,本文將“routine”(本意為:例程/程式)翻譯為“函式”,是讀了作者的幾篇文章和其它一些資料認定的。可能作者採用了Fortran語言的習慣。對否,請高手斧正。
原文出處:http://www.woodmann.com/crackz/Tutorials/Nolflex3.htm