对当前堆栈进行校验和

Max*_*xux 7 c stack checksum

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

例如:

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

    ... process ...

    if(stack_checksum() != ...)
        altered.
}
Run Code Online (Sandbox Code Playgroud)

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

编辑: 随着@MiroslavBajtoš帮助,步骤方法:

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

Mir*_*toš 6

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

对于gcc(或使用glibc的任何其他编译器),您可以使用backtrace()函数execinfo.h- 请参阅这些答案以获取更多详细信息:如何在我的gcc C++应用程序崩溃时生成堆栈跟踪以及如何获取更详细的回溯

对于Microsoft编译器,您可以使用StackWalk64()函数,有关详细信息,请参阅此文章:Walking-the-callstack.在StackOverflow上也有类似的问题:Windows上的StackWalk64 - 获取符号名称

一旦你可以走栈,计算校验和应该很容易.