2011-09-30 15 views
1

我編譯使用Visual C++ 10以下程序:爲什麼一些函數密集定位,而其他函數是用int 3指令對齊和填充的?

include <Windows.h> 
int _tmain(int /*argc*/, _TCHAR* /*argv*/[]) 
{ 
    Sleep(0); 
    return 0; 
} 

,並考慮拆卸。程序映像中有很多C++運行時功能。一些功能位於密集型 - ret的某些功能之後是下一個功能的第一條指令。例如,

` __declspec(noreturn) void __cdecl __report_gsfailure(ULONGLONG StackCookie)` 

在地址004013B7結束(有一個ret指令)和地址004013B8包含其他一些功能的量,調試器不能找到源。同時

BOOL __cdecl _ValidateImageBase(PBYTE pImageBase) 

結束於地址00401554但接下來的功能

PIMAGE_SECTION_HEADER __cdecl _FindPESection(PBYTE pImageBase, DWORD_PTR rva) 

開始在地址00401560有是後者的兩個地址之間的多個int 3指令。

爲什麼區別?爲什麼一些函數密集放置,而其他函數是用不可達代碼分隔的?

+0

鑑於你的兩個例子:這兩個函數都以'8'的倍數開始,而以'7'結尾的函數恰好不需要任何填充。如果你能找到另一個與函數是8對齊的假設相矛盾的例子,請添加它。 –

+0

@Steve Jessop:好的,但有11個字節的填充,而不是3. – sharptooth

+0

糟糕,不,我很笨。第二種情況是'54',而不是'58'。 –

回答

1

我轉載了此行爲。您也可以注意到這些函數以mov edi,edi intruction開頭。

int 3指令與函數開頭的mov edi,edi指令一起允許hotpatching。 當需要對函數進行熱補丁時,mov edi,edi被替換爲在函數入口點之前跳轉的短跳轉指令,並將int 3指令替換爲跳至補丁函數的長跳轉。

參考Anyone knows what "mov edi,edi " does?

不知道爲什麼__report_gsfailure僅由2 INT 3 preceeded即使有MOV EDI,EDI指令開始......

+0

我想過了,但結果是有'mov edi,edi'開頭的函數,同時它們前面沒有填充。 – sharptooth

相關問題