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

时间:2016-07-22 08:46:34

标签: windbg

如何将当前线程堆栈的所有Args转储到Child,例如我想在当前堆栈中的每个帧的args上执行类似du的命令。就像所有帧上的du ebp+<1st 4 args>一样。

1 个答案:

答案 0 :(得分:0)

恕我直言,在WinDbg中做起来并不容易,但我可以推荐PyKd来解决这个问题。确保以正确的位数安装Python(与您想要使用的WinDbg具有相同的位数)。

0:000> .symfix
0:000> .reload
0:000> .load E:\...\pykd\0.3.0.27\x86\pykd.dll

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

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作为返回地址的参数,14kb显示的参数。
  • 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