又搜索了一下,发现这段代码很有来头的.
利用了堆栈执行的方法.
ret以后,要从堆栈里弹出返回地址,于是UnmapViewOfFile就弹出来了,这个API需要参数,于是就从堆栈里去取,它根据汇编语法,认为栈顶元素是返回地址,参数要+4,所以取到了push module.
执行完以后,又返回到它认为的返回地址,即DeleteFile,这个也需要参数,刚才module已弹出,所以它又认为push ExitProcess 是返回地址,参数要+4,所以取到了push eax,执行完以后,又返回到他认为的返回地址,即ExitProcess,...
所以为什么要PUSH进两个0的原因也清楚了,是为了堆栈平衡.
这段代码很神奇的用堆栈执行了3个操作,很有技巧和水平. 现在才明白.
感谢楼上高手指点.