.expr 命令指定默認的表達式求值器
- 0:000> .expr
- Current expression evaluator: MASM - Microsoft Assembler expressions
- 0:000> .expr /s masm
- Current expression evaluator: MASM - Microsoft Assembler expressions
- 0:000> .expr /q
- Available expression evaluators:
- MASM - Microsoft Assembler expressions
- C++ - C++ source expressions
- Current expression evaluator: MASM - Microsoft Assembler expressions
- 0:000> .expr /s c++
- Current expression evaluator: C++ - C++ source expressions
n可用來設置缺省基數爲 16, 10 或者 8。所有不帶前綴的數值都以該基數來解釋
masm表達式:
0:000> n
base is 16
MASM 表達式中的符號
在 MASM 表達式中,任意符號的數值都是它的內存地址。根據引用符號的不同,可以是全局變量、局部變量、函數、段、模塊或者任何其它可識別標籤的地址- 0:000> ? g_ClientLibraryOffset
- Evaluate expression: 8602736 = 00834470
- 0:000> dd 00834470
- 00834470 00000104 00000000 00000000 00000000
- 00834480 00000000 00000000 00000000 00000000
- 00834490 00000000 00000000 00000000 00000000
- 008344a0 00000000 00000000 00000000 00000000
- 008344b0 00000000 00000000 00000000 00000000
- 008344c0 00000000 00000000 00000000 00000000
- 008344d0 007772fc 008344d0 00000000 00000000
- 008344e0 0000001a 00000000 00000000 00000000
- 0:000> dd g_ClientLibraryOffset
- 00834470 00000104 00000000 00000000 00000000
MASM 表達式中的數值運算符
表達式的任意組件都可以用一元運算符來修改,任意兩個組件都可以用二元運算符組合起來。一元運算符優先於二元運算符,可以用圓括號來掩蓋優先級規則一元地址運算符尋址時假定 DS 爲缺省段。按運算符的優先級順序計算表達式
一元運算符有:
+ | 正數 |
- 0:000> ? +1
- Evaluate expression: 1 = 00000001
- 0:000> ? +eip
- Evaluate expression: 2838334 = 002b4f3e
- | 負數 |
- 0:000> ? -1
- Evaluate expression: -1 = ffffffff
- 0:000> ? -eip
- Evaluate expression: -2838334 = ffd4b0c2
not | 如果參數爲零返回 1;任何非零參數返回 0 |
- 0:000> ? not 1
- Evaluate expression: 0 = 00000000
- 0:000> ? not 0
- Evaluate expression: 1 = 00000001
- 0:000> ? not eip
- Evaluate expression: 0 = 00000000
hi | 高 16 位 |
- 0:000> ? hi eip
- Evaluate expression: 43 = 0000002b
- 0:000> r eip
- eip=002b4f3e
- 0:000> ? hi (eip)
- Evaluate expression: 43 = 0000002b
low | 低 16 位 |
- 0:000> ? low eip
- Evaluate expression: 20286 = 00004f3e
- 0:000> r eip
- eip=002b4f3e
- 0:000> ? (low eip)
- Evaluate expression: 20286 = 00004f3e
by | 指定地址處的低位字節--地址所對應內容的低位字節! |
:
- 0:000> ? by ebp
- Evaluate expression: 76 = 0000004c
- 0:000> r ebp
- ebp=00affad8
- 0:000> dd ebp
- 00affad8 00affc4c 002d7d94 00affe5c 00affc54
wo | 指定地址處的內容的低位字!不是字節 |
- 0:000> ? wo(eip)
- Evaluate expression: 15747 = 00003d83
- 0:000> dd eip
- 002b4f3e 44743d83
dwo | 指定地址處的內容的雙字 |
- 0:000> ?dwo eip
- Evaluate expression: 1148468611 = 44743d83
- 0:000> dd eip
- 002b4f3e 44743d83 74000083 ebc03304 30a1643b
qwo | 指定地址處的內容的四字節 |
- 0:000> ? qwo eip
- Evaluate expression: 8358681472188824963 = 74000083`44743d83
- 0:000> dd eip
- 002b4f3e 44743d83 74000083 ebc03304 30a1643b
poi | 指定地址處的指針大小的數據。指針大小或者是 32 位或者是 64 位 |
- <pre name="code" class="cpp">0:000> ? poi(eip)
- Evaluate expression: 1148468611 = 44743d83
- 0:000> dd eip
- 002b4f3e 44743d83 74000083 ebc03304 30a1643b</pre><br><br>
二元運算符
* / mod (或 %) | 乘法整數除法模數(餘數) |
- 0:000> ? 4*2
- Evaluate expression: 8 = 00000008
- 0:000> ? eip*2
- Evaluate expression: 5676668 = 00569e7c
- 0:000> ? 4/2
- Evaluate expression: 2 = 00000002
- 0:000> ? eip/2
- Evaluate expression: 1419167 = 0015a79f
- 0:000> ? 5 mod 1
- Evaluate expression: 0 = 00000000
- 0:000> ? 5mod1
- Syntax error at '5mod1'
- 0:000> ? eip mod 2
- Evaluate expression: 0 = 00000000
- 0:000> ? 5 mod 2
- Evaluate expression: 1 = 00000001<strong>
- </strong>
+ - | 加法 減法 |
- 0:000> ? 1+2
- Evaluate expression: 3 = 00000003
- 0:000> ? 2+eip
- Evaluate expression: 2838336 = 002b4f40
<< >> >>> | 左移位 邏輯右移位 算術右移位 |
- 0:000> ? 4>>1
- Evaluate expression: 2 = 00000002
- 0:000> ? 4<<1
- Evaluate expression: 8 = 00000008
- 0:000> ? 4>>>1
- Evaluate expression: 2 = 00000002
- 0:000> ? 4 << 1
- Evaluate expression: 8 = 00000008
= (or ==) < > <= >= != | 等於 小於 大於 小於等於 大於等於 不等於 |
- 0:000> ? 4>1
- Evaluate expression: 1 = 00000001
- 0:000> ? 4<1
- Evaluate expression: 0 = 00000000
- 0:000> ? eip
- Evaluate expression: 2838334 = 002b4f3e
- 0:000> ? eip = 1
- Evaluate expression: 0 = 00000000
- 0:000> r eip
- eip=002b4f3e
可以看到eip沒有被改變,要改變就用r命令
非法操作(例如除零)會返回給調試器命令窗口調試器命令窗口一個"Operand error"
- 0:000> ? 1/0
- Operand error at '0'
and (或&) | 按位與 |
xor (或^) | 按位異或(不同於 OR) |
or (或|) | 按位或 |
異或是不同爲1,相同爲0
- 0:000> ? 5&1
- Evaluate expression: 1 = 00000001
- 0:000> ? 5 xor 1
- Evaluate expression: 4 = 00000004
- 0:000> ? 5 or 2
- Evaluate expression: 7 = 00000007
MASM 表達式中使用的其它運算符
$iment (Address) | 返回加載模塊列表中映像入口點地址。Address 指定 PE 映像基地址。通過查找 Address 指定映像的 PE 頭中的映像入口點找到入口點。 該函數既可以用在模塊列表中已有的模塊上,也可以通過bu命令設置未確定的斷點 |
如:
- 0:000> lm
- start end module name
- 00030000 0089f000 VerifyTxSignDemo
- 0:000> r $exentry
- $exentry=0029cf7c
- 0:000> ? $iment(00030000+100)
- Evaluate expression: 2740092 = 0029cf7c
0:000> bu $iment(00030000)
$scmp("String1", "String2") | 計算後得到 -1、0 或者 1;就像 C 函數中的 strcmp。 |
- 0:000> ? $scmp("c:", "c:")
- Evaluate expression: 0 = 00000000
- 0:000> ? $scmp("c:", "d:")
- Evaluate expression: -1 = ffffffff
- 0:000> ? $scmp("e:", "d:")
- Evaluate expression: 1 = 00000001
要注意的是一些字符串可能包含轉義字符,如\n、 \"、 \r、 和\b,它們會被按字面的樣子讀取,而不會由求值器進行計算
要讓求值器按字面意思萊解釋字符串,必須使用@"String" 語法
- 0:000> ? $scmp("c:\", "c:\")
- Syntax error at '("c:\", "c:\")'
- 0:000> ? $scmp(@"c:\", @"c:\")
- Evaluate expression: 0 = 00000000
- 0:000> ? $scmp(@"c:\", @"d:\")
- Evaluate expression: -1 = ffffffff
可以看到第一個報錯
- 0:006> ? $scmp(@"c:\",@"C:\")
- Evaluate expression: 1 = 00000001
- 0:006> ? $sicmp(@"c:\",@"C:\")
- Evaluate expression: 0 = 00000000
$sicmp("String1", "String2") | 計算後得到 -1、0 或者 1;就像 Win32 函數 stricmp |
- 0:000> ? $sicmp(@"C:\", @"c:\")
- Evaluate expression: 0 = 00000000
$spat("String", "Pattern") | 根據 String 是否匹配 Pattern 計算得到 TRUE 或 FALSE。Pattern 可以包含多種通配符和特定符(specifiers); |
- 0:000> ? $spat(@"c:\1.txt", "*.txt")
- Evaluate expression: 1 = 00000001
- 0:000> ? $spat(@"c:\1.txt", "*.tet")
- Evaluate expression: 0 = 00000000
$vvalid(Address, Length) | 判斷一段起始地址爲 Address 長度爲 Length字節的內存範圍是否有效。如果這段內存有效,$vvalid計算得到 1;否則,$vvalid 計算得到 0 |
- 0:000> ? $vvalid(0089e000, 1000)
- Evaluate expression: 1 = 00000001
- 0:000> ? $vvalid(0089e000, 1001)
- Evaluate expression: 0 = 00000000
- 0:000> !vprot 0089efff
- BaseAddress: 0089e000
- AllocationBase: 00030000
- AllocationProtect: 00000080 PAGE_EXECUTE_WRITECOPY
- RegionSize: 00001000
- State: 00001000 MEM_COMMIT
- Protect: 00000002 PAGE_READONLY
- Type: 01000000 MEM_IMAGE
- 0:000> !vprot 0089f000
- BaseAddress: 0089f000
- AllocationBase: 00000000
- RegionSize: 00001000
- State: 00010000 MEM_FREE
- Protect: 00000001 PAGE_NOACCESS