Delphi編譯單元:DCU(Delphi compiled unit: DCU)
當一個Delphi工程被編譯或運行時,一個編譯單元(.dcu)文件便產生了。默認情況下,每個單元的編譯版本都存放在獨立的二進制文件中,該文件的文件名與單元文件同名,同時它的擴展名為.DCU。例如:unit1.dcu文件包含有在unit1.pas文件中聲明的代碼和數據。
這意味著如果你有某些資源,如編譯過的組件,你所必須做的是反編譯它並獲得源代碼。錯了,DCU文件格式是非文檔的(所有者格式)並且它可以隨版本的改變而改變。
編譯器之後:Delphi反向工程(After the compiler: Delphi Reverse Engineering)
如果你試圖反編譯一個Delphi可執行文件,有幾件事你應該知道:
Delphi源程序文件通常以兩種文件類型存儲:ASCII代碼文件(.pas、.dpr)和資源文件(.res、.rc、.dfm、.dcr)。Dfm文件包含表單中所容納的對象的詳細資料(屬性)。當創建一個可執行文件時,Delphi拷貝.dfm文件中的信息到已完成的.exe代碼文件。表單文件描述了表單中的每個組件,包括所有穩定的屬性值。每當我們改變表單的位置、按鈕的標題或為組件指派一個事件過程時,Delphi就會在DFM文件中記下這些改變(不是事件過程的代碼—它是存放在pas/dcu文件中)。為了從可執行文件中得到'dfm',我們需要理解什麼類型的資源被存放在Win32可執行文件中。
所有被Delphi編譯過的程序都有以下幾個部分:CODE、DATA、BSS、.idata、tls、.rdata、.rsrc。從反編譯的角度來看,最重要的部分是:CODE、.rsrc。在“Adding functionality to a Delphi program"(“在Delphi程序中增加功能”)(譯者加:陸續譯出)文章中討論了關於Delphi可執行格式、類信息和DFM資源的一些有趣的內容:怎樣分配事件給同一個表單中定義的其他事件句柄(handler)處理、怎樣增加你自己的事件句柄(handler)從而在可執行文件中增加代碼改變按鈕的標題。
存放在.exe文件中的各種類型的資源裡,RT_RCDATA或Application-defined(程序定義)資源(原始數據)擁有編譯前DFM文件所包含的信息。為了從.exe文件中選出DFM數據,我們可以調用EnumResourceNames API函數...關於從.exe文件中選出DFM數據的更多的信息,可以參考:“Coding a Delphi DFM explorer”(“編寫一個Delphi DFM探測器”)。(譯者加:陸續譯出)