【发布时间】:2017-11-27 18:59:59
【问题描述】:
我想知道是否有一种方法可以在 C 程序中编写一个函数,该函数遍历另一个函数来定位调用指令的地址。
比如我想在main函数中找到ret指令使用的地址。
我的第一个想法是创建一个从“&main()”开始的while循环,然后每次循环将地址加1,直到指令在当前地址“ret”并返回地址。
【问题讨论】:
-
这行得通吗?..
-
不同的 x86 指令具有不同的长度,并且可能包含可能被误认为是“ret”指令的 立即 数据值。此外,一个函数可以有多个 'ret' 指令,或者有 'ret' 指令的变体。
-
这样做的目的是什么?你这样做到底想达到什么目的?
-
@ethanelle:查找当前函数调用链通常是通过跟踪堆栈来完成的。每个函数都会在堆栈上留下信息。最特别的是,必须保存先前函数的返回地址。 (尽管最近的返回地址可能保存在寄存器中并且不会保存到堆栈中,除非并且直到即将执行另一个调用。)在堆栈上追溯过去是“容易的”,因为从帧中有明确的链接框架,所以你只需要按照链接到最后一个。不幸的是,正如 Ian Abbott 所提到的,程序可能被编译为不使用帧指针,......
-
... 在这种情况下,无法直接获得所需的信息,并且很难追溯。在任何情况下,您都应该输入一个新问题,例如“我如何编写一个可以追溯其自己的堆栈帧的程序?”这样的问题。 (但先搜索现有问题。)