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*命令,d 和db 的效果相同。
注意d重复前一个以d开头的命令。包括dda、ddp、ddu、dpa、dpp、dpu、dqa、dqp、dqu、dds、dps、dqs、ds、dS、dg、dl、dt和dv,以及本页中的显示命令。如果在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*命令是ea、eza、eu或ezu,则最后一个参数是String并且不能省略。) |
ea | ASCII 字符串(不以NULL结尾)。 |
eb | 字节值。 |
ed | 双字值(4字节)。 |
eD | 双精度浮点数(8字节)。 |
ef | 单精度浮点数(4字节)。 |
ep | 指针大小的值。该命令根据目标机的处理器架构是32位还是64位,可能分别等于ed 或eq。 |
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>