还可以看出,kV实际上是EBP+0x8、EBP+0xc和EBP+10x10作为变化函数的三个参数的粗略显示

在调试期间,我们经常检查方法的输入和输出,以确定该方法是否异常。那么,如何通过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。

因此,我们可以快速看到第二个参数的值。


发表评论

Copyright 2002-2022 by 安徽俄奥汽车改装网(琼ICP备2022001899号-3).All Rights Reserved.