我们写一个函数,里面必然会用到变量,每个变量都会占用内存,这些内存分成三个种类。
第一个是栈内存,函数内部局部变量是栈内存。栈内存不用我们手动管理,在调用完函数之后 函数会自动释放栈内存。实际上就是函数末尾被编译器添加的mov esp,ebp和pop ebp。
栈内存的大小是有两个大小,一个是reserve ,保留大小。一般是1MB,就是1024*1024字节。一个是1KB,这个4KB是 commit 内存,就是4096字节。reserve内存是说这部分虚拟内存已经预订了,不要再往出分配了,这部分虚拟内存没有和物理内存建立对应关系,你是不能使用这部分内存的。commit内存是说这部分虚拟内存已经和物理内存建立对应关系了,你可以使用这部分内存。当
c++程序默认分配的commit内存是4KB,当你使用的栈内存大于4kb的时候,会在1MB的reserve内存中设置一部分内存为commit内存。
当你函数中申请的栈内存大于4KB的时候,比如下面
int main(int argc, char* argv[])
{
char str[4100]={0};
scanf("%s",str);
printf("%s",str);
return 0;
}
生成的汇编代码会有一探针函数。
mov eax, 1004h call __alloca_probe push edi mov ecx, 400h xor eax, eax lea edi, [esp+1008h+var_1003] mov [esp+1008h+var_1004], 0 rep stosd stosw stosb lea eax, [esp+1008h+var_1004] push eax push offset Format ; "%s" call _scanf add esp, 8 lea ecx, [esp+1008h+var_1004] push ecx push offset Format ; "%s" call sub_401050 add esp, 8 xor eax, eax pop edi add esp, 1004h retn _main endp
__alloca_probe 这个就是探针函数。 在逆向分析的时候,如果遇到这个探针函数,那么就知道了这个使用了至少4KB的栈内存,一般用在解密数据的时候。