为什么有些函数的位置很密集,而有些函数则排列整齐,用int - 3指令填充?
Why are some functions located densely and others are aligned and padded with int 3 instructions?
我用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指令开始?
相关文章:
- 在函数 'int main(int, char**) 中,没有声明 'MIN'
- 错误:无效使用非静态成员函数"int test::hotplug_callback(libusb_contex
- 重载函数 int vs double
- 错误 C2084:函数"int main(void)"已具有主体
- 无效使用非静态成员函数 int test::funcAB(int, int)
- 错误:函数"int open(...)"的隐式声明
- 如何在没有参数的情况下实现返回双向链表大小的函数?int size() const.
- 错误:参数太少,无法函数"int Solution(std::vector<int>, int)"
- arr++ 在函数"int f(int arr[])"中是什么意思?
- 带有声明帐户的C 构造函数(int = 0);
- 如何初始化一个在C++中期望向量和变量的构造函数<int>?
- C++,实现函数"int next(std::string param)"时出现奇怪的编译器错误
- 单链表交换函数(int,int)
- 插入 std::map<int, std::vector 的简短函数<int>>
- 函数int get()和istream&get(char&c)有什么区别
- 该函数 int f() 没有警告不返回任何值?
- 没有用于启动"ostream_iterator"的匹配构造函数<int>
- 函数"int __cdecl invoke_main(void)"中引用LNK2019未解析的外部符号_main错误 (?invoke_main@@YAHXZ)
- 函数"int (*function())[10];"是什么意思?
- 非成员函数 'int find(const T&)' 不能有 cv 限定符