Я получил следующий простой код C ++:
#include <stdio.h>
int main(void)
{
::printf("\nHello,debugger!\n");
}
И из WinDbg я получил следующий код разборки:
SimpleDemo!main:
01111380 55 push ebp
01111381 8bec mov ebp,esp
01111383 81ecc0000000 sub esp,0C0h
01111389 53 push ebx
0111138a 56 push esi
0111138b 57 push edi
0111138c 8dbd40ffffff lea edi,[ebp-0C0h]
01111392 b930000000 mov ecx,30h
01111397 b8cccccccc mov eax,0CCCCCCCCh
0111139c f3ab rep stos dword ptr es:[edi]
0111139e 8bf4 mov esi,esp
011113a0 683c571101 push offset SimpleDemo!`string' (0111573c)
011113a5 ff15b0821101 call dword ptr [SimpleDemo!_imp__printf (011182b0)]
011113ab 83c404 add esp,4
011113ae 3bf4 cmp esi,esp
011113b0 e877fdffff call SimpleDemo!ILT+295(__RTC_CheckEsp) (0111112c)
011113b5 33c0 xor eax,eax
011113b7 5f pop edi
011113b8 5e pop esi
011113b9 5b pop ebx
011113ba 81c4c0000000 add esp,0C0h
011113c0 3bec cmp ebp,esp
011113c2 e865fdffff call SimpleDemo!ILT+295(__RTC_CheckEsp) (0111112c)
011113c7 8be5 mov esp,ebp
011113c9 5d pop ebp
011113ca c3 ret
У меня есть некоторые трудности, чтобы полностью понять это. Что здесь делают SimpleDemo! ILT ?
Какой смысл инструкции сравнивать ebp и esp в 011113c0 ?
Поскольку у меня нет никаких локальных переменных в функции main (), почему по-прежнему есть sub esp, 0C0h при расположении 01111383
Большое спасибо.
Обновление 1
Хотя я до сих пор не знаю, что означает ILT , но __RTC_CheckESP предназначен для проверок во время выполнения. Этот код можно убрать, поместив следующую прагму перед функцией main () .
#pragma runtime_checks( "su", off )
Ссылка:
http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx
http://msdn.microsoft.com/en-us/library/6kasb93x.aspx
Обновление 2
Инструкция sub esp, 0C0h выделяет еще один 0C0h байт дополнительного пространства в стеке. Затем EAX заполняется 0xCCCCCCCC, это 4 байта, поскольку ECX = 30h, 4 * 30h = 0C0h, поэтому инструкция rep Stos dword ptr es: [edi] заполняет точно дополнительные пробелы с 0xCC. Но для чего это дополнительное пространство в стеке? Это какой-то безопасный ремень? Также я замечаю, что если я отключу проверку во время выполнения, как показывает Обновление 1, в стеке все еще остается такое дополнительное пространство, хотя и намного меньше. И это пространство не заполнено 0xCC.
Код сборки без проверки времени выполнения приведен ниже:
SimpleDemo!main:
00231250 55 push ebp
00231251 8bec mov ebp,esp
00231253 83ec40 sub esp,40h <-- Still extra space allocated from stack, but smaller
00231256 53 push ebx
00231257 56 push esi
00231258 57 push edi
00231259 683c472300 push offset SimpleDemo!`string' (0023473c)
0023125e ff1538722300 call dword ptr [SimpleDemo!_imp__printf (00237238)]
00231264 83c404 add esp,4
00231267 33c0 xor eax,eax
00231269 5f pop edi
0023126a 5e pop esi
0023126b 5b pop ebx
0023126c 8be5 mov esp,ebp
0023126e 5d pop ebp
0023126f c3 ret