.expr 命令指定默认的表达式求值器

[cpp] view plaincopy
  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. Current expression evaluator: MASM - Microsoft Assembler expressions
  10. 0:000> .expr /s c++
  11. Current expression evaluator: C++ - C++ source expressions

/q 显示可用的表达式类型的列表

n可用来设置缺省基数为 16, 10 或者 8。所有不带前缀的数值都以该基数来解释

masm表达式:

0:000> n
base is 16

MASM 表达式中的符号

在 MASM 表达式中,任意符号的数值都是它的内存地址。根据引用符号的不同,可以是全局变量、局部变量、函数、段、模块或者任何其它可识别标签的地址

[cpp] view plaincopy
  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 为缺省段。按运算符的优先级顺序计算表达式

一元运算符有:

+ 正数

[cpp] view plaincopy
  1. 0:000> ? +1
  2. Evaluate expression: 1 = 00000001
  3. 0:000> ? +eip
  4. Evaluate expression: 2838334 = 002b4f3e
- 负数

[cpp] view plaincopy
  1. 0:000> ? -1
  2. Evaluate expression: -1 = ffffffff
  3. 0:000> ? -eip
  4. Evaluate expression: -2838334 = ffd4b0c2
not 如果参数为零返回 1;任何非零参数返回 0

[cpp] view plaincopy
  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 位

[cpp] view plaincopy
  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 位

[cpp] view plaincopy
  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 指定地址处的低位字节--地址所对应内容的低位字节!

[cpp] view plaincopy
  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 指定地址处的内容的低位字!不是字节
[cpp] view plaincopy
  1. 0:000> ? wo(eip)
  2. Evaluate expression: 15747 = 00003d83
  3. 0:000> dd eip
  4. 002b4f3e  44743d83
dwo 指定地址处的内容的双字
[cpp] view plaincopy
  1. 0:000> ?dwo eip
  2. Evaluate expression: 1148468611 = 44743d83
  3. 0:000> dd eip
  4. 002b4f3e  44743d83 74000083 ebc03304 30a1643b
qwo 指定地址处的内容的四字节
[cpp] view plaincopy
  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 位
[cpp] view plaincopy
  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 (或 %) 乘法整数除法模数(余数)
[cpp] view plaincopy
  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>
+

-

加法

减法

[cpp] view plaincopy
  1. 0:000> ? 1+2
  2. Evaluate expression: 3 = 00000003
  3. 0:000> ? 2+eip
  4. Evaluate expression: 2838336 = 002b4f40
<<

>>

>>>

左移位

逻辑右移位

算术右移位

[cpp] view plaincopy
  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 ==)

<

>

<=

>=

!=

等于

小于

大于

小于等于

大于等于

不等于

[cpp] view plaincopy
  1. 0:000> ? 4>1
  2. Evaluate expression: 1 = 00000001
  3. 0:000> ? 4<1
  4. Evaluate expression: 0 = 00000000

比较运算符 <, >, =, ==!= 计算后如果为真则得到 1,如果为假则得到 0。单个等于号( =)和双等于号( ==)相同;在 MASM 表达式中不会产生副作用,也不会赋值

[cpp] view plaincopy
  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"

[cpp] view plaincopy
  1. 0:000> ? 1/0
  2. Operand error at '0'
and (或&) 按位与
xor (或^) 按位异或(不同于 OR)
or (或|) 按位或
异或是不同为1,相同为0
[cpp] view plaincopy
  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命令设置未确定的断点

方使用从入口点跟进代码:

如:

[cpp] view plaincopy
  1. 0:000> lm
  2. start    end        module name
  3. 00030000 0089f000   VerifyTxSignDemo

则可以用[00030000, 0089f000)中任一个地址取得:

[cpp] view plaincopy
  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
[cpp] view plaincopy
  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" 语法

[cpp] view plaincopy
  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

可以看到第一个报错

[html] view plaincopy
  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

同于上面的,不多解释

