将给定堆栈上的所有 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 地址,1
到 4
是 [=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
如何将当前线程堆栈的所有 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 地址,1
到4
是 [=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