2011-06-08 49 views
0

我試圖反彙編並理解一箇舊遊戲的啓動器(asm列出在http://pastebin.com/raw.php?i=6Z4Xu3Cg)。它是使用Borland C++ 1995構建的,在asm列表中有四個類名和dtor地址。我如何知道其他功能屬於哪個類?我如何識別vtable?畢竟,它應該包含一切。從asm列表中識別C++類成員

順便說一句,這不是關於複製保護破壞。遊戲太舊了,它沒有任何形式的保護。我想要做的和OpenTTD開發者所做的一樣。

謝謝 硬盤

+1

爲什麼你認爲所有的功能都屬於類? C++是一種多範型語言,並允許按照C的非成員函數。類似地,可能沒有vtable - 它們只是爲具有虛函數的類生成的,並且僅用於運行時多態性。如果遊戲只有4個類別,那麼他們很可能不會模擬系統的正交方面,並且沒有繼承關係。而vtable只有指向虛擬函數(也許RTTI)的指針 - 不是理解整體的魔法關鍵。 – 2011-06-08 08:12:15

回答

0

不,它不包含一切。沒有動態解除引用的每個符號可能已被分割。反彙編可以做的是識別特定編譯器輸出的典型結構並賦予它一些意義。

+0

對於Borland C++編譯器來說,tpid結構之間的代碼是否屬於同一類是否至少是安全的? – harddisk 2011-06-08 08:10:53

+0

根據連接器的工作/工作方式,人們可以假設這可能是正確的,但不會指望它。例如,在兩個tpid結構之間可以找到WinMain,這是一個絕對不屬於類的功能。要了解的一件重要事情是在組裝層面上沒有類。你得到了一堆包含類成員變量的結構,以及一堆函數,它們指向這些結構。一個類成員變量是指向vtable的指針。 – datenwolf 2011-06-08 10:43:28

+0

什麼是類成員變量的結構,你是如何找到它們的?我唯一能找到的就是dword_4038F8,它出現在每一個dtor和ctor中...... – harddisk 2011-06-08 13:06:57