我最近在分析一个调用栈时犯了一个错误,因为我没有预料到应用程序是64位的。我使用WinDbg命令kb
来显示调用栈和传递给方法的参数。
在64位上,参数不是通过堆栈传递的,而是通过寄存器(RCX、RDX、R8和R9)传递。似乎WinDbg并没有完全实现这个功能。部分原因是由于寄存器的值可能已经改变了。
然而,WinDbg帮助文档仍将kb
列为User-Mode, x64 Processor
下的有效命令。因此,我的问题是:
kb
对64位用户模式进程显示什么?它的输出何时/如何有用?
我最近在分析一个调用栈时犯了一个错误,因为我没有预料到应用程序是64位的。我使用WinDbg命令kb
来显示调用栈和传递给方法的参数。
在64位上,参数不是通过堆栈传递的,而是通过寄存器(RCX、RDX、R8和R9)传递。似乎WinDbg并没有完全实现这个功能。部分原因是由于寄存器的值可能已经改变了。
然而,WinDbg帮助文档仍将kb
列为User-Mode, x64 Processor
下的有效命令。因此,我的问题是:
kb
对64位用户模式进程显示什么?它的输出何时/如何有用?
0:000> u DriverEntry
mov qword ptr [rsp+10h],rdx
mov qword ptr [rsp+8],rcx
push rdi
sub rsp,0C0h
同样的代码编译为“Release”模式时,使用主页空间进行非易失性寄存器保存:
0:000> u DriverEntry
mov qword ptr [rsp+8],rbx
mov qword ptr [rsp+10h],rdi
push rbp
lea rbp,[rsp-57h]
sub rsp,0B0h
这意味着Home Space通常在获取函数参数方面是无用的。但是,它仍然可以用作调试辅助工具,以在函数进入时重建非易失性寄存器值(例如,通过查看Home Space,我可以告诉您RBX或RDI的值)。
kb列出了堆栈回溯及其三个参数,但是参数传递机制(调用约定)使得显示的参数不可信。您必须阅读更多信息@http://www.codemachine.com/article_x64deepdive.html
dv以及所有其他变体dv /v等都可能显示垃圾值。仅在__this call的情况下,我们才可以使用rcx作为此指针,但我们必须反汇编并确保指针没有备份到其他位置,然后重新使用。除非我们有归属参数,否则反汇编是解决问题的方法。