對vc++類和對象的逆向研究
知識
09-29
經過反編譯動態調試,vcpp的類實際上就是struct,跟delphi不同,它沒有類頭,而且所有的函數都直接放在函數表裡頭,跟普通的函數一樣混在一起。而成員變數,則直接就在對象頭開始算起,成員變數的結尾是0xfdfdfdfd,如果沒有成員變數,則對象的開頭就是0xfdfdfdfd。
舉個例子:如果有1個int成員變數,則sizeof(class)=4;如果有2個int成員變數,則sizeof(class)=8; 如果沒有,則sizeof(class)=1;
對象指針默認通過ecx傳遞,而delphi是第一個參數傳遞。
目標結論如下:
所以想要設計一個兼容delphi對象的c文件,讓cpp當作一個類使用,是不合適的,因為它不是通過對象指針的偏移來調用成員函數的,而是直接跳轉到了靜態函數表。但是用struct調用函數指針還是可以的,這樣其實就沒必要使用cpp的類了,直接用c就可以了,而且函數指針更加靈活,方便定義和響應事件,以及多態,有著無與倫比的靈活優勢,為什麼我喜歡javascript呢,因為指針函數發揮的淋漓盡致。
逆向其他軟體,比如遊戲等,需要研究更多,比如虛函數等。
今天先這樣,以後研究了再增加。
※apache的commons-email 類庫開發示例
※Tomcat 調優測試
TAG:程序員小新人學習 |