Почему некоторые функции расположены плотно, а другие выровнены и дополнены инструкциями int 3? - PullRequest
1 голос
/ 30 сентября 2011

Я компилирую следующую программу с 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 инструкций

Почему разница?Почему некоторые функции расположены плотно, а другие разделены недоступным кодом?

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Я воспроизвел это поведение. Вы также можете заметить, что эти функции начинаются с mov edi, edi intruction.

Инструкции int 3 вместе с инструкцией mov edi, edi в начале функции позволяют выполнять горячее исправление. Когда требуется выполнить горячее исправление функции, mov edi, edi заменяется инструкцией быстрого перехода, которая переходит до точки входа функции, а инструкции int 3 заменяются длинным переходом к исправленной функции.

См. Кто-нибудь знает, что делает "mov edi, edi"?

Не знаю, почему __report_gsfailure предшествует только 2 int 3, даже если он начинается с инструкции mov edi, edi ...

...