本文主要是介绍Windbg——ReadVirtual: not properly sign extended,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在使用Windbg对windows XP系统进行内核调试时,查看SSDT表某个函数,如NTCreateFile的函数地址时,提示如下:
0: kd> u 8057d330
ReadVirtual: 8057d330 not properly sign extended
8057d330 8bff mov edi,edi
ReadVirtual: 8057d340 not properly sign extended
8057d332 55 push ebp
8057d333 8bec mov ebp,esp
8057d335 33c0 xor eax,eax
8057d337 50 push eax
8057d338 50 push eax
8057d339 50 push eax
8057d33a ff7530 push dword ptr [ebp+30h]
ReadVirtual: 8057d340 not properly sign extended
这个提示一直困扰了我很久,后来才知道可以通过以下方式解决。
1、这个问题是由于你正在尝试反汇编一个使用 32 位地址的内核代码,但你的 windbg 配置成了对 64 位地址进行解码。在 Windows 的 x64 架构上,所有内核模式的地址都是在高位 32 位的地址空间,也就是说,如果一个内核地址是合法的,它的高位应该是全 1 或全 0。所以当你尝试去反汇编一个低位 32 位地址的代码时,windbg 认为这个地址没有被正确地符号扩展,于是就抛出了这个错误。
解决这个问题的办法是将 32 位的地址扩展为 64 位的地址。假设你的地址是 0x8057d330,你可以尝试将其扩展为 0xffffffff8057d330,然后再使用 u 命令进行反汇编。
1: kd> u ffffffff8057d330
nt!NtCreateFile:
8057d330 8bff mov edi,edi
8057d332 55 push ebp
8057d333 8bec mov ebp,esp
8057d335 33c0 xor eax,eax
8057d337 50 push eax
8057d338 50 push eax
8057d339 50 push eax
8057d33a ff7530 push dword ptr [ebp+30h]
2、在WinDbg中打开文件菜单,选择 “Symbol File Path”。加载符号文件:
在 “Symbol search path” 对话框中,输入以下内容:
srv*c:\symbols*https://msdl.microsoft.com/download/symbols
这将设置 WinDbg 以从 Microsoft 的 symbol 服务器下载 symbol。符号文件将保存在C:\symbols目录下。
点击 “OK” 以关闭对话框。
在WinDbg命令行中,输入以下命令来重新加载symbols:
.reload /f
然后你应该可以使用 u 命令来反汇编地址了,例如:
0: kd> u nt!NTCreateFile
nt!NtCreateFile:
8057d330 8bff mov edi,edi
8057d332 55 push ebp
8057d333 8bec mov ebp,esp
8057d335 33c0 xor eax,eax
8057d337 50 push eax
8057d338 50 push eax
8057d339 50 push eax
8057d33a ff7530 push dword ptr [ebp+30h]
总结:
不管怎么样都需要在地址前面加8个F来使地址被正确的符号扩展。这也许跟我的宿主机是X64有关,windbg跟着所在环境走的?
有知道的大佬可以留言探讨~
都看到这儿了,留个赞再走?
这篇关于Windbg——ReadVirtual: not properly sign extended的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!