C++ 堆栈分配随机偏移量C++;窗户
首先,这是在Windows 64位上实现的。据我所知,只要输入一个函数,堆栈内存就会被分配。所以在这种情况下,整数应该在一开始就分配。由于ASLR,堆栈的位置在多个运行中会有所不同,但是我希望堆栈限制的偏移量保持不变。我编写了一个函数C++ 堆栈分配随机偏移量C++;窗户,c++,windows,memory,stack,memory-address,C++,Windows,Memory,Stack,Memory Address,首先,这是在Windows 64位上实现的。据我所知,只要输入一个函数,堆栈内存就会被分配。所以在这种情况下,整数应该在一开始就分配。由于ASLR,堆栈的位置在多个运行中会有所不同,但是我希望堆栈限制的偏移量保持不变。我编写了一个函数GetThreadStackAddresses,它获取当前线程的上下堆栈地址。然而,我注意到整数到堆栈限制的偏移也是非常随机的。Windows是否也向堆栈指针添加了随机偏移?还有什么原因可能导致这种情况?谢谢你的回答 int main() { int som
GetThreadStackAddresses
,它获取当前线程的上下堆栈地址。然而,我注意到整数到堆栈限制的偏移也是非常随机的。Windows是否也向堆栈指针添加了随机偏移?还有什么原因可能导致这种情况?谢谢你的回答
int main()
{
int someInt = 123;
Process::Stack stack{};
if (!Process::GetThreadStackAddresses(GetCurrentProcess(), GetCurrentThread(), stack))
{
return 1;
}
std::cout << "stackLimit: 0x" << std::hex << std::uppercase << stack.Limit << std::endl;
std::cout << "stackBase: 0x" << std::hex << std::uppercase << stack.Base << std::endl;
std::cout << "someInt: (0x" << std::hex << std::uppercase << (uintptr_t)&someInt << ") = " << std::dec << someInt << std::endl;
std::cout << "someInt Offset to Limit: 0x" << std::hex << std::uppercase << (uintptr_t)&someInt - stack.Limit << std::endl;
std::cout << "someInt Offset to Base: 0x" << std::hex << std::uppercase << stack.Base - (uintptr_t)&someInt << std::endl;
}
显然,我们可以看到它确实如此。你的问题到底是什么?我不认为是因为我这样做。我想知道为什么会发生这种情况,我自己也看到了。ASLR正在这样做。是的,你是对的,我测试了它,我不知怎的认为ASLR只会随机化堆栈的位置,而不会随机化堆栈内分配发生的偏移
stackLimit: 0x1000FD000
stackBase: 0x100100000
someInt: (0x1000FFCCC) = 123
someInt Offset to Limit: 0x2CCC
someInt Offset to Base: 0x334
stackLimit: 0x5B3B11D000
stackBase: 0x5B3B120000
someInt: (0x5B3B11F88C) = 123
someInt Offset to Limit: 0x288C
someInt Offset to Base: 0x774
stackLimit: 0x52887FD000
stackBase: 0x5288800000
someInt: (0x52887FF9AC) = 123
someInt Offset to Limit: 0x29AC
someInt Offset to Base: 0x654