123456

 

Windbg命令学习4(d和e)

以下所有例子都以CALC程序为示例----hgy413 notes.

1 d

d*命令显示给定范围内存的内容。

d, da, db, dc, dd, dD, df, dp, dq, du, dw, dW, dyb, dyd (Display Memory)

如果省略掉Range ,命令将会从上一条内存查看命令结束的位置开始。这使得可以连续的进行内存查看。

d这种显示的格式和最近一次d*命令的格式相同。如果之前没有使用过d*命令,ddb 的效果相同。

注意d重复前一个以d开头的命令。包括ddaddpddudpadppdpudqadqpdquddsdpsdqsdsdSdgdldtdv,以及本页中的显示命令。如果在d之后的参数不适当,可能会产生错误。

0:001> d
7c92120e  cc c3 8b ff cc c3 8b ff-8b 44 24 04 cc c2 04 00  .........D$.....
7c92121e  64 a1 18 00 00 00 c3 57-8b 7c 24 0c 8b 54 24 08  d......W.|$..T$.
7c92122e  c7 02 00 00 00 00 89 7a-04 0b ff 74 1e 83 c9 ff  .......z...t....
7c92123e  33 c0 f2 ae f7 d1 81 f9-ff ff 00 00 76 05 b9 ff  3...........v...
7c92124e  ff 00 00 66 89 4a 02 49-66 89 0a 5f c2 08 00 57  ...f.J.If.._...W
7c92125e  8b 7c 24 0c 8b 54 24 08-c7 02 00 00 00 00 89 7a  .|$..T$........z
7c92126e  04 0b ff 74 1e 83 c9 ff-33 c0 f2 ae f7 d1 81 f9  ...t....3.......
7c92127e  ff ff 00 00 76 05 b9 ff-ff 00 00 66 89 4a 02 49  ....v......f.J.I
0:001> d
7c92128e  66 89 0a 5f c2 08 00 57-8b 7c 24 0c 8b 54 24 08  f.._...W.|$..T$.
7c92129e  c7 02 00 00 00 00 89 7a-04 0b ff 74 22 83 c9 ff  .......z...t"...
7c9212ae  33 c0 66 f2 af f7 d1 d1-e1 81 f9 fe ff 00 00 76  3.f............v
7c9212be  05 b9 fe ff 00 00 66 89-4a 02 49 49 66 89 0a 5f  ......f.J.IIf.._
7c9212ce  c2 08 00 83 ec 0c dd 14-24 e8 bf cf 00 00 e8 0d  ........$.......
7c9212de  00 00 00 83 c4 0c c3 8d-54 24 04 e8 6a cf 00 00  ........T$..j...
7c9212ee  52 9b d9 3c 24 74 50 66-81 3c 24 7f 02 74 06 d9  R..<$tPf.<$..t..
7c9212fe  2d 5c e7 92 7c d9 fe 9b-df e0 9e 7a 1d 83 3d ac  -\..|......z..=.

我们可以看出第二个d显示的地址是前面的地址的延续

da:ASCII 字符每行最多48个字符。显示一直继续直到遇到第一个null字节或者到达range 值指定的所有字符都已经显示。所有不可打印字符,如回车和换行都被显示为点号(.)。

0:001> r
eax=00000009 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005
eip=7c92120e esp=00c1ffcc ebp=00c1fff4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
7c92120e cc              int     3
0:001> da ebp
00c1fff4  ""
0:001> da
00c1fff5  ""


 

这个用来查ASCII字符串好像不错哦,但是应该注意到,这个打印只有ASCII码,没有字节数显示

db:字节值和ASCII字符每个显示行都包含该行第一个字节的地址,后面跟16进制字节值。这些字节值后面会紧跟它们对应的ASCII值。第8和第9个16进制值之间会用连字号(-)分隔。所有不可打印字符,如回车和换行都被显示为点号(.)。

默认的显示个数为128字节。

这个就不写例子了,第一个d给出的就是db的例子

dc:双字值(4字节)和ASCII字符。每个显示行都会显示行中第一个数据的地址,并且每行最多显示8个16进制值以及它们对应的ASCII字符。默认的显示数量为32个DWORD(128字节)。
dd:双字值(4字节) 默认的显示数量为32个DWORD(128字节)。

这两个比对着给个例子:

0:001> dc eip
7c92120e  ff8bc3cc ff8bc3cc 0424448b 0004c2cc  .........D$.....
7c92121e  0018a164 57c30000 0c247c8b 0824548b  d......W.|$..T$.
7c92122e  000002c7 7a890000 74ff0b04 ffc9831e  .......z...t....
7c92123e  aef2c033 f981d1f7 0000ffff ffb90576  3...........v...
7c92124e  660000ff 49024a89 5f0a8966 570008c2  ...f.J.If.._...W
7c92125e  0c247c8b 0824548b 000002c7 7a890000  .|$..T$........z
7c92126e  74ff0b04 ffc9831e aef2c033 f981d1f7  ...t....3.......
7c92127e  0000ffff ffb90576 660000ff 49024a89  ....v......f.J.I
0:001> dd eip
7c92120e  ff8bc3cc ff8bc3cc 0424448b 0004c2cc
7c92121e  0018a164 57c30000 0c247c8b 0824548b
7c92122e  000002c7 7a890000 74ff0b04 ffc9831e
7c92123e  aef2c033 f981d1f7 0000ffff ffb90576
7c92124e  660000ff 49024a89 5f0a8966 570008c2
7c92125e  0c247c8b 0824548b 000002c7 7a890000
7c92126e  74ff0b04 ffc9831e aef2c033 f981d1f7
7c92127e  0000ffff ffb90576 660000ff 49024a89

