zoukankan      html  css  js  c++  java
  • 查看调用栈的命令kb内容分析

    #include "stdafx.h"
    
    int fun0(int i)
    {
    	return i;
    };
    
    int fun1(int i)
    {
    	return fun0(i);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	fun1(10);
    
    	return 0;
    }


    代码如上

    我们在test!fun1下个断点,g运行,断下来后:


    我们来观注下蓝色小框的地址是RetAddr,具体指什么,跳转到此处汇编:


    很明显了,就是运行函数后的下一条要执行的指令

    我们再看看ChildEBP的含义:

    现在打印下ebp值:

    0:000> r ebp
    ebp=002ef930
    很诡异,怎么会是前一个栈的ebp呢,其实我们可以注意到当前汇编是push ebp

    而这个函数用到的ebp应该是到mov ebp, esp之后,单步调过此处,再看其值:


    也就是ChildEbp就是当前函数需要使用的EBP,不要被ChildEbp的child字面意思搞晕了~~~~


    有函数调用的栈中的情况:


    在内存中的一系列的值是可以被识别出来的, 这些值表示当前栈中的某个地址, 并且在这些值之后是一个可执行的地址.

    0:000> lm
    start    end        module name
    011e0000 011fb000   test     C (private pdb symbols)  E:\test\Debug\test.pdb
    53ca0000 53dc3000   MSVCR90D   (deferred)             
    756f0000 7573b000   KERNELBASE   (deferred)   

    再看下转存的栈


    可以看到,蓝色的地址和最右排地址相差无几,极可能是当前栈的某个地址,后面接着红色部分是在test模块内的,所以应该是返回地址

    以后为重启了次程序运行结果,我们可以打印出kb看到:

    0:000> kb
    ChildEBP RetAddr  Args to Child              
    0029fbb4 011f1417 0000000a 0029fd64 00000000 test!fun0+0xb [e:\test\test\test.cpp @ 7]
    0029fc8c 011f1465 0000000a 00000000 00000000 test!fun1+0x27 [e:\test\test\test.cpp @ 13]
    0029fd64 011f19f8 00000001 00331b90 00334800 test!wmain+0x25 [e:\test\test\test.cpp @ 19]
    0029fdb4 011f183f 0029fdc8 75aaed6c 7ffdd000 test!__tmainCRTStartup+0x1a8 [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 583]
    0029fdbc 75aaed6c 7ffdd000 0029fe08 7757377b test!wmainCRTStartup+0xf [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 403]
    0029fdc8 7757377b 7ffdd000 764a1a3e 00000000 kernel32!BaseThreadInitThunk+0xe
    0029fe08 7757374e 011f107d 7ffdd000 00000000 ntdll!__RtlUserThreadStart+0x70
    0029fe20 00000000 011f107d 7ffdd000 00000000 ntdll!_RtlUserThreadStart+0x1b

    这是fun1用到的ebp,按图就知道,保存的EBP和返回地址是连续的.

    后面的test!fun1+0x27其实是通过寻找上一行的返回地址(011f1417)得来的,可以使用ln 011f1417查看.


     


  • 相关阅读:
    樊登读书 增长黑客
    樊登读书 不妥协的谈判
    樊登读书 反脆弱 MD
    樊登读书 思考快与慢
    JS常见的API扩展形式(prototype、jquery、vue插件封装)以及怎样设计出易扩展的表单验证功能?
    [JS设计模式]:策略模式及应用-计算奖金、表单验证的实现(5)
    JS之Math.sin与Math.cos介绍及应用-实现鼠标点击后的烟花效果
    webpack系列-externals配置使用(CDN方式引入JS)
    vue+webpack工程中怎样在vue页面中引入第三方非标准的JS库或者方法
    2-class.com
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693441.html
Copyright © 2011-2022 走看看