调试使用windows堆程序遇到的问题
今天测试我的api hook demo,中间有个单向链表,我对他进行遍历的时候,通过判断链表当前元素是否为NULL(即0)来进行循环控制,在cmd下正常运行,输出的是:,struct addr is 902e40,next struct addr is 904ef8,struct addr is 904ef8,next struct addr is 0。
但是我OD加载运行,却输出下面的结果:struct addr is 902e40,next struct addr is 904ef8,struct addr is 904ef8,next struct addr is baadf00d。
经过查找原因在此:
在调试状态下,微软的堆管理函数也会在分配和释放的时候添加一些初始化值。LocalAlloc/GlobalAlloc,如果指定的是LMEM_FIXED(默认就指定了这个),并且没有指定LMEM_ZEROINIT,则分配的内存中初始化值为BAADF00D。
所以错误在于我用malloc创造链表元素的时候,next指针没有赋值为NULL(我记得明明赋值了的,所以没想到问题出在这里)。
另附一篇博文,收集了常用的magic number:http://www.cnblogs.com/georgepei/archive/2012/07/02/2573292.html。