2011-05-09 28 views
4

這是我想要實現的。我確定了一個我定義爲一個結構來存儲類數據的類。該類的其中一個方法使用class-field,就像它指向vtable的指針一樣。IDA Pro中有可能爲.data段中定義的vtable創建結構體字段偏移量嗎?

int __thiscall SignOn(struc_4 *this) 
{ 
    v1 = this; 
    if (!v1->vtable_40194AE0) 
    return E_UNEXPECTED; 
    v1->field_3E8 = 0; 
    if (!sub_686F7193(v1)) 
    return (*(*v1->vtable_40194AE0 + 12))(v1->vtable_40194AE0, 0, 0); // sub_40128EEE 
} 

正如你所看到的,它從vtable中調用第三個函數。在運行時我確定了vtable_40194AE0指向數組中的.data段,看起來像這樣

off_40194AE0 dd offset InternalQueryInterface 
       dd offset AddRef 
       dd offset Release 
       dd offset sub_40128EEE ; 3 
       dd offset sub_40128F8C 
       dd offset sub_4012C2E2 ; 5 

有沒有辦法告訴莫名其妙IDA是vtable_40194AE0總是指向0x40194AE0到VTABLE在僞代碼,以便給呼叫看起來像

return vtable_40194AE0->sub_40128EEE(v1->vtable_40194AE0, 0, 0); 

我試圖設置結構的vtable_40194AE0是「用戶自定義的偏移」,但它並不能幫助:(

非常感謝!

回答

0

據我所知,沒有。IDA結構僅僅是提供使可視化更容易拆卸後的數據的過程。在你能做的就是評論調用點,以確定實際的虛函數最被調用。

5

。當然,這是可能的!

打開「結構」窗口中,找到你的班級結構ct(struc_4在你的情況下)並打開它(如果它被摺疊)。選擇vtable字段(它應該在第一個地方),按Y並輸入類型聲明作爲指向vtable結構的指針在打開的窗口中(在您的情況下爲vtable_40194AE0 *)。而已。

+0

嗨! vtable_40194AE0在我的情況下不是一個結構。它是結構struc_4的一個字段的名稱。 – expert 2012-08-09 01:12:41

1

可以使表示所述虛函數表的結構,與Y(待輸入函數指針)聲明的C類型其字段,並在與該T結構偏移的call [ecx+12]的偏移量。這樣,IDA將識別該調用的參數。

在表示類的結構中,將vtable字段的類型設置爲指向vtable結構的指針,然後如果幸運的話,反編譯器會將它們放在一起,並將vtable結構字段名稱放入調用中,而不是一個偏移量。

相關問題