——WINDBG中的表达式
WINDBG接受两种表达式,C++表达式和MASM表达式。
1、 MASM表达式中的数值:
MASM表达式中的数值可以基于16,10,8,2四种进制。用n命令可以设置WINDBG的缺省进制,如果没有设置过则默认为16。
所有没有使用前缀和后缀的数值都被认为是使用缺省进制,例如如果当前的缺省进制是16,那么“20”这个数值代表的是16进制的“20”,而不是10进制的“20”。通过使用前缀和后缀可以改变数值的进制,“0x”前缀和“h”后缀代表16进制数,“0n”前缀代表10进制数,“0t”前缀代表8进制数,“0y”前缀代表2进制数。
例子:
0:000> n 10
base is 10
0:000> ? 1b
Syntax error at '1b'
0:000> ? 0x1b
Evaluate expression: 27 = 0000001b
0:000> ? 1bh
Evaluate expression: 27 = 0000001b
0:000> n 16
base is 16
0:000> ? 1b
Evaluate expression: 27 = 0000001b
0:000> ? 20
Evaluate expression: 32 = 00000020
2、 MASM表达式中的symbol:
在MASM表达式中,symbol的数值被认为是它的地址。根据symbol的类型,可以是全局变量的地址,局部变量的地址,函数的地址或模块的地址。
3、 MASM表达式中的数值运算符:
一些一元运算符:
运算符
说明
hi
返回数值的高字,相当于C语言的hiword
low
返回数值的低字,相当于C语言的lowword
by
参数为一个地址,返回该地址指向的字节值,相当于*(byte*)arg
wo
参数为一个地址,返回该地址指向的字值,相当于*(word*)arg
dwo
参数为一个地址,返回该地址指向的双字值,相当于*(dword*)arg
qwo
参数为一个地址,返回该地址指向的四字值,相当于*(qword*)arg
poi
参数为一个地址,返回该地址指向的指针长度的数值,在32位程序中相当于dwo
例子:
0:000> db 400000
00400000 4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00 MZ..............
00400010 b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00 ........@.......
00400020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00400030 00 00 00 00 00 00 00 00-00 00 00 00 00 01 00 00 ................
00400040 0e 1f ba 0e 00 b4 09 cd-21 b8 01 4c cd 21 54 68 ........!..L.!Th
00400050 69 73 20 70 72 6f 67 72-61 6d 20 63 61 6e 6e 6f is program canno
00400060 74 20 62 65 20 72 75 6e-20 69 6e 20 44 4f 53 20 t be run in DOS
00400070 6d 6f 64 65 2e 0d 0d 0a-24 00 00 00 00 00 00 00 mode....$.......
0:000> ? by(400000)
Evaluate expression: 77 = 0000004d
0:000> ? wo(400000)
Evaluate expression: 23117 = 00005a4d
0:000> ? dwo(400000)
Evaluate expression: 9460301 = 00905a4d
0:000> ? qwo(400000)
Evaluate expression: 12894362189 = 00000003`00905a4d
0:000> ? poi(400000)
Evaluate expression: 9460301 = 00905a4d
0:000> ? hi(poi(400000))
Evaluate expression: 144 = 00000090
0:000> ? low(poi(400000))
Evaluate expression: 23117 = 00005a4d