我试着理解关于堆栈指针的东西。它是如何工作的..。因为大部分的教材都没有结合实际的例子,所以我试着复制一下:框架。
以下是我编写的非常简单的代码:
#include <stdio.h>
int main()
{
function1(1, 2);
}
int function1(int a, int b)
{
int c = a + b;
return c;
}我使用WinDbg执行程序,并设置断点bm CallStackPractice!function1,并键入g以命中断点,并键入p以分步进入函数。
使用ebp+8,我们应该得到第一个参数。我在WinDbg上这么做的:
0:000> ? poi(ebp+8)
Evaluate expression: 1 = 00000001好的。不,我们想要第二个参数,应该是ebp+12。
0:000> ? poi(ebp+12)
Evaluate expression: 270729434 = 102300da我们没有得到2 = 00000002。我在WinDbg中打开了内存窗口,它显示了正确的值,但是为什么我的命令不能工作呢?
谢谢!
更新:为了更好地理解截图:

发布于 2022-09-04 13:55:16
这是个常见的错误。默认情况下,12的意思是0x12。
如果您想要小数12,请使用0n12或0xC或使用n 10的更改默认数字格式 (实际上,我不知道有谁这样做)。
0:000> ? 12
Evaluate expression: 18 = 00000000`00000012
0:000> n 10
base is 10
0:000> ? 12
Evaluate expression: 12 = 00000000`0000000c回到第16基地:
1:005:x86> n 16
base is 16
1:005:x86> ? poi(ebp+8)
Evaluate expression: 1 = 00000001
1:005:x86> ? poi(ebp+c)
Evaluate expression: 2 = 00000002如果你有奇怪的错误
1:005:x86> ?poi(ebp +c)
Memory access error at ')'那是因为你还在10号基地。
您可能还需要查看使用dps的堆栈,如下所示:
1:005:x86> dps ebp-c L7
008ff60c cccccccc <-- magic number (4x INT 3 breakpoint)
008ff610 00000003
008ff614 cccccccc
008ff618 008ff6f4
008ff61c 00fb189a DebugESPEBP!main+0x2a [C:\...\DebugESPEBP.cpp @ 13]
008ff620 00000001 <-- a
008ff624 00000002 <-- b正如您所看到的,dps将给您返回地址作为带有行号的符号。你会看到调试模式中的内存布局包含有助于调试的神奇数字。
https://stackoverflow.com/questions/73579943
复制相似问题