Answers
0xCC在调试版本中应该不是一个随机的值,而是有意为之。每当程序调用一个函数,该该函数会生成一个函数栈,用以存放局部的变量,在将这些局部变量push进栈前,会将栈内所有的字节初始化为0xcc. 为了理解初始化为0xcc的过程,要理解汇编指令stosd,其他还有stosb、stosw
如以下汇编指令会在进入函数时频繁看到的汇编指令
stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中,同时,edi会增加4(字节数)。rep使指令重复执行ecx中填写的次数。方括弧表示存储器,这个地址实际上就是edi的内容所指向的地址。这里的stos其实对应的是stosd,其他还有stosb、stosw,分别对应于处理4、1、2个字节,这里对堆栈中30h*4(0c0h)个字节初始化为0cch(也就是int 3指令的机器码),这样发生意外时执行堆栈里面的内容会引发调试中断。更详细的分析参见 天书夜读:从汇编语言到Windows内核编程 1.2.2 数据传送指令 章节。