0x01  栈简介

    首先局部变量的分配释放是通过调整栈指针实现的,栈为函数调用和定义局部变量提供了一块简单易用的空间,定义在栈上的变量不必考虑内存申请和释放。只要调整栈指针就可以分配和释放内存。

    每个函数在栈中使用的区域叫做栈帧Stack Frame,在X86中,通常使用EBP寄存器作为帧指针使用,EBP寄存器所指向的栈单元中保存的是前一个EBP寄存器的值,通常也就是父函数的EBP值。帧指针不仅对函数中的代码起到定位变量和参数的参照物作用,而且将栈中的一个个栈帧串联在一起,形成了一个可以遍历所有栈帧的链条,这也就是栈回溯的基本原理。值得注意的是必须要保证函数返回时栈指针的值与进入函数时一致,即保证栈平衡。
 
 
0x02  栈帧
     百度百科的经典解释:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。

    可以理解为:栈帧就是存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元。栈帧表示程序的函数调用记录,而栈帧又是记录在栈上面,很明显栈上保持了N个栈帧的实体

    

0x03  栈回溯简单实现

     通过帧指针ebp来实现函数返回地址,调用地址的获取。

     对于这里的call指令,研究的是E8类型的call指令机器码,其他类型的call指令并未采取相关的操作。

     机器码e8后面的四字节是一个相对偏移,即当前指令指针中(EIP)(即下一条指令的地址)的值与目的地址(被调函数首地址)的差值。所以目的地址(被调函数首地址)的计算方法为: 目的地址 =  返回地址 +  相对偏移(四字节机器码)

     

     下一条指令地址:0x011c1722 + 5 = 011c1727

     如上图:0x011c1727 + 0xFFFFF933 = 0x011c105a目的地址(被调函数首地址)

     所以可以根据call机器指令的特征码E8来找到函数返回地址和被调用函数地址。

  

void __stdcall StackTraceFunction(int StackBase, int ebp, int esp)
{
LONG_PTR LimitCount = 30;
LONG_PTR RetAddress = 0;
LONG_PTR CalleeFunctionAddress = 0;
printf("ebp RetAddress CalleeFunctionAddress\n"); while ((ebp > esp) && (ebp < StackBase) && (LimitCount--))
{
int v1 = ebp;
int v2 = esp;
RetAddress = *(LONG_PTR *)(ebp + 4);
CalleeFunctionAddress = 0; if (*(unsigned char *)(RetAddress - 5) == 0xe8)
{
CalleeFunctionAddress = *(LONG_PTR *)(RetAddress - 4) + RetAddress;
} printf("%08x %08x %08x\n", ebp, RetAddress, CalleeFunctionAddress);
ebp = *(LONG_PTR *)ebp;
}
}

  

栈回溯简单实现(x86)的更多相关文章

  1. linux中oops信息的调试及栈回溯【转】

    本文转载自:http://blog.csdn.net/kangear/article/details/8217329 ========================================= ...

  2. arm平台的调用栈回溯(backtrace)

    title: arm平台的调用栈回溯(backtrace) date: 2018-09-19 16:07:47 tags: --- 介绍 arm平台的调用栈与x86平台的调用栈大致相同,稍微有些区别, ...

  3. linux中Oops信息的调试及栈回溯

    Oops 信息来源及格式 Oops 这个单词含义为“惊讶” ,当内核出错时(比如访问非法地址)打印出来的信息被 称为 Oops 信息. Oops 信息包含以下几部分内容. 1 一段文本描述信息. 比如 ...

  4. linux内核中打印栈回溯信息 - dump_stack()函数分析【转】

    转自:http://blog.csdn.net/jasonchen_gbd/article/details/45585133 版权声明:本文为博主原创文章,转载请附上原博链接.   目录(?)[-] ...

  5. 内核中dump_stack的实现原理(1) —— 栈回溯

    环境 Aarch64 Qemu aarch64-linux-gnu-gcc linux-4.14   概述     栈回溯的目的是将函数的调用栈打印出来,对于分析函数调用和debug系统异常会很有帮助 ...

  6. Lua中如何实现类似gdb的断点调试--03通用变量修改及调用栈回溯

    在前面两篇01最小实现及02通用变量打印中,我们已经实现了设置断点.删除断点及通用变量打印接口. 本篇将继续新增两个辅助的调试接口:调用栈回溯打印接口.通用变量设置接口.前者打印调用栈的回溯信息,后者 ...

  7. 怎么从代码中拿到栈回溯信息(call stack trace)

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:怎么从代码中拿到栈回溯信息(call stack trace).

  8. hdu Train Problem I(栈的简单应用)

    Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot o ...

  9. Oops信息及栈回溯

    1. Oops信息来源及格式Oops这个单词含义为“惊讶”,当内核出错时(比如访问非法地址)打印出来的信息被称为Oops信息.Oops信息包含以下几部分内容:(1)一段文本描述信息.      比如类 ...

随机推荐

  1. 【Linux】linux常用查看命令

    查看磁盘大小的命令df .du df -h 查看整台服务器的硬盘使用情况 du -sh * 查看每个文件夹的大小 ps -ef 查看所有进程 top 实时显示进程状态用户 free -m 查看内存使用 ...

  2. Stanford: Creating a Hadoop-2.x project in Eclipse

    Creating a Hadoop-2.x project in Eclipse http://snap.stanford.edu/class/cs246-data-2014/hw0.pdf Hado ...

  3. redis 持久化方式

    对于persistence持久化存储,Redis提供了两种持久化方法: Redis DataBase(简称RDB) 执行机制:快照,直接将databases中的key-value的二进制形式存储在了r ...

  4. C# string 字符串详解 恒定 驻留

    string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨.这篇文章共四节,来讲 ...

  5. spring boot 多数据源配置与使用

    在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文 ...

  6. python-day81--Ajax

    一.准备知识:json 1.什么是json? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.任何的语言之间都可以用json进行数据的交 ...

  7. 新增节点NewBook并增加属性Name="WPF"

    XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); var root = xmlDoc.DocumentElement;//取到 ...

  8. [转载]完全理解Python迭代对象、迭代器、生成器

    译文地址:liuzhijun 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导 ...

  9. python 解析与生成xml

    xml.etree.ElementTree模块为xml文件的提取和建立提供了简单有效的API.下文中使用ET来代表xml.etree.ElementTree模块. XML是一种内在的分层的数据形式,展 ...

  10. Python爬虫原理

    前言 简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前: 一.爬虫是什 ...