2012-08-12 54 views
4

我正在對一個程序進行逆向工程。我正在使用IDA Pro和Hex-Rays Decompiler。我碰到大量的代碼,我知道有一個對象,並有一個方法調用對象,但它顯示的方式,我無法弄清楚。例如:找出對象的內存佈局而不調試正在運行的程序?

if ((*(*interfacePtr + 24))(interfacePtr, &v23) >= 0) 

我知道這裏interfacePtr指向一個ICLRRuntimeHost對象。 (C++,.NET CLR運行時)但是....我不知道什麼是*(* interfacePtr + 24)。我可以告訴它是一種方法,但我怎麼知道坐在+24的是什麼?

+0

難道你不認爲在逆向工程論壇上有更好的答案嗎?或者也許是IDA/hex-rays論壇,你應該在爲這個軟件付出巨大的價錢之後獲得這個論壇? – snemarch 2012-08-12 03:03:49

+1

IDA可以解析用於結構聲明的C頭文件。 'ICLRRuntimeHost'在Windows SDK'mscoree.h'文件的定義,有些工作,你應該能夠養活任何該文件到IDA或者至少提取類和虛函數表聲明到另一個文件和解析。在IDA定義了這個類之後,你可以簡單地告訴Hex-Rays:'interfacePtr'是'ICLRRuntimeHost'類型(按Y或者右鍵單擊變量名),它將更新顯示以包含函數名。 – DCoder 2012-08-12 05:38:06

+0

@snemarch我認爲這個問題是完全有效的,因爲所有的關於編程都是關於編程的,在一天結束的時候....是我的問題真正的關鍵。如果我遇到產品問題,我會使用討論板上的產品。但是,這僅僅是我對本機Windows可執行文件的底層機制知之甚少......而不是我在IDA或Hex-Rays反編譯器方面遇到問題。 – 2012-08-12 16:07:59

回答

2

一類的虛函數表僅僅是一個函數指針的列表。它包含每個虛函數的一個指針,順序爲:非常非常高的基類,下一個基類,它的子類。 。 。大多數派生類。

實施例:

struct A { 
    virtual ~A() {} 
    virtual void foo() = 0; 
} 
struct B : public A { 
    virtual void foo() { // do something } 
    virtual void bar() { // do something else } 
} 

對於B V表將包含,以該順序:

  • 〜甲
  • FOO
  • 酒吧

(該爲那些必須先到達,以便同一個vtable可以是你由具有類型A的指針的代碼的一部分sed到該對象;代碼不知道潛在的對象實際上是B.)

如果你正在尋找32位源,指針是4個字節,因此24 = 4 * 6,你看第7虛擬函數(索引從0開始)。如果你在64位,指針是8個字節,所以24 = 8 * 3,你正在尋找第四。實際上,我沒有使用IDA「轉換爲C++」的功能,所以24可能實際上是表中的第24項。

簡單的方法來確認:編寫自己的程序。聲明一個ICLRRuntimeHost類型的變量。調用您懷疑的函數(基於查看頭文件並計數到7或4,取決於位數,或者24,如果我誤解了您的示例)。查看生成的彙編代碼,並確認您的索引是否正確。 (我總是關閉一對這樣的事,所以這將提供一個檢查。)

+0

我是否正確地假設你打算宣佈擴展A? – 2012-08-12 14:36:44

+0

除了我上面的評論,在閱讀這個僞代碼的時候看mscoree.h就可以很好地匹配整個vtable排序方案。看起來這是對我來說最大的缺失環節。 :D – 2012-08-12 15:24:20

+0

是的,B應該延伸A.固定。 – Michael 2012-08-13 05:39:02

0

有在mscoree.h

大致翻譯的東西hexrays會理解來看看ICLRRuntimeHostVtblICLRRuntimeHostVtbl的定義,他們是這樣的:

struct ICLRRuntimeHost { 
    ICLRRuntimeHostVtbl *vtbl; 
}; 
struct ICLRRuntimeHostVtbl { 
    _DWORD (*QueryInterface)(ICLRRuntimeHost*, _DWORD*, void**); 
    _DWORD (*AddRef)(ICLRRuntimeHost*); 
    _DWORD (*Release)(ICLRRuntimeHost*); 
    _DWORD (*Start)(ICLRRuntimeHost*); 
    _DWORD (*Stop)(ICLRRuntimeHost*); 
    _DWORD (*SetHostControl)(ICLRRuntimeHost*, void*); 
    _DWORD (*GetCLRControl)(ICLRRuntimeHost*, void**); 
}; 

你的變量interfacePtr應該有類型:ICLRRuntimeHost,那麼你的代碼應該編譯如下:

interfacePtr->GetCLRControl(&v23); 
相關問題