Что это за странные инструкции ассемблера по разборке моей основной функции? - PullRequest
2 голосов
/ 09 апреля 2020

Так что у меня есть эта основная функция, и она производит много странных инструкций. Я использую Visual Studio 2019, и я нахожусь в режиме отладки, поэтому оптимизации отключены. Что делают эти инструкции?

int main()
{
00D340E0  push        ebp  
00D340E1  mov         ebp,esp  
00D340E3  sub         esp,104h  
00D340E9  push        ebx  
00D340EA  push        esi  
00D340EB  push        edi  
00D340EC  lea         edi,[ebp-104h]  
00D340F2  mov         ecx,41h  
00D340F7  mov         eax,0CCCCCCCCh  
00D340FC  rep stos    dword ptr es:[edi]  
00D340FE  mov         eax,dword ptr [__security_cookie (0D3A024h)]  
00D34103  xor         eax,ebp  
00D34105  mov         dword ptr [ebp-4],eax  
00D34108  mov         ecx,offset _842A6236_main@cpp (0D3C012h)  
00D3410D  call        @__CheckForDebuggerJustMyCode@4 (0D31208h) 

(the rest of the file...)

РЕДАКТИРОВАТЬ: под странным, я имел в виду, я не понимаю, что здесь происходит, не то, что это не стандартно.

1 Ответ

1 голос
/ 09 апреля 2020

Это помощники по отладке.

__security_cookie используется для проверки записи после конца стека (например, если вы переполняете буфер на основе стека). Фактическая проверка выполняется при выходе из функции.

__CheckForDebuggerJustMyCode позволяет отладчику переключаться на «системные, инфраструктурные, библиотечные и другие не пользовательские вызовы», см. здесь .

И этот код:

lea         edi,[ebp-104h]  
mov         ecx,41h  
mov         eax,0CCCCCCCCh  
rep stos    dword ptr es:[edi]

Заполняет кадр стека мусорными байтами, которые (например) вызовут исключение при разыменовании неинициализированного указателя.

Ничего из этого материал присутствует в сборках выпуска, только в сборках отладки.

...