第二節Delphi反向工程
目前,Borland沒有提供任何產品用於反編譯可執行(.exe)檔案或「Delphi 編譯檔」(.dcu)為原始的程式碼(.pas)。
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探測器」)。 (譯者加:陸續譯)