windbg學習-------.expr和masm表達式

.expr 命令指定默認的表達式求值器

  1. 0:000> .expr  
  2. Current expression evaluator: MASM - Microsoft Assembler expressions  
  3. 0:000> .expr /s masm  
  4. Current expression evaluator: MASM - Microsoft Assembler expressions  
  5. 0:000> .expr /q  
  6. Available expression evaluators:  
  7. MASM - Microsoft Assembler expressions  
  8. C++ - C++ source expressions  
  9.   
  10. Current expression evaluator: MASM - Microsoft Assembler expressions  
  11. 0:000> .expr /s c++  
  12. Current expression evaluator: C++ - C++ source expressions  
/q 顯示可用的表達式類型的列表

n可用來設置缺省基數爲 16, 10 或者 8。所有不帶前綴的數值都以該基數來解釋

masm表達式:

0:000> n
base is 16

MASM 表達式中的符號

在 MASM 表達式中,任意符號的數值都是它的內存地址。根據引用符號的不同,可以是全局變量、局部變量、函數、段、模塊或者任何其它可識別標籤的地址
  1. 0:000> ? g_ClientLibraryOffset  
  2. Evaluate expression: 8602736 = 00834470  
  3. 0:000> dd 00834470  
  4. 00834470  00000104 00000000 00000000 00000000  
  5. 00834480  00000000 00000000 00000000 00000000  
  6. 00834490  00000000 00000000 00000000 00000000  
  7. 008344a0  00000000 00000000 00000000 00000000  
  8. 008344b0  00000000 00000000 00000000 00000000  
  9. 008344c0  00000000 00000000 00000000 00000000  
  10. 008344d0  007772fc 008344d0 00000000 00000000  
  11. 008344e0  0000001a 00000000 00000000 00000000  
  12. 0:000> dd g_ClientLibraryOffset  
  13. 00834470  00000104 00000000 00000000 00000000  
可以看到00834470就是g_ClientLibraryOffset的地址


MASM 表達式中的數值運算符

表達式的任意組件都可以用一元運算符來修改,任意兩個組件都可以用二元運算符組合起來。一元運算符優先於二元運算符,可以用圓括號來掩蓋優先級規則

一元地址運算符尋址時假定 DS 爲缺省段。按運算符的優先級順序計算表達式

一元運算符有:

+ 正數

  1. 0:000> ? +1  
  2. Evaluate expression: 1 = 00000001  
  3. 0:000> ? +eip  
  4. Evaluate expression: 2838334 = 002b4f3e  

- 負數
  1. 0:000> ? -1  
  2. Evaluate expression: -1 = ffffffff  
  3. 0:000> ? -eip  
  4. Evaluate expression: -2838334 = ffd4b0c2  

not 如果參數爲零返回 1;任何非零參數返回 0
  1. 0:000> ? not 1  
  2. Evaluate expression: 0 = 00000000  
  3. 0:000> ? not 0  
  4. Evaluate expression: 1 = 00000001  
  5. 0:000> ? not eip  
  6. Evaluate expression: 0 = 00000000  

hi 高 16 位
  1. 0:000> ? hi eip  
  2. Evaluate expression: 43 = 0000002b  
  3. 0:000> r eip  
  4. eip=002b4f3e  
  5. 0:000> ? hi (eip)  
  6. Evaluate expression: 43 = 0000002b  

low 低 16 位
  1. 0:000> ? low eip  
  2. Evaluate expression: 20286 = 00004f3e  
  3. 0:000> r eip  
  4. eip=002b4f3e  
  5. 0:000> ? (low eip)  
  6. Evaluate expression: 20286 = 00004f3e  

by 指定地址處的低位字節--地址所對應內容的低位字節!

  1. 0:000> ? by ebp  
  2. Evaluate expression: 76 = 0000004c  
  3. 0:000> r ebp  
  4. ebp=00affad8  
  5. 0:000> dd ebp  
  6. 00affad8  00affc4c 002d7d94 00affe5c 00affc54  

wo 指定地址處的內容的低位字!不是字節
  1. 0:000> ? wo(eip)  
  2. Evaluate expression: 15747 = 00003d83  
  3. 0:000> dd eip  
  4. 002b4f3e  44743d83   

