windbg学习-------.expr和masm表达式
来源:互联网 发布:亚马逊通途软件管理 编辑:程序博客网 时间:2024/06/06 09:17
.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)
- 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
MASM 表达式中的寄存器和伪寄存器
MASM 表达式中可以使用寄存器和伪寄存器。所有寄存器和伪寄存器可以包含单个at符号( @) 的前缀。使用该前缀可以使调试器存取这些值更快。该记号对于大多数 x86 通用寄存器不需要 0 0
- windbg学习-------.expr和masm表达式
- 59.windbg-MASM表达式语法
- 57.windbg-MASM vs C++表达式
- java正则表达式 ^expr 和 [^expr] 和 ^[^expr]的比较
- 数学表达式(expr和bc)
- shell学习十--expr及expr和let性能比较
- tcl/tk学习笔记:数学表达式与 expr 命令
- windbg调试masm生成程序的方法
- 【shell学习笔记】反引号和expr的用法
- gtk之G_LIKELY(expr)和G_UNLIKELY(expr)
- 43.windbg-.expr、n(设置默认的表达式语法、默认的数字基础0x、0n、0t、0y)
- ARM汇编书写格式及符号(symbol)和表达式(expr)
- expr
- expr
- expr
- expr
- windbg学习21(!handle和!cs)
- Windbg命令学习6(k和x)
- 【c++】Debug Assertion Failed!
- Socket编程基础知识
- Facebook 190亿美元收购WhatsApp 补移动短板
- ios开发键盘隐藏的方法
- java 从零开始,学习笔记之基础入门<三大框架整合>(四十二)
- windbg学习-------.expr和masm表达式
- 《机器学习》学习笔记_1.机器学习的分类
- 排序的一些总结
- 每天没做好的地方都要记录都要改正!!!!
- vi和vim编辑器
- 禁用ASLR
- android SlidingPaneLayout DrawerLayout的区别
- 基础知识之 TCP/IP, HTTP, Socket
- linux USB驱动详解 一