将给定堆栈上的所有 Args 转储到 Child

Dump out all Args to Child on a given stack

如何将当前线程堆栈的所有 Args 转储到 Child,例如我想对当前堆栈中的每一帧的参数执行 du 之类的命令。在所有帧上点赞 du ebp+<1st 4 args>

恕我直言,在 WinDbg 本身中做起来不是很容易,但我可以推荐 PyKd 来解决这个任务。确保您以正确的位数安装了 Python(与您要使用的 WinDbg 的位数相同)。

0:000> .symfix
0:000> .reload
0:000> .load E:\...\pykd[=10=].3.0.27\x86\pykd.dll

如果没有 pykd.dll,则使用 pykd.pyd

0:000> !py
>>> s = getStack()
>>> for f in s:
...     for p in range(1,4):
...         print("%016X" % (ptrPtr(f.sp + p*ptrSize())))
... 
>>> exit()
  • s是当前线程的栈。
  • for f in s 遍历所有帧。
  • p 是参数,其中 0 是 return 地址,14 是 [=22] 显示的参数=].
  • p*ptrSize() 计算相对于位数的正确偏移量
  • f.sp给你当前帧的栈指针
  • ptrPtr() 从内存中读取指针大小(位元感知)数据
  • "%016X" % n 将数字格式化为十六进制
  • exit() 让您退出交互式控制台

现在您已经拥有所有参数,您还可以将它们的值转储为字符串。你可以试试 PyKd 的loadWStr()。这是一个完整的脚本:

from pykd import *
s = getStack()
for f in s:
    for p in range(1,4):
        paramaddr = f.sp + p*ptrSize()
        string = loadWStr(paramaddr)
        print(string)

如果你想将它应用到所有线程,运行像这样:

0:000> ~*e !py string.py