首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
软件逆向
发新帖
1
0
[求助]关于函数体内用esp或ebp做局部变量的问题!
发表于: 2010-2-5 10:57
7649
[求助]关于函数体内用esp或ebp做局部变量的问题!
manbug
2010-2-5 10:57
7649
我是初学者,一直有个问题困扰这我,我们一般在反编译函数体内会看到
push ebp
mov ebp,esp
...
然后在访问局部变量时一般都是用ebp做基址来访问局部变量
但是有时个在同一个程序不同函数体内有的是用esp做为基址来访问局部变量的
不知道为什么会这样,也不知道是什么会造成不同的用法。
既然是同一个编译器为什么会出现这样的情况呢?希望大哥们解释一下,谢了
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
#调试逆向
收藏
・
1
免费
・
0
支持
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
12
)
dtkalaok
雪 币:
150
活跃值:
(16)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
11
粉丝
0
关注
私信
dtkalaok
2
楼
作为局部变量指针
2010-2-5 11:32
0
manbug
雪 币:
220
活跃值:
(55)
能力值:
( LV2,RANK:10 )
在线值:
发帖
39
回帖
188
粉丝
0
关注
私信
manbug
3
楼
楼上未看明白我的意思,我的意思是说,为什么有时候用ebp 而有时候却用esp
我们知道一般都是用ebp的
2010-2-5 11:45
0
第八个门
雪 币:
178
活跃值:
(10)
能力值:
( LV5,RANK:60 )
在线值:
发帖
6
回帖
90
粉丝
0
关注
私信
第八个门
1
4
楼
FP0.....
2010-2-5 11:58
0
resty
雪 币:
424
活跃值:
(10)
能力值:
( LV6,RANK:90 )
在线值:
发帖
4
回帖
190
粉丝
0
关注
私信
resty
2
5
楼
就算是同一个编译器,对于不同的函数会自己选择合适的编译方式。里面有很多使用者想象不出的东西,并不是简单的翻译转换一下那么简单的。
想了解可以参考一些高端的编译器设计的资料,一般的编译原理都不会涉及
2010-2-5 13:20
0
网络游侠
雪 币:
0
活跃值:
(954)
能力值:
( LV3,RANK:30 )
在线值:
发帖
19
回帖
971
粉丝
15
关注
私信
网络游侠
6
楼
在子程序里面如果用到ESP 有两种可能,一种是传地址指针过去,还有一种大多是传参数过去
2010-2-5 14:03
0
xiaobaozi
雪 币:
76
活跃值:
(27)
能力值:
( LV4,RANK:50 )
在线值:
发帖
6
回帖
114
粉丝
0
关注
私信
xiaobaozi
1
7
楼
编译器的问题而已,为了优化就没有使用ebp。其实用不用都无所谓,只要能够保证堆栈平衡
只是看汇编代码的时候很吃力而已
2010-2-5 16:45
0
风扬飘雪
雪 币:
3
活跃值:
(11)
能力值:
( LV2,RANK:10 )
在线值:
发帖
18
回帖
47
粉丝
0
关注
私信
风扬飘雪
8
楼
用ebp做一个esp的保存很多时候用在需要esp对齐到一个比如说16字节对齐的位置时候用吧
然后本函数被传入的参数用ebp访问,esp访问本函数里面的局部变量
2010-2-6 02:48
0
zcchm
雪 币:
171
活跃值:
(10)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
25
粉丝
0
关注
私信
zcchm
9
楼
使用esp而不使用ebp,称为FPO---栈指针省略。使用ebp,对于分析汇编更加方便,编译器采用FPO的原因是可以减少代码体积,提高执行效率,毕竟节省了几行汇编。编译器里可以设置FPO选项。
2010-2-9 09:32
0
JBoy
雪 币:
123
活跃值:
(10)
能力值:
( LV2,RANK:10 )
在线值:
发帖
6
回帖
121
粉丝
0
关注
私信
JBoy
10
楼
遇到这种情况,个人一般边看代码边算堆栈变化,习惯了就会比较熟悉了的,比ebp寻址的麻烦不到哪去
2010-2-11 18:59
0
manbug
雪 币:
220
活跃值:
(55)
能力值:
( LV2,RANK:10 )
在线值:
发帖
39
回帖
188
粉丝
0
关注
私信
manbug
11
楼
谢谢各位解答,总算明白了
2010-2-11 19:58
0
NutCracker
雪 币:
39
活跃值:
(2876)
能力值:
( LV2,RANK:10 )
在线值:
发帖
5
回帖
193
粉丝
8
关注
私信
NutCracker
12
楼
(1) 在VC++中,你只要点
Project->Settings->C/C++
->Optimizations->Disable(Debug)
这样编译出来的堆栈框架就是EBP的;
(2) 在C++Builder中,
Project->Options->Compiler->Compiling->Stack frames(打勾)
这样编译出来的堆栈框架也是EBP的;
2010-2-11 21:13
0
splitpants
雪 币:
68
活跃值:
(11)
能力值:
( LV2,RANK:10 )
在线值:
发帖
15
回帖
85
粉丝
0
关注
私信
splitpants
13
楼
额。。还有这么多学问呢啊。呵呵。学习了。。FPO。。。
2010-2-13 11:03
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
manbug
39
发帖
188
回帖
10
RANK
关注
私信
他的文章
[求助]C#的DLL文件用ildasm反编译后修改,然后用ilasm重新编译成功,但是程序运行不了了
5288
有没有vmware虚拟机防检测插件什么的工具?
4810
[原创]自己制做IDA签名文件批处理!外带1个问题
5718
[求助]自己写的一个监听本地端口的工具,360报毒!why?
6829
dup换肤的原理是什么
4094
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部