7

我想在 main 中对当前堆栈进行校验和,以检查它是否已在两点之间更改。

例如:

int main(void) {
    ...
    stack_checksum();

    ... process ...

    if(stack_checksum() != ...)
        altered.
}

如何获取堆栈基地址和堆栈顶部的当前地址?

编辑: 在@Miroslav Bajtoš 的帮助下,采取措施

  • 将局部变量放入结构中
  • 检查回溯返回数组
4

2 回答 2

6

这取决于您使用的标准库的编译器/实现。

对于 gcc(或任何其他使用 glibc 的编译器),您可以使用backtrace()函数execinfo.h- 有关更多详细信息,请参阅这些答案:How to generate a stacktrace when my gcc C++ app crashs and How to get more detail backtrace

对于 Microsoft 编译器,您可以使用StackWalk64()函数,有关详细信息,请参阅本文:Walking-the-callstack。StackOverflow 上也有类似的问题:StackWalk64 on Windows - Get symbol name

一旦您可以遍历堆栈,计算校验和应该很容易。

于 2013-01-13T17:45:24.937 回答
3

我认为您将不得不为此使用内联汇编。以下代码将基指针和当前指针的当前值存储在base和中current。它适用gcc于 64 位机器:

// make these variables global (if not, the stack registers would change)
void *base, *current;
__asm__("movq %%rbp, %0;"
        "movq %%rsp, %1;"
        : "=r"(base), "=r"(current)
        :
        :
);

如果您在 32 位计算机上,则必须使用ebpandesp而不是rbpandrspmovl而不是movq.
如果您对语法有任何疑问,我建议您查看这个gcc 内联汇编教程。

于 2013-01-13T17:52:50.193 回答