dwo 指定地址處的內容的雙字
  1. 0:000> ?dwo eip  
  2. Evaluate expression: 1148468611 = 44743d83  
  3. 0:000> dd eip  
  4. 002b4f3e  44743d83 74000083 ebc03304 30a1643b  

qwo 指定地址處的內容的四字節
  1. 0:000> ? qwo eip  
  2. Evaluate expression: 8358681472188824963 = 74000083`44743d83  
  3. 0:000> dd eip  
  4. 002b4f3e  44743d83 74000083 ebc03304 30a1643b  

poi 指定地址處的指針大小的數據。指針大小或者是 32 位或者是 64 位
  1. <pre name="code" class="cpp">0:000> ? poi(eip)  
  2. Evaluate expression: 1148468611 = 44743d83  
  3. 0:000> dd eip  
  4. 002b4f3e  44743d83 74000083 ebc03304 30a1643b</pre><br><br>  

二元運算符

* / mod (或 %) 乘法整數除法模數(餘數)
  1. 0:000> ? 4*2  
  2. Evaluate expression: 8 = 00000008  
  3. 0:000> ? eip*2  
  4. Evaluate expression: 5676668 = 00569e7c  
  5. 0:000> ? 4/2  
  6. Evaluate expression: 2 = 00000002  
  7. 0:000> ? eip/2  
  8. Evaluate expression: 1419167 = 0015a79f  
  9. 0:000> ? 5 mod 1  
  10. Evaluate expression: 0 = 00000000  
  11. 0:000> ? 5mod1  
  12. Syntax error at '5mod1'  
  13. 0:000> ? eip mod 2  
  14. Evaluate expression: 0 = 00000000  
  15. 0:000> ? 5 mod 2  
  16. Evaluate expression: 1 = 00000001<strong>  
  17. </strong>  

+

-
加法

減法
  1. 0:000> ? 1+2  
  2. Evaluate expression: 3 = 00000003  
  3. 0:000> ? 2+eip  
  4. Evaluate expression: 2838336 = 002b4f40  

<<

>>

>>>
左移位

邏輯右移位

算術右移位
  1. 0:000> ? 4>>1  
  2. Evaluate expression: 2 = 00000002  
  3. 0:000> ? 4<<1  
  4. Evaluate expression: 8 = 00000008  
  5. 0:000> ? 4>>>1  
  6. Evaluate expression: 2 = 00000002  
  7. 0:000> ? 4 << 1  
  8. Evaluate expression: 8 = 00000008  

= (or ==)

<

>

<=

>=

!=
等於

小於

大於

小於等於

大於等於

不等於
  1. 0:000> ? 4>1  
  2. Evaluate expression: 1 = 00000001  
  3. 0:000> ? 4<1  
  4. Evaluate expression: 0 = 00000000  
比較運算符 <, >, =, == != 計算後如果爲真則得到 1,如果爲假則得到 0。單個等於號(=)和雙等於號(==)相同;在 MASM 表達式中不會產生副作用,也不會賦值
  1. 0:000> ? eip   
  2. Evaluate expression: 2838334 = 002b4f3e  
  3. 0:000> ? eip = 1  
  4. Evaluate expression: 0 = 00000000  
  5. 0:000> r eip  
  6. eip=002b4f3e  

可以看到eip沒有被改變,要改變就用r命令

非法操作(例如除零)會返回給調試器命令窗口調試器命令窗口一個"Operand error"

  1. 0:000> ? 1/0  
  2. Operand error at '0'  

and (或&) 按位與
xor (或^) 按位異或(不同於 OR)
or (或|) 按位或
異或是不同爲1,相同爲0
  1. 0:000> ? 5&1  
  2. Evaluate expression: 1 = 00000001  
  3. 0:000> ? 5 xor 1  
  4. Evaluate expression: 4 = 00000004  
  5. 0:000> ? 5 or 2  
  6. Evaluate expression: 7 = 00000007  

MASM 表達式中使用的其它運算符

$iment (Address) 返回加載模塊列表中映像入口點地址。Address 指定 PE 映像基地址。通過查找 Address 指定映像的 PE 頭中的映像入口點找到入口點。

該函數既可以用在模塊列表中已有的模塊上,也可以通過bu命令設置未確定的斷點
方使用從入口點跟進代碼:

如:

  1. 0:000> lm  
  2. start    end        module name  
  3. 00030000 0089f000   VerifyTxSignDemo  
則可以用[00030000, 0089f000)中任一個地址取得:
  1. 0:000> r $exentry  
  2. $exentry=0029cf7c  
  3. 0:000> ? $iment(00030000+100)  
  4. Evaluate expression: 2740092 = 0029cf7c  
那麼下斷點也很好:

0:000> bu $iment(00030000)


$scmp("String1", "String2") 計算後得到 -1、0 或者 1;就像 C 函數中的 strcmp
  1. 0:000> ? $scmp("c:""c:")  
  2. Evaluate expression: 0 = 00000000  
  3. 0:000> ? $scmp("c:""d:")  
  4. Evaluate expression: -1 = ffffffff  
  5. 0:000> ? $scmp("e:""d:")  
  6. Evaluate expression: 1 = 00000001  

要注意的是一些字符串可能包含轉義字符,如\n\"\r、 和\b,它們會被按字面的樣子讀取,而不會由求值器進行計算

要讓求值器按字面意思萊解釋字符串,必須使用@"String" 語法

  1. 0:000> ? $scmp("c:\", "c:\")  
  2. Syntax error at '("c:\", "c:\")'  
  3. 0:000> ? $scmp(@"c:\", @"c:\")  
  4. Evaluate expression: 0 = 00000000  
  5. 0:000> ? $scmp(@"c:\", @"d:\")  
  6. Evaluate expression: -1 = ffffffff  

可以看到第一個報錯

  1. 0:006> ? $scmp(@"c:\",@"C:\")  
  2. Evaluate expression: 1 = 00000001  
  3. 0:006> ? $sicmp(@"c:\",@"C:\")  
  4. Evaluate expression: 0 = 00000000  

$sicmp("String1", "String2") 計算後得到 -1、0 或者 1;就像 Win32 函數 stricmp
同於上面的,不多解釋
  1. 0:000> ? $sicmp(@"C:\", @"c:\")  
  2. Evaluate expression: 0 = 00000000  

$spat("String", "Pattern") 根據 String 是否匹配 Pattern 計算得到 TRUE 或 FALSE。Pattern 可以包含多種通配符和特定符(specifiers);
  1. 0:000> ? $spat(@"c:\1.txt""*.txt")  
  2. Evaluate expression: 1 = 00000001  
  3. 0:000> ? $spat(@"c:\1.txt""*.tet")  
  4. Evaluate expression: 0 = 00000000  

$vvalid(Address, Length) 判斷一段起始地址爲 Address 長度爲 Length字節的內存範圍是否有效。如果這段內存有效,$vvalid計算得到 1;否則,$vvalid 計算得到 0
  1. 0:000> ? $vvalid(0089e000, 1000)  
  2. Evaluate expression: 1 = 00000001  
  3. 0:000> ? $vvalid(0089e000, 1001)  
  4. Evaluate expression: 0 = 00000000  
原因:
  1. 0:000> !vprot 0089efff  
  2. BaseAddress:       0089e000  
  3. AllocationBase:    00030000  
  4. AllocationProtect: 00000080  PAGE_EXECUTE_WRITECOPY  
  5. RegionSize:        00001000  
  6. State:             00001000  MEM_COMMIT  
  7. Protect:           00000002  PAGE_READONLY  
  8. Type:              01000000  MEM_IMAGE  
  9. 0:000> !vprot 0089f000  
  10. BaseAddress:       0089f000  
  11. AllocationBase:    00000000  
  12. RegionSize:        00001000  
  13. State:             00010000  MEM_FREE  
  14. Protect:           00000001  PAGE_NOACCESS  
一個是可讀可寫的,一個是不可訪問的

MASM 表達式中的寄存器和僞寄存器

MASM 表達式中可以使用寄存器和僞寄存器。所有寄存器和僞寄存器可以包含單個at符號( @) 的前綴。使用該前綴可以使調試器存取這些值更快。該記號對於大多數 x86 通用寄存器不需要
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章