gpt4 book ai didi

c++ - 调用指令中的偏移量损坏

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:57 25 4
gpt4 key购买 nike

这几天一直在调试一个很奇怪的问题。在 Windows 上运行的为 i386 构建的应用程序崩溃,调用堆栈的顶部完全损坏,指令指针位于无意义的位置。

经过一番努力,我重建了调用堆栈,并且能够确定 IP 是如何出现在无意义位置的。 boost 共享指针代码中的一条指令尝试使用不正确的偏移调用我的 DLL 导入地址表中定义的函数。指令看起来像:

call dword ptr [nonsense offset into import address table]

因此,执行最终在一个错误的位置结束,不幸的是,该位置是可执行的。然后继续执行,吞噬堆栈的顶部,直到最终崩溃。

通过在我的 PC 上启动相同的应用程序,并单步执行有问题的代码,我可以找到相同的调用指令,并通过调用 msvc100 的"new"运算符查看它应该执行的操作。

进一步比较客户端 PC 和我 PC 的小型转储,我发现我的 PC 正在调用地址表中偏移量为 0x0254 的函数。在客户端 PC 上,代码试图调用偏移量为 0x8254 的函数。

更令人困惑的是,这个偏移量不是来自寄存器或另一个内存位置。偏移量在反汇编中是一个常量。所以,反汇编看起来像:

call dword ptr [ 0x50018254 ]

不喜欢:

call dword ptr [ edx ]

有谁知道这是怎么发生的?

最佳答案

这是一位翻转:

0x0254 = 0b0000001001010100
0x8254 = 0b1000001001010100

也许损坏的内存、损坏的磁盘、来自太阳的 Gamma 射线......?

如果这个特定案例是可重现的,并且他们的磁盘二进制文件与您的匹配,我会进一步调查。如果它不是特别可重现的,我会鼓励客户运行一些机器诊断。

关于c++ - 调用指令中的偏移量损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com