对call、retn的深入分析和认识
来源:互联网 发布:fgo石头号除了淘宝 编辑:程序博客网 时间:2024/05/01 16:15
为了加深对call、retn的理解,我今天用delphi写了一个小程序,在OD中跟踪程序执行call及retn时堆栈的变化。
程序很简单:
对应的汇编代码:
004A4D28 . B8 3C4D4A00 mov eax, 004A4D3C ; ASCII "bbbbbbbb"
004A4D2D . E8 9EFFFFFF call 004A4CD0
004A4D32 . C3 retn
004A4CD0 /$ 55 push ebp
...........
004A4D21 . 59 pop ecx
004A4D22 . 59 pop ecx
004A4D23 . 5D pop ebp
004A4D24 . C3 retn
执行到004A4D2D,esp=0013F630,F7进去后到达004A4CD0 也就是summ的第一句代码,esp=0013F62C,也就是说执行call xx系统进行了一个压栈操作!执行到 004A4D24时,esp=0013F62C(和执行到第一句代码时相等),执行了retn后,esp=0013F630,也就是说retn进行了一个出栈的动作!
另外,函数执行完毕的前后,不管是stdcall还是fastcall,都不保证寄存器不被修改!
总结:
1、执行到函数内的第一个语句时的esp值和到最后一个语句(也就是retn)的esp值是一样的:
004A4CD0 /$ 55 push ebp ;esp=0013F628
004A4CD1 |. 8BEC mov ebp, esp
004A4CD3 |. 5D pop ebp
004A4CD4 /. C2 0400 retn 4 ;esp=0013F628
2、retn 4表示pop 2次。
3、执行到call xx时的esp值与执行完xx时的esp值不一定相等,对stdcall的尤其是这样。
粗浅分析,不当之处还请指出。
- 对call、retn的深入分析和认识
- 反汇编的call和retn
- 反汇编的call和retn
- 【破解小札记】--call、retn 和 retf
- 执行retn、call、leave指令的时候,esp和eip的变化情况
- CALL与retn
- call 和 apply 的认识
- 对Java接口和抽象类的认识及分析
- 纠正对call stack的错误的认识
- js中对call()函数和apply()函数的深入探索
- call和apply的深入理解
- retn
- equal和hashcode的深入认识
- session和cookie的深入认识
- 发现Hibernate的bug与对Properties的深入认识
- this call apply的认识
- call,apply 和 bind 的对比分析
- 对 Map HashMap LinkedHashMap TreeMap 的深入认识
- 更改word内公式字号大小
- JAVA变量path , classpth ,java_home设设置作用和作用
- 英语学术论文写作的几个细节 (转)
- Tiles 中文乱码处理
- hdu1012 变态的输出
- 对call、retn的深入分析和认识
- 学习使用vi萤幕编辑器
- struts 实现文件上传与下载
- C#下调用C写的dll的例子
- blog 测试
- 由我朋友想做IM想到的一些
- 当注入拥有sa权限,提升webshell权限!
- 关于C#中的out和ref
- 一个典型的Spring的applicationcontext.xml配置文件