debugging WinDbg评估ebp+12

balp4ylt  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(160)

我试着去理解关于stackpointer,basepointer的事情..它是如何工作的..因为大多数的教学材料都没有结合一个实际的例子,我试着重现:https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames
下面是我编写的非常简单的代码:

#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中打开了内存窗口,它显示了正确的值,但为什么我的命令不起作用?
谢谢你,谢谢你
更新:为了更好地理解屏幕截图:

dz6r00yl

dz6r00yl1#

这是一个常见的错误。默认情况下,12表示0x12
如果你想要一个十进制数12,使用0n120xCchange the default number format加上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会以行号符号的形式给予返回地址。

相关问题