170605 逆向 Delphi和VB的理論

2021-08-02 04:38:46 字數 1302 閱讀 8791

1625-5 王子昂 總結《2023年6月5日》 【連續第247天總結】

a.delphi程式和vb程式

b.delphi和c++ builder除了語言不通,其餘幾乎都相同

delphi和c++ builder採用的是vcl(視覺化元件庫)技術,環境使用一種特殊的資源格式rcdata。

rcdata中含有delphi的窗體,所有對視窗設計的資訊都包含在內。當乙個典型的delphi程式開始執行時,其初始化**建立這種窗體,並從資源中讀取所需要的資訊。dfm檔案是delphi編碼的二進位制檔案,編譯時儲存於rcdata中。因此利用exescope等工具可以對它檢視、編輯,或者改變程式的某些執行方式

dede利用上述原理進行反編譯,獲取相關資訊,將介面與事件聯絡關係還原,但事件的彙編**不能還原。

動態除錯時會發現不能通過api函式來攔截文字框的資料,因為delphi是通過向文字框傳送wm_gettext訊息來獲得文字框的內容的(直接呼叫wndproc,而沒有使用訊息函式),整個過程沒有呼叫任何win32 api函式。

因此常用的api斷點都是沒辦法的。

可以通過dede找到按鈕的事件位址,在該位址處下斷來跟蹤(之前也就是這樣做的)

程式執行時,首先會將類完成初始化,然後開始執行**。

存在乙個初始化表,其中包含了各個控制項的資訊。

程式的入口點就在初始化表後,因此在以後脫殼的時候,可以用這種方法確定入口點。同時一些殼會加密初始化表,需要還原。

vb3和4是典型的解釋語言,它們都有相應的反編譯器存在。而vb5和vb6則在繼續保留p-code編譯(即偽**編譯)的同時也引入了native編譯方式,使得生成本地二進位制**成為可能。

vb32位版本的字串處理採用unicode編碼。因此當需要處理ascii的時候常常要呼叫api(rtcansivaluebstr)轉換;

vb4和以前的vb字串格式很複雜,使用連續指標的方式,源指標指向乙個由字串長度和字串首位址指標組合而成的結構,其中的字串首位址指標再指向字串。

vb5及以後的版本則是單指標方式,源指標指向乙個復合字串。開頭的4個位元組組成乙個長整數,指示此字串的長度,其後是字串;另外字串以「00」結尾,且不計算在長度之內。

編譯器的編譯技術可以分為native-compile自然編譯與pcode-compile偽編譯兩種

自然編譯是指編譯器將高階語言轉換為彙編**,並經鏈結生成exe程式的過程

偽編譯是編譯器將高階語言轉換為某種編碼,將能解釋、執行此編碼的一段程式一同連線, 生成exe程式

由於偽**實際只是「變形的源**」,因此反編譯起來比較容易

c.明日計畫

vb的自然編譯和偽編譯的針對處理

Delphi專案開發和Delphi學習筆記索引

最近準備做乙個用delphi客戶端呼叫.net的webservice的專案。所以把專案開發計畫和學習計畫寫在部落格上。希望對自己的技術有個促進。因為網上用delphi客戶端呼叫.net的webservice的專案和資料並不多,再加上我也沒做過客戶端程式,所以一些東東還要靠自己去鑽研。大致的計畫如下。...

Delphi函式和過程

過程無返回值,函式有返回值。procedure myproc m,n integer o string p single 2.5 q string delphi 如上例所示,過程宣告和定義中,多個引數是用分號隔開的,但在呼叫時是用逗號隔開的 eg myproc 3,4,me 3.14 上例中省略了最...

Python 正向迴圈和逆向迴圈

逆向迴圈 lista 0,1,2,1,4,1,6,1,8,1 for i in reversed range len lista print i 98 7654 3210 正向迴圈 lista 0,1,2,1,4,1,6,1,8,1 for i in range range len lista pr...