在调试期间,我们经常检查方法的输入和输出,以确定该方法是否异常。那么,如何通过WinDbg获得该方法的参数值呢
WinDbg主要包括三个命令:标准命令和元命令。
K命令可以获得堆栈跟踪。
其中,KP可以以函数原型格式显示参数和参数值,但需要签名。详情如下:
如您所见,将显示某些方法的参数和相应值。这里是一个例子。
同时,您还可以看到,某些方法可能无法显示,即使它们具有符号。例如:
如果我们想看到参数值呢
您还可以通过kV命令显示前三个参数。例如:
然后我们可以看到所有方法的参数值。不幸的是,只能看到三个参数。
由于WinDbg可以获得它,我们还可以在内存中找到相应的参数。
在找到参数在内存中的位置之前,我们需要了解方法调用的一些约定。对于这些协议,我们称之为协议。
函数调用约定意味着在调用函数时,函数的参数将传递给被调用函数,返回值将返回给调用函数。
函数的调用约定是描述如何传递参数以及谁平衡堆栈,当然还有返回值
C/C++是默认的调用约定。
规则:
参数通过堆栈传递
从右向左堆叠
参数由调用方清理
Eax作为方法返回值
规则:
参数通过堆栈传递
从右向左堆叠
参数由被调用方清理
Eax作为方法返回值
规则:
前两个参数分别通过ECX和EDX传递,其他参数仍通过堆栈传递
从右向左堆叠
参数由被调用方清理
Eax作为方法返回值
规则:
前四个参数分别由ECX、EDX、R8和R9传递,其他参数仍由堆栈传递
从右向左堆叠
参数由被调用方清理
Eax作为方法返回值
让我们调试代码并停止代码。让我们看看当前堆栈和参数,以及EBP所在的内存地址的值。
可以看出,存储器中EBP的对应值是呼叫者的,即;EBP+4对应于当前方法的返回地址;以下是电流法的参数值,与kV命令的输出一致。
还可以看出,kV实际上是EBP+0x8、EBP+0xc和EBP+10x10作为变化函数的三个参数的粗略显示。
所以我们可以返回到如何找到参数值。
从文档复制定义:
然后让我们先看看寄存器上的值。
让我们看看内存中的值
在x64应用程序中,调用约束是x64约束。也就是说,前四个参数将分别存储在ECX、EDX、R8和R9中。我们在这里寻找的是第二个参数,因此我们可以直接转到EDX
其他参数类似。
要查看此方法的参数:
通常,它可以通过KP直接查看。但它需要符号和参数信息。
如果参数数量少于三个,则前三个参数可通过kV显示。
对于多个参数,EBP/ESP的地址只能通过DP手动检查,并通过内存分配手动计算。
一般来说,使用WinDbg查看参数相对比较复杂。还有其他更直观的工具可用。
打开文件。由于od支持x86,因此此处仅使用x86可执行文件进行演示。对于x64,使用WinDbg。
因此,我们可以快速看到第二个参数的值。
发表评论