我们可以发现dd相对来说,少了右边的Asii码字符,所以推荐用dc,不过dd好记,和debug运用相同嘛.

dq:四字值(Quad-word values) (8 bytes)。默认显示数量为16个四字 (128 字节)。

dw:WORD值(2字节)。 每个显示行都会显示行中第一个数据的地址,并且每行最多显示8个16进制值。默认显示数量为64个WORD(128字节)。

dW:WORD值(2字节)和ASCII字符。每个显示行都会显示行中第一个数据的地址,并且每行最多显示8个16进制值。默认显示数量为64个WORD(128字节)。

0:001> dd eip
7c92120e  ff8bc3cc ff8bc3cc 0424448b 0004c2cc
7c92121e  0018a164 57c30000 0c247c8b 0824548b
7c92122e  000002c7 7a890000 74ff0b04 ffc9831e
7c92123e  aef2c033 f981d1f7 0000ffff ffb90576
7c92124e  660000ff 49024a89 5f0a8966 570008c2
7c92125e  0c247c8b 0824548b 000002c7 7a890000
7c92126e  74ff0b04 ffc9831e aef2c033 f981d1f7
7c92127e  0000ffff ffb90576 660000ff 49024a89
0:001> dw eip
7c92120e  c3cc ff8b c3cc ff8b 448b 0424 c2cc 0004
7c92121e  a164 0018 0000 57c3 7c8b 0c24 548b 0824
7c92122e  02c7 0000 0000 7a89 0b04 74ff 831e ffc9
7c92123e  c033 aef2 d1f7 f981 ffff 0000 0576 ffb9
7c92124e  00ff 6600 4a89 4902 8966 5f0a 08c2 5700
7c92125e  7c8b 0c24 548b 0824 02c7 0000 0000 7a89
7c92126e  0b04 74ff 831e ffc9 c033 aef2 d1f7 f981
7c92127e  ffff 0000 0576 ffb9 00ff 6600 4a89 4902
0:001> dW eip
7c92120e  c3cc ff8b c3cc ff8b 448b 0424 c2cc 0004  .........D$.....
7c92121e  a164 0018 0000 57c3 7c8b 0c24 548b 0824  d......W.|$..T$.
7c92122e  02c7 0000 0000 7a89 0b04 74ff 831e ffc9  .......z...t....
7c92123e  c033 aef2 d1f7 f981 ffff 0000 0576 ffb9  3...........v...
7c92124e  00ff 6600 4a89 4902 8966 5f0a 08c2 5700  ...f.J.If.._...W
7c92125e  7c8b 0c24 548b 0824 02c7 0000 0000 7a89  .|$..T$........z
7c92126e  0b04 74ff 831e ffc9 c033 aef2 d1f7 f981  ...t....3.......
7c92127e  ffff 0000 0576 ffb9 00ff 6600 4a89 4902  ....v......f.J.I

 

dD:双精度浮点数(8字节) 默认的显示数量是15个数字(120字节)。

df:单精度浮点数(4字节) 默认的显示数量是16个数字(64字节)。

dp:指针大小的值。该命令根据目标机的处理器是32位还是64位的,分别等于dd 或dq。默认显示数量为32个DWORD或者16个四字(quad-word) (128 字节)。

du:Unicode字符 。每行最多显示48个字符。显示一直继续直到遇到第一个null字节或者到达range 值指定的所有字符都已经显示。所有不可打印字符,如回车和换行都被显示为点号(.)。

dyb:二进制值和字节的值。默认显示数量为32字节。

dyd:二进制值和双字值(4字节)。默认显示数量为8个DWORD(32字节)。


 

