返回

对代码指令s、!address、.writemem的使用简介

见解分享

在上一篇文章中,我们主要使用了三个命令 !addresss。writemem 把丢失的代码成功的保存到了文件中。本文简单介绍一下上文用到的这三个命令。

很多命令都会用到地址范围。比如 s 命令,.writemem 命令。在 windbg 中可以通过两种形式指定地址范围。

1.address

!address [-l[n]] [-d <space>] {[-|+]expr1}[,{[-|+]expr2}[...]]}
  • -l:以列表格式显示数据。
  • -n:显示 n 个地址。
  • -d:指定地址之间间隔的大小。默认为十六进制。
  • expr:可以是以下任何一种:
    • 十进制、十六进制、八进制或二进制的地址。
    • 一个简单的数学表达式。
    • 一个寄存器。
    • 一个变量。
    • 一个内存区域。

如果指定了多个表达式,那么它们之间可以用逗号分隔。

例如,以下命令将以列表格式显示 0x100000x10010 之间的地址,间隔为 8 个字节:

!address -l8 0x10000-0x10010

以下命令将显示 eax 寄存器的内容:

!address eax

2.s

s <expression>[;<expression>...]
  • expression:可以是以下任何一种:
    • 一条汇编指令。
    • 一个内存地址。
    • 一个寄存器。
    • 一个变量。
    • 一个数学表达式。

如果指定了多个表达式,那么它们之间可以用分号分隔。

例如,以下命令将单步执行一条汇编指令:

s inc eax

以下命令将单步执行到内存地址 0x10000

s 0x10000

3.writemem

.writemem <memory-address> <data>
  • memory-address:要写入数据的内存地址。
  • data:要写入数据。可以是以下任何一种:
    • 一个数字。
    • 一个字符串。
    • 一个二进制数据块。

例如,以下命令将在内存地址 0x10000 处写入数字 1

.writemem 0x10000 1

以下命令将在内存地址 0x10010 处写入字符串 "Hello, world!":

.writemem 0x10010 "Hello, world!"