我想在 main 中对当前堆栈进行校验和,以检查它是否已在两点之间更改。
例如:
int main(void) {
...
stack_checksum();
... process ...
if(stack_checksum() != ...)
altered.
}
如何获取堆栈基地址和堆栈顶部的当前地址?
编辑: 在@Miroslav Bajtoš 的帮助下,采取措施:
- 将局部变量放入结构中
- 检查回溯返回数组
这取决于您使用的标准库的编译器/实现。
对于 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
一旦您可以遍历堆栈,计算校验和应该很容易。
我认为您将不得不为此使用内联汇编。以下代码将基指针和当前指针的当前值存储在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 位计算机上,则必须使用ebp
andesp
而不是rbp
andrsp
和movl
而不是movq
.
如果您对语法有任何疑问,我建议您查看这个gcc 内联汇编教程。