控制元件破解指南(轉貼) (4千字)

看雪資料發表於2002-06-27

控制元件破解指南
MikeDeakins
注意:本文的轉載必須獲得作者同意(作者電子郵件地址:
MikeDeakins@ChinaRen.com )。
不像可執行檔案,Delphi / C++ Builder 的控制元件是不能利用 SoftIce 進行動態跟蹤的,但
是,這並不意味著控制元件的破解比可執行檔案的破解要困難。
要想破解一個控制元件,首先要弄明白它為什麼能夠產生限制。一般來講,帶有限制的控制元件
只能在 IDE 中執行。這就意味著,這個控制元件必須有一種既定的機制來判斷當前執行環境是
否是在 IDE 內部。Delphi / C++ Builder 的 IDE 具有什麼樣的特徵呢?自從 Delphi 1.0 開
始,IDE 的主視窗的類名始終沒有改變過,一直是 TAppBuilder ,並且,這個視窗沒有子窗
口。幾乎所有限制控制元件都是用這個特徵來判斷當前是否是在 IDE 內部的。雖然列舉系統中
的所有程式,並且判斷程式檔名是否是 Delphi32.exe 也似乎可行,但是這會在程式執行
的時候產生明顯的延遲,所以目前為止,我還沒有發現使用這種方法的例項。
只要瞭解了這些,破解控制元件就成為了可能。實際進行破解的時候,需要兩個重要的工具
軟體:DeDe 2.50 和 Ultra Edit ,前者用來分析 DCU 檔案,後者用來對二進位制檔案進行編
輯。
下面,我將利用破解 JF Control Delphi 版本的實際例子來說明破解的方法。JF Control
的未破解版本可以在 http://www.jfactivesoft.com/spindex.htm 下載。
安裝好這套控制元件以後,我們首先來分析它所有的 DCU 之間的關係。判斷限制條件的
部分必然要被所有其它單元所使用,這樣才能保證不管在程式中引用了哪一個單元都能夠保
證程式不能在 IDE 外執行。當然,尋找這個單元並不一定需要使用 DeDe 開啟所有 DCU 。
發現 Delphi\ Lib\JFMain.dcu 了嗎?這就是一個再明顯不過的標誌:這是一個主單元,限制
條件有很大可能就是在這裡判斷的。好,我們再使用另外一招:使用資源管理器在 Delphi\Lib
目錄中對檔案進行搜尋,條件是檔案內容包含 TAppBuilder 。如果在程式中要查詢
TAppBuilder 視窗類,就必須用到 FindWindow 函式,這個函式要求傳遞視窗類的名字字串,
在 DCU 中應當有相應的字串存在。查詢的結果,符合條件的檔案只有兩個:
JFCtrls_d5.dcp 和 JFMain.dcu 。DCP 是 Delphi Component Package 的縮寫,是在 Delphi
IDE 內部使用的控制元件包,既然是內部使用的,根本不用去管它。但是,另外一個檔案則證
明瞭我們剛才的判斷,好,準備破解。
執行 DeDe 程式,在 Dumper 選單中選擇 DCU Dumper ,在開啟檔案對話方塊中選擇
JFMain.dcu 。處理完畢以後,在反編譯的文字框中全選所有文字並且複製,然後貼上到記事
本中。在記事本中查詢字串 TAppBuilder 。尋找的結果好像並不太令人滿意:
const
szTAppBuilder:System.AnsiString ='О憊 ?{@_NF_7E5+$8};
原來這個字串是一個常量的名字。常量的內容是不可識別的字串,顯然,加密了。
但是不要著急,這個字串的內容並不重要了。偶然向下翻了一屏,驚喜就會出現:
function JfDelphiIDERunning:System.Boolean;
萬萬沒想到這個程式編寫的居然如此明顯。現在看一看這個函式的內容,千萬別被騙了。
這個函式內嵌一個函式:function CnvString (AStr:System.AnsiString):System.AnsiString;
這就是負責把剛才我們看到的加密字串解密的函式。繼續向下看,函式的主體呼叫了
FindWindow,GetWindowText,EnumChildWindows,功能確實符合這個函式的名字。
下面,我們要做的並不是破解 CnvString 函式,因為要想理解這個函式的演算法還是有一
些難度的,另外,這個函式是內嵌函式,也就是說,在這個單元的其他地方是不需要這個函
數的。實際上,我們只要修改 JfDelphiIDERunning 的程式碼,讓它只返回 true 就可以了。
如果有組合語言的基礎,這段簡單的程式很容易寫出來。如果不會組合語言,也可以很
容易解決這個問題:啟動 Delphi ,開始一個新的工程,建立一個單元,建立一個如下的函
數:
function CrackStub:Boolean;
begin
Result:=true;
end;
然後編譯程式。用 DeDe 開啟這個函式所在的 DCU 檔案,獲得彙編程式碼:B0 01 C3 。
下面,我們記錄 JfDelphiIDERunning 入口點的程式碼,應當記錄足夠長的特徵程式碼,否則
可能在後面的二進位制查詢中獲得多個結果。我記錄的入口點程式碼是:55 8B EC 81 C4 E8 FE FF
FF 53 56 57 33 C0 89 85 E8 FE FF FF 89 85 EC FE FF FF 89 85 F0 FE FF FF 89 85 F4 FE FF FF 89 85
F8 FE FF FF 89 85 FC FE FF FF 。
啟動 Ultra Edit ,開啟 JFMain.dcu ,使用二進位制 / 十六進位制尋找功能,搜尋記錄的特徵
程式碼。找到以後,在此搜尋,確認特徵程式碼唯一。下面,把入口點位置的程式碼修改為我們的
程式碼。後面的程式碼我們不需要修改,因為 CPU 執行完 B0 01 C3 就返回了,根本不會繼續
執行。修改完畢,儲存檔案。我們可以使用 Delphi 開啟它的 Demo 程式,然後編譯,退
出 Delphi ,執行 Demo 程式,程式正常啟動。破解成功。
這種對 DCU 檔案的破解其實還是有一些限制的:不能使用 BPL 動態程式包。BPL 文
件實際上是可執行檔案的結構,破解方法和 DCU 檔案有些區別,破解方法不在這裡討論。
(待續)

相關文章