• 2178阅读
  • 4回复

对函数头和函数尾我的初理解 [复制链接]

上一主题 下一主题
离线有三只熊
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2014-03-13
函数头


0040D450   push        ebp                        //保留ebp的值
0040D451   mov         ebp,esp                    //将栈底和栈顶放到一起
0040D453   sub         esp,40h                    //将栈顶向上走16行  空余出16行的空间
0040D456   push        ebx                        //保存ebx的值
0040D457   push        esi                        //保存esi的值
0040D458   push        edi                        //保存edi的值
0040D459   lea         edi,[ebp-40h]              //将edi变成ebx的下方 准备放入数据
0040D45C   mov         ecx,10h                    //规定填充次数 16次
0040D461   mov         eax,0CCCCCCCCh             //准备放入数据  CCCCCCCC是方便纠错
0040D466   rep stos    dword ptr [edi]            //填充16次 将栈填满








函数尾


0040D46A   pop         edi                        //还原edi的值
0040D46B   pop         esi                        //还原esi的值
0040D46C   pop         ebx                        //还原ebx的值
0040D46D   mov         esp,ebp                    //将栈底和栈顶放到一起
0040D46F   pop         ebp                        //还原ebp的值
0040D470   ret                                    //esp+4后 【esp-4】-->eip




  
寄存器      初始值               结束值          变化特征


EDI   =   00000000      -->    00000000    (0012FF40 --> 0012FF80 --> 还原)
ESI   =   02BBF8E8      -->    02BBF8E8    (未发生变化)
EBP   =   0012FFC0      -->    0012FFC0    (0012FF80 --> 还原)
EBX   =   7FFDD000      -->    7FFDD000    (未发生变化)
EIP   =   0040D4B0      -->    00401189  


粗略总结:


1、通过一系列操作 保存的寄存器 有EDI EBP EBX ESI以上4个寄存器 都成功还原为之前的值 其中EBX ESI的值从未发生变化
2、EDI起到了中转站的作用 为填充eax的值指明了位置
3、EBP因为始终指向栈底 所以只进行了1次变化 并成功还原为之前的值
离线啊冲

只看该作者 沙发  发表于: 2014-03-13
学的这么认真啊
熊版必成啊
善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线逍遥枷锁

只看该作者 板凳  发表于: 2014-03-14
熊熊老师你这是我的偶像啊,我表示对你很膜拜。冲冲老师你是我的神致敬。
离线逍遥枷锁

只看该作者 地板  发表于: 2014-03-14
求熊熊老师继续更新自己的知识。
离线lcfqysr

只看该作者 4楼 发表于: 2014-03-14
莫非这是滴水培训内容?
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个