首页
社区
课程
招聘
堆栈未能自动平衡,编译器BUG?
发表于: 2005-12-7 21:45 5366

堆栈未能自动平衡,编译器BUG?

2005-12-7 21:45
5366
我用MASM32包,写了个函数如下:
.model flat, stdcall
。。。。。。。。。。。
_DisplayDataHex        proc       
                pushad
                mov        esi,offset szClearBuf
                mov        edi,dwClearBufLen
                invoke        RtlZeroMemory,offset szBufHex,1024
                .while        edi != 0
                        invoke        wsprintf,offset szTest,offset szFmtTs,byte ptr [esi]
                        invoke        lstrcat,offset szBufHex,offset szSpace
                        invoke        lstrcat,offset szBufHex,offset szTest
                        add        esi,1
                        dec        edi
                .endw
                invoke        SendMessage,hWinInfo,EM_SETSEL,-1,-1
                invoke        SendMessage,hWinInfo,EM_REPLACESEL,FALSE,offset szBufHex
                invoke        SendMessage,hWinInfo,EM_SETSEL,-1,-1
                invoke        SendMessage,hWinInfo,EM_REPLACESEL,FALSE,offset szDA
                popad
                ret
_DisplayDataHex        endp

用OD反编译后,发现进入函数时,ESP为0012F968,执行到RET的时候,ESP为0012F8F6,函数未能自动平衡,应该是wsprintf,lstrcat这2个函数出了问题,这是编译器的BUG吗

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
wsprintf是特殊的函数,参数数量是可变的,需要自己平衡堆栈
2005-12-7 22:49
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感觉不是这么简单,wsprintf我用过N次了,就这次出问题,我手动恢复平衡后,消息处理函数那里也出问题,堆栈又失去平衡
2005-12-8 21:11
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
仔细看了一下,invoke是可以自动处理堆栈平衡的

出错的原因在于你的写法:
invoke  wsprintf,offset szTest,offset szFmtTs,byte ptr [esi]
编译以后结果成:
PUSH 0
MOV AL,BYTE PTR DS:[ESI]
MOVZX AX,AL
PUSH AX
PUSH offset szFmtTs
PUSH offset szTest
CALL <JMP.&user32.wsprintfA>
ADD ESP,0C

变成4个参数了,显然已经错了,应该不能用byte ptr [esi]作为函数的参数;

可以分开两行来写:
movzx eax,byte ptr [esi]
invoke  wsprintf,offset szTest,offset szFmtTs,eax
编译以后的结果是:
MOVZX EAX,BYTE PTR DS:[ESI]
PUSH EAX
PUSH offset szFmtTs
PUSH offset szTest
CALL <JMP.&user32.wsprintfA>
ADD ESP,0C
2005-12-8 22:25
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
学习了
2005-12-8 22:32
0
游客
登录 | 注册 方可回帖
返回
//