2013-12-12 72 views
1

我需要理解和再現(另一種語言)以下功能(C代碼)的 邏輯 ,我真的不明白,簡單C函數的輸出是什麼,爲什麼?

double __thiscall sub_1(int this) { 

    return * (double *) (this + 12); 

} 

它編譯OK它是做什麼的,但墜毀運行時.exe文件

我不是強以C可言,而且不能找出來, 什麼實際操縱該組操作數是做 *(雙*) 這不是一個解引用,因爲沒有聲明指針。

無論如何,誰能告訴我 - 會是怎樣的功能

爲sub_1輸出(2)爲什麼?

+1

您確定這是確切的功能嗎?這沒有意義。 –

+2

這個問題在[ReverseEngineering.SE](http://reverseengineering.stackexchange.com/)中會更好。你有什麼是原始代碼的粗略反編譯,這是不正確的。 – DCoder

+1

@DCoder好的一個;我沒有看到。所以'this'可能是一個包含12個字節的東西和一個double的結構的地址。 –

回答

3

要使此代碼生效,int this必須是一個保存地址整數值的變量。從該地址開始,必須有一個有效的雙重分配,並有12個字節的偏移量。該代碼返回該double的內容。

因此,如果函數被調用爲sub_1(0x00000010),那麼必須有一個雙變量分配在address 0x0000001C。如果沒有,程序調用未定義的行爲,很可能會崩潰&刻錄。

請注意,使用int傳遞地址沒有任何意義。一個更好的選擇應該是double*,或者至少是uint32_t這不是一個有符號的整數類型。如果地址太大而無法放入int中,該代碼將失敗。

+0

es,這個代碼是接收到的反編譯代碼的一部分,它沒有什麼意義我也是。 我實際上試圖理解的是什麼序列的操作數正在做,而不會進入無用的討論__thiscall等: *(double *)(i)//其中我 - 是int' 步驟通過步驟 '*(i)'正在對'int'進行'??'操作,並且具有一個'??'值''' '(double *)' - 正在執行'''並且結果是類型?和價值? '*(double *)(i)'最終的結果是'''''類型'的值和''' 請問你能幫我把丟失的信息,而不是'''請。 – user3095293

+0

@ user3095293:'*(double *)(i)'將'i'的值解釋爲'double *',然後嘗試對其進行解引用。這通常是一個壞主意,因爲不能保證'i'與指針的大小相同,或者將它看作一個指針是合理的。正如我們試圖告訴你的那樣,在你的代碼片斷中,this不是一個int,而是一個void *(實際上,指向從第12個字節開始有一個double的結構的指針)。 – DCoder