我最近一直在学习x86组件的逆向工程,在我的教程中有一句话说Ebp指向旧的Ebp,但我不明白这一点,它的混乱。我查了一下其他的帖子,但是没有人回答我的问题。
ee7vknir1#
一个帧指针指向另一个帧指针的意义在于,这创建了堆栈帧的链表,每个堆栈帧可以用于标识先前(调用,调用)堆栈帧-这意味着(A)调试器可以跟踪调用堆栈,(B)我们可以展开堆栈以进行异常处理(catch/throw)。(Note需要一些附加的行为/信息来完成这些作业,并且帧指针机制只是完成堆栈跟踪的几种方式之一)。当前ebp是指当前帧已存储先前ebp值的位置。这样就创建了一个经典的单链表,所以,解引用当前ebp并得到先前ebp的值,对先前也这样做并得到先前ebp的值。因为前一个ebp是作为新调用函数的第一次推送而推送的,而新调用函数是使用某个调用指令调用的,所以我们知道堆栈上每个旧ebp值的正上方都有一个返回地址。由于返回地址总是紧挨着ebp,因此我们可以跟踪每个ebp找到它的调用者(调用者的帧),我们可以找到执行调用的代码-这需要使用返回地址和一些范围检查来识别调用函数。由指向前一帧的ebp值创建的链表的关键元素是访问堆栈帧中的返回地址(甚至函数中的哪个位置)进行调用。
ebp
1条答案
按热度按时间ee7vknir1#
一个帧指针指向另一个帧指针的意义在于,这创建了堆栈帧的链表,每个堆栈帧可以用于标识先前(调用,调用)堆栈帧-这意味着(A)调试器可以跟踪调用堆栈,(B)我们可以展开堆栈以进行异常处理(catch/throw)。
(Note需要一些附加的行为/信息来完成这些作业,并且帧指针机制只是完成堆栈跟踪的几种方式之一)。
当前
ebp
是指当前帧已存储先前ebp
值的位置。这样就创建了一个经典的单链表,所以,解引用当前
ebp
并得到先前ebp
的值,对先前也这样做并得到先前ebp
的值。因为前一个
ebp
是作为新调用函数的第一次推送而推送的,而新调用函数是使用某个调用指令调用的,所以我们知道堆栈上每个旧ebp
值的正上方都有一个返回地址。由于返回地址总是紧挨着
ebp
,因此我们可以跟踪每个ebp
找到它的调用者(调用者的帧),我们可以找到执行调用的代码-这需要使用返回地址和一些范围检查来识别调用函数。由指向前一帧的ebp
值创建的链表的关键元素是访问堆栈帧中的返回地址(甚至函数中的哪个位置)进行调用。