滴水逆向联盟

标题: 对函数头和函数尾我的初理解--有三只熊 [打印本页]

作者: 有三只熊    时间: 2014-3-14 03:52
标题: 对函数头和函数尾我的初理解--有三只熊
本帖最后由 有三只熊 于 2014-3-14 03:58 编辑

    根哥一再强调栈的重要性 相信大家都在此处花了很多功夫 经过N次攻坚 有一点小小的心得 恳请大家批评指正


函数头

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-3-14 08:48
0040D451   mov         ebp,esp   这个我认为是保存ESP,等函数调用完后,恢复ESP用的。(如果有误,欢迎指正)
作者: 有三只熊    时间: 2014-3-15 01:16
有道理:lol     帮助记忆可以这样理解  




欢迎光临 滴水逆向联盟 (http://www.dtdebug.com/) Powered by Discuz! X3.2