0:001> dD eip
7c92120e     -2.43714230651e+306     6.62088185061e-309     5.84873529654e+114
7c921226      1.92413942387e-269     1.81520618711e+282    -3.58305289924e+307
7c92123e     -1.97432319055e+277    -1.75705767106e+307     5.09883096248e+043
7c921256      1.20502524006e+111     1.92413942387e-269     1.81520618711e+282
7c92126e     -3.58305289924e+307    -1.97432319055e+277    -1.75705767106e+307
0:001> df eip
7c92120e          -1.#QNAN         -1.#QNAN   1.9309581e-036   4.3722194e-040
7c92121e     2.261948e-039   4.2880953e+014   1.2671579e-031   4.9451335e-034
7c92122e    9.9632321e-043   3.5567233e+035   1.6165272e+032         -1.#QNAN
7c92123e   -1.1039027e-010  -8.4258111e+034   9.1834095e-041         -1.#QNAN
0:001> dp eip
7c92120e  ff8bc3cc ff8bc3cc 0424448b 0004c2cc
7c92121e  0018a164 57c30000 0c247c8b 0824548b
7c92122e  000002c7 7a890000 74ff0b04 ffc9831e
7c92123e  aef2c033 f981d1f7 0000ffff ffb90576
7c92124e  660000ff 49024a89 5f0a8966 570008c2
7c92125e  0c247c8b 0824548b 000002c7 7a890000
7c92126e  74ff0b04 ffc9831e aef2c033 f981d1f7
7c92127e  0000ffff ffb90576 660000ff 49024a89
0:001> du eip
7c92120e  "쏌ヒ쏌ヒ䒋Ф싌.ꅤ."
0:001> dyb eip
          76543210 76543210 76543210 76543210
          -------- -------- -------- --------
7c92120e  11001100 11000011 10001011 11111111  cc c3 8b ff
7c921212  11001100 11000011 10001011 11111111  cc c3 8b ff
7c921216  10001011 01000100 00100100 00000100  8b 44 24 04
7c92121a  11001100 11000010 00000100 00000000  cc c2 04 00
7c92121e  01100100 10100001 00011000 00000000  64 a1 18 00
7c921222  00000000 00000000 11000011 01010111  00 00 c3 57
7c921226  10001011 01111100 00100100 00001100  8b 7c 24 0c
7c92122a  10001011 01010100 00100100 00001000  8b 54 24 08
0:001> dyd eip
           3          2          1          0
          10987654 32109876 54321098 76543210
          -------- -------- -------- --------
7c92120e  11111111 10001011 11000011 11001100  ff8bc3cc
7c921212  11111111 10001011 11000011 11001100  ff8bc3cc
7c921216  00000100 00100100 01000100 10001011  0424448b
7c92121a  00000000 00000100 11000010 11001100  0004c2cc
7c92121e  00000000 00011000 10100001 01100100  0018a164
7c921222  01010111 11000011 00000000 00000000  57c30000
7c921226  00001100 00100100 01111100 10001011  0c247c8b
7c92122a  00001000 00100100 01010100 10001011  0824548b

个人觉得最难记的就是,db-dd-dw,但是dW是dw的扩展,dD却不是dd的扩充,而是双精度显示,dc才是dd的扩充,我靠,晕了。还是要在线查查文档啊。

2。e

e命令和d命令非常相似,一个读一个写嘛!


命令 输入
e 输入数据的格式和前一次e* 命令一样。(如果上一次的e*命令是eaezaeuezu,则最后一个参数是String并且不能省略。)
ea ASCII 字符串(不以NULL结尾)。
eb 字节值。
ed 双字值(4字节)。
eD 双精度浮点数(8字节)。
ef 单精度浮点数(4字节)。
ep 指针大小的值。该命令根据目标机的处理器架构是32位还是64位,可能分别等于edeq
eq 4字值(8字节)。
eu Unicode字符串(非NULL结尾)。
ew 字值(2字节)。
eza NULL结尾的ASCII字符串。
ezu

NULL结尾的Unicode字符串。

 

0:000> da 0027eb3c  
0027eb3c  "Tencent Technology(Shenzhen) Com"
0027eb5c  "pany Limited"
0:000> ea 0027eb3c  "Tencent Technology(Shenzhen) Company Limited1"
0:000> da 0027eb3c  
0027eb3c  "Tencent Technology(Shenzhen) Com"
0027eb5c  "pany Limited1"
 因为不以NULL结束,所以有可能出现乱字符

0:000> eu 0027eb3c  "Tencent Technology(Shenzhen) Company Limited1"
0:000> da 0027eb3c  
0027eb3c  "T"
0:000> du 0027eb3c  
0027eb3c  "Tencent Technology(Shenzhen) Com"
0027eb7c  "pany Limited1"

0:000> ezu 0027eb3c  "Tencent Technology(Shenzhen) Company Limited1"
0:000> du 0027eb3c  
0027eb3c  "Tencent Technology(Shenzhen) Com"
0027eb7c  "pany Limited1"

把下面5个word改为0x41(字符A)

0:000> ew 0027eb3c   41 41 41 41 41
0:000> du 0027eb3c  
0027eb3c  "AAAAAnt Technology(Shenzhen) Com"
0027eb7c  "pany Limited1"

如果只指定了地址,那么windbg会以交互式来让用户输入,命令提示符会改变为Input>

windbg会先显示要编辑的内存地址和当前的取值,然后等待用户输入,

1.可输入新的值,然后回车提交

2.可按空格再按回车,保留当前值,跳到接下来的Input>

3.直接按回车可以停止输入,退出Input>















posted on 2012-05-13 17:33  hgy413  阅读(608)  评论(0编辑  收藏  举报

导航