[cpp] view plaincopy
  1. 0:000> ? $sicmp(@"C:\", @"c:\")
  2. Evaluate expression: 0 = 00000000
$spat("String", "Pattern") 根据 String 是否匹配 Pattern 计算得到 TRUE 或 FALSE。Pattern 可以包含多种通配符和特定符(specifiers);
[cpp] view plaincopy
  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
[cpp] view plaincopy
  1. 0:000> ? $vvalid(0089e000, 1000)
  2. Evaluate expression: 1 = 00000001
  3. 0:000> ? $vvalid(0089e000, 1001)
  4. Evaluate expression: 0 = 00000000

原因:

[cpp] view plaincopy
  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 通用寄存器不需要

windbg学习-------.expr和masm表达式相关推荐

  1. windbg学习笔记

    写与2014年6月3日 Default Workspace 默认工作空间 implicit Workspace 隐含工作空间 Named Workspace 命名工作空间 explicit Works ...

  2. Windbg学习 (0x0012) 命令-批处理命令程序

    Windbg学习 (0x0012) 命令-批处理命令 转载于:https://www.cnblogs.com/ywnwa417/p/5678344.html

  3. python学习(2)--变量与表达式

    python学习(2)--变量与表达式 1.与java和c语言相通,python中也分为四种运算符: (1)算数运算符(如:+.-.*./); 学过java或者C的朋友,对加减乘除这种普通的算数运算符 ...

  4. windbg学习-----n(Set Number base)

    0:006> n base is 16 表示当前是16位进制的 但是这个只作用于MASM表达式 在C++表达式中的数字如果没有专门指定,则被认为是10进制数. 0:006> ? 10+1 ...

  5. WinDbg学习笔记(二)--字符串访问断点

    标 题: [原创]WinDbg学习笔记(二)--字符串访问断点 作 者: gaorqing 时 间: 2009-07-25,21:39:04 链 接: http://bbs.pediy.com/sho ...

  6. WinDbg学习笔记(一)--认识WinDbg

    标 题: [原创]WinDbg学习笔记(一)--认识WinDbg 作 者: gaorqing 时 间: 2009-07-27,20:45:27 链 接: http://bbs.pediy.com/sh ...

  7. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)

    目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行   Stream的.max方 ...

  8. 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程

    8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...

  9. java 位运算_java学习之运算符与表达式(四)

    (6)位运算符 位运算是指对整数按二进制的位进行运算. 位运算用于整数或字符类型. 有7个:~(非).&(与).|(或).^(异或).<>(右移).>>>(无符号 ...

最新文章

  1. 《Programming Ruby 中文版第二版》P577页singleton_method_undefined方法说明有点问题
  2. Android XML使用的学习记录
  3. 在局域网可以访问电脑中存放的网页(IIS服务)
  4. SEH in ASM 研究(一)
  5. 直播丨 SQL大赛冠军怀晓明:深入解析Oracle存储过程中的性能瓶颈
  6. double取两位小数_Java语言中:float、double数据类型在内存中是如何存储的
  7. 算法导论9:栈的链表实现 2016.1.9
  8. 对象行为型 - 模版方法模式
  9. Windows不同压缩软件、压缩算法、压缩率详细对比测试与选择
  10. 计算机房消防设计规范,发电机房消防设计规范要求有哪些
  11. 12个月份的RGB配色
  12. 中国地产商寻找下一个春天
  13. 解决小程序直播组件live-player全屏问题
  14. 2022网络安全技术自学路线图及职业选择方向
  15. 谷歌浏览器网页翻译插件
  16. Leetcode_162_Find Peak Element
  17. 新春思考:如何用区块链与投证保护“一杯严选”「见茶卸甲」级好茶
  18. 【C语言程序设计】实验 4
  19. 参数传递是什么?参数传递的是什么?
  20. Spring Integration-简介

热门文章

  1. C语言处理字符串及内存操作
  2. Eclipse下新建Maven项目、自动打依赖jar包
  3. 关于向Mybatis传递多个参数进行SQL查询的用法
  4. MusicXML 3.0 (7) - 连线、延音线
  5. C#获取网页中的验证码图片(转载)
  6. 面试--java实现一个多人图文聊天室(c/s或b/s),写出思路
  7. 【发现】彻底清除www.go2000.cc的清除方法
  8. 一些还能记住的面试题
  9. vue2 + vue-router + vuex + iview 入门项目
  10. 手机验证短信设计与代码实现(转载)