windbg学习-------.expr和masm表达式
.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
/q 显示可用的表达式类型的列表
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
可以看到00834470就是g_ClientLibraryOffset的地址
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
比较运算符 <, >, =, == 和 != 计算后如果为真则得到 1,如果为假则得到 0。单个等于号( =)和双等于号( ==)相同;在 MASM 表达式中不会产生副作用,也不会赋值
- 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
则可以用[00030000, 0089f000)中任一个地址取得:
- 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
一个是可读可写的,一个是不可访问的
MASM 表达式中的寄存器和伪寄存器
MASM 表达式中可以使用寄存器和伪寄存器。所有寄存器和伪寄存器可以包含单个at符号( @) 的前缀。使用该前缀可以使调试器存取这些值更快。该记号对于大多数 x86 通用寄存器不需要
windbg学习-------.expr和masm表达式相关推荐
- windbg学习笔记
写与2014年6月3日 Default Workspace 默认工作空间 implicit Workspace 隐含工作空间 Named Workspace 命名工作空间 explicit Works ...
- Windbg学习 (0x0012) 命令-批处理命令程序
Windbg学习 (0x0012) 命令-批处理命令 转载于:https://www.cnblogs.com/ywnwa417/p/5678344.html
- python学习(2)--变量与表达式
python学习(2)--变量与表达式 1.与java和c语言相通,python中也分为四种运算符: (1)算数运算符(如:+.-.*./); 学过java或者C的朋友,对加减乘除这种普通的算数运算符 ...
- windbg学习-----n(Set Number base)
0:006> n base is 16 表示当前是16位进制的 但是这个只作用于MASM表达式 在C++表达式中的数字如果没有专门指定,则被认为是10进制数. 0:006> ? 10+1 ...
- WinDbg学习笔记(二)--字符串访问断点
标 题: [原创]WinDbg学习笔记(二)--字符串访问断点 作 者: gaorqing 时 间: 2009-07-25,21:39:04 链 接: http://bbs.pediy.com/sho ...
- WinDbg学习笔记(一)--认识WinDbg
标 题: [原创]WinDbg学习笔记(一)--认识WinDbg 作 者: gaorqing 时 间: 2009-07-27,20:45:27 链 接: http://bbs.pediy.com/sh ...
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行 Stream的.max方 ...
- 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程
8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...
- java 位运算_java学习之运算符与表达式(四)
(6)位运算符 位运算是指对整数按二进制的位进行运算. 位运算用于整数或字符类型. 有7个:~(非).&(与).|(或).^(异或).<>(右移).>>>(无符号 ...
最新文章
- 《Programming Ruby 中文版第二版》P577页singleton_method_undefined方法说明有点问题
- Android XML使用的学习记录
- 在局域网可以访问电脑中存放的网页(IIS服务)
- SEH in ASM 研究(一)
- 直播丨 SQL大赛冠军怀晓明:深入解析Oracle存储过程中的性能瓶颈
- double取两位小数_Java语言中:float、double数据类型在内存中是如何存储的
- 算法导论9:栈的链表实现 2016.1.9
- 对象行为型 - 模版方法模式
- Windows不同压缩软件、压缩算法、压缩率详细对比测试与选择
- 计算机房消防设计规范,发电机房消防设计规范要求有哪些
- 12个月份的RGB配色
- 中国地产商寻找下一个春天
- 解决小程序直播组件live-player全屏问题
- 2022网络安全技术自学路线图及职业选择方向
- 谷歌浏览器网页翻译插件
- Leetcode_162_Find Peak Element
- 新春思考:如何用区块链与投证保护“一杯严选”「见茶卸甲」级好茶
- 【C语言程序设计】实验 4
- 参数传递是什么?参数传递的是什么?
- Spring Integration-简介
热门文章
- C语言处理字符串及内存操作
- Eclipse下新建Maven项目、自动打依赖jar包
- 关于向Mybatis传递多个参数进行SQL查询的用法
- MusicXML 3.0 (7) - 连线、延音线
- C#获取网页中的验证码图片(转载)
- 面试--java实现一个多人图文聊天室(c/s或b/s),写出思路
- 【发现】彻底清除www.go2000.cc的清除方法
- 一些还能记住的面试题
- vue2 + vue-router + vuex + iview 入门项目
- 手机验证短信设计与代码实现(转载)