怀德维宁

大邦维屏,大宗维翰。怀德维宁,宗子维城。

0%

windbg标准调试技巧-读写内存(1):通过虚拟地址访问内存

在调试过程中可以通过使用多个指令来访问内存或内存区域。visual studio和windbg提供命令行命令时,也提供了用户图形界面,用户可以用图形界面来查看和编辑内存。详情可以参考windbg帮助文档中的在visual studio中查看和编辑内存和寄存器,以及在windbg中查看和编辑内存两个章节。

以下命令可以读取与写入多种格式的内存。这些屙屎包含了16字节、字格式(单字、双字、四字、八字格式)、整数格式(short、long、quad、unsigned格式)、浮点数格式(10字节、16字节、32字节、64字节实数格式)以及ascii字符格式。

  • d*(展示内存display memory)指令会展示特定内存或内驱区域的内容。
  • e*(输入数值enter values)指令向特定的内存地址写入数值。

也可以使用如下指令处理更加特定的数据类型:

  • dt(展示类型display type)指令会检索多种数据类型并展示被当前正在调试的应用程序锁创建出来的数据结构。改名了用途广泛并拥有多种变体及可选配置项。
  • ds(展示字符串display string)指令展示了STRING、ANSI_STRING和UNICODE_STRING数据结构。
  • dl(展示链表display linked list)指令追踪并展示链表。
  • d*s(展示字格式和符号display words and symbols)指令检索可能包含符号信息的双字或四字结构,之后展示对应的数据及符号信息。
  • !address扩展指令展示位于特定地址的内存属性信息。

可以使用如下指令来进行内存范围操作:

  • m(移动内存move memory)指令将一个内存范围的内容移到另外一个中。
  • f(填充内存fill mempry)指令向内存范围中写入指定的样式,后续重复该操作直到内存范围被全部填满。
  • c(比较内存compare memory)指令比较两个内存范围的内容;
  • s(搜索内存search memory)指令在一个内存范围内搜索指定格式的内容、或者搜索内存范围内的任一ascii或unicode编码;
  • .holdmem(保存并比较内存hold and compare memory)指令将一个内存范围与另外一个进行比较。

在大多数场景下,这些命令以当前的进制解释其参数。因此,如果当前的进制不是16,那么需要在16进制地址前增加0x表示其为16进制。然而,命令的展示输出通常是16进制的,不按照当前进制进行展示。内存窗口以10进制展示了整数与实数以16进制展示其他类型的参数。

可使用n(设置数字基数set number base)指令改变默认的进制。为快速将数字由一个进制转换为另外一个进制,可使用?(计算表达式evaluate expression)指令或者.format(展示数字格式show number formats)指令。

当进行用户模式调试时,虚拟地址的含义是当前进程决定的。当你进行内核模式调试时,虚拟地址的含义可以被调试器控制。更多内容,可参考进程上下文(process context)章节。