我使用Visual C ++ 10编译以下程序:
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 :(得分:1)
我重现了这种行为。你也可以注意到这些函数以mov edi,edi intruction开头。
int 3指令以及函数开头的mov edi,edi指令允许热修改。 当需要对一个函数进行热补丁时,mov edi,edi将被一个跳转指令替换,该指令在函数的入口点之前跳转,而int 3指令被跳转到补丁函数的替换。
请参阅Anyone knows what "mov edi,edi " does?
不知道为什么__report_gsfailure仅在2 int 3之前,即使它以mov edi,edi指令开头......
答案 1 :(得分:1)