为什么有些函数的位置很密集,而有些函数则排列整齐,用int - 3指令填充?

Why are some functions located densely and others are aligned and padded with int 3 instructions?

本文关键字:函数 int 指令 填充 位置 为什么 排列      更新时间:2023-10-16

我用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指令。

为什么有差异?为什么一些函数被密集地放置,而另一些函数被不可访问的代码分开?

我复制了这个行为。您还可以注意到,这些函数以一个mov,edi,edi指令开始。

int 3指令,以及函数开头的mov edi、edi指令允许热补丁。当需要对函数进行热补丁时,将mov edi、edi替换为在函数入口点之前跳转的短跳指令,将int 3指令替换为跳转到已补丁函数的长跳指令。

参考有人知道吗?呢?

不知道为什么__report_gsfailure只在2 int 3之前,即使它以mov edi,edi指令开始…

Raymond Chen告诉你所有你需要知道的:为什么Windows函数都以毫无意义的MOV EDI, EDI指令开始?