2012-06-22 27 views
0

從下面的反彙編代碼我可以假定位置43E010是保持串(如在彙編代碼的註釋)的變量的一個位置:定位可變位置中裝配

拆卸:

... 
push offset loc_43E010 
... 
push offset aAllYourBaseAre ; "all your base are belong to us" 
... 
.rdata:00446074 aAllYourBaseAre db 'all your base are belong to us',0 

這是一個Win32應用程序反彙編代碼看起來像這樣:

class Foo { 
public: 
    string mystring;  
    __declspec(dllexport) void foo(); 
}; 

void Foo::foo(){ 

    printf("foo called"); 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Foo foo; 
    foo.mystring = "all your base are belong to us"; 

    return 0; 
} 

這個指令:push offset loc_43E010是否顯示地址43E010是從win32可執行文件的基本映像的偏移量,並且它是一個可變位置?

+2

問題是什麼? –

+0

這條指令是否:「push offset loc_43E010」是指43E010是一個可變的偏移量? – xybrek

+2

它是* something *的偏移量。沒有足夠的信息來確切知道它的偏移量。 –

回答

2

我會調用我的精神力量(HI雷蒙德!),並會胡亂猜測,你看到的是這樣的:

push ebp 
mov  ebp, esp 
push 0FFFFFFFFh 
push offset loc_43E010 
mov  eax, large fs:0 
push eax 
... 
mov  large fs:0, eax 

這是一個功能的一個典型的序言中,使用異常處理。在你的情況下,即使沒有try/catch語句,也存在一個具有非平凡析構函數的局部變量,在傳播異常的情況下需要調用該變量。 loc_43E010是該函數的異常處理程序的標籤。

因此,答案是:不,它是而不是「可變位置」。

要了解有關Win32(SEH和C++)中的異常的更多信息,請檢查my OpenRCE article

+0

我看到了,如果是這種情況,變量賦值的模式是什麼,說一個DWORD或std :: string變量?順便說一句,因爲我認爲你是這方面的專家,你可能想幫助我也這樣:http://stackoverflow.com/questions/11194837/function-address乾杯。 – xybrek

+0

簡而言之,整數賦值是'mov',而'std :: string'賦值則是'std :: strings :: operator =()'的調用。我建議你閱讀[本書](http://www.amazon.com/dp/0764574817/),它在恢復編譯代碼方面有很長的附錄。 –