Может ли кто-нибудь помочь мне интерпретировать эту простую разборку из WinDbg?
Я получил следующий простой код 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! ИЛТ дела здесь?
Какой смысл инструкции сравнивать ebp и esp в011113c0?
Поскольку у меня нет никаких локальных переменных в функции main (), почему до сих порsub esp, 0C0h в месте отдыха01111383?
Большое спасибо.
Обновление 1Хотя я до сих пор не знаю, чтоИЛТ означает, но __RTC_CheckESP для проверки во время выполнения. Этот код можно устранить, поместив следующую прагму передглавный() функция.
#pragma runtime_checks( "su", off )
Ссылка:
http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx
http://msdn.microsoft.com/en-us/library/6kasb93x.aspx
Обновление 2sub esp, 0C0h Инструкция выделяет еще один 0C0h байтов дополнительного пространства в стеке. Затем EAX заполняется 0xCCCCCCCC, это 4 байта, так как ECX = 30h, 4 * 30h = 0C0h, поэтому инструкцияreps 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