吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1478|回复: 8
收起左侧

[求助] 关于平衡堆栈问题

[复制链接]
dnz 发表于 2020-3-22 20:25
如图:
为什么使用了四个push还要用减去8呢
新建位图图像.gif

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| dnz 发表于 2020-3-22 20:34
这里的
00486540             |. 83C4 F8        ADD ESP,-0x8
是因为以下申请了局部变量
00486543             |. 884C24 04      MOV BYTE PTR SS:[ESP+0x4],CL
00486547             |. 891424         MOV DWORD PTR SS:[ESP],EDX
来进行的
无闻无问 发表于 2020-3-22 20:54
函数头并不是平衡堆栈,retn处或call函数之后才是平衡堆栈,分外平栈和内平栈,你这里是函数头,是函数申请栈空间,即函数中局部变量需要用的空间…
 楼主| dnz 发表于 2020-3-22 20:59
无闻无问 发表于 2020-3-22 20:54
函数头并不是平衡堆栈,retn处或call函数之后才是平衡堆栈,分外平栈和内平栈,你这里是函数头,是函数申请 ...

你好,楼主的图上面函数中的PUSH离下面的函数调用很远,这里的push都是給下面的函数call进行传参的么?
无闻无问 发表于 2020-3-22 21:04
dnz 发表于 2020-3-22 20:59
你好,楼主的图上面函数中的PUSH离下面的函数调用很远,这里的push都是給下面的函数call进行传参的么?

这个应该是保存现场…传参是call上方,call内头部为保存现场,函数尾部有对应的pop xxx还原现场…
 楼主| dnz 发表于 2020-3-22 21:13
无闻无问 发表于 2020-3-22 21:04
这个应该是保存现场…传参是call上方,call内头部为保存现场,函数尾部有对应的pop xxx还原现场…

那CALL上下文出没有push的传参怎么判断呢?
 楼主| dnz 发表于 2020-3-22 21:15
dnz 发表于 2020-3-22 21:13
那CALL上下文出没有push的传参怎么判断呢?

比如这一段的call调用
0048653C             /$ 53             PUSH EBX
0048653D             |. 56             PUSH ESI
0048653E             |. 57             PUSH EDI
0048653F             |. 55             PUSH EBP
00486540             |. 83C4 F8        ADD ESP,-0x8
00486543             |. 884C24 04      MOV BYTE PTR SS:[ESP+0x4],CL
00486547             |. 891424         MOV DWORD PTR SS:[ESP],EDX
0048654A             |. 8BD8           MOV EBX,EAX
0048654C             |. 33C0           XOR EAX,EAX
0048654E             |. 8B73 14        MOV ESI,DWORD PTR DS:[EBX+0x14]
00486551             |. 85F6           TEST ESI,ESI                             ;  如果角色血量为0则跳出函数
00486553             |. 74 41          JE SHORT RPG_RT.00486596
00486555             |. 8BFE           MOV EDI,ESI                              ;  当前角色血量
00486557             |. 8BC3           MOV EAX,EBX                              ;  当前角色指针
00486559             |. 8B10           MOV EDX,DWORD PTR DS:[EAX]               ;  某个函数地址
0048655B             |. FF52 28        CALL DWORD PTR DS:[EDX+0x28]             ;  RPG_RT.00488410
0048655E             |. 8BC8           MOV ECX,EAX
00486560             |. 8BC6           MOV EAX,ESI
00486562             |. 2B0424         SUB EAX,DWORD PTR SS:[ESP]
00486565             |. 33D2           XOR EDX,EDX
00486567             |. E8 4480FDFF    CALL RPG_RT.0045E5B0
0048656C             |. 8BE8           MOV EBP,EAX
0048656E             |. 896B 14        MOV DWORD PTR DS:[EBX+0x14],EBP          ;  在此进行扣血
00486571             |. 85ED           TEST EBP,EBP
00486573             |. 75 1C          JNZ SHORT RPG_RT.00486591
00486575             |. 807C24 04 00   CMP BYTE PTR SS:[ESP+0x4],0x0
0048657A             |. 74 0E          JE SHORT RPG_RT.0048658A
0048657C             |. BA 01000000    MOV EDX,0x1
00486581             |. 8BC3           MOV EAX,EBX
00486583             |. E8 80050000    CALL RPG_RT.00486B08
00486588             |. EB 07          JMP SHORT RPG_RT.00486591
0048658A             |> C743 14 010000>MOV DWORD PTR DS:[EBX+0x14],0x1
00486591             |> 8BC7           MOV EAX,EDI
00486593             |. 2B43 14        SUB EAX,DWORD PTR DS:[EBX+0x14]
00486596             |> 59             POP ECX
00486597             |. 5A             POP EDX
00486598             |. 5D             POP EBP
00486599             |. 5F             POP EDI
0048659A             |. 5E             POP ESI
0048659B             |. 5B             POP EBX
0048659C             \. C3             RETN

罗萨 发表于 2020-3-22 23:05
你发的代码本身就是一个函数,入口处push用来保护现场
罗萨 发表于 2020-3-22 23:06
至于你说的传参 ebx就是参数
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表