Я получил следующий простой код на С++